openGym:用 Docker 自建训练计划与身体数据追踪器
给想自管训练数据的人用的健身追踪器,Docker部署,数据不离开自己的服务器。
GitHub DuarteSantos8/openGym 更新 2026-10-06 分支 main 星标 4.2K 分叉 654
JavaScript React 19 Docker 健身训练追踪 Passkeys JSON 数据存储 AGPL-3.0

🧭 决策指南

适合,如果你

  • 你希望用Docker在自己的服务器运行训练计划和体重记录。
    README 的“Why openGym”和“Quick start”写明项目运行在自己的设备上,使用 Docker Compose 启动。
  • 你需要1,324个动作、肌肉地图、Supersets和RIR/RPE记录。
    README 的“Features”章节列出1,324 exercises、muscle map、supersets以及RIR/RPE。
  • 你要迁移FitNotes、Strong或Hevy的历史训练数据。
    README 的“Accounts and data”列出从 FitNotes、Strong、Hevy 导入数据。
  • 你需要手机和笔记本之间同步,并希望使用Passkey登录。
    README 首页描述支持passkey sign-in和phone/laptop同步;“Accounts and data”说明设备间同步。

不适合,如果你

  • 你不能提供HTTPS域名,却需要在手机上使用Passkeys。
    README 的“Quick start”明确写明手机使用passkeys需要HTTPS on a domain。
  • 你不愿运行Docker或在主机管理./data数据目录。
    README 的“Quick start”要求Docker with Compose,并说明DATA_DIR映射到主机./data。
  • 你需要云端托管、订阅服务或官方托管账户体系。
    README 的“Why openGym”强调项目运行在自己的服务器上,没有他人服务器账户和订阅。
  • 你要求AI教练无需外部Provider密钥即可工作。
    README 的“Optional extras, off by default”说明AI coach使用自有provider key。

前置条件

  • 需要 Docker with Compose。
  • 默认Web端口为 8080,API端口为 3000。
  • 首次启动会下载约 140 MB exercise media。
  • 手机使用Passkeys需要HTTPS on a domain。
  • 主机不需要安装Node;README说明Docker部署无需Node on the host。

第一步命令(README 原文)

docker compose up -d

要注意

  • 切换到手机Passkeys前,要在.env配置HTTPS域名相关设置。
    README 的“Quick start”说明需要HTTPS on a domain,并指出只需修改.env中的两行。
  • 使用GHCR镜像时需要替换docker-compose.yml中的image行。
    README 的“Quick start”说明默认从GitLab Registry拉取,也可改用GHCR。
  • 启用AI coach时需将API_TARGET设为coach并配置Provider密钥。
    README 配置表列出API_TARGET的coach选项;AI coach章节要求自有provider key。
  • 审计日志默认开启,AUDIT_MAX默认保留5,000条、AUDIT_DAYS默认保留90天。
    README 的配置表给出AUDIT_LOG、AUDIT_MAX和AUDIT_DAYS的默认值。

材料未说明

  • README未提供最低CPU、内存或磁盘要求。
  • README未说明单实例可支持的用户数量或训练记录规模。
  • README未说明Android APK与Docker版本之间的功能差异。
  • README未提供数据库迁移、备份恢复或灾难恢复流程的完整细节。
  • README未说明10位贡献者和5个版本对应的长期维护计划。
  • README未提供Passkeys在不同浏览器和反向代理组合下的兼容性矩阵。

💡 深度解析

6
适合 我现在使用 FitNotes、Strong 或 Hevy,想把历史训练迁移到自己的服务器,并在以后导出完整 JSON;openGym 能满足这个迁移约束吗?
适合读者: 正在从 FitNotes、Strong 或 Hevy 迁移到自托管系统,并要求保留历史训练和可导出 JSON 的健身者

适合,README 直接覆盖这些来源的导入和完整 JSON 导出,但迁移结果仍取决于原应用数据字段能否正确映射。

  • Accounts and data 章节列出 FitNotes、Strong、Hevy 导入;FitNotes 等支持 CSV,Strong 和 Hevy 还可使用 API key,另有 Apple Health 体重导入。
  • 同一章节说明可以随时将全部数据导出为一个 JSON 文件,符合自托管和可迁移要求。
  • Progress 章节支持编辑已保存训练、补录纸面训练和修改日期,修正后会重新读取历史记录。
  • README 没有承诺不同应用的字段、单位、动作名称和日期格式会完全一致,因此迁移后仍需要核对历史内容。
  • Accounts and data:"Import from FitNotes, Strong, Hevy (CSV or API key) and Apple Health weight exports."
  • Accounts and data:"Export everything as one JSON file whenever you like."
  • Progress:"Edit any saved workout after the fact... Records are re-read from the corrected history."
