在 Rancher 上部署 Wekan 与 MongoDB:借助 Rancher Active Proxy 实现自动 HTTPS 反向代理
【免费下载链接】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
本文是一份基于仓库文档 docs/Platforms/FOSS/Container/Docker/Rancher---Rancher-Active-Proxy---Wekan-MongoDB-Docker.md 编写的实战指南。核心场景是:在一台 Rancher 管理的主机上,以 Docker 方式同时运行 Wekan(基于 Meteor 的开源看板)和 MongoDB,并在前面接入 Rancher Active Proxy(RAP),让 Wekan 自动获得所选域名的 Let's Encrypt 证书签发、续期与反向代理能力。读完本文,你将掌握如何改造 Wekan 的 docker-compose 服务定义、正确配置 RAP 标签与ROOT_URL,从而以 HTTPS 域名对外提供 Wekan 服务。
为什么选择 Rancher + Rancher Active Proxy
Wekan 官方提供了大量 Docker 部署形态,仓库根目录的 docker-compose.yml 与 docker-compose-mongodb-v7.yml 覆盖了从「FerretDB + SQLite 轻量单机」到「经典 MongoDB 7」的多种组合。而 Rancher 方案的价值在于编排与管理:
- 通过 Rancher 统一管理宿主机上的 Wekan 与 MongoDB 容器,支持
restart: always等自愈策略; - 接入 Rancher Active Proxy(一个运行在 Rancher 之上的反向代理组件)后,只需在容器上打几个 label,RAP 便会自动监听容器事件,完成域名的反向代理与Let's Encrypt 证书的自动申请与续期;
- 不需要手动维护 Nginx/Caddy 配置,也不需要单独部署 certbot,适合希望「域名 + HTTPS 一步到位」的部署者。
在 docs/Platforms/FOSS/Container/Docker/README.md 的 Rancher 一节中,仓库也专门链接了本文档作为该部署形态的官方说明。
说明:Rancher Active Proxy 属于第三方开源组件,其自身的安装与初始化步骤以该项目官方文档为准(原文档指向的安装指南为 https://github.com/adi90x/rancher-active-proxy/issues/21)。本文聚焦于仓库提供的 Wekan 侧配置。
第一步:先完成 Rancher 与 Rancher Active Proxy 的基础部署
在动手改造 Wekan 之前,需要先在宿主机上完成两件事:
- 部署 Rancher:让宿主机的 Docker 环境纳入 Rancher 管理,Wekan 与 MongoDB 都以「栈 / 服务」的形式出现在 Rancher 界面中;
- 启动 Rancher Active Proxy(RAP):RAP 会持续监听 Docker 事件,读取各容器上以
rap.开头的标签,据此动态生成反向代理规则,并调用 Let's Encrypt 为配置了rap.le_*标签的域名自动申请证书、在到期前自动续期。
原文档给出了 RAP 的安装指引链接(见上文说明),请先完成这一层基础环境,再继续下文。
第二步:按 RAP 约定改造 Wekan 服务
Wekan 服务在 docker-compose 中原本是标准的 Web 服务。要让 RAP 认识它、转发它并为其签发证书,需要为服务补充 RAP 标签,并调整端口与ROOT_URL。原文档给出的改造后的 wekan 服务定义如下:
wekan: image: wekanteam/wekan:meteor-1.4 container_name: whatever-you-like restart: always ports: - 80 labels: - io.rancher.container.pull_image=always - rap.port=80 - rap.host=your.domain.com - rap.le_host=your.domain.com - rap.le_email=your@mail.com environment: - MONGO_URL=mongodb://wekandb:27017/wekan - ROOT_URL=https://your.domain.com depends_on: - wekandb这段配置是整份文档的核心,逐项拆解如下:
| 配置项 | 含义与要点 |
|---|---|
image: wekanteam/wekan:meteor-1.4 | Wekan 的 Docker 镜像。注意该标签为历史版本写法,下文「镜像与版本」一节会给出当前仓库推荐的镜像选择 |
container_name | 容器名称,可按喜好自定义(whatever-you-like) |
restart: always | 容器异常退出后自动重启,配合 Rancher 保证服务可用性 |
ports: - 80 | 将容器内 Wekan 的 80 端口映射到宿主机随机高位端口。RAP 通过标签获知要转发到的容器内端口,因此这里不需要固定宿主端口 |
io.rancher.container.pull_image=always | Rancher 标签:每次部署时总是拉取最新镜像,便于升级镜像版本 |
rap.port=80 | RAP 核心标签:告诉 RAP 该容器的 80 端口是需要被反向代理的目标端口(与上面ports中的容器内端口一致) |
rap.host=your.domain.com | RAP 核心标签:对外提供服务的域名,RAP 据此生成该域名的反向代理规则 |
rap.le_host=your.domain.com | RAP 核心标签:需要申请 Let's Encrypt 证书的域名,通常与rap.host相同 |
rap.le_email=your@mail.com | RAP 核心标签:Let's Encrypt 注册使用的邮箱,用于证书申请与到期提醒 |
MONGO_URL=mongodb://wekandb:27017/wekan | Wekan 连接 MongoDB 的连接串,主机名为 compose 中的wekandb服务名 |
ROOT_URL=https://your.domain.com | Wekan 对外访问的完整地址,必须与rap.host一致(详见下文) |
depends_on: - wekandb | 保证 MongoDB 服务先启动,Wekan 再启动 |
改造完成后,RAP 会自动完成三件事:把your.domain.com的 443/80 流量反向代理到该 Wekan 容器的 80 端口;为your.domain.com申请 Let's Encrypt 证书;并在证书到期前自动续期。
第三步:MongoDB 服务的配套写法
原文档中的MONGO_URL指向wekandb服务。Wekan 依赖 MongoDB,这一侧的 compose 服务可以与仓库中的经典 MongoDB 配置对齐。仓库的 docker-compose-mongodb-v7.yml 提供了现成的wekandb服务定义,关键点包括:
- 使用
image: mongo:7,容器名为wekan-db,restart: always; - 以副本集模式启动(
--replSet rs0 --bind_ip_all),并在启动脚本中自动执行rs.initiate(); - 仅对
wekan-tier网络expose: - 27017,不对外暴露端口; - 通过健康检查(
mongosh探测副本集是否有主节点)与depends_on: condition: service_healthy联动,确保 Wekan 在数据库就绪后才启动。
与这份 MongoDB 配置配套时,Wekan 侧的连接串需要包含副本集参数并追加 oplog 连接串,例如:
environment: - MONGO_URL=mongodb://wekandb:27017/wekan?replicaSet=rs0 - MONGO_OPLOG_URL=mongodb://wekandb:27017/local?replicaSet=rs0 - METEOR_REACTIVITY_ORDER=changeStreams,oplog,polling这在 docker-compose-mongodb-v7.yml 中有完整注释:Meteor 通过 oplog 实现实时数据同步,副本集是启用 oplog 的前提。若在 Rancher 栈中自行编排wekandb服务,应把上面原文档中的MONGO_URL写成带?replicaSet=rs0的形式,并让depends_on使用健康检查条件,以规避「Topology is closed」这类数据库未就绪导致的启动崩溃。
ROOT_URL 与 HTTPS 的联动要点
ROOT_URL是 Wekan 部署中最容易出错的环境变量。仓库的 docs/Platforms/Webserver/Settings.md 明确指出:
- Wekan 自身只在本机端口上运行HTTP,HTTPS 由前置的 Web 服务器(如 Caddy、Nginx,或本文的 RAP)终结 TLS;
- 因此当 RAP 对外提供
https://your.domain.com时,Wekan 的ROOT_URL必须设置为https://your.domain.com,与rap.host/rap.le_host保持一致; - 原文档特别强调
ROOT_URL必须写https://前缀(ROOT_URL=https://your.domain.com),这样 Wekan 生成的所有链接、回调地址才会指向 HTTPS 域名,否则会出现登录回调、头像等资源走错协议/域名的问题。
镜像与版本:从历史标签到当前实践
原文档示例使用wekanteam/wekan:meteor-1.4标签,这属于早期镜像写法。当前仓库的 docker-compose.yml 与 docker-compose-mongodb-v7.yml 给出了更稳妥的镜像选择原则:
- 优先使用具体的版本标签(如
ghcr.io/wekan/wekan:v6.89、quay.io/wekan/wekan:v6.89、wekanteam/wekan:v6.89),因为latest会随新版本发布而变化,升级行为不可预期; - 镜像目前可从三个仓库获取:GitHub Container Registry(
ghcr.io/wekan/wekan)、Quay(quay.io/wekan/wekan)、Docker Hub(wekanteam/wekan),默认推荐ghcr.io/wekan/wekan:latest; - 若需拉取最新提交的自动构建,可使用
ghcr.io/wekan/wekan:main(仅供尝鲜)。
在 Rancher 栈中替换镜像时,保留原有的labels(io.rancher.container.pull_image=always会确保每次重新部署都拉取新镜像)、rap.*标签与ROOT_URL即可。
验证与排障
完成 compose 文件改造并部署到 Rancher 后,可按以下顺序验证:
- 检查容器状态:
docker ps确认 wekan 与 wekandb 容器均为 Up,且restart: always生效; - 确认反向代理生效:在浏览器访问
https://your.domain.com,应能看到 Wekan 登录页; - 确认证书:浏览器地址栏应显示有效的 Let's Encrypt 证书;RAP 会在到期前自动续期,无需手工干预;
- 查看日志:
docker logs <wekan容器名>观察启动日志;若出现数据库连接错误,优先确认MONGO_URL中的副本集参数(?replicaSet=rs0)与wekandb服务的健康状态; - 确认
ROOT_URL:登录后检查页面链接、头像与邮件通知中的地址,确保全部为https://your.domain.com前缀。
延伸阅读
- 仓库 Docker 目录总览:docs/Platforms/FOSS/Container/Docker/README.md(其中 Rancher 一节链接到本文档)
- 经典 MongoDB 7 完整编排示例:docker-compose-mongodb-v7.yml
- 默认 FerretDB + SQLite 编排示例:docker-compose.yml
ROOT_URL、端口与 Web 服务器配置:docs/Platforms/Webserver/Settings.md- Docker 容器数据导入导出与升级:Export-Docker-Mongo-Data.md、Move-Docker-containers-to-other-computer.md
【免费下载链接】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),仅供参考