照片浏览与备份
前言
- 手里有一个树莓派4b开发版,准备将他做成aio主机,除了肩负软路由的工作外,还提供
照片浏览和备份
功能。 - 因为系统是
istoreos
,该系统基于openwrt且自带docker,所以全部的软件都是docker的方式搭建的。
拓扑图
2024-7-25 修改
部署
immich
基于如下几个特点选择了immich:
- immich支持通过android、ios和web端实现照片上传和备份功能。
- ios端的app支持
前台和后台自动备份
,特别是后台备份,无须打开app也能定时将相册中的图片上传到immich服务端。 - 基于
docker-compose
的部署方式,同时通过机器学习实现人物识别。 - 界面简洁且美观,操作方便,同时支持图片流的形式。
警告
immich作者不推荐将immich作为唯一
的备份方式,因为immich还处在开发与bug修复阶段。
基于下面的配置,使用docker-compose up -d
命令启动immich服务。
bash
# 只需要设置这个参数即可,其他没必要修改,我设置为/mnt/sata1/immich
UPLOAD_LOCATION=<local_path_to_store_photo>
IMMICH_VERSION=release
DB_PASSWORD=postgres
DB_HOSTNAME=immich_postgres
DB_USERNAME=postgres
DB_DATABASE_NAME=immich
REDIS_HOSTNAME=immich_redis
bash
version: "3.8"
name: immich
services:
immich-server:
container_name: immich_server
image: ghcr.io/immich-app/immich-server:${IMMICH_VERSION:-release}
command: [ "start.sh", "immich" ]
volumes:
- ${UPLOAD_LOCATION}:/usr/src/app/upload
env_file:
- .env
ports:
- 2283:3001
depends_on:
- redis
- database
restart: always
immich-microservices:
container_name: immich_microservices
image: ghcr.io/immich-app/immich-server:${IMMICH_VERSION:-release}
# extends: # uncomment this section for hardware acceleration - see https://immich.app/docs/features/hardware-transcoding
# file: hwaccel.transcoding.yml
# service: cpu # set to one of [nvenc, quicksync, rkmpp, vaapi, vaapi-wsl] for accelerated transcoding
command: [ "start.sh", "microservices" ]
volumes:
- ${UPLOAD_LOCATION}:/usr/src/app/upload
env_file:
- .env
depends_on:
- redis
- database
restart: always
immich-machine-learning:
container_name: immich_machine_learning
# For hardware acceleration, add one of -[armnn, cuda, openvino] to the image tag.
# Example tag: ${IMMICH_VERSION:-release}-cuda
image: ghcr.io/immich-app/immich-machine-learning:${IMMICH_VERSION:-release}
# extends: # uncomment this section for hardware acceleration - see https://immich.app/docs/features/ml-hardware-acceleration
# file: hwaccel.ml.yml
# service: cpu # set to one of [armnn, cuda, openvino, openvino-wsl] for accelerated inference - use the `-wsl` version for WSL2 where applicable
volumes:
- model-cache:/cache
env_file:
- .env
restart: always
redis:
container_name: immich_redis
image: redis:6.2-alpine@sha256:afb290a0a0d0b2bd7537b62ebff1eb84d045c757c1c31ca2ca48c79536c0de82
restart: always
database:
container_name: immich_postgres
image: tensorchord/pgvecto-rs:pg14-v0.1.11@sha256:0335a1a22f8c5dd1b697f14f079934f5152eaaa216c09b61e293be285491f8ee
env_file:
- .env
environment:
POSTGRES_PASSWORD: ${DB_PASSWORD}
POSTGRES_USER: ${DB_USERNAME}
POSTGRES_DB: ${DB_DATABASE_NAME}
volumes:
- pgdata:/var/lib/postgresql/data
restart: always
volumes:
pgdata:
model-cache:
访问IP:2283查看immich是否能够成功响应。
icloudpd
bash
docker run -d \
--name icloud-backup \
--restart=always \
-e notification_days=14 \
-e notification_type=Bark \
-e notification_title=icloud_backup \
-e bark_server=api.day.app \
-e bark_device_key=<bark_id> \
-e auth_china=True \
-e apple_id="<icloud_id>" \
-e authentication_type=2FA \
-e folder_structure={:%Y/%m} \
-e auto_delete=True \
-e synchronisation_interval=43200 \
-e icloud_china=True \
-e TZ=Asia/Shanghai \
-e download_path=/home/root/iCloud \
-v <icloudpd_config_path>:/config \
-v <icloudpd_download_path>:/home/root/iCloud \
pjoc/docker-icloudpd:master
国区的icloud需要特殊设置下,如果是第一次启动,需要执行
sync-icloud.sh --Initialise
命令,操作提示登陆账户(默认90天过期)。如果过期了命令行执行sync-icloud.sh
重新登陆下即可。
immich_upload
bash
docker run -d \
--name immich_upload \
-e INSTANCE_URL=<INSTANCE_URL> \
-e API_KEY=<API_KEY> \
-e CRON=<CRON> \
-v <UPLOAD_DIR>:/home
xiaokexiang/immich_upload:latest
- 基于immich cli工具定时将照片上传到immich。
- INSTANCE_URL: http://<immich_ip>:2283/api
- API_KEY: How to Obtain API_KEY
- UPLOAD_DIR: 这里就是icloudpd设置的download_path地址。
- CRON: 基于corn的表达式,默认"30 1 * * *"
aliyundrive-webdav
bash
docker run -d --name=webdav -p 8888:8080 \
-v /root/conf/aliyundrive-webdav/:/etc/aliyundrive-webdav/ \
-e REFRESH_TOKEN='<refresh_token>' \
-e WEBDAV_AUTH_USER=admin \
-e WEBDAV_AUTH_PASSWORD=admin \
messense/aliyundrive-webdav
需要获取阿里云盘的token信息,点击此处或进入容器执行
aliyundrive-webdav qr login
获取 访问IP:8888查看webdav能够成功响应
duplicati
bash
docker run -d \
--name=duplicati \
-e PUID=0 \
-e PGID=0 \
-e TZ=Asia/Shanghai \
-e CLI_ARGS= `#optional` \
-p 8200:8200 \
-v <duplicati_config_path>:/config \
-v <duplicati_backups>:/backups \
-v <duplicati_source>:/source \
-v <duplicati_tmp>:/tmp \
--restart unless-stopped \
lscr.io/linuxserver/duplicati:latest
- PUID和PGID这里就使用root,如果使用其他用户,千万记得要有写权限,否则恢复备份的时候是没有权限创建文件。
- 上传时duplicati默认使用/tmp(--tempdir设置)目录存放临时文件,如果上传文件过大,可能会出现
disk full
的错误提示,因为树莓派本身用的sd卡,存储不够,所以我将tmp目录挂载到外接ssd上。
访问IP:8200查看服务能够成功响应。
备份步骤
- 新建备份
- 添加备份目标路径,选择webdav
这里不需要写http,ip地址、端口和账户密码就是前文
aliyundrive-webdav
配置的参数,文件夹可以随便写,该文件夹最终会在阿里云盘的根目录下创建,如果不存在,记得测试连接
会自动创建。
- 添加备份数据源
选择计算机: /source/immich目录,这里的计算机对应着容器内部的目录
- 设置备份时间
- 高级设置
- 远程卷大小默认是50MB,duplicati会将备份的数据切割保存,如果数据量比较大,也可以将卷的大小设置到GB级别。
- 参照图上配置,在duplicati自动备份后,会推送备份结果给ios端的bark,只需要修改
send-http-url
为https://api.day.app/<bark_id>
就行,其他的参数不需要修改。更多参数
恢复步骤
- 选择需要恢复的备份记录,也可以在首页中选择restore
- 选择需要恢复的详细数据
- 选择恢复到/backups目录
这个/backups目录对应容器内的目录,大文件恢复需要设置足够的权限和足够大的空间才能正常恢复。