ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

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

Wekan Docker MongoDB 数据导出、备份与恢复实战指南 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 infoWekan 的数据全部存放在 MongoDB 容器中而不是应用容器中。因此在任何导入、恢复操作之前必须遵守两条铁律先停止 Wekan 应用容器再导入数据库docker stop wekan-app否则应用进程正在持有数据库连接与写入恢复时可能出现数据不一致或锁冲突。核对 MongoDB 数据库名称。请检查你的start-wekan.sh、docker-compose.yml 或类似启动脚本中的MONGO_URL确认数据库名是admin、wekan还是其他名字。恢复时若不使用正确的库名恢复结果将是空数据库——这是最容易踩的坑备份时对wekan库执行mongodump恢复时却写入了admin库前端看起来就是数据全没了。Docker 数据目录的风险提示Docker 容器数据位于宿主机的/var/lib/docker其中包含可能难以恢复的重要数据。相比直接翻找该目录恢复 mongodump 文件要容易得多。因此官方强烈建议以mongodump文件作为备份载体仓库 docs/Backup/Backup.md 也给出了完整的备份方案备份时注意保留文件与目录的权限例如复制时使用cp -p或tar -p否则恢复后可能因权限问题无法读取。二、本地快速搭建 Wekan MongoDB 容器先从零搭建一个可复现的环境。下面的命令会启动两个容器wekan-dbMongoDB 3.2.18与wekan-appWekan 应用通过--link连接数据库访问地址为http://localhost:8080/如需换端口修改脚本中的8080即可docker run -d --restartalways --name wekan-db mongo:3.2.18 docker run -d --restartalways --name wekan-app --link wekan-db:db -e MONGO_URLmongodb://db -e ROOT_URLhttp://localhost:8080 -p 8080:80 wekanteam/wekan:latest版本说明以当前仓库为准上例中的mongo:3.2.18是文档撰写时的历史版本。当前仓库默认的 docker-compose.yml 已改用 FerretDB v1 SQLiteMongoDB 线协议兼容层而经典 MongoDB 部署使用 docker-compose-mongodb-v7.yml 中的mongo:7镜像容器名wekan-db并启用了单节点副本集rs0。备份与恢复思路完全一致但连接串、认证方式需按各自配置文件调整。确认容器状态docker psdocker 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:/dumpdump 目录并带有健康检查等待副本集选出主节点后才允许 Wekan 启动。三、进入 MongoDB 容器并浏览数据1. 进入数据库容器docker exec -it wekan-db bash2. 可选用 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 版本的迁移状态兼容。当前仓库中附件等文件数据既可能存在 GridFScfs_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. 退出容器exit4. 把备份目录拷出容器回到宿主机把容器内的/dump目录复制到当前目录docker cp wekan-db:/dump .docker cp是容器与宿主机之间双向拷贝文件的官方方式docker cp 容器名:容器内路径 宿主机路径导出docker cp 宿主机路径 容器名:容器内路径导入。五、用 mongorestore 恢复数据库方案 9a恢复到原数据库先把宿主机上的dump目录拷回容器内的/data/docker cp dump wekan-db:/data/进入数据库容器并切换到数据目录docker exec -it wekan-db bash cd /data执行恢复。恢复前必须先docker stop wekan-appmongorestore --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_URLmongodb://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 --nsFromwekan.* --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 cpmongorestore恢复数据。注意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-122SCRIPTPATH.../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库压缩为 tgz7find ... -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 给出了两条路线整机搬移 Docker 数据目录用tar cvpzf打包/var/lib/docker并 scp 到新机注意-p保留权限适合新服务器直接接管全部容器的场景通过 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 同时备份数据库与文件卷关注后端差异当前仓库默认使用 FerretDBMongoDB 兼容层经典 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),仅供参考
返回列表