Wekan Docker MongoDB 数据导出、备份与恢复实战指南
2026/9/14 6:32:15 网站建设 项目流程

Wekan Docker MongoDB 数据导出、备份与恢复实战指南

【免费下载链接】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

导读

本文以仓库 Export-Docker-Mongo-Data.md 为核心,系统讲解 Wekan(基于 Meteor 的开源看板)在 Docker 部署形态下的 MongoDB 数据导出(mongodump)、恢复(mongorestore)与自动备份脚本的完整流程。读完本文,你将掌握:如何在容器内外迁移 Wekan 数据库、如何用docker cp搬运 dump 文件、如何解决恢复时的索引冲突,以及如何编写"超过 7 天自动清理"的备份/恢复脚本,并了解当前仓库中 MongoDB 与 FerretDB 两种数据库后端的备份差异。


一、备份前的关键检查(Important info)

Wekan 的数据全部存放在 MongoDB 容器中,而不是应用容器中。因此在任何导入、恢复操作之前,必须遵守两条铁律:

  1. 先停止 Wekan 应用容器再导入数据库

    docker stop wekan-app

    否则应用进程正在持有数据库连接与写入,恢复时可能出现数据不一致或锁冲突。

  2. 核对 MongoDB 数据库名称。请检查你的start-wekan.sh、docker-compose.yml 或类似启动脚本中的MONGO_URL,确认数据库名是adminwekan还是其他名字。恢复时若不使用正确的库名,恢复结果将是空数据库——这是最容易踩的坑:备份时对wekan库执行mongodump,恢复时却写入了admin库,前端看起来就是"数据全没了"。

Docker 数据目录的风险提示

Docker 容器数据位于宿主机的/var/lib/docker,其中包含可能难以恢复的重要数据。相比直接翻找该目录,恢复 mongodump 文件要容易得多。因此官方强烈建议:

  • mongodump文件作为备份载体(仓库 docs/Backup/Backup.md 也给出了完整的备份方案);
  • 备份时注意保留文件与目录的权限(例如复制时使用cp -ptar -p),否则恢复后可能因权限问题无法读取。

二、本地快速搭建 Wekan + MongoDB 容器

先从零搭建一个可复现的环境。下面的命令会启动两个容器:wekan-db(MongoDB 3.2.18)与wekan-app(Wekan 应用,通过--link连接数据库),访问地址为http://localhost:8080/(如需换端口,修改脚本中的8080即可):

docker run -d --restart=always --name wekan-db mongo:3.2.18 docker run -d --restart=always --name wekan-app --link "wekan-db:db" -e "MONGO_URL=mongodb://db" -e "ROOT_URL=http://localhost:8080" -p 8080:80 wekanteam/wekan:latest

版本说明(以当前仓库为准):上例中的mongo:3.2.18是文档撰写时的历史版本。当前仓库默认的 docker-compose.yml 已改用 FerretDB v1 + SQLite(MongoDB 线协议兼容层),而经典 MongoDB 部署使用 docker-compose-mongodb-v7.yml 中的mongo:7镜像(容器名wekan-db),并启用了单节点副本集rs0。备份与恢复思路完全一致,但连接串、认证方式需按各自配置文件调整。

确认容器状态:docker ps

docker ps

输出示例(实际 ID 会不同):

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 1234wekanid wekanteam/wekan:latest "/bin/sh -c 'bash $ME" About an hour ago Up 46 minutes 0.0.0.0:8080->80/tcp wekan-app 4321mongoid mongo "/entrypoint.sh mongo" About an hour ago Up 46 minutes 27017/tcp wekan-db

docker ps -a可以连停止的容器一并列出——这正是后面备份/恢复脚本判断wekan-db是否在运行的依据(docker ps -a | grep 'wekan-db')。

从当前仓库的 docker-compose-mongodb-v7.yml 可以看到,MongoDB 7 版本中wekan-db容器还挂载了两个卷:wekan-db:/data/db(数据目录)与wekan-db-dump:/dump(dump 目录),并带有健康检查(等待副本集选出主节点后才允许 Wekan 启动)。


三、进入 MongoDB 容器并浏览数据

1. 进入数据库容器

docker exec -it wekan-db bash

2. 可选:用 mongo shell 浏览数据

