ARTICLE DETAIL

资讯详情

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

openGym项目架构总览:2个容器+1个文件夹如何撑起一款现代健身App

openGym项目架构总览:2个容器+1个文件夹如何撑起一款现代健身App openGym项目架构总览2个容器1个文件夹如何撑起一款现代健身App【免费下载链接】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 是一款自托管健身与体重追踪 App计划训练、记录组间与力竭、查看肌肉疲劳与恢复还能从 FitNotes / Strong / Hevy 导入历史数据用 Passkey面容/指纹登录数据完全存你自己的服务器。它没有复杂微服务——整个服务端就是2 个容器 1 个你拥有的数据文件夹一条docker compose up就能跑起来。下面用 5 分钟带你看完它的架构全景 ️一、架构 30 秒速览一张图看懂整体结构官方架构图中手机或电脑浏览器通过 HTTPS 只访问web 容器nginx由它转发/api请求到api 容器Node.jsAPI 把所有数据写成 JSON 文件放进./data文件夹。首次启动时一个一次性的media 服务会下载约 140 MB 的动作示意图仅首次之后不再运行。AI 教练与 MCP 服务器都是可选项默认关闭这套结构对应 docker-compose.yml 里的 3 个 service服务角色是否常驻web构建 React 前端 nginx 托管代理/api✅ 常驻api无框架 Node 后端 Passkey 登录 推送通知✅ 常驻media首次启动下载动作图片/GIF 到共享卷⚡ 一次性二、web 容器多阶段构建 单端口入口web/Dockerfile 采用多阶段构建build 阶段node:22-alpine里跑 Vite把frontend/编译成纯静态文件serve 阶段把静态文件拷进nginx:alpine启动即用。自托管者本地完全不需要装 Node。真正的设计亮点在 web/nginx.conf.template静态页面与/api代理同处一个 origin同源这是WebAuthn Passkey 登录的硬性要求配置模板在容器启动时由环境变量渲染NGINX_PORT、BACKEND、PORT、BASE_PATH意味着改端口、挂子路径/gym部署都不需要重新构建镜像/api用变量 resolver实现每次请求动态解析 api 容器地址避免容器重建后 IP 变化导致 502代理时覆盖而非追加X-Forwarded-For头防止客户端伪造活动日志里的 IP。三、api 容器只有 1 个主文件的 Node 后端后端 api/server.js 是纯node:http零框架依赖少到可以数出来api/package.json 中生产依赖仅 3 个——simplewebauthn/serverPasskey 登录、web-push休息计时器/训练提醒推送、undici。加一个可选依赖用于 AI 教练。几个值得新手学习的设计状态即 JSON 文件无数据库。db.json存用户与凭据state-用户id.json存每个用户的计划、训练记录、体重与设置写入采用写临时文件再原子改名防止损坏路由即对象键routes[GET /api/health]这样的键匹配请求方法与路径加接口只需加一个键会话用 HMAC 签名 Cookie密钥存在./data/secret不依赖 JWT 或服务端会话存储默认与教练双镜像api/Dockerfile 用两个 build target 从同一份文件出两种镜像——default不含任何 AI 运行时coach才装 Claude Agent SDK并创建一个无权读取/data的降权用户把 AI 运行时与你的数据隔离开。四、1 个文件夹./data就是全部数据整个项目的数据库就是主机上的 ./data 目录映射进容器的/data文件内容db.json用户档案与 Passkey 公钥state-用户.json每个用户的计划、训练、体重、设置secret会话 Cookie 签名密钥audit.log登录/管理活动日志滚动保留vapid.json推送通知密钥自动生成备份 打包这个文件夹一行tar完事。Passkey 私钥永远在手机的安全硬件或密码管理器里不上服务器。五、多设备同步版本号 乐观合并手机和笔记本同时登录时同步靠服务端修订号revision设备保存时带上它最后看到的版本如果期间另一台设备写过服务器返回409 冲突 当前文档设备本地合并后重试。整个过程见官方时序图断网期间的修改不会被丢弃应用会显示离线横幅提示你何时恢复同步。六、可选扩展默认关闭的 AI 教练与 MCP 服务器AI 教练API_TARGETcoach构建帮你起草一周训练计划、根据记录建议调整所有改动需你批准且使用你自己的API Key跑在你的服务器上见 docs/AI_COACH.mdMCP 服务器只读的标准输入输出桥让 Claude Desktop、Cursor 等 AI 客户端直接读取你的训练历史与 1RM不走网络、不占容器见 mcp/README.md。七、快速启动步骤装好 Docker 后git clone https://gitcode.com/GitHub_Trending/op/openGym cd openGym cp .env.example .env docker compose up -d打开http://localhost:8080创建档案即可。首次启动会一次性下载动作媒体约 140 MB。想让手机用 Passkey 登录需要 HTTPS 域名只需改.env两行——docs/SELF_HOSTING.md 覆盖 Cloudflare Tunnel、Caddy、Traefik、nginx 等全部方案Kubernetes 部署见 docs/SELF_HOSTING_KUBERNETES.md。八、关键路径速查想了解去哪里看项目结构与架构一页通CLAUDE.md训练逻辑渐进规则、1RM、恢复模型frontend/src/lib/progression.js、frontend/src/lib/onerm.jsAPI 全部路由OpenAPI 规范api/openapi.yaml常见问题iPhone、费用、数据去向docs/FAQ.md手机端 APK 与 PWA 方案docs/MOBILE.md结语极简却五脏俱全openGym 的架构哲学可以概括为一句话把现代 App 的体验装进两个容器 一个文件夹里。单 origin 保 Passkey、JSON 文件保可备份、模板化 nginx 保零构建部署、原子写入保数据安全——每个设计决策都服务于你的数据你的服务器这一承诺。对于想学习小型自托管服务如何从零搭起的同学这个仓库几乎是最好的范本 【免费下载链接】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),仅供参考
返回列表