材料未说明:README 未提供各导入器支持的完整字段映射、单位转换规则和错误报告格式。;README 未说明超大历史文件的导入耗时或大小上限。
不适合 我计划在 Kubernetes 上部署 openGym,开启邀请制注册、管理员面板和审计日志,供多个个人档案使用;它适合组织级健身管理吗?
适合读者: 准备在 Kubernetes 上为多个个人档案部署 openGym,并需要邀请制注册、管理员面板和审计日志的运维者

不适合把它直接当作组织级健身管理系统;它能覆盖小规模多档案自托管,但 README 没有承诺教练审批、团队权限或高并发能力。

  • README 提供单独的 Kubernetes 自托管指南,说明部署形态可行。
  • Configuration reference 支持 INVITE_ONLY、ADMIN_UIDS 和 AUDIT_LOG,Accounts and data 也提供可选管理员面板。
  • 但项目洞察明确指出 JSON 文件存储更适合个人或小规模实例,不适合大量用户、高并发、多租户和复杂查询。
  • 同一分析还指出项目面向个人健身追踪,缺少医疗数据治理、教练审批工作流和组织级权限模型。

因此,家庭或小型私有实例可以考虑;需要正式团队管理时,现有权限和数据层不足以直接支撑。

  • Quick start:"there are separate guides for ... Kubernetes"
  • Configuration reference:`ADMIN_UIDS`、`INVITE_ONLY`、`AUDIT_LOG`
  • 项目洞察 usage_limitations:"适合个人或小规模实例;对于大量用户、高并发、多租户..."
  • 项目洞察 usage_limitations:"并非医疗、康复或专业运动队管理系统"
材料未说明:README 未给出 Kubernetes 副本数、容量规划、故障恢复和滚动升级要求。;README 未定义管理员面板可执行的具体操作及不同管理员角色的权限差异。
视情况 我只有一台 ARM64 NAS,想用 Docker 部署 openGym,并让手机通过 Passkey 在家外记录训练;这个方案适合我吗?
适合读者: 拥有 ARM64 NAS、希望用 Docker 在家中自托管,并从手机通过 Passkey 记录训练的个人用户

视情况,适合 ARM64 NAS 的基础部署,但手机远程 Passkey 使用取决于 HTTPS 和域名配置是否正确。

  • README 明确提供 amd64 与 arm64 预构建镜像,并说明宿主机不需要安装 Node.js。
  • 数据保存在用户控制的文件夹中,适合 NAS 做持久化和备份。
  • README 要求手机 Passkey 使用 HTTPS 域名,并正确设置 RP_ID 与 ORIGIN;仅执行 Compose 启动并不足够。
  • 首次启动还要下载约 140 MB 的训练媒体,NAS 的带宽和存储需要能承受这次初始化。

因此,局域网使用较直接;远程使用则必须完成反向代理或 Cloudflare Tunnel 等配置。

  • Quick start:"prebuilt images, amd64 + arm64"
  • Quick start:"Either way you don't need Node on the host."
  • Quick start:"To reach it from your phone with passkeys you need HTTPS on a domain"
  • Configuration reference:`RP_ID`、`ORIGIN`
docker compose up -d
材料未说明:README 未给出 ARM64 NAS 的最低 CPU、内存和存储要求。;README 未说明特定 NAS 厂商的 Docker Compose 兼容性。
适合 我按 Push/Pull/Legs 或 5×5 训练,记录 RIR/RPE,并希望使用双重进阶、估算 1RM 和恢复肌群分析;openGym 是否比简单重量次数日志更合适?
适合读者: 使用 Push/Pull/Legs 或 5×5、依赖 RIR/RPE 和双重进阶,并希望查看肌群恢复状态的中高级训练者

适合,因为它把计划、努力程度、进阶和肌群状态放在同一套训练记录中,而不是只保存重量与次数。

  • Planning 章节提供 Push/Pull/Legs、Upper/Lower、Full Body 和 5×5 模板,而且模板仍可编辑。
  • Training 章节支持可选 RIR 或 RPE、预填上次重量、PR 检测,以及超级组、热身组和递减组。
  • Progress 章节提供线性、Greyskull LP、双重进阶和时间进阶;失败次数不会增加重量,停滞会触发减量。
  • 同一章节还提供估算 1RM、训练量、恢复中肌群和未训练肌群视图,因此与需要长期训练反馈的场景匹配。

