Wekan 与 PostgreSQL:ToroDB 只读镜像方案的历史部署指南与 FerretDB 替代路线
Wekan 与 PostgreSQLToroDB 只读镜像方案的历史部署指南与 FerretDB 替代路线【免费下载链接】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 开源看板项目归档的 docs/Databases/ToroDB/PostgreSQL/README.md 为骨架完整讲解其历史上的 Docker 一键部署方案借助 ToroDB 把 Wekan 写入 MongoDB 的数据实时镜像为 PostgreSQL 只读副本从而让 LibreOffice、报表系统等任何支持 PostgreSQL 的工具直接读取看板数据。读完本文你将掌握这套 compose 的四个服务与关键环境变量、只读镜像的正确连接与使用边界、MongoDB 数据备份恢复流程以及 ToroDB 停更后官方推荐的 FerretDB 替代路线。ToroDB 是什么为什么它已经停更ToroDB 是一个用 Java 编写的 MongoDB 代理层其思路是替换底层存储Wekan 依旧通过 MongoDB 协议读写而 ToroDB 在背后把数据实际存进 PostgreSQL 或 MySQL。项目代号 Stampede在 CHANGELOG 中可以看到它从 v0.12017-02-13MongoDB 3.2一路演进到 v0.92018-12-22的完整历史。现状必须明确ToroDB 已经不再开发。docs/Databases/ToroDB/README.md 与 docs/Databases/README.md 均明确指出Wekan 并不运行在 ToroDB 之上仓库中保留的仅是历史部署材料与替代方案说明。因此本文内容属于历史方案复盘性质它解释了 Wekan 生态中曾经存在的一条 PostgreSQL 集成路径也解释了为何今天应改用 FerretDB。替代路线FerretDB 与 SQL 后端的现状原文档在同一页给出了明确的Try FerretDB instead指引要点如下FerretDB用 Go 编写与 ToroDB 是同一思路——在 SQL 数据库之上实现 MongoDB 线协议wire protocol让 Wekan 这类 Meteor 应用无需修改即可换用 PostgreSQL 后端项目官方还引入 Microsoft DocumentDB 以补充额外的兼容能力。FerretDB/SQLite 旧分支FerretDB 的main-v1分支保留着 SQLite 后端社区可以自行维护但 FerretDB 官方当前不再开发它。C89 SQLite 的固有问题原文档指出 C89 版 SQLite 存在并发与数据损坏方面的问题。Turso 的 Rust SQLite 计划原文档介绍了 Tursolibsql 的继承者后迁至 tursodatabase 组织下的 turso 仓库用 Rust 重写 SQLite 的路线并借助 TigerBeetle 这类模拟器验证并修复并发、损坏等缺陷一旦重写完成Rust 版 SQLite 可作为 C89 版的高并发、防损坏的drop-in替代品语法不变。在 Wekan 当前仓库中PostgreSQL 后端的主力方案已是 FerretDB详见 docs/Databases/FerretDB 与 docs/Databases/README.md默认部署是 FerretDB v1 内嵌 SQLite无需独立数据库服务器。下文回到历史方案本身讲解 ToroDB/PostgreSQL 只读镜像的部署细节。架构Wekan → MongoDB → ToroDB → PostgreSQL 只读镜像这套方案的链路清晰来自 README 的原始描述Wekan (Meteor/Node.js) ──写入──▶ MongoDB ──同步──▶ ToroDB ──写入──▶ PostgreSQL只读镜像 ▲ LibreOffice / 报表工具 / 任意 SQL 客户端核心规则是单向只读Wekan 正常读写 MongoDB数据唯一事实来源ToroDB 订阅 MongoDB 变更把数据镜像到 PostgreSQL任何 SQL 侧工具LibreOffice、BI 报表、脚本只允许读 PostgreSQL绝不能写——写操作应在 Wekan/MongoDB 中完成再由镜像同步到 PostgreSQL。这套设计的价值在于让不具备 MongoDB 技能栈的团队也能用标准 SQL 生态Office 套件、报表、任意编程语言的 PostgreSQL 驱动来查询看板数据。下面的截图展示了当年实测环境中的完整工作流——Wekan 看板界面、LibreOffice Base 连接postgresql://127.0.0.1:15432/wekan并查看wekan.cards表数据、终端执行安装与连接命令Docker 部署完整操作步骤原 README 给出 10 步部署流程下面完整保留并补充关键说明。先决条件是宿主机已安装 docker-compose。第 1~2 步准备 compose 文件历史上该方案是作为独立示例仓库维护的git clone后进入torodb-postgresql目录。在当前 Wekan 仓库中该 compose 文件归档于 docs/Databases/ToroDB/PostgreSQL/docker-compose.yml部署时请先把它复制到一个独立目录例如mkdir torodb-postgresql cp docs/Databases/ToroDB/PostgreSQL/docker-compose.yml torodb-postgresql/再在该目录内执行后续命令。第 3 步修改 ROOT_URL重要compose 中 Wekan 默认配置为- ROOT_URLhttp://localhost如需在局域网内使用必须把http://localhost改为真实地址例如http://192.168.10.100或http://example.com。ROOT_URL直接决定 Wekan 生成的页面链接与登录回调地址配错会导致页面跳转和登录异常。第 4 步可选修改 PostgreSQL 凭据默认数据库名、用户名、密码均为wekan。生产环境建议全部改掉需同时修改 compose 中postgres服务与torodb-stampede服务两处的对应变量见下文服务详解。第 5~6 步启动与访问docker-compose up -dWekan 访问地址为http://IPADDRESS或http://example.com映射到容器内 8080 端口宿主机 80 端口对外。首次启动时 MongoDB 容器会自动初始化名为rs1的副本集ToroDB 依赖 MongoDB 副本集同步机制Wekan 的depends_on仅指向mongodb。第 7 步连接 PostgreSQL 只读镜像README 给出的 LibreOffice 连接信息dbnamewekan hostaddr127.0.0.1 port15432 userwekan passwordwekan其他应用可使用 URL 形式postgresql://127.0.0.1:15432/wekan用户名wekan、密码wekan若在第 4 步修改过请保持一致。注意这里 README 记载的15432是历史版本端口当前仓库的 docker-compose.yml 中postgres服务实际映射为5432:5432因此实际端口请以你使用的 compose 文件为准修改ports映射即可自定义对外端口。使用原则只读不要向 PostgreSQL 写入任何数据它只是镜像需要修改数据时回到 Wekan 操作等待 ToroDB 同步若宿主机开放了对应端口README 原文为 15432局域网内其他机器也能远程连接该只读库。第 8~9 步MongoDB 与其他容器端口MongoDB 在 README 中记录为127.0.0.1:28017同样为历史端口当前 compose 中为27017:27017。README 同时提醒Wekan 与数据库均绑定0.0.0.0因此可能被局域网其他计算机访问到原作者注明未实测属于风险提示生产环境请配合防火墙使用。第 10 步恢复 MongoDB 数据部署前如需导入既有数据按 导出/恢复 Docker 中 MongoDB 数据 操作。该文档的核心流程为停止 Wekandocker stop wekan-app进入 MongoDB 容器docker exec -it wekan-db bash容器名以你的 compose 为准本方案中为mongodb备份容器内执行mongodump -o /dump/退出后用docker cp wekan-db:/dump .拷出恢复把 dump 拷入容器后执行mongorestore --drop --db wekan /data/dump/wekan/若遇索引冲突改用mongorestore --drop --noIndexRestore --db wekan /data/dump/wekan/重新启动 Wekan。docker-compose.yml 服务详解当前仓库归档的 compose 定义了一个 bridge 网络wekan-tier与四个服务下面逐一拆解。mongodb数据源mongodb: image: mongo:3.2 ports: - 27017:27017 entrypoint: - /bin/bash - -c - mongo --nodb --eval var db; while (!db) { try { db new Mongo(mongodb:27017).getDB(local); } catch(ex) {} sleep(3000); }; rs.initiate({_id:rs1,members:[{_id:0,host:mongodb:27017}]}); 1/dev/null 21 mongod --replSet rs1固定使用 MongoDB 3.2因为这是 ToroDB 兼容的版本见 CHANGELOG v0.2入口脚本先等待自身就绪再初始化副本集rs1最后以--replSet rs1启动mongod——副本集是 ToroDB 增量同步的前提数据持久化在命名卷mongodb:/data/db另有mongodb-dump:/dump用于备份。torodb-stampede镜像核心torodb-stampede: image: quay.io/wekan/torodb-stampede:1.0.0 networks: [wekan-tier] links: [postgres, mongodb] environment: - POSTGRES_PASSWORDwekan - TORODB_SETUPtrue - TORODB_SYNC_SOURCEmongodb:27017 - TORODB_BACKEND_HOSTpostgres - TORODB_BACKEND_PORT5432 - TORODB_BACKEND_DATABASEwekan - TORODB_BACKEND_USERwekan - TORODB_BACKEND_PASSWORDwekan - DEBUG环境变量含义本文件默认值TORODB_SETUP首次启动时自动初始化后端库表结构trueTORODB_SYNC_SOURCE同步源即 MongoDB 地址mongodb:27017TORODB_BACKEND_HOST/PORT后端 PostgreSQL 地址与端口postgres/5432TORODB_BACKEND_DATABASE镜像目标数据库名wekanTORODB_BACKEND_USER/PASSWORD后端数据库账号与密码wekan/wekanDEBUG开启调试日志未赋值即启用—镜像被固定为quay.io/wekan/torodb-stampede:1.0.0。注意 CHANGELOG v0.4 记载过 ToroDB 因不支持复合索引compound indexes而退出的问题该版本已修复——这也是选型时必须锁定版本、不要随意升级的原因之一。postgres只读镜像后端postgres: image: quay.io/wekan/postgres:9.6 environment: - POSTGRES_PASSWORDwekan ports: - 5432:5432PostgreSQL 9.6 镜像同样由 Wekan 团队从 Docker Hub 迁移至 Quay 以避免拉取限流compose 注释说明2020-12-03。对外端口5432:5432即 SQL 客户端LibreOffice 等的连接入口。wekan应用wekan: image: quay.io/wekan/wekan container_name: wekan-app restart: always ports: - 80:8080 environment: - WRITABLE_PATH/data - MONGO_URLmongodb://mongodb:27017/wekan - ROOT_URLhttp://localhost - MAIL_URLsmtp://user:passmailserver.example.com:25/ - MAIL_FROMExample Wekan Support supportexample.com - WITH_APItrue - RICHER_CARD_COMMENT_EDITORfalse - CARD_OPENED_WEBHOOK_ENABLEDfalse - BIGEVENTS_PATTERNNONE - BROWSER_POLICY_ENABLEDtrue - LDAP_BACKGROUND_SYNC_INTERVAL depends_on: [mongodb] volumes: - wekan-files:/data:rw关键点MONGO_URL指向mongodb://mongodb:27017/wekanWekan 只与 MongoDB 通信不直接接触 PostgreSQL——这正是 ToroDB 透明代理的意义WITH_APItrue启用 REST API也是导出看板Export Board功能的前置条件关闭则导出不可用BROWSER_POLICY_ENABLEDtrue启用浏览器安全策略见 server/policy.js可配合TRUSTED_URL允许指定站点 iframe 嵌入 Wekan文档注释明确不建议关闭BIGEVENTS_PATTERNNONE默认关闭所有成员强制通知的大事件模式可改为due或received|start|due|end等正则匹配活动类型其余可选变量S3 附件存储、MONGO_OPLOG_URL、OAuth2/OIDC、LDAP、SAML、CAS、邮件服务等在 compose 中以注释形式完整保留可按需取消注释启用注意 compose 顶部注释强调环境变量值不要加单引号LDAP_BACKGROUND_SYNC_INTERVAL是官方刻意保留的空值写法Wekan 未depends_onPostgreSQL/ToroDB因为应用本身不依赖镜像链路MongoDB 就绪即可启动wekan-files:/data:rw卷保存上传的附件对应WRITABLE_PATH/data。历史版本演进CHANGELOG 要点CHANGELOG.md 记录了这套 compose 的演进轨迹可供追溯其行为差异v0.12017-02-13首个版本实现 Wekan ⇄ MongoDB ⇄ ToroDB → PostgreSQL 只读镜像支持任意具备 PostgreSQL 驱动的语言/Office 套件当时为 LibreOffice 3.5v0.22017-04-06改用 Meteor 1.4 基础镜像MongoDB 锁定 3.2 以保证 ToroDB 兼容v0.42017-08-18修复 ToroDB 因不支持复合索引而退出的问题v0.52018-08-01默认启用 Wekan API保证导出看板可用新增 Matomo 统计选项v0.62018-08-03wekan-app 容器内部端口统一为 8080v0.7 / v0.82018-08新增 browser-policy、trusted-url、webhooks 设置与 OAuth2v0.92018-12-22更新到当时最新的 Wekan 与 ToroDB 镜像补齐环境变量文档。总结什么时候用这套方案若你的环境仍然依赖 ToroDB/PostgreSQL 这套历史镜像本文的 compose 解析与运维步骤只读原则、凭据修改、备份恢复、端口说明可直接对照使用若你正在规划新的 PostgreSQL 后端部署仓库官方指引是改用 FerretDB同样是把 MongoDB 数据落到 SQL 数据库但它是活跃维护的 Go 实现也是 Wekan 当前默认数据库后端详见 docs/Databases/README.md不要再基于已停更的 ToroDB 新建生产环境。无论选择哪条路线请牢记本方案的根本约束PostgreSQL 只是只读镜像一切数据变更都要回到 Wekan/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创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考