备份完整安装
记录应用版本及源码、运行配置与数据位置。使用数据库引擎支持的一致性备份方式,并包括本地附件目录或 S3 对象。部署设置与恢复所需秘密应单独保护。副本不要只保存在唯一的应用主机上。个人笔记导出有帮助,但不是完整安装备份。
SQLite 一致性
不要在写入进行中只复制主数据库文件,并假定内容完整。应使用 SQLite 支持的备份机制,或干净停止应用后保存完整数据库状态。如果选择停机备份,在相关文件快照完成前保持停止。依赖该流程前,先用非生产数据测试。
先隔离恢复
先恢复到独立数据目录或数据库,并使用不公开的监听地址。测试恢复时避免触发 Webhook 或邮件。检查登录、笔记数量、抽样正文、时间、附件和权限边界,确认后再切换用户访问。备份任务无报错结束,不等于备份一定能恢复。
默认 Docker SQLite 部署的停机备份
本流程仅适用于容器名 memos、镜像 memos:local,并且 SQLite 与本地附件都位于快速开始创建的 memos-data 卷内的情况。流程会主动停止写入;不包含远程数据库、卷外附件、S3 对象及单独挂载的密钥,使用这些配置时需另行备份。先确认磁盘空间并安排维护窗口。辅助容器使用已经构建的镜像、绕过应用入口且不联网。
set -eu
BACKUP_DIR="$PWD/backups/$(date -u +%Y%m%dT%H%M%SZ)"
mkdir -p "$BACKUP_DIR"
chmod 700 "$BACKUP_DIR"
docker stop --time 60 memos
test "$(docker inspect memos --format '{{.State.Running}}')" = false
docker run --rm --network none --entrypoint /bin/sh \
-v memos-data:/source:ro \
--mount type=bind,src="$BACKUP_DIR",dst=/backup memos:local -c 'tar -C /source -czf /backup/memos-data.tgz .'
tar -tzf "$BACKUP_DIR/memos-data.tgz"
# Restart only after the archive command and listing succeed.
docker start memos恢复到全新的卷
让 BACKUP_DIR 指向上一步的备份目录。下面由 Docker 生成全新的卷名,记录打印的名称,方便后续复核及清理。使用这个新目标卷,不要覆盖解压到生产卷。下面先恢复文件而不启动应用,再禁用网络运行二进制的只读 SQLite inspect 命令。期望输出包含 readOnly: true 与 quickCheck: "ok"。数据库缺失或完整性检查失败,都表示恢复未通过;保留原安装不动。
set -eu
: "${BACKUP_DIR:?Set BACKUP_DIR to the completed backup directory}"
RESTORE_VOLUME="$(docker volume create)"
printf 'Restore volume: %s\n' "$RESTORE_VOLUME"
docker run --rm --network none --entrypoint /bin/sh \
-v "$RESTORE_VOLUME:/restore" \
--mount type=bind,src="$BACKUP_DIR",dst=/backup,readonly memos:local -c 'tar -C /restore -xzf /backup/memos-data.tgz'
docker run --rm --network none \
--entrypoint /usr/local/memos/memos \
-v "$RESTORE_VOLUME:/restore" memos:local inspect --database /restore/memos_prod.db在不联网的条件下启动恢复实例
inspect 通过后,保持 RESTORE_VOLUME 指向新卷,使用匹配镜像和 --network none 启动,不发布任何端口。打包镜像含 wget,可在容器内部执行健康检查。如果首次检查早于启动完成,应先读日志再重试。本步验证实际应用启动,同时阻止恢复的 Webhook、邮件及提供方流量到达其他主机。检查后停止测试容器,保留卷用于复核。禁用网络期间无法验证 SSO、S3 或浏览器登录;宣布恢复验收通过前,还需在单独受控测试网络完成这些检查。
docker run -d --name memos-restore-check --network none \
-e MEMOS_DRIVER=sqlite -e MEMOS_PORT=5230 \
-v "$RESTORE_VOLUME:/var/opt/memos" memos:local
docker logs --tail 100 memos-restore-check
docker exec memos-restore-check wget -qO- http://127.0.0.1:5230/healthz
docker stop --time 60 memos-restore-check完成恢复演练
完整性检查不能验证每条笔记及附件。应在阻止向外投递的独立测试环境中,用匹配的应用构建和配置启动恢复数据,比较用户数、已知笔记的文本与日期、本地附件以及私人/空间权限,监听端口保持不公开。完成这些检查后再计划生产切换。备份包、配置记录及匹配镜像要一起保留,并把备份复制到本机之外。命名卷行为可参考 Docker 卷指南。