Skip to content

照片浏览与备份

前言

  • 手里有一个树莓派4b开发版,准备将他做成aio主机,除了肩负软路由的工作外,还提供照片浏览和备份功能。
  • 因为系统是istoreos,该系统基于openwrt且自带docker,所以全部的软件都是docker的方式搭建的。

拓扑图

photobackup

2024-7-25 修改


photobackup

部署

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查看服务能够成功响应。

备份步骤

  1. 新建备份 step1
  2. 添加备份目标路径,选择webdav step2

这里不需要写http,ip地址、端口和账户密码就是前文aliyundrive-webdav配置的参数,文件夹可以随便写,该文件夹最终会在阿里云盘的根目录下创建,如果不存在,记得测试连接会自动创建。

  1. 添加备份数据源 step3

选择计算机: /source/immich目录,这里的计算机对应着容器内部的目录

  1. 设置备份时间 step4
  2. 高级设置 step5
  • 远程卷大小默认是50MB,duplicati会将备份的数据切割保存,如果数据量比较大,也可以将卷的大小设置到GB级别。
  • 参照图上配置,在duplicati自动备份后,会推送备份结果给ios端的bark,只需要修改send-http-urlhttps://api.day.app/<bark_id>就行,其他的参数不需要修改。更多参数

恢复步骤

  1. 选择需要恢复的备份记录,也可以在首页中选择restore step6
  2. 选择需要恢复的详细数据 step7
  3. 选择恢复到/backups目录 step8

这个/backups目录对应容器内的目录,大文件恢复需要设置足够的权限和足够大的空间才能正常恢复。