- Đă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

Chúc thành công,
ANH NGUYỄN me@nvtienanh.info