Đăng vào

Cài đặt Immich trên Kubernetes dùng ArgoCD

Giới thiệu

Hiện tại, mình đang sử dụng Google photos để lưu trữ hình ảnh kỷ niệm của gia đình, tuy nhiên không có gỉ đảm bảo chắc chắn là Google sẽ không sử dụng dữ liệu này vào mục đích riêng. Vì vậy mình tìm một giải pháp self-hosted thay thế nào, qua tìm hiểu thì Immich là một sự thay thế tốt nhất tại thời điểm hiện tại.

Immich là một giải pháp mã nguồn mở (open-source) tự lưu trữ (self-hosted) dành cho việc quản lý và sao lưu ảnh và video. Nó được phát triển với mục tiêu cung cấp trải nghiệm tương tự như Google Photos nhưng với quyền kiểm soát hoàn toàn dữ liệu nằm trong tay người dùng.

Tại sao Immich là một giải pháp thay thế hấp dẫn cho Google Photos?

  • Quyền riêng tư và sở hữu dữ liệu: Điểm khác biệt lớn nhất là Immich cho phép bạn lưu trữ ảnh và video trên phần cứng của riêng mình (máy chủ cá nhân, NAS), thay vì trên máy chủ của các công ty lớn như Google. Điều này đảm bảo quyền riêng tư tối đa và bạn hoàn toàn kiểm soát dữ liệu của mình.
  • Tiết kiệm chi phí dài hạn: Thay vì trả phí hàng tháng cho các dịch vụ đám mây, bạn chỉ cần đầu tư ban đầu vào phần cứng. Sau đó, chi phí lưu trữ ảnh và video sẽ gần như bằng không.
  • Mã nguồn mở và linh hoạt: Là một dự án mã nguồn mở, Immich cho phép bạn tùy chỉnh, đóng góp và tích hợp thêm các tính năng phù hợp với nhu cầu cá nhân.
  • Tính năng phong phú: Immich cung cấp nhiều tính năng tương tự Google Photos, bao gồm:
    • Tự động sao lưu: Tự động đồng bộ ảnh và video từ điện thoại hoặc máy tính.
    • Quản lý ảnh và video: Duyệt, sắp xếp theo album, gắn thẻ, và tìm kiếm.
    • Nhận diện khuôn mặt: Tự động nhận diện và nhóm các bức ảnh của cùng một người.
    • Tìm kiếm thông minh: Khả năng tìm kiếm ảnh theo địa điểm, người, hoặc đối tượng (ví dụ: "cỏ", "nước", "chó").
    • Chia sẻ: Tạo album chia sẻ với các tùy chọn bảo mật như mật khẩu, tắt tải xuống, hoặc ẩn siêu dữ liệu.
    • Hỗ trợ đa người dùng: Immich có thể được sử dụng bởi nhiều người dùng, phù hợp cho gia đình hoặc nhóm.
    • Ứng dụng đa nền tảng: Có ứng dụng web và di động (iOS/Android) để truy cập thuận tiện.
  • Hiệu năng vượt trội: Với việc chạy trên phần cứng của bạn, Immich có thể mang lại trải nghiệm mượt mà và nhanh chóng khi duyệt ảnh và video, đặc biệt với các thư viện lớn

Triển khai

Để cài đặt bất kỳ ứng dụng nào trên Kubernetes thì tốt nhất là sử dụng công cụ GitOps, dưới đây mình sẽ trình bày YAML để triển khai các tài nguyên lên cụm Kubernetes sử dụng công cụ Argo CD.

Database

Mình vẫn sẽ sử dụng CloudNativePG để triển khai database trên Kubernetes và sử dụng ArgoCD. Chi tiết có thể tham khảo thêm bài viết Sử dụng ArgoCD triển khai giải pháp database trên Kubernetes với CloudNative-PG

apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: immich-db
  namespace: argocd
  finalizers:
    - resources-finalizer.argocd.argoproj.io
  labels:
    name: immich
