immich - Sao lưu ảnh
Selfhost
Selfhost
immich là phần mềm mã nguồn mở miễn phí hỗ trợ 1 mục địch duy nhất là nơi sao lưu và chia sẽ ảnh của bạn. Nó tương đối giống với Google Photos, nhưng có nhiều tính năng hơn và người ta thường nhắc đến tính riêng tư khi sử dụng phần mềm tự lưu trữ.
Nó hỗ trợ tải lên ảnh từ điện thoại và cũng hỗ trợ đồng bộ 1 phần (do giới hạn trên iPhone nên nó không thể đồng bộ đầy đủ do hạn chế về quyền trên iPhone, với android có lẽ là hỗ trợ đồng bộ đầy đủ).
Bạn có thể đồng bộ Album, xóa ảnh đồng thời trên immich và nó sẽ được xóa trên iPhone. Nhưng lưu ý là phải thác tác xóa trên immich thì sẽ được xác nhận có xóa trên điện thoại không. làm ngược lại thì sẽ không được hỗ trợ.
Hỗ trợ tải lên từ webapp, cùng các tính năng nâng cao khác: nhận diện mặt, tìm kiếm thông mình, ảnh trùng lặp,..
(Bấm vào để mở rộng)
#
# WARNING: To install Immich, follow our guide: https://docs.immich.app/install/docker-compose
#
# Make sure to use the docker-compose.yml of the current release:
#
# https://github.com/immich-app/immich/releases/latest/download/docker-compose.yml
#
# The compose file on main may not be compatible with the latest release.
name: immich
services:
immich-server:
container_name: immich_server
image: ghcr.io/immich-app/immich-server:release
# extends:
# file: hwaccel.transcoding.yml
# service: cpu # set to one of [nvenc, quicksync, rkmpp, vaapi, vaapi-wsl] for accelerated transcoding
volumes:
# Do not edit the next line. If you want to change the media storage location on your system, edit the value of UPLOAD_LOCATION in the .env file
- CHANGE_TO_COMPOSE_DATA_PATH/immich/data:/data
- /etc/localtime:/etc/localtime:ro
environment:
DB_PASSWORD: 4dminpostgres
DB_USERNAME: postgres
DB_DATABASE_NAME: immich
FFMPEG_NUM_THREADS: 1
ports:
- '2283:2283'
depends_on:
- redis
- database
restart: always
healthcheck:
disable: false
cpus: 1.5
mem_limit: 1500m
immich-machine-learning:
container_name: immich_machine_learning
# For hardware acceleration, add one of -[armnn, cuda, rocm, openvino, rknn] to the image tag.
# Example tag: ${IMMICH_VERSION:-release}-cuda
image: ghcr.io/immich-app/immich-machine-learning:release
# extends: # uncomment this section for hardware acceleration - see https://docs.immich.app/features/ml-hardware-acceleration
# file: hwaccel.ml.yml
# service: cpu # set to one of [armnn, cuda, rocm, openvino, openvino-wsl, rknn] for accelerated inference - use the `-wsl` version for WSL2 where applicable
volumes:
- model-cache:/cache
restart: always
healthcheck:
disable: false
cpus: 1.5
mem_limit: 1500m
redis:
container_name: immich_redis
image: docker.io/valkey/valkey:9@sha256:546304417feac0874c3dd576e0952c6bb8f06bb4093ea0c9ca303c73cf458f63
healthcheck:
test: redis-cli ping || exit 1
restart: always
database:
container_name: immich_postgres
image: ghcr.io/immich-app/postgres:14-vectorchord0.4.3-pgvectors0.2.0@sha256:bcf63357191b76a916ae5eb93464d65c07511da41e3bf7a8416db519b40b1c23
environment:
POSTGRES_PASSWORD: 4dminpostgres
POSTGRES_USER: postgres
POSTGRES_DB: immich
POSTGRES_INITDB_ARGS: '--data-checksums'
# Uncomment the DB_STORAGE_TYPE: 'HDD' var if your database isn't stored on SSDs
# DB_STORAGE_TYPE: 'HDD'
volumes:
# Do not edit the next line. If you want to change the database storage location on your system, edit the value of DB_DATA_LOCATION in the .env file
- CHANGE_TO_COMPOSE_DATA_PATH/immich/postgresql/data:/var/lib/postgresql/data
shm_size: 128mb
restart: always
healthcheck:
disable: false
volumes:
model-cache:
(Tunnel của Cloudflare hỗ trợ truy cập qua tên miền từ Internet mà không cần mở port).
Vì mình dùng Cloudflared rồi nên dùng luôn Zero Trust-WARP luôn, không cần dùng dịch vụ VPN khác (nếu muốn an toàn hơn thì có thể cài thêm 1 VPN khác để backup).
Lợi ích của việc này là có thể dùng trực tiếp tên miền luôn mà không cần thay đổi tên miền sang IP cục bộ của server, hoạt động liền mạch - tốt cho những người dùng khác của bạn (Điều kiện là tên miền của bạn đang được Cloudflare quản lý). Cũng như vẫn có thể dùng tính năng đăng nhập bàng Google,.. vì bạn vẫn đang truy cập bằng tên miền mà. Vì nếu bạn dùng IP để truy cập immich thì bắt buộc phải dùng user và password.
Vì mình dùng docker nên tất cả hướng dẫn mình sẽ chỉ hướng dẫn thiết lập trên docker nhé!
Sơ đồ:
Client (điện thoại, máy tính,..) - Zero Trust WARP - Caddy - Server immich
Truy cập bằng domain public: immich.yourdomain.vn
Nhưng resolve về IP nội bộ 192.168.1.X
SSL vẫn hợp lệ từ Let's Encrypt
DNS quản lý bởi Cloudflare
Nghĩa là: Cùng một domain, nhưng trả về IP khác nhau tùy theo môi trường mạng (dùng hoặc không dùng VPN/ZeroTrust).
Zero Trust - phân giải tên miền thành IP cục bộ của server immich:
Caddy - cấp chứng chỉ SSL từ Let's Encrypt (Vì đang truy cập domain qua IP local nên SSL do Cloudflare cấp trước đó qua Tunnel không hoạt động).. thông qua Cloudflare (vì khi Let's Encrypt xác thực thông tin để cấp chứng chỉ SSL thì không truy cập được server chạy caddy vì đang proxy qua Cloudflare, Let's Encrypt chỉ thấy được Cloudflare thôi).
Thiết lập DNS policy trên Zero Trust (Cloudflare):
Cloudflare -> Zero Trust -> Traffic Policies -> Firewall policies -> DNS policy -> Create a DNS policy
Traffic: Domain
Operator : is
Value: YourDomain.com
Select an action:
Action: Override
Override Hostname: YourServerIP
=> Save policy
Tạo CLOUDFLARE_API_TOKEN:
Bạn truy cập link này, hoặc
Vào icon tài khoản của bạn trên góc phải và chọ Profile
API Tokens.
Sau đó chọn "Create Token"
Dùng Edit zone DNS templates hoặc Create Custom Token với thiết lập:
Permissions:
Zone → DNS → Edit
Zone → Zone → Read
Zone Resources: Include -> Specific zone -> youdomain.vn
Sau đó xác nhận và copy token, dùng để điền vào CLOUDFLARE_API_TOKEN trên file compose của Caddy.
Caddy - vì không có image chính thức sẵn của Caddy kèm plugin caddy-dns/cloudflare nên ta sẽ tự build image riêng.
Build image hỗ trợ DNS-Cloudflare cho Caddy bằng Dockerfile:
#Dockerfile
FROM caddy:2-builder AS builder
RUN xcaddy build \
--with github.com/caddy-dns/cloudflare
FROM caddy:2
COPY --from=builder /usr/bin/caddy /usr/bin/caddy
Caddy compose cho image tự build:
container_name: caddy - bạn thay "caddy" thành tên của image mà đặt lúc bạn build nhé. Tại mình dùng OMV thao tác qua giao diện web. Các bạn tự tìm hiểu nhé.
CLOUDFLARE_API_TOKEN=bmXjgdev1eTn_efGkkRyIbk32gneqtJCx8ndsgUe - Thay API Token mà bạn đã lấy bên trên vào.
#compose file:
services:
caddy:
container_name: caddy
image: caddy-dns
restart: always
ports:
- 80:80
- 443:443
volumes:
- CHANGE_TO_COMPOSE_DATA_PATH/caddy/Caddyfile:/etc/caddy/Caddyfile
- CHANGE_TO_COMPOSE_DATA_PATH/caddy/caddy_data:/data
- CHANGE_TO_COMPOSE_DATA_PATH/caddy/caddy_config:/config
- CHANGE_TO_COMPOSE_DATA_PATH/caddy/websites:/var/www
networks:
- caddy_net
environment:
- CLOUDFLARE_API_TOKEN=bmXjgdev1eTn_efGkkRyIbk32gneqtJCx8ndsgUe
networks:
caddy_net:
name: caddy_net
external: true
File Caddyfile:
#Bạn có thể dùng local_certs nếu không muốn dùng acme_dns cloudflare để Let's Encrypt xác thực tên miền qua Cloudflare, nhưng trình duyệt/app sẽ báo lỗi SSL gây khó chịu.
#{
# local_certs
#}
{
acme_dns cloudflare {env.CLOUDFLARE_API_TOKEN}
}
#For test
:80 {
respond "Hello, world!"
}
YourDomain.com {
# respond "Hello, world!!"
reverse_proxy YourIP:2283
}
Và thế là xong rồi!