Duplicati 部署教程:加密备份、远端存储与文件恢复
使用 Docker 部署 Duplicati,设置备份范围、加密口令和远端目标,恢复旧版本文件。
Duplicati 适合备份什么
网站附件、配置和数据库导出文件,可以交给 Duplicati 定时备份到 SFTP 或对象存储,并保留多个时间点。正在写入的数据库先用数据库工具导出,再备份导出文件。
准备目录和登录密码
本篇使用 LinuxServer 镜像。先用 id 查看宿主用户的 UID、GID,下面 Compose 的 PUID、PGID 示例为 1000,需要按实际用户修改。
mkdir -p ~/services/duplicati
cd ~/services/duplicati
mkdir -p config restore-test
chmod 700 config restore-test
id
umask 077
printf 'SETTINGS_ENCRYPTION_KEY=%s\n' "$(openssl rand -hex 32)" > .env
printf 'DUPLICATI__WEBSERVICE_PASSWORD=%s\n' "$(openssl rand -hex 24)" >> .env
chmod 600 .env后台密码用于登录管理界面;SETTINGS_ENCRYPTION_KEY 用于加密本地敏感设置;备份任务的加密口令用于解密远端备份。三者分别保存,备份口令与存储凭据另外留在服务器之外。
启动容器并访问后台
先建立 /srv/backup-source,并让指定 UID 能读取;把需要备份的附件与数据库导出放到这个目录。保存 compose.yaml:
services:
duplicati:
image: lscr.io/linuxserver/duplicati:latest
env_file:
- .env
environment:
PUID: "1000"
PGID: "1000"
TZ: Asia/Shanghai
ports:
- "127.0.0.1:8200:8200"
volumes:
- ./config:/config
- /srv/backup-source:/source:ro
- ./restore-test:/restore-test
restart: unless-stopped后台看到的来源路径是 /source,恢复目录是 /restore-test。来源只读挂载,恢复文件写入独立目录。
docker compose config --quiet
docker compose up -d
docker compose logs --tail=80 duplicatissh -L 18200:127.0.0.1:8200 user@your-server在本机打开 http://127.0.0.1:18200,使用 .env 中的后台密码登录。8200 只绑定服务器回环地址,不需要开放公网端口。
添加远端备份任务
新建备份任务,填写名称、独立加密口令和远端存储。SFTP、S3 兼容存储分别按表单设置地址与访问凭据,点击连接测试后选择 /source 中的目录。
先运行一份小范围备份,查看结果中的未读文件、权限错误和上传失败。数据库导出先写临时文件,成功后再改成正式文件;备份计划安排在导出完成之后。
同一个远端目录由一套 Duplicati 任务维护。迁移时先停掉旧实例的计划任务,再由新实例接管。保留每日、每周和每月历史时,按文件变化量与目标容量调整。
恢复一个旧版本文件
备份一个内容明确的文本文件,修改后再次备份。进入恢复页面,选第一个时间点,将文件恢复到 /restore-test,再检查内容。
find restore-test -maxdepth 3 -type f
sha256sum restore-test/example.txtexample.txt 换成实际文件名;先用 find 找到恢复后的层级。再恢复图片和数据库导出,数据库导入到独立实例检查。原实例丢失时,可以凭远端目标、凭据和加密口令,从远端重建恢复信息。
原机已经不可用时,先找齐备份目标的完整地址、访问凭据和备份加密口令。只有后台登录密码、SETTINGS_ENCRYPTION_KEY 或本地数据库,都不能代替备份口令。若备份做了加密却丢失口令,就无法解密取回文件。
新机沿用前面的目录与回环访问方式,但在启动前把 Compose 的 image 改成原实例记录的版本或镜像摘要,不直接用 latest 替代原版本。把 /config 挂到一个新的空目录,恢复目录也单独建立。新实例的后台密码和设置加密密钥可以重新生成,备份加密口令仍用原来的。旧实例若还在运行,先停止它的计划任务,不让两套任务同时维护同一备份目标。
进入恢复页面,选择“直接从备份文件恢复”(Direct restore from backup files),重新填写原来的存储类型、目标地址与访问凭据,测试连接后输入备份加密口令。Duplicati 会从目标读取文件列表和索引,建立本次恢复需要的局部数据库;没有原来的 config,也可以走这条路径。它不会因此恢复原计划任务、通知设置或全部本地管理数据。
文件列表出现后,先在版本下拉框中选择要恢复的准确时间。默认显示最新版本,误删文件可能只存在于更早的快照中。选中需要的完整目录,将目标改成新的空目录;不要直接覆盖正在运行的站点,也不要把恢复目录放回同一个备份仓库。给恢复文件和临时下载、索引、缓存都留出空间,摘要若报告错误或警告,先查明原因再接回应用。
Duplicati 默认不恢复原权限,因为新机器的用户和组可能不同。需要保留权限时,先核对原 UID、GID 与目标账号的对应关系,再启用相应选项并检查结果;不要只凭用户名相同就认为属主一致,也不要用全目录放宽权限代替排查。
文件哈希相符后,再验证数据库导出。若备份的是 SQLite 的 SQL 导出,可在已安装 sqlite3 的环境中导入一份新的检查库;下面的 database.sql 路径要按 find 的实际结果修改,不能指向应用正在使用的数据库。
set -eu
sql_file=restore-test/database.sql
test -f "$sql_file"
test ! -e restore-check.sqlite
sqlite3 restore-check.sqlite < "$sql_file"
sqlite3 restore-check.sqlite 'PRAGMA integrity_check;'完整性检查通过后,还要查看关键表和业务记录。PostgreSQL、MySQL 等导出应使用对应工具导入独立测试实例;取回一个 SQL 文件不等于数据库或应用已经恢复。确认数据后,再安排应用切换与新的备份计划。
这条“无原配置恢复文件”的路径已用 LinuxServer Duplicati 2.4.0.1(v2.4.0.1_stable_2026-10-07-ls313)做过 ARM64 本地命令行验证:从加密仓库副本、空客户端配置恢复两个历史版本,逐项比对文件内容和权限,并将两份 SQLite 导出分别导入新库检查。这里验证的是本地文件仓库的文件恢复;后台界面、SFTP、S3 与计划任务迁移仍须在各自环境中核验。
保存配置与迁移任务
本地 config 保存任务设置与数据库。停止容器后归档 config、.env 与 Compose 文件:
docker compose stop duplicati
mkdir -p local-config-backups
tar -czf "local-config-backups/duplicati-config-$(date +%F-%H%M%S).tar.gz" config .env compose.yaml
docker compose start duplicati将归档转移到服务器之外并限制访问。重建时沿用原 config 和设置加密密钥;升级前保存镜像版本及配置,更新后检查下一次计划任务的运行结果。
能正常访问后台时,也可以额外导出任务配置,省去重建时重新填写存储地址和选项。导出文件若另行加密,其密码不一定与备份加密口令相同,两者要分别记录。导出配置不能代替远端备份文件;只想抢救文件时,也不必先把计划任务重新启动。
