尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

Wekan Docker 部署实战:Traefik 反向代理 + 自签名 SSL 证书单主机容器编排指南

Wekan Docker 部署实战:Traefik 反向代理 + 自签名 SSL 证书单主机容器编排指南 Wekan Docker 部署实战Traefik 反向代理 自签名 SSL 证书单主机容器编排指南【免费下载链接】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 官方仓库的 Traefik-and-self-signed-SSL-certs.md 展开完整复现并深入讲解在单台 Docker 主机上用 Traefik 作为反向代理、以自签名证书提供 HTTPS、以容器方式运行 Wekan MongoDB的完整落地流程。读者读完可以独立完成证书生成、Traefik 动态路由、Wekan 容器编排、HTTP→HTTPS 强制跳转与多服务共存的配置并理解ROOT_URL、MONGO_URL、BROWSER_POLICY_ENABLED等关键环境变量在源码层的作用。背景与适用场景原作者 Craig 之前一直用 nginx 作为 restyaboard 的反向代理但在需要代理多个服务时nginx 的配置显得不够直观opaque。为了把 Wekan 作为学习对象他改用 Traefik 并对比两者。这个实验本身也服务于以容器即服务的理念——他所在的组织仍停留在 vmware/vm 的传统运维模式此方案用于向团队演示现代容器化服务编排。该文档于 2018-05-10 针对 wekan v1.52 与 mongodb 3.2.21 更新。本方案的核心取舍如下内网环境优先Wekan 运行在内网域名无法被公网 DNS 解析因此不使用依赖公网与注册域名的 Lets Encrypt而是手动生成自签名证书单一 Docker 主机Traefik、Wekan、MongoDB 三个容器在同一台 Docker 主机上通过共享的web网络互联零端口暴露wekan-app 与 wekan-db 容器不向 Docker 宿主机暴露任何端口外部访问流量全部经 Traefik 的 80/443 端口进入安全性更好动态路由Traefik 通过读取容器 Label 自动发现服务并生成路由规则后续新增服务只需加 Label无需重写 nginx 式的大段server块。需要说明的是自签名证书不应在生产环境使用它会破坏 TLS 证书校验链。仓库中 Local-self-signed-TLS.md 也强调你永远不应当在生产环境使用自签名证书……但对于有限的本地使用场景它是可用的。 本方案适用于内网、实验、演示等场景。一、前置准备目录、自签名证书与 Docker 网络1.1 创建证书与配置目录以sudo创建 Traefik 的配置目录与证书目录并设置合理的权限目录可被他人读取、进入但证书目录仅属主可写sudo mkdir -p /opt/traefik/certs sudo chmod 755 /opt/traefik sudo chmod 750 /opt/traefik/certs说明原文档作者将自己的登录账号加入了 docker 组因此可以不用sudo直接执行 docker 命令。如果当前用户不在 docker 组请将后续 docker 命令前加上sudo。1.2 生成自签名证书与私钥使用 OpenSSL 生成有效期 365 天、RSA 2048 位的自签名 X.509 证书。-nodes表示私钥不加密便于容器内加载无需每次输入口令sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout wekan1.key -out wekan1.crt命令执行时会交互式询问国家、地区、组织、Common Name 等字段Common NameCN务必填写你打算用域名访问 Wekan 的域名如wekan.myinternaldomain.org否则浏览器会给出更严重的证书域名不匹配告警。随后将证书与私钥复制到/opt/traefik/certs并收紧权限——证书公钥部分设为 644 可被所有人读取私钥设为 600 仅属主可读写chmod 644 /opt/traefik/certs/wekan1.crt chmod 600 /opt/traefik/certs/wekan1.key1.3 创建共享 Docker 网络创建一个名为web的外部 Docker 网络Traefik、wekan-app、wekan-db 三个容器都挂接在它上面docker network create web这是整个方案wekan-app 与 wekan-db 不需要向宿主机暴露端口的关键容器间通过 Docker 内部 DNS 解析服务名如wekan、wekandb互相通信只有 Traefik 对外暴露 80/443/8080。1.4 配置内部 DNS 或 hosts 映射在内部 DNS 中添加一条 CNAME 记录wekan.myinternaldomain.org指向 Docker 宿主机 IP即 Wekan 域名解析到宿主机地址。若没有内部 DNS则需在**所有访问该应用的机器包括 Docker 宿主机本身**的 hosts 文件中添加对应映射docker-host-ip wekan.myinternaldomain.org此外本方案假设 Docker 宿主机的 80 和 443 端口当前没有其他进程监听。二、Traefik 配置详解2.1 Traefik 的 docker-compose.yml在/opt/traefik/docker-compose.yml中定义 Traefik 服务version: 2 services: traefik: image: traefik:latest ports: - 80:80 - 443:443 - 8080:8080 networks: - web volumes: - /var/run/docker.sock:/var/run/docker.sock - /opt/traefik/traefik.toml:/traefik.toml - /opt/traefik/certs/:/certs/ container_name: traefik networks: web: external: true逐项说明配置项作用image: traefik:latest原文档作者使用 latest 标签但注释明确指出建议固定到特定版本号避免升级引入行为变化ports: 80/443/8080对外暴露 HTTP、HTTPS 与 Traefik 内置 API8080 为 dashboard/api 入口/var/run/docker.sock:/var/run/docker.sock把宿主机的 Docker socket 挂载进容器Traefik 借此动态读取 Docker 配置即文档所说的 more advanced 动态发现能力/opt/traefik/traefik.toml:/traefik.toml把宿主机配置文件挂载为容器内的/traefik.toml/opt/traefik/certs/:/certs/把证书目录挂载到容器内/certs/供 TLS 配置引用networks: web: external: true引用前文创建的web外部网络而不是由本 compose 文件重新创建2.2 Traefik 主配置 traefik.toml创建/opt/traefik/traefik.tomldebug false logLevel DEBUG defaultEntryPoints [https,http] [entryPoints] [entryPoints.http] address :80 [entryPoints.http.redirect] entryPoint https [entryPoints.https] address :443 [entryPoints.https.tls] [[entryPoints.https.tls.certificates]] certFile /certs/wekan1.crt keyFile /certs/wekan1.key [entryPoints.eightzero] address :8080 [api] entrypoint eightzero [retry] [docker] endpoint unix:///var/run/docker.sock domain docker.localhost watch true exposedbydefault false关键参数解读defaultEntryPoints [https,http]声明默认入口点顺序https 优先[entryPoints.http]redirect监听 80 端口并将所有 HTTP 请求 301 重定向到 HTTPS 入口点实现强制 HTTPS后续访问http://wekan.myinternaldomain.org会自动跳转到https://[entryPoints.https.tls.certificates]指定 TLS 证书文件与私钥文件路径对应容器内挂载的/certs/wekan1.crt与/certs/wekan1.key[entryPoints.eightzero]为 Traefik 内置 API/dashboard 单独开一个 8080 入口点避免与业务入口混在一起[api] entrypoint eightzero把 API 绑定到 8080 入口点可通过http://docker-hostip:8080查看 Traefik 面板与路由信息[docker]段endpoint unix:///var/run/docker.sock变更从这里读取即 Traefik 监听 Docker socket 上的容器事件domain docker.localhost默认 DNS 域名watch true持续监视 Docker 变化容器启停/加 Label 后自动更新路由exposedbydefault false只有显式打上traefik.enabletrue标签的容器才会被 Traefik 接管其余容器一律忽略。这对同一主机上运行多个服务时避免误路由非常重要。2.3 启动并验证 Traefik前台启动日志直接输出到终端确认无误后再转入后台cd /opt/traefik docker-compose up终端持续输出日志确认一切正常后按Ctrl-c停止再以守护模式启动docker-compose up -d此时宿主机已暴露 80、443、8080 三个端口。由于 Wekan 尚未部署直接访问会返回 404。可以用 curl 带Host头验证 Traefik 已就绪并正确响应域名路由curl -H Host:wekan.myinternaldomain.org http://localhost三、Wekan MongoDB 的容器编排在 Wekan 的 compose 文件中定义两个服务wekandbMongoDB与wekan应用两个容器都只加入web网络、不对外暴露端口version: 2 services: wekandb: image: mongo:3.2.21 container_name: wekan-db restart: always command: mongod --smallfiles --oplogSize 128 networks: - web expose: - 27017 volumes: - wekan-db:/data/db - wekan-db-dump:/dump wekan: image: quay.io/wekan/wekan:v1.52 container_name: wekan-app restart: always networks: - web # traefik magic stuff here labels: - traefik.backendwekan-app - traefik.docker.networkweb - traefik.frontend.ruleHost:wekan.myinternaldomain.org - traefik.enabletrue - traefik.port8080 - traefik.default.protocolhttp #note: mail url points to ip address of docker host which has postfix running as a relay # for docker apps. ping me at email: silvacraiggmail.com if you want the postfix config. # note here that an ip address is used instead of the servce name in the MONGO_URL - # this is a bug that I have to work out. To identify the IP address use docker network # inspect web when the wekandb is running environment: - MONGO_URLmongodb://172.xx.xx.2:27017/wekan - ROOT_URLhttp://wekan.myinternaldomain.org - MAIL_URLsmtp://172.17.0.1:25/ - MAIL_FROMWekan Support - unix.adminmyinternaldomain.org # newer environment variables: - BROWSER_POLICY_ENABLEDtrue - TRUSTED_URL - WEBHOOKS_ATTRIBUTES depends_on: - wekandb volumes: wekan-db: driver: local wekan-db-dump: driver: local networks: web: external: true3.1 MongoDB 服务要点command: mongod --smallfiles --oplogSize 128针对小规模部署优化存储占用oplog 限制为 128MBexpose: 27017仅在容器网络内部暴露27017宿主机上不可直接访问数据库端口两个数据卷wekan-db/data/db 数据目录与wekan-db-dump/dump 备份目录保证重启/重建容器后数据不丢失。3.2 Traefik 路由标签LabelsWekan 容器的 Label 是让 Traefik 识别并转发流量的魔法所在Label含义traefik.backendwekan-app后端服务名Traefik 面板中以此标识traefik.docker.networkweb指定 Traefik 与后端通信所用的 Docker 网络多网络时必须显式指定traefik.frontend.ruleHost:wekan.myinternaldomain.org路由规则仅当请求 Host 为该域名时才转发到本后端这正是多服务共存的关键traefik.enabletrue结合exposedbydefault false显式允许该容器被 Traefik 发现traefik.port8080Wekan 容器内部监听端口为 8080Meteor 应用的默认端口traefik.default.protocolhttp后端协议为 HTTPTLS 在 Traefik 处终结3.3 环境变量详解对应源码依据MONGO_URLmongodb://172.xx.xx.2:27017/wekanMongoDB 连接串。注意原文档作者在此处用了宿主机网络的 IP 而不是服务名wekandb并注明这是一个待解决的 bug——更稳妥的做法是直接使用 Docker 内部 DNS 服务名MONGO_URLmongodb://wekandb:27017/wekan。若确实需要查询容器的 IP可在 wekandb 运行后执行docker network inspect web查看。当前仓库默认的 docker-compose.yml 即采用服务名方式如MONGO_URLmongodb://ferretdb:27017/wekan。ROOT_URLhttp://wekan.myinternaldomain.orgWekan 对外可访问的完整 URL。源码中 server/models/settings.js 会用它解析出域名用于生成默认邮件发件人地址Boards Support support${domain}官方在 Settings.md 中强调 Docker 环境应写作不带引号、大写、下划线的形式ROOT_URLhttp://192.168.0.100。若在 Traefik 处终结了 TLS则应配置为https://wekan.myinternaldomain.org当前仓库的 docker-compose.yml 也明确提示使用 Caddy/Nginx/Apache 提供 SSL 时应设置https://前缀的 ROOT_URL。MAIL_URLsmtp://172.17.0.1:25/邮件发送地址。172.17.0.1是 Docker 默认桥接网络的宿主机网关宿主机上运行着 postfix 作为中继供容器内的应用发信。MAIL_FROMWekan Support - unix.adminmyinternaldomain.org邮件发件人显示名。BROWSER_POLICY_ENABLEDtrue启用浏览器安全策略。对应源码 server/policy.js当该变量为true时Wekan 会应用内容安全策略CSP、iframe 限制等浏览器防护false会关闭全部相关保护源码注释明确仅限内网使用不要在公网使用。TRUSTED_URL配合浏览器策略使用允许指定信任的 URL 以 iframe 方式嵌入 Wekan如https://intra.example.com。WEBHOOKS_ATTRIBUTES控制出站 Webhook 发送哪些字段留空则使用默认字段集合cardId,listId,oldListId,boardId,comment,user,card,commentId,swimlaneId,customerField,customFieldValue等见 docker-compose.yml 中相关注释。3.4 启动 Wekan与 Traefik 相同先前台启动观察日志确认就绪后再转后台docker-compose up运行正常后按Ctrl-c再执行docker-compose up -d四、验证与整体架构回顾完成以上步骤后访问https://wekan.myinternaldomain.org即可看到 Wekan 登录页面浏览器会提示自签名证书不受信任需手动信任该证书。整体数据流向为浏览器 --HTTPS-- Traefik(:443, 自签名TLS终结) --HTTP-- wekan-app(:8080) \-- 动态发现 -- Docker socket -- 容器Label路由 wekan-app --MongoDB协议-- wekandb(:27017, 仅容器内网)几个值得注意的验证点HTTP 强制跳转访问http://wekan.myinternaldomain.org会被 Traefik 的[entryPoints.http.redirect]规则 301 到 HTTPS404 检查Wekan 未启动前用curl -H Host:wekan.myinternaldomain.org http://localhost会得到 404Traefik 无匹配后端Wekan 启动后同一请求应返回 Wekan 页面Traefik 面板浏览器访问http://docker-hostip:8080可查看已发现的后端、前端路由规则与健康状态后续扩展服务只需在新容器上添加traefik.enabletrue、traefik.frontend.ruleHost:xxx、traefik.portyyy等 Label 并加入web网络Traefik 即可自动代理无需改动 Traefik 配置——这正是该方案相对 nginx 多服务配置更透明的体现。五、源码级延伸反向代理场景下的注意事项将 Traefik 方案放到仓库整体的反向代理实践中看还有两个与 Meteor/Wekan 运行时强相关的点值得留意WebSocket/SockJS 升级Wekan 采用 Meteor DDP 协议进行实时通信当前仓库的 docker-compose.yml 明确说明 sockjs is the only transport WeKan ships。虽然 Traefik 本身对 WebSocket 支持较好HTTP 后端自动升级但任何位于 Wekan 之前的反向代理都必须正确传递Upgrade/Connection头。仓库 Nginx.md 记录了一个典型故障浏览器控制台出现WebSocket connection to wss://HOST/sockjs/.../websocket failed根因几乎总是反向代理缺少proxy_http_version 1.1、proxy_set_header Upgrade $http_upgrade、proxy_set_header Connection $connection_upgrade这三行。部署 Traefik 后可打开浏览器开发者工具确认/sockjs/的 WebSocket 连接成功未降级为慢速长轮询。TLS 终结与 ROOT_URL 一致性自签名证书方案在 Traefik 终结 TLS因此ROOT_URL应使用https://前缀的域名。仓库 server/models/settings.js 中ROOT_URL还承担着生成默认邮件发件域名的职责配置不一致会导致通知邮件、头像 URL官方 docker-compose.yml 注释提及 issue #1776 的头像问题等出现异常。六、与仓库其他反向代理方案的对照Wekan 仓库 docs/Platforms/Webserver 目录下还提供了其他反向代理与 TLS 方案可按环境选型Nginx.md经典 nginx 方案包含完整的server块、WebSocket 升级三行式、client_max_body_size 100M附件上传上限以及 CentOS 7 的 SELinux 注意事项Caddy.mdCaddy 1/2 方案含 Lets Encrypt 自动证书、CloudFlare 通配符证书、PWA assetlinks 配置等Local-self-signed-TLS.mdSnap 版 Wekan 在本地使用自签名证书的两种方式tls self_signed开发证书与自定义长效证书脚本与本篇的 Docker 版自签名方案互为补充Lets-Encrypt-and-Google-Auth.mdCaddy Lets Encrypt 并叠加 Google Auth 白名单登录的进阶方案Settings.mdROOT_URL在 Docker 与 Snap 两种形态下的不同写法约定。总体而言本方案适用于内网、单机、实验性场景Traefik 以标签驱动的方式提供比 nginx 更直观的多服务反向代理体验自签名证书规避了内网环境无法走 Lets Encrypt 的限制而零端口暴露 共享网络的编排方式也为后续向正式的多服务容器化架构演进打下了基础。若面向公网生产环境建议仍以受信任证书Lets Encrypt 或机构 CA替代自签名证书。【免费下载链接】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),仅供参考
返回列表