openGym首次启动全流程:从克隆仓库到创建第一个Passkey档案
【免费下载链接】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 是一款自托管(self-hosted)的家庭健身房训练与体重记录应用:制定每周计划、记录每一次组数、查看肌肉训练状态,还支持从 FitNotes/Strong/Hevy 导入历史数据。全文用不到 10 分钟,带你完成openGym 自托管部署:克隆仓库、Docker 一键启动、打开浏览器、创建第一个Passkey 档案(Face ID / 指纹登录),数据完全存放在你自己的服务器上。
一键启动 openGym:克隆仓库并拉起 Docker 容器
唯一前提是安装好 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这 5 行命令背后,docker-compose.yml 编排了 3 个角色:
| 容器 | 职责 |
|---|---|
media | 一次性下载约 140 MB 的动作示范图片/GIF 到./media/ |
api | Node 后端,负责 Passkey 认证(WebAuthn)与 JSON 数据存储 |
web | nginx 托管前端,并把/api代理到后端,保证整个应用处于同一域名下——这是 Passkey 的硬性要求 |
验证服务是否健康
docker compose ps curl http://localhost:8080/api/health # 应返回 {"ok":true,...}看到两个容器均为running、健康检查通过,openGym 就已在http://localhost:8080上运行。首次启动会先下载动作媒体库,稍慢属正常现象。
创建你的第一个 Passkey 档案(无需密码)
打开http://localhost:8080,你会看到登录页,三个入口:
- Sign in with passkey(用 Passkey 登录)——已有档案时使用
- Create new profile(创建新档案)——新手点这个
- Continue without account(游客模式,数据仅存本机浏览器)
点击Create new profile后流程如下:
- 给档案起一个名字(最长 40 字符,如
阿哲); - 点击Create passkey,浏览器会弹出系统生物识别窗口——在手机上就是 Face ID / Touch ID / 指纹,在 Windows 上是 Windows Hello,在 Mac 上是 Touch ID;
- 确认成功后立即进入应用,界面提示Welcome, {你的名字}。
💡Passkey 和传统密码的区别:私钥永远只保存在你的设备安全硬件或密码管理器(iCloud 钥匙串、Google 密码管理器等)里,服务器只存公钥(见 .env.example 中
RP_NAME=openGym的提示文案)。因此 openGym 默认没有密码,也无法被钓鱼或撞库。
如果你的实例配置了邀请码(INVITE_ONLY=1),创建档案时还需要填入管理员发放的邀请码;默认实例是开放注册的,无需此步。
登录后,你的数据放在哪里?
一切都在主机的./data目录中,备份时打包这一个文件夹即可(详细备份说明见 docs/SELF_HOSTING.md):
| 文件 | 内容 |
|---|---|
db.json | 档案列表与公开 Passkey 数据 |
state-<user>.json | 每个用户的计划、训练记录、体重与设置 |
audit.log | 管理员活动日志(默认开启) |
secret | 会话 Cookie 签名密钥 |
登录成功后,应用会自动把本机已有的游客数据合并进新档案(Profile created — data from this device moved into it)。之后在手机与电脑间同步时,每台设备保存时会带上自己"最后看到的版本号",若期间另一台设备写过数据,服务器会返回冲突并让设备合并后重试——多设备互不覆盖,原理图如下:
⚠️关于手机访问:浏览器只允许在 HTTPS(或localhost)下使用 Passkey,所以手机不能通过http://<局域网IP>:8080登录。想在手机上用 Passkey,需要给实例配置一个 HTTPS 域名(Caddy、Cloudflare Tunnel、nginx 均可),文档 docs/SELF_HOSTING.md 有逐项教程;临时方案是先用游客模式或在局域网设置PASSWORD_LOGIN=1开启密码登录。
首次启动常见问题排查速查
| 现象 | 解决方法 |
|---|---|
| 8080 端口被占用 | 在.env中改为WEB_PORT=9090,同步更新ORIGIN |
| 手机上看不到 Passkey 弹窗 | 你访问的是http://或 IP 地址,请配置 HTTPS 域名 |
| 登录报 "verification failed" | RP_ID/ORIGIN与地址栏 URL 不匹配,见下表 |
| 动作图片/GIF 没下载 | docker compose logs media查看,重跑docker compose up -d |
修改.env不生效 | docker compose restart不会重读.env,请用docker compose up -d |
RP_ID与ORIGIN的格式是新手最常踩的坑:
| 变量 | 正确写法 | 错误写法 |
|---|---|---|
RP_ID | gym.example.com(纯主机名) | https://gym.example.com、带端口、带斜杠 |
ORIGIN | https://gym.example.com(带协议) | 裸域名、带末尾斜杠 |
本地体验(localhost)保持 .env.example 的默认值即可:RP_ID=localhost、ORIGIN=http://localhost:8080。更多问题可查阅 docs/FAQ.md,完整的部署、多用户、通知与更新指南见 docs/SELF_HOSTING.md。
总结
至此你已经走完openGym 首次启动的完整闭环:克隆仓库 →docker compose up -d一键拉起 → 浏览器创建 Passkey 档案 → 数据落地./data。接下来可以试试:从 FitNotes/Strong/Hevy 导入历史数据(docs/DATA_IMPORTS.md)、加载 Push/Pull/Legs 等四个模板计划,或把应用"添加到主屏幕"变成类原生体验(docs/MOBILE.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),仅供参考