ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

最快跑通 openGym:自托管健身记录应用 5 分钟部署与手机配对

最快跑通 openGym:自托管健身记录应用 5 分钟部署与手机配对

最快跑通 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/openGym

训练数据锁在别人服务器上、随时可能订阅涨价——这种顾虑在 openGym 自托管健身记录应用里不存在。它是一整套跑在你自己机器上的健身与体重记录系统:排周计划、记录每一次组数、看肌群疲劳情况,还能从 FitNotes、Strong 导入历史。本文带你从零部署实例、确认数据落盘,再把 Android 手机配对上去。

最小可用路径

前提只有一台装了 Docker 和 Compose 插件的机器,不需要 Node。

git clone https://gitcode.com/GitHub_Trending/op/openGym cd openGym cp .env.example .env docker compose pull docker compose up -d
  1. 把仓库克隆到打算长期跑它的机器上,web 和 api 两个容器都从这份配置启动。
  2. 复制.env.example为.env。默认值就是http://localhost:8080,本地跑不用改任何一行。
  3. docker compose pull拉取预构建镜像(amd64 和 arm64 都有)。想从源码构建就跳过这步,改用docker compose up -d --build。
  4. docker compose up -d启动。约一分钟后 web 和 api 两个容器都应变为 Up。
  5. 浏览器打开http://localhost:8080,点Create profile,用 passkey(指纹/面容)创建第一个档案。动作图片与动画已打进镜像,没有别的下载步骤。

确认它正常了

两条命令验证服务与接口:

docker compose ps curl http://localhost:8080/api/health # 应返回 {"ok":true,...}

容器都 Up、health 返回 ok,就算跑通了。日志用docker compose logs -f看,停掉用docker compose down。

数据落在哪,一次说清:

  • 你的全部数据在项目目录的./data里:db.json是档案列表,state-<用户>.json是每人的计划、训练、体重与设置,secret是会话签名密钥,audit.log是管理日志。
  • 备份这个文件夹就等于备份了一切;换机器就是复制这个目录。
  • passkey 的私钥只存在你设备的安全硬件或密码管理器里,从不上服务器。

它为什么这样做

  • 故意不上应用商店。APK 由 CI 构建、签名、发布,每个版本旁边都带.sha256校验文件。对你意味着:文件完整性可以自行验证,更新不依赖商店推送,也没有商店账号和年费夹在中间。
  • 整个数据层是一堆 JSON 文件,没有数据库。对你意味着:迁移和备份策略都简单到只有一条tar命令,排查问题直接读文件。
  • passkey 登录是默认且推荐方式。它绑定精确主机名,且只在 HTTPS 下生效(唯一例外是 localhost)。对你意味着:部署机上http://localhost:8080直接可用;想在手机上登录就得先套一个域名加证书(Cloudflare Tunnel、Caddy、nginx 均可,见 docs/SELF_HOSTING.md)。
  • 默认无遥测、无 AI 调用。默认安装不向任何外部服务发请求,AI 教练和 MCP 服务器都是管理员可选项、默认关闭。对你意味着:你的训练数据默认不出你的实例。

跑通之后

把 Android APK 配对到自托管服务器

从项目 Releases 页下载官方签名的 APK(含arm64-v8a与armeabi-v7a,覆盖几乎所有真机),首次安装时允许"安装未知来源应用"。然后在已登录的浏览器里打开 Settings → Account →"Pair the mobile app",页面生成一个5 分钟有效的一次性配对码,在 App 里输入你的服务器地址和这个码即完成绑定。

App 的 WebView 无法走 passkey,所以配对换发的是 bearer token 而不是 cookie,这带来两个实际好处:

  • token 寿命是SESSION_DAYS(默认 90 天),每次启动若超过一半寿命就自动换新,常用的手机永远不掉线。
  • 离线时照常记录,网络恢复后自动同步;断线期间没有任何改动会丢。

更新也不用你操心:App 每次会话只查一次最新版本,发现更新后先做文件大小检查(小于 100 KB 判定无效),再计算 SHA-256 与官方哈希比对,不一致会报 "download may be corrupted or tampered with" 并中止,通过才调系统安装器覆盖安装。本地模式、离线行为与自构建流程详见 docs/MOBILE.md。

多设备同步如何合并冲突

每个档案的数据是一个带服务器修订号(revision)的文档。设备写入时上报它上次看到的修订号;如果中间有别的设备写过,服务器拒绝并返回当前文档,设备合并后重试。每条改动都带自己的时间戳,细到一个设置项或计划字段,所以合并保留每个字段的最新编辑,删除保持删除。手机、笔记本同时改,互不覆盖。

从 FitNotes、Strong 或 Hevy 导入历史

Settings → Data & backup 里从旧应用导出 CSV,走Import from another app导入。动作名会对动作库做匹配,认不出的变成你的自定义动作,所以文件里什么都没有丢失;同一天已有训练的记录会被跳过,同一文件导两次不会产生重复。Hevy Pro 用户可以直接用 API key 导入训练、计划和体重;iPhone 上的体重数据则从 Apple Health 的导出文件读取。

边界与代价

  • 不想维护服务器的人不适合。没有服务器就只能用 Android APK 的纯本地模式:数据存在应用私有目录opengym-state.json,能记录但不能跨设备同步。
  • LAN 里用纯http://访问时 passkey 不可用。只能启用PASSWORD_LOGIN=1走密码登录、用访客模式(数据仅存于那个浏览器),或者照 docs/SELF_HOSTING.md 给内网地址配证书。
  • ./data明文存放,没有静态加密。备份归档里还包含audit.log(登录时间等记录),把备份丢到第三方云盘前,先知道里面有这些。
  • 动作图片版权仅限 openGym 使用。它们不受 AGPL 覆盖,非商业 fork 可原样保留,其他用途需向版权方单独授权。
  • iOS 没有商店应用。可选方案是自托管后用 Safari"添加到主屏幕"(完整 PWA,支持离线与同步),或用 Xcode 免费签名装机(7 天后签名过期,需重新签)。

常见问题

必须花钱吗?不需要。AGPL-3.0 开源,无订阅、无广告、无付费层,代码和文档全部公开。更多短问答见 docs/FAQ.md。

多人可以共用一个实例吗?可以。每个人建自己的档案,数据彼此隔离。INVITE_ONLY=1可把注册改为邀请制,FIRST_USER_ADMIN=1让空实例上第一个注册的档案自动成为管理员(记得先于分享地址前注册自己的档案)。

怎么升级?git pull后docker compose pull再docker compose up -d即可,./data不受影响,动作媒体随新镜像一起更新。

手机上的数据存在哪?本地模式下是应用私有目录里的opengym-state.json,每次变更都写盘。打开 Settings →Auto-backup on changes后,每次完成训练会在手机Documents/openGym/生成一份带日期的 JSON 备份,每天一份,自动只保留最新 14 份,可以直接交给 Syncthing 或云盘同步。

服务器跑起来的那一刻,你的训练记录就有了一个可以备份、可以迁移、可以审计的去处——数据始终是你的。

【免费下载链接】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),仅供参考

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进