资讯动态

openGym 子路径与端口部署指南:5 步融入你的反向代理栈

发布时间:2026/10/8 16:33:52 来源:尧图企业网站定制
openGym 子路径与端口部署指南5 步融入你的反向代理栈【免费下载链接】openGymSelf-hosted gym body-weight tracker — plan routines, log workouts (supersets, warm-ups, cardio), see which muscles are trained, fatigued or detrained, import from FitNotes/Strong/Hevy, passkey login. Your data, your server.项目地址: https://gitcode.com/GitHub_Trending/op/openGymopenGym 是一款自托管健身与体重追踪器self-hosted gym body-weight tracker规划训练计划、记录训练组数与体重、导入 FitNotes/Strong/Hevy 数据、passkey 登录数据完全存放在你自己的服务器上。它的架构非常精简——一个 web 容器 一个 api 容器因此子路径与端口部署几乎零成本只需改.env里几个变量就能把它塞进你已有的 Caddy / Traefik / nginx 反向代理栈甚至和现有的api服务共用同一套命名。本文带你用 5 步完成这套部署。1. 先看架构为什么子路径 反向代理对它天然友好从上面的架构图可以看到关键点web 容器内置 nginx既托管前端页面又把/api代理到api 容器整个应用只暴露一个源origin浏览器只与 web 容器打交道api 对外不可达。所以你的反向代理只需要把域名/子路径指到 web 容器无需单独暴露 API 端口前端路由走 hash/#/plan资产路径是相对路径——这让子路径部署几乎不用操心 404。官方自托管文档在 docs/SELF_HOSTING.md其中的 Fitting into an existing stack 一节就是本文的完整版。顺带一提上图是手机/笔记本与服务器之间的同步时序。因为同步是整包 PUT 版本号合并一次请求可能携带完整训练史后文提到的请求体大小限制正是为它准备的。2. 端口配置5 个变量把 openGym 挪进你的端口规划默认假设是openGym 独占主机api 服务名为api、监听 3000 端口web 容器内 nginx 监听 80 端口。如果你的 compose 文件里已有api服务或想用别的端口改 .env 即可web 镜像在启动时渲染 nginx 配置预构建镜像直接生效无需重新构建WEB_PORT8080 # 宿主机端口——浏览器访问的端口 NGINX_PORT80 # web 容器内部 nginx 监听端口 BACKENDapi # /api 代理到的服务名可改成你 compose 里的名字 PORT3000 # API 监听端口web 会代理到同一值 RESOLVER127.0.0.11 # nginx 解析 BACKEND 用的 DNS非 Docker 环境需改两个细节值得注意BACKEND和PORT组合起来就是/api的上游必须指向 web 容器所在网络上真实可达的服务RESOLVER只在离开 Docker 时重要Kubernetes 上建议设为集群 DNS 地址如10.96.0.10参考 kubernetes/ 目录下的示例清单。解析器不可达不会快速失败而是让每个/api请求挂起到超时。完整的默认值逻辑可对照 docker-compose.yml 中web服务的environment部分以及 nginx 模板 web/nginx.conf.template。3. 子路径部署先判断你的代理剥不剥前缀想让 openGym 住在https://example.com/gym/而不是独占一个域名只需回答一个问题反向代理在请求到达容器之前是否剥掉了/gym前缀情况 A代理剥掉前缀Caddy 的handle_path、Traefik 的StripPrefix中间件、nginx 带尾斜杠的proxy_pass——什么都不用配example.com { handle_path /gym/* { reverse_proxy opengym-web:80 } }情况 B代理把前缀原样透传——告诉 web 容器前缀是什么不要带尾斜杠BASE_PATH/gym两点提醒只把/gym前缀转发给容器不要同时在站点根路径也提供一份 openGym否则那份副本会去找一个不存在于该路径的 APIVITE_IMG_BASE/VITE_GIF_BASE是构建时变量对预构建镜像无效需要重定向媒体路径时请改在反向代理层做。4. 反向代理层的 3 个隐藏陷阱即使端口和子路径都对代理层的默认值仍可能让 openGym 出故障陷阱症状代理层配置请求体上限太小数据同步静默失败、照片/视频上传 413nginx 默认client_max_body_size为 1 MiB/api/至少给 5 MiB整段训练史一次 PUT 过去/api/media/建议 ≥MEDIA_VIDEO_MAX_MB默认 40 MiB容器侧上限为MEDIA_UPLOAD_MAX默认 48m超时太短慢速移动网络上传视频到一半被掐断Traefik v3 默认readTimeout60s建议调到 600s 级别nginx 的client_body_timeout是两次读取间隔默认 60s 足够代理注入的 CSP 过严自定义动作的照片/视频显示为空白CSP 需允许img-src与media-src中的blob:另外如果你在 Cloudflare 之后可给 web 容器设CF_CONNECTING_IP$http_cf_connecting_ip让真实访客地址穿过代理供活动日志与登录限流使用见 .env.example 中 AUDIT_IP 相关注释。5. passkey 登录RP_ID 与 ORIGIN 的正确写法子路径部署不改变 passkey 规则——浏览器只在HTTPS或localhost下允许 passkey且 passkey 绑定的是主机名而非路径。但同一主机名下挂多个实例会共享 passkey 作用域互相能看到凭据介意的话给每个实例独立域名。变量正确错误RP_IDexample.comhttps://example.com、example.com:8080、example.com/ORIGINhttps://example.comexample.com、https://example.com/改完记得用docker compose up -drestart不会重读.env并可用启动日志核对docker compose logs api | grep gym-api on。若日后换域名已有 passkey 全部失效所有人要重新注册。部署完成度自查清单 ✅curl https://example.com/gym/api/health返回{ok:true,...}浏览器地址栏域名与ORIGIN/RP_ID完全一致注意www.是不同主机新建 profile 的 passkey 弹窗能正常出现HTTPS 才有效大文件上传训练史同步、视频不被代理 413 或掐断所有数据只落在./data/一个目录——备份它即备份整个实例tar czf opengym-backup-$(date %F).tar.gz data/。按这套步骤走完后openGym 就成了你反向代理栈里一个安静的子路径应用一个源、两个容器、一个数据目录。更多细节Kubernetes 清单、多用户管理、通知、移动端配对可查阅 docs/SELF_HOSTING.md 与 docs/SELF_HOSTING_KUBERNETES.md。【免费下载链接】openGymSelf-hosted gym body-weight tracker — plan routines, log workouts (supersets, warm-ups, cardio), see which muscles are trained, fatigued or detrained, import from FitNotes/Strong/Hevy, passkey login. Your data, your server.项目地址: https://gitcode.com/GitHub_Trending/op/openGym创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