spec:
  syncPolicy:
    automated:
      selfHeal: true
      prune: true
      allowEmpty: false
    syncOptions:
      - Validate=false
      - CreateNamespace=true
      - PrunePropagationPolicy=foreground
      - PruneLast=true
      - RespectIgnoreDifferences=true
      - Replace=true
  project: default
  sources:
    - chart: cluster
      repoURL: https://cloudnative-pg.github.io/charts
      targetRevision: 0.*
      helm:
        releaseName: cnpg
        passCredentials: false
        parameters:
          - name: "fullnameOverride"
            value: "pgsql"
          - name: "cluster.instances"
            value: "1"
          - name: "cluster.storage.storageClass"
            value: "nfs-csi"
          - name: "cluster.storage.size"
            value: "2Gi"
          - name: "cluster.walStorage.enabled"
            value: "true"
          - name: "cluster.walStorage.storageClass"
            value: "nfs-csi"
          - name: cluster.monitoring.enabled
            value: "true"
          - name: cluster.imageName
            value: ghcr.io/tensorchord/cloudnative-pgvecto.rs:16.5-v0.3.0
          - name: cluster.roles[0].name
            value: immich
          - name: cluster.roles[0].superuser
            value: "true"
          - name: cluster.roles[0].login
            value: "true"
        valuesObject:
          cluster:
            postgresql:
              shared_preload_libraries:
                - vectors.so
            initdb:
              database: immich
              owner: immich
              secret:
                name: immich-postgres-user
              postInitSQL:
                - CREATE EXTENSION IF NOT EXISTS "vectors";
                - CREATE EXTENSION IF NOT EXISTS "cube" CASCADE;
                - CREATE EXTENSION IF NOT EXISTS "earthdistance" CASCADE;
    - repoURL: https://github.com/codemauvn/gitops
      targetRevision: HEAD
      path: deploys/immich/manifests 
  destination:
    server: "https://kubernetes.default.svc"
    namespace: immich
  revisionHistoryLimit: 3

Triển khai app immich

Việc deploy này cứ theo các thông số của helm chart immich,

apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: immich-app
  namespace: argocd
  finalizers:
    - resources-finalizer.argocd.argoproj.io
  labels:
    name: immich
spec:
  syncPolicy:
    automated:
      selfHeal: true
      prune: true
      allowEmpty: false
    syncOptions:
      - Validate=false
      - CreateNamespace=true
      - PrunePropagationPolicy=foreground
      - PruneLast=true
      - RespectIgnoreDifferences=true
      - Replace=true
  project: default
  source:
    chart: immich
    repoURL: https://immich-app.github.io/immich-charts
    targetRevision: 0.9.*
    helm:
      releaseName: immich
      passCredentials: false
      parameters:
        - name: "env.DB_HOSTNAME"
          value: "pgsql-rw"
        - name: "env.DB_USERNAME"
          value: "immich"
        - name: "env.DB_DATABASE_NAME"
          value: "immich"
        - name: "envFrom[0].secretRef.name"
          value: "immich-postgres-user"
        - name: "env.DB_PASSWORD.valueFrom.secretKeyRef.name"
          value: "immich-postgres-user"
        - name: "env.DB_PASSWORD.valueFrom.secretKeyRef.key"
          value: "password"
        - name: "immich.persistence.library.existingClaim"
          value: "immich-data-pvc"
        - name: "redis.enabled"
          value: "true"
        - name: "redis.global.defaultStorageClass"
          value: "nfs-csi"
        - name: "redis.master.persistence.size"
          value: "2Gi"
        - name: "redis.master.persistence.enabled"
          value: "false"
        - name: "redis.master.kind"
          value: "Deployment"          
        - name: "machine-learning.persistence.cache.type"
          value: "pvc"
        - name: "machine-learning.persistence.cache.storageClass"
          value: "nfs-csi"
        - name: "machine-learning.env.MACHINE_LEARNING_WORKER_TIMEOUT"
          value: "600"
          forceString: true
        - name: "server.ingress.main.enabled"
          value: "true"
        - name: "server.ingress.main.className"
          value: "nginx"
        - name: "server.ingress.main.annotations.cert-manager\\.io/cluster-issuer"
          value: "letsencrypt-prod"
        - name: "server.ingress.main.hosts[0].host"
          value: "photos.mydomain.com"
        - name: "server.ingress.main.hosts[0].paths[0].path"
          value: "/"
        - name: "server.ingress.main.tls[0].hosts[0]"
          value: "photos.mydomain.com"
        - name: "server.ingress.main.tls[0].secretName"
          value: "immich-ssl"
  destination:
    server: "https://kubernetes.default.svc"
    namespace: immich
  revisionHistoryLimit: 3
  ignoreDifferences:
    - jsonPointers:
        - /spec/volumeName
        - /spec/storageClassName
      kind: PersistentVolumeClaim

Dưới đây là hình này ứng dụng immich ở phiên bản web

STM32F103 I/O
Pin

Chúc thành công,

ANH NGUYỄN me@nvtienanh.info