进入容器后启动 MongoDB 客户端(mongo是 MongoDB 3.x 的客户端命令,MongoDB 6+ 镜像中已更名为mongosh):

> mongo <==== START MONGO CLI MongoDB shell version: 3.2.18 connecting to: test Server has startup warnings: ... > show dbs <=== SHOW DATABASES admin 0.034GB local 0.000GB > use admin <=== CHANGE TO USE ADMIN DATABASE switched to db admin > show collections <=== SHOWS TABLES activities boards card_comments cards cfs._tempstore.chunks cfs.attachments.filerecord cfs_gridfs._tempstore.chunks cfs_gridfs._tempstore.files cfs_gridfs.attachments.chunks cfs_gridfs.attachments.files esCounts lists meteor-migrations meteor_accounts_loginServiceConfiguration presences users > db.users.find() <=== LISTS ALL USERS (list of all users here) > exit <=== EXIT MONGO CLI

show collections的输出可以看到 Wekan 的核心数据集合:boards(看板)、lists(列表)、cards(卡片)、card_comments(卡片评论)、activities(活动记录)、users(用户),以及cfs.*/cfs_gridfs.*(GridFS 附件存储)等。meteor-migrations集合记录数据库结构迁移版本,恢复备份时它必须与当前 Wekan 版本的迁移状态兼容。

当前仓库中,附件等文件数据既可能存在 GridFS(cfs_gridfs.attachments.*),也可能存在文件系统。默认 docker-compose.yml 通过WRITABLE_PATH=/data将附件落到宿主机卷wekan-files:/data上,因此现代部署中"备份数据库 + 备份文件卷"需要同时进行(详见 Meteor3/backup.sh,它在mongodump之后用cp -pR "/var/lib/docker/volumes/${DB_PARAM}_wekan-files/_data/files"一并拷贝附件目录)。


四、用 mongodump 导出数据库

1. 切换到根目录

cd /

2. 执行备份

在容器内执行mongodump,把数据库导出到容器内的/dump目录。注意:只包含名为wekan的数据库,不包含local系统库

mongodump -o /dump/

3. 退出容器

exit

4. 把备份目录拷出容器

回到宿主机,把容器内的/dump目录复制到当前目录:

docker cp wekan-db:/dump .

docker cp是容器与宿主机之间双向拷贝文件的官方方式:docker cp <容器名>:<容器内路径> <宿主机路径>导出,docker cp <宿主机路径> <容器名>:<容器内路径>导入。


五、用 mongorestore 恢复数据库

方案 9a:恢复到原数据库

  1. 先把宿主机上的dump目录拷回容器内的/data/

    docker cp dump wekan-db:/data/
  2. 进入数据库容器并切换到数据目录:

    docker exec -it wekan-db bash cd /data
  3. 执行恢复。恢复前必须先docker stop wekan-app

    mongorestore --drop --db wekan /data/dump/wekan/ exit

    参数说明:

    • --drop:恢复前先删除目标库中已有集合,避免新旧数据混叠(配合先停止应用容器使用,防止正在写入);
    • --db wekan:显式指定目标数据库名,必须与MONGO_URL中的库名一致;
    • 若恢复过程中报"索引已存在(index already exists)"错误,改用以下命令跳过索引恢复(--noIndexRestore),恢复完成后由 Wekan 启动时重新创建索引:
    ## Only if you get errors about existing indexes, use this instead: ## mongorestore --drop --noIndexRestore --db wekan /data/dump/wekan/ mongorestore --drop --db wekan /data/dump/wekan/

    库名可以是wekan或其他任意合法库名,只要与启动配置中的MONGO_URL保持一致。例如 docker-compose.yml 中默认MONGO_URL=mongodb://ferretdb:27017/wekan,则目标库名即wekan

副本集场景补充(基于当前仓库):docker-compose-mongodb-v7.yml 的 MongoDB 7 使用副本集rs0并开启了认证相关配置,其注释给出的恢复流程为:docker stop wekan-app→ 进容器 →cd /data→ 删除旧 dump →docker cp dump wekan-db:/data/→ 进容器执行mongorestore --drop→ 退出 →docker start wekan-app。若你的部署启用了账号密码,还需为 mongorestore 追加--username/--password/--authenticationDatabase等参数。

