跳转到主要内容

备份脚本

Borg 是一个功能丰富的重复数据删除归档软件,具有内置的版本控制功能。我们提供了一个模板 bash 脚本,可以作为每日/每周的 cron 作业运行,用于备份您的文件和数据库。在运行此脚本之前,我们建议您阅读 Borg 的快速入门指南。

此脚本假设您有一个连接到服务器的第二硬盘用于现场备份,并通过 ssh 访问远程机器用于第三个异地副本。BorgBase 是一个异地备份的替代选项,其价格结构具有竞争力。您可以选择完全跳过异地备份,只需从模板脚本中删除相关的行即可。

数据库保存到您的 Immich 上传文件夹中的 database-backup 子目录。然后,数据库会与您的资源一起通过 Borg 进行备份和版本化。这确保了每个快照中的数据库备份与您的资源保持同步。

信息

此脚本会将您的数据库与您的照片/视频库一起备份。这与 Immich 内置的自动数据库备份工具重复。使用此脚本备份您的数据库相比内置备份工具有两个优势:

  • 此脚本通过版本控制您的备份而不是创建多个副本来更有效地使用存储空间。
  • 数据库备份与库备份同时执行,确保数据库和库的备份始终同步。

因此,如果您使用此脚本,则可以安全地从管理面板关闭内置的自动数据库备份功能,以节省存储空间。

前提条件

  • Borg需要安装在您的服务器以及远程机器上。您可以在此处找到安装Borg的说明。-(可选)若要以非 root 用户运行此脚本,您需要将您的用户名添加到 docker 组
  • 若要非交互地运行此脚本,请从您的服务器设置免密码的 ssh访问到远程机器。如果跳过了前一步,请确保此步骤是从您的 root 帐户完成的。

要初始化Borg存储库,请运行以下命令一次。

Borg 设置
UPLOAD_LOCATION="/path/to/immich/directory"       # Immich 数据库位置,设置于您的 .env 文件中
BACKUP_PATH="/path/to/local/backup/directory"

mkdir "$UPLOAD_LOCATION/database-backup"
borg init --encryption=none "$BACKUP_PATH/immich-borg"

## 远程设置
REMOTE_HOST="remote_host@IP"
REMOTE_BACKUP_PATH="/path/to/remote/backup/directory"

borg init --encryption=none "$REMOTE_HOST:$REMOTE_BACKUP_PATH/immich-borg"

根据需要编辑以下脚本,并将其添加到您的 crontab。请注意,此脚本假设您的路径中没有 :@" 字符。如果这些字符存在,您需要转义和/或重命名路径。

Borg 备份模板
#!/bin/sh

# 路径
UPLOAD_LOCATION="/path/to/immich/directory"
BACKUP_PATH="/path/to/local/backup/directory"
REMOTE_HOST="remote_host@IP"
REMOTE_BACKUP_PATH="/path/to/remote/backup/directory"


### 本地备份

# 备份 Immich 数据库
docker exec -t immich_postgres pg_dumpall --clean --if-exists --username=<DB_USERNAME> > "$UPLOAD_LOCATION"/database-backup/immich-database.sql
# 对于诸如 Borg 或 Restic 的重复数据删除备份程序,压缩内容可能会增加备份大小,使得更难删除重复数据。如果您使用的是其他程序或仍然希望压缩,可以使用以下命令替代:
# docker exec -t immich_postgres pg_dumpall --clean --if-exists --username=<DB_USERNAME> | /usr/bin/gzip --rsyncable > "$UPLOAD_LOCATION"/database-backup/immich-database.sql.gz

### 添加到本地 Borg 存储库
borg create "$BACKUP_PATH/immich-borg::{now}" "$UPLOAD_LOCATION" --exclude "$UPLOAD_LOCATION"/thumbs/ --exclude "$UPLOAD_LOCATION"/encoded-video/
borg prune --keep-weekly=4 --keep-monthly=3 "$BACKUP_PATH"/immich-borg
borg compact "$BACKUP_PATH"/immich-borg


### 添加到远程 Borg 存储库
borg create "$REMOTE_HOST:$REMOTE_BACKUP_PATH/immich-borg::{now}" "$UPLOAD_LOCATION" --exclude "$UPLOAD_LOCATION"/thumbs/ --exclude "$UPLOAD_LOCATION"/encoded-video/
borg prune --keep-weekly=4 --keep-monthly=3 "$REMOTE_HOST:$REMOTE_BACKUP_PATH"/immich-borg
borg compact "$REMOTE_HOST:$REMOTE_BACKUP_PATH"/immich-borg

恢复

要从备份中恢复,请使用 borg mount 命令。

从本地备份恢复
BACKUP_PATH="/path/to/local/backup/directory"
mkdir /tmp/immich-mountpoint
borg mount "$BACKUP_PATH"/immich-borg /tmp/immich-mountpoint
cd /tmp/immich-mountpoint
从远程备份恢复
REMOTE_HOST="remote_host@IP"
REMOTE_BACKUP_PATH="/path/to/remote/backup/directory"
mkdir /tmp/immich-mountpoint
borg mount "$REMOTE_HOST:$REMOTE_BACKUP_PATH"/immich-borg /tmp/immich-mountpoint
cd /tmp/immich-mountpoint

您可以在 /tmp/immich-mountpoint 下的单独子目录中找到可用的快照。恢复您需要的文件,并使用 borg umount /tmp/immich-mountpoint 卸载 Borg 存储库。