限制是这些指标依赖动作分类和训练记录质量,不能当作医学或精确生理测量。

  • Planning:"Four starter plans (Push/Pull/Legs, Upper/Lower, Full Body, 5×5)"
  • Training:"Optional effort column as RIR or RPE"
  • Progress:"linear, Greyskull LP, double progression"
  • Progress:"A muscle map in three modes: where your volume went, what is still recovering, and what has gone untrained."
材料未说明:README 未说明恢复模型使用的具体时间窗、权重公式或动作强度校准方式。;README 未说明 Structural Balance 比例是否支持自定义标准。
适合 我想让 AI 教练使用自己的 Anthropic、OpenAI、Gemini 或 Ollama 密钥,并让 Claude Desktop 只读查询训练历史;这些能力在 openGym 中是否能一起使用?
适合读者: 希望在自有服务器上使用 Anthropic、OpenAI、Gemini 或 Ollama,并让 Claude Desktop 查询训练历史的开源开发者

适合,但这是两个默认关闭且部署边界不同的可选能力,不能把 MCP 当作 Docker 核心服务的一部分。

  • Optional extras 章节说明 AI 教练在服务器运行,使用用户自己的 provider key,支持 Anthropic、OpenAI、Gemini、OpenAI-compatible endpoint 和 Ollama。
  • AI 教练只起草训练周计划或提出变更,README 明确要求用户批准每次修改,适合不希望 AI 自动改计划的约束。
  • MCP server 面向 Claude Desktop,默认只读、只在本地查询训练历史。
  • README 同时明确 MCP 不属于 Docker build,因此需要按独立文档配置,不能假设 docker compose up -d 会自动启用它。
  • Optional extras, off by default:"your own provider key (Anthropic, OpenAI, Gemini or any OpenAI-compatible endpoint, Ollama included)"
  • Optional extras, off by default:"You approve every change."
  • Optional extras, off by default:"Read-only and local; not part of the Docker build."
材料未说明:README 未说明 AI 教练支持的具体模型版本、上下文长度和请求失败后的行为。;README 未说明 MCP 对 Claude Desktop 的完整配置格式和权限边界细节。
视情况 我会在健身房用手机离线记录,再用笔记本查看或修改;有时两个设备会同时编辑训练记录,openGym 能避免简单的最后写入覆盖吗?
适合读者: 在手机和笔记本之间切换、需要离线训练并由两个设备同时编辑记录的个人用户

视情况,README 明确支持离线、多设备同步和并行编辑合并,但没有把它描述成完整的版本控制系统。

  • Why openGym 章节说明应用可安装到主屏幕、离线工作,并在手机和笔记本之间同步。
  • Accounts and data 章节明确写出两个设备同时编辑时会合并,而不是互相覆盖。
  • 训练界面还提供屏幕常亮、组间休息计时和提醒,符合健身房手机使用场景。
  • 但项目洞察指出复杂冲突仍可能需要用户复核;README 的已提供片段没有说明冲突优先级、离线时长上限或恢复历史界面。

所以普通训练记录适合,多设备同时改同一条复杂计划时不能假设所有冲突都自动解决。

  • Why openGym:"works offline, syncs between your phone and your laptop."
  • Accounts and data:"Two devices editing at once merge instead of overwriting each other"
  • Training:"the screen stays awake" 和 "a rest-timer alert"
材料未说明:README 未说明同步冲突的字段级合并规则和冲突呈现方式。;README 未说明离线多久后重新联网仍能可靠合并。

✨ 核心亮点

  • 内置1,324个动作、动画演示与肌肉地图
  • Docker一条命令自建,数据存于主机./data
  • 支持Passkeys、离线使用与跨设备同步
  • 可导入FitNotes、Strong和Hevy数据
  • AI教练默认关闭且需要自有Provider密钥

🔧 工程化

  • React 19前端提供计划、引导训练、PR与热力图
  • 支持Supersets、RIR/RPE、递进规则与deload
  • node:http API用JSON保存数据并提供OpenAPI文档
  • Docker部署包含amd64与arm64预构建镜像

⚠️ 风险

  • 手机使用Passkeys必须为域名配置HTTPS
  • 首次启动需下载约140MB训练媒体
  • AI教练需Anthropic、OpenAI或Gemini等Provider密钥
  • 项目采用AGPL-3.0,分发修改版需关注许可证义务

👥 适合谁?

  • 想用Docker在自有服务器管理训练数据的个人
  • 已有FitNotes、Strong或Hevy历史数据的用户
  • 需要React 19与Passkeys示例的开源开发者
  • 拥有HTTPS域名并使用手机训练的自托管用户