
WeKan Snap 数据库备份与恢复实战从 mongodump 手动操作到 Snap 内置命令【免费下载链接】wekanThe Open Source kanban, built with Meteor. GitHub issues/PRs are only for FLOSS Developers, not for support, support is at https://wekan.fi/commercial-support/ . PR source translation to imports/i18n/data/en.i18n.json, other translations at https://app.transifex.com/wekan/wekan项目地址: https://gitcode.com/GitHub_Trending/we/wekan本文围绕 WeKan 官方 Snap 发布形式下的数据库备份与恢复系统讲解三种可用方案基于 MongoDB 客户端mongodump/mongorestore的脚本化备份、手动停止服务后的目录式备份与恢复、以及 Snap 自带的wekan.database-backup/wekan.database-list-backups/wekan.database-restore命令。读完本文你可以直接复制可用的备份脚本与恢复命令并理解这些命令在 Snap 包内部snapcraft.yaml、snap-src/bin/mongodb-backup 等的实际执行逻辑从而在升级、迁移或数据损坏时可靠地保护 WeKan 数据。Docker 部署方式的备份可另行参考 Docker Backup and Restore。备份对象为什么是端口 27019WeKan Snap 与外部工具mongodump、mongorestore交互的数据库端口默认是27019而不是 MongoDB 的默认端口 27017。这一点可以直接从 Snap 的配置脚本得到确认snap-src/bin/config 中定义了DEFAULT_MONGODB_PORT27019对应 snap 设置键为mongodb-port描述为 mongodb binding port: eg 27017 when using localhostsnap-src/bin/wekan-read-settings 通过snapctl get读取该键值未设置时回落到默认值 27019并导出为环境变量MONGODB_PORT。因此下文所有--port 27019的示例均针对 Snap 的默认配置如果你在 Snap 中设置了mongodb-port或在源码安装环境中运行 MongoDB请相应替换端口号例如源码安装常用 27017。另外从 snapcraft.yaml 的服务注释可以看到Snap 内的 MongoDB 服务与 FerretDB v1 服务绑定同一个端口、同一时刻只有一个在运行因此mongodump --port 27019对当前实际承载数据的那个数据库同样适用。方案一基于 MongoDB 客户端的脚本化备份这是原始文档推荐的常规做法适合用 crontab 定时执行。1. 安装 MongoDB 命令行工具按 MongoDB 官方文档在 Ubuntu 上安装 MongoDB 客户端原文档以 MongoDB 3.2.x 的 shell 安装为例实际使用 4.x/5.x 的 Database Tools 亦可只需保证 mongodump 与 mongorestore 可用。安装后mongodump、mongorestore需要能在系统 PATH 中找到。2. 备份脚本Snap MongoDB 运行在端口 27019将以下脚本保存为backup.sh并赋予可执行权限即可每次生成一个带时间戳的目录备份和 zip 归档#!/bin/bash now$(date %Y-%m-%d_%H.%M.%S) mkdir -p backups/$now cd backups/$now mongodump --port 27019 # if running on source install, run for example: mongodump --port 27017) cd .. zip -r $now.zip $now cd ../.. echo \nBACKUP DONE. echo Backup is at directory backups/${now}. echo Backup is also archived to .zip file backups/${now}.zip脚本要点now$(date %Y-%m-%d_%H.%M.%S)生成可读的时间戳作为备份目录名与 zip 归档名mongodump --port 27019将 Snap 内 MongoDB 的全部数据以 BSON 格式导出到当前目录对源码安装环境改为mongodump --port 27017最后用zip -r将目录压缩归档便于传输到异地。需要指出该脚本在运行中的数据库上直接执行 mongodumpMongoDB 的 dump 操作本身是快照一致的因此无需为此停止 WeKan。方案二手动停止服务后备份与恢复当需要一份绝对静止的备份、或数据库正在做恢复时原始文档给出的是停服务 → 备份/恢复 → 起服务的流程。1. 停止 WeKan 并导出到目录 dumpsudo snap stop wekan.wekan mongodump --port 27019 sudo snap start wekan.wekanmongodump默认在当前目录生成dump/子目录其中按数据库和集合组织 BSON 文件。2. 停止 WeKan 并恢复sudo snap stop wekan.wekan ## Only if you get errors about existing indexes, use this instead: ## mongorestore -d wekan --drop --noIndexRestore --port 27019 mongorestore -d wekan --drop --port 27019 sudo snap start wekan.wekan参数含义-d wekan恢复到名为wekan的数据库WeKan 的库名--drop恢复前先 drop 目标集合。Snap 内置恢复脚本 snap-src/bin/mongodb-restore 中的注释解释了使用--drop的原因当备份中的索引定义与现网索引不一致例如 schema 迁移后 unique 标志变化时不带--drop会触发IndexKeySpecsConflict错误注释中给出的替代方案mongorestore -d wekan --drop --noIndexRestore --port 27019跳过索引恢复。该脚本注释进一步说明如果你需要保留现有数据、并愿意让 WeKan 在下次启动时自行重建索引可以用--noIndexRestore代替--drop。恢复完成后执行sudo snap start wekan.wekan重启服务即可。方案三Snap 内置备份命令wekan.database-*Snap 包把数据库备份、列举、恢复封装成了三个独立 app定义在 snapcraft.yaml 的apps段中database-backup→./bin/mongodb-backupdatabase-list-backups→./bin/database-list-backupsdatabase-restore→./bin/mongodb-restore这些命令由普通用户非 root执行原始文档同时提示这是less reliable, can disappear with snap remove的方案——备份存放在 Snap 的公共数据目录里执行snap remove wekan时该目录会被一并删除因此重要备份应另行拷出系统。1. 准备备份目录$ sudo mkdir /var/snap/wekan/common/db-backups $ sudo chmod 777 /var/snap/wekan/common/db-backups/var/snap/wekan/common即脚本中的$SNAP_COMMON是 Snap 跨修订版本持久保存的目录chmod 777是为了让以普通用户身份运行的备份 app 可以写入。2. 创建备份$ wekan.database-backup备份文件生成在/var/snap/wekan/common/db-backups。也支持传入可选的备份文件名参数wekan.database-backup BACKUPFILENAME不过原始文档提示该参数probably it does not work建议以后台默认命名为准。结合源码可以看到它实际做了什么。snap-src/bin/mongodb-backup 的关键逻辑是if [ -z $1 ]; then DATE/bin/date %Y%m%dT%H%M%S mkdir -p $SNAP_COMMON/db-backups/ ARCHIVE$SNAP_COMMON/db-backups/wekan-$DATE.backup else ARCHIVE$1 fi [ x x${MONGODB_BIND_IP} ] MONGODB_BIND_IP127.0.0.1 mongodump --host $MONGODB_BIND_IP --port $MONGODB_PORT -d wekan --gzip --archive${ARCHIVE}不传参数时生成形如/var/snap/wekan/common/db-backups/wekan-20260913T152000.backup的文件注意这与方案一/二不同内置命令产出的是单个 gzip 压缩的 archive 文件--gzip --archive...而不是dump/目录--host取 snap 设置mongodb-bind-ip未设置时默认127.0.0.1--port取MONGODB_PORT默认 27019见上文 snap-src/bin/config脚本开头还source $SNAP/bin/wekan-read-settings读取全部 snap 设置并把$SNAP/bin含随包发布的 MongoDB Database Tools见 snapcraft.yaml 中 wekan part 对mongodump/mongorestore等工具移入bin/的处理加入 PATH因此无需在系统上另装 mongodump。3. 列出已有备份$ wekan.database-list-backups该命令要求至少已经存在一次备份否则会报错目录不存在时列举失败。从实现看snap-src/bin/database-list-backups 的全部内容就是对备份目录执行ls -al $SNAP_COMMON/db-backups/所以输出就是标准的目录列表。4. 恢复备份$ wekan.database-restore FULL-PATH-TO-BACKUP-FILENAME参数必须是备份文件的完整路径。snap-src/bin/mongodb-restore 的校验与恢复逻辑if [[ $# -ne 1 ]]; then echo Usage: ${SNAP_INSTANCE_NAME:-wekan}.database-restore FULL-PATH-TO-BACKUP-FILENAME 2 exit 2 fi archive$1 if [[ ! -f $archive ]]; then echo Backup archive does not exist or is not a file: $archive 2 exit 2 fi [ x x${MONGODB_BIND_IP} ] MONGODB_BIND_IP127.0.0.1 echo using bind ip: $MONGODB_BIND_IP port: $MONGODB_PORT # --drop: drop each collection before restoring to avoid IndexKeySpecsConflict # when the dumps index specs differ from the existing index definitions # (e.g. unique flag mismatch after a schema migration). # Add --noIndexRestore instead of --drop if you need to preserve existing data # and are happy to let WeKan rebuild indexes on next startup. mongorestore --host $MONGODB_BIND_IP --port $MONGODB_PORT -d wekan --drop --gzip --archive$archive要点参数个数不为 1、或路径不是文件时直接以退出码 2 失败用法错误不会误触恢复恢复使用--drop即先 drop 集合再写入与方案二的mongorestore -d wekan --drop行为一致规避索引定义冲突脚本注释同样给出--noIndexRestore的替代语义保留现有数据、由 WeKan 下次启动时重建索引。三种方案对比与使用建议方案产出形式是否需要停止 WeKan存放位置注意事项mongodump 脚本方案一dump/目录 zip 归档不需要你自己指定的backups/目录需要系统装有 mongodump/zip端口按环境替换手动 stop/restore方案二dump/目录需要snap stop wekan.wekan当前工作目录恢复时如遇索引错误改用--noIndexRestoreSnap 内置命令方案三单个.backupgzip archive不需要/var/snap/wekan/common/db-backupssnap remove wekan会连备份一起删除务必另行拷出实操建议无论采用哪种方案恢复前都先做一次备份确保回退路径存在方案三的 archive 文件位于 Snap 沙箱内定期将其复制到 Snap 外的路径如 NAS、对象存储才是完整备份策略升级 Snap 版本前后各执行一次备份是最稳妥的做法恢复后如遇索引相关报错按上文--noIndexRestore变体重试更多 Snap 运行相关的配置项可以通过wekan.help即 snap-src/bin/wekan-help 脚本查看其中也再次列出了三个数据库备份命令的用法。参考文件原始备份文档、snapcraft.yaml、mongodb-backup 脚本、mongodb-restore 脚本、database-list-backups 脚本、config 配置、wekan-read-settings。【免费下载链接】wekanThe Open Source kanban, built with Meteor. GitHub issues/PRs are only for FLOSS Developers, not for support, support is at https://wekan.fi/commercial-support/ . PR source translation to imports/i18n/data/en.i18n.json, other translations at https://app.transifex.com/wekan/wekan项目地址: https://gitcode.com/GitHub_Trending/we/wekan创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考