方案 9b:恢复到另一个 MongoDB(不同端口)

如果目标 MongoDB 运行在非默认端口(如多实例隔离),用--port指定:

mongorestore --port 11235

新库接入后,把对应端口的 MongoDB 作为MONGO_URL指向的数据库即可让 Wekan 读取恢复后的数据。

仓库 Meteor3/3restoredb.sh 展示了更现代的恢复写法:从连接串文件读取MONGO_URL,用mongorestore --uri=... --drop --nsFrom="wekan.*" --nsTo="${DB_PARAM}.*"把 dump 中的wekan库改名为目标租户库,实现"一份备份恢复到任意多租户库"——这对应官方文档 Meteor3 多租户托管方案 的部署方式。


六、用 GUI 工具浏览容器外的 MongoDB

如果不想在命令行里操作,可以给 Docker 外的 MongoDB 装一个图形化管理界面(如 Robomongo/Studio 3T、NoSQLBooster 等管理工具),直接可视化查看集合数据、执行查询与导入导出。容器内的 MongoDB 默认只监听在 Docker 网络,需要通过端口映射(如-p 27017:27017)暴露到宿主机后才能用 GUI 连接。


七、重装与回退:删除容器 / 运行旧版本

11. 删除 Wekan 容器以重新安装(慎用!)

如果希望在备份之后彻底重装,先停止再删除两个容器(该操作会销毁容器及未挂载卷中的数据,务必先完成备份):

docker stop wekan-app wekan-db docker rm wekan-app wekan-db

删除后即可回到本文第二节从第 1 步重新安装,再通过docker cp+mongorestore恢复数据。

注意:docker rm删除的是容器,而docker-compose-mongodb-v7.yml中数据存放在命名卷wekan-db:/data/db,卷在docker rm后依然保留。若想连同卷一起清理需使用docker volume rm;而旧版docker run且未指定-v的容器,其可写层数据会随docker rm一并销毁——所以删除容器前务必确认数据已通过 mongodump 备份

12. 回退到旧版本镜像

如果最新版 Wekan Docker 镜像出现故障,可改用带版本号的镜像标签启动(例如wekanteam/wekan:v6.89)。当前仓库的 compose 文件也明确建议:升级时优先使用具体版本标签而非latest,例如 docker-compose.yml 中注释的image: ghcr.io/wekan/wekan:v6.89/quay.io/wekan/wekan:v6.89/wekanteam/wekan:v6.89。升级流程可参考 docs/Backup/Upgrade.md:停止应用容器 → 删除旧的wekan-app容器(保留数据库容器)→ 更新镜像 → 重新启动。


八、自动备份与恢复脚本(含 7 天清理)

文档提供了一对可直接套用的 shell 脚本,默认会自动删除超过 7 天的备份。使用时请根据实际环境修改容器名、目录与库名。

备份脚本

#!/bin/bash DATE=$(date +%Y-%m-%d-%H-%M) SCRIPTPATH="$( cd "$(dirname "$0")" ; pwd -P )" cd $SCRIPTPATH mkdir -p backups/$DATE docker ps -a | grep 'wekan-db' &> /dev/null if [ $? = 0 ]; then docker exec -t wekan-db bash -c "rm -fr /dump ; mkdir /dump ; mongodump -o /dump/" docker cp wekan-db:/dump $SCRIPTPATH/backups/$DATE tar -zc -f backups/$DATE.tgz -C $SCRIPTPATH/backups/$DATE/dump wekan if [ -f backups/$DATE.tgz ]; then rm -fr backups/$DATE find $SCRIPTPATH/backups/ -name "*.tgz" -mtime +7 -delete fi else echo "wekan-db container is not running" exit 1 fi

脚本要点拆解:

步骤命令作用
1DATE=$(date +%Y-%m-%d-%H-%M)生成带时间戳的备份目录名,如backups/2026-09-13-06-12
2SCRIPTPATH=.../cd $SCRIPTPATH无论从哪里调用脚本,都切到脚本自身所在目录,保证备份落点固定
3docker ps -a \| grep 'wekan-db'先检查数据库容器是否存在(含停止状态),不存在则报错退出
4docker exec -t wekan-db bash -c "rm -fr /dump ; mkdir /dump ; mongodump -o /dump/"在容器内清空旧 dump 并重新导出
5docker cp wekan-db:/dump $SCRIPTPATH/backups/$DATE把 dump 拷出容器
6tar -zc -f backups/$DATE.tgz -C ... wekan只打包wekan库,压缩为 tgz
7find ... -name "*.tgz" -mtime +7 -delete删除 7 天前的 tgz 备份,实现滚动保留

恢复脚本

#!/bin/bash if [ $# -eq 0 ] then echo "Supply a path to a tgz file!" exit 1 fi SCRIPTPATH="$( cd "$(dirname "$0")" ; pwd -P )" DATE=$(basename $1 .tgz) docker ps -a | grep 'wekan-db' &> /dev/null if [ $? = 0 ]; then if [ -f $1 ]; then docker stop wekan-app mkdir -p $SCRIPTPATH/backups/$DATE-restore tar -zx -f $1 -C $SCRIPTPATH/backups/$DATE-restore docker exec -t wekan-db bash -c "rm -fr /restore ; mkdir /restore" docker cp $SCRIPTPATH/backups/$DATE-restore/wekan wekan-db:/restore ## Only if you get errors about existing indexes, use this instead: ## docker exec -t wekan-db bash -c "mongorestore --drop --noIndexRestore --db wekan /restore/wekan/" docker exec -t wekan-db bash -c "mongorestore --drop --db wekan /restore/wekan/" docker start wekan-app fi else echo "wekan-db container is not running" exit 1 fi

用法:./restore.sh backups/2026-09-13-06-12.tgz。脚本会自动完成"停止 wekan-app → 解压备份 → 拷入容器 → mongorestore 恢复 → 重启 wekan-app"的全流程,并在容器内使用/restore目录隔离恢复过程;遇到索引冲突时,把恢复命令换成注释中带--noIndexRestore的版本即可。

仓库 Meteor3/backup.sh 是面向"每租户一库"多租户部署的更完整备份脚本:它从${DB}.txt文件读取MONGO_URL,通过sed剥离库名得到服务器级连接串,用mongodump --uri=... --db=$DB --out=...备份单个租户库,并用cp -pR(保留权限)把wekan-files卷中的附件一并拷贝到备份目录——同时覆盖"数据库 + 附件文件"两部分,可作为单租户场景的升级版参考。


九、跨机器迁移:从备份到新服务器

备份的终极用途之一是迁移服务器。仓库 Move-Docker-containers-to-other-computer.md 给出了两条路线:

  1. 整机搬移 Docker 数据目录(用tar cvpzf打包/var/lib/docker并 scp 到新机,注意-p保留权限),适合"新服务器直接接管全部容器"的场景;
  2. 通过 mongodump 备份迁移(即本文方法),对新机器只需 Docker 环境,无需搬动整个 Docker 数据目录——这也是文档认为"恢复 mongodump 文件容易得多"的原因。

若 MongoDB 数据存放在命名卷中,迁移时还需同步处理数据卷(docker volume的备份/恢复/迁移)。迁移完成后,务必核对 docker-compose.yml 或启动脚本中的MONGO_URL库名,再启动wekan-app


十、总结与最佳实践

  • 恢复前先停应用docker stop wekan-app,恢复完成后再docker start wekan-app,避免写入冲突与索引错误;
  • 库名决定成败:备份与恢复的--db参数必须与MONGO_URL中的库名严格一致,否则恢复出空库;
  • 用 dump 而非裸目录做备份:容器数据在/var/lib/docker下难以直接恢复,mongodump文件才是可靠载体;
  • 索引冲突有解:报索引已存在时改用mongorestore --drop --noIndexRestore,索引由 Wekan 启动时重建;
  • 脚本化 + 滚动清理:仓库提供的备份/恢复脚本包含"超过 7 天自动删除"策略,可直接套用;多租户部署可参考 Meteor3/backup.sh 同时备份数据库与文件卷;
  • 关注后端差异:当前仓库默认使用 FerretDB(MongoDB 兼容层),经典 MongoDB 7 部署见 docker-compose-mongodb-v7.yml,两者的 dump/restore 命令族一致,但连接串、认证与副本集参数需按配置调整。

【免费下载链接】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),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询