Self hosted Workout Tracking App: Wger

Wger 是一个开源并且可以轻松架设在私人服务器上面的健身追踪App。虽然相比一些商业方案来讲功能还比较有限,而且相对于各种基于 smart device的方案来讲还是不够方便,毕竟很多地方需要手动输入。但是因为手机上面已经有一个相当可用的 APP,所以总体来讲可用性已经相当不错了。即使人工输入信息,体验也不算太糟糕。

假设的总体流程还是很容易的:  Docker compose + Reverse proxy

Docker compose

Checkout code from https://github.com/wger-project/docker. 这个是 Wger 专门给 Docker compose 用的 repo。

Config

这个Repo 里面有一个 config/ 目录,里面的config,一个给 Nginx 用的,一个给 Wger 用的。而这两个正是 docker-compose.yaml 里面主要的service。

其中 nginx.conf 大概率不需要做什么更改,里面的 client_max_body_size 可能需要更改,如果需要支持更大的上传文件。主要就是对于视频上传的支持。

对于另一个文件,需要更改的比较多。

  • SECRET_KEY + SIGNING_KEY 这两个都需要生成新的 string 。用 https://djecrety.ir  就可以
  • TIME_ZONE 根据需要更改
  • CSRF_TRUSTED_ORIGINS=https://my.domain.example.com,https://118.999.881.119 这个默认是没有打开的。但是如果用 reverse proxy 的话,肯定是要打开的。
    • 而且,因为 reverse proxy 到 wger host 之间大概率是没有采用 SSL 加密的(毕竟一般 HTTPS 卸载应该都在 Reverse proxy 上面做了),所以一定要添加 Reverse proxy 到 wger 之间访问的URL。比如如果 Reverse proxy 上面添加的是 IP:port, 那么这里就应该有个 http://<IP>:port 在这里。
  • ALLOW_REGISTRATION + ALLOW_GUEST_USERS 这两个如果没有必要还是关上比较好。如果需要多用户的话,添加用户的时候临时打开一下就好。一般个人使用不会需要经常添加新用户。
  • SYNC_EXERCISES_ON_STARTUP + DOWNLOAD_EXERCISE_IMAGES_ON_STARTUP 这两个很有趣,如果是第一次运行,两个还是都打开为好。
    • 如果是之后打开,我的理解是,前者不需要打开,后者可以打开。
  • 其他的基本都不需要动。尤其是那个 SITE_URL, 尽量还是不要轻易动。

之后就是正常的 docker-compose up -d. 一个小建议就是,checkout 下来的代码,repo 名字是 docker,所以目录名字也是 docker. 而这个对于Wger来讲并不合适。我个人只是把目录名改为 wger, 这样的话 docker 里面看到这个 stack 的名字就是 wger. 而所有启动的 container 名字都会有前缀 wger_. 关于 docker-compose.yaml 文件的修改,见下一章节。

而因为这次有这两个 config 文件,需要以 binding mount的方式传进 Docker container 里面,所以就没有通过 Portainer 来部署,而是直接选择命令行部署。这样部署的docker compose stack 在 Portainer 里面依旧可以看到。但是不能做更改。

Docker compose yaml

这里实际上不需要改动什么地方。大概只有 nginx.ports 这一项需要改动。默认的是 80:80. 而大多数人的 server 上面大概率不会只有一个 wger 在运行。这里我的设置是 5780。至于那些DB的密码之类的,随意改动就好了。

Reverse proxy

这里还是使用 Nginx Proxy Manager 来做 Reverse proxy。

  • Forward Hostname / IP
    • 这里我用的是Wger host VM 的 Domain name。如果内网没有单独的 DNS, 那就直接用 Wger host 的 IP

因为启动的时候需要下载图片之类的静态资源,所以可能 docker-compose up -d 需要一段时间才能完成。注意,成功的部署,首次打开网页的时候应该如下图所示。如果没有背景图片的话,多半是由地方没有配置好。

Usage

Wger 的用法有一点点不好理解,或者说,非常针对健身房中的器材健身,而不是平时的日常锻炼,尤其是Cardio的活动。

Wger 训练计划的基础在于定义 Workout,而Workout 是由一周中的日期组成的。然后在每天定义这一天的锻炼项目。一旦某一天定义了workout 项目,那么这一天就不能再次被使用了。

限制在于,假设你周一要做 Exercise A and Exercise B,周二做 Exercise B。我们能想到两种方式

  1. 定义 Exercise A,选择 Monday + Tuesday,然后定义 Exercise B, 选择 Tuesday only
  2. 定义 Monday, 选择 Exercise A + B, 然后定义 Tuesday, 选择 Exercise B only

在 Wger 上面使用方法二。 方法一是不行的。

这时你可能会想:那么如果创建多个 Workout,然后一个 Workout 负责有氧,一个负责无氧,两个同时使用不就好了?

然后实际情况是,同一时间只会有一个 Workout 处于 Active 状态。而手机上默认能够Track的就是目前 Active 的那个 Workout。

而在Workout的 Tracking 上面,Wger 也是非常面向健身房的,而不是一天中时不时锻炼的方式。在手机上追踪锻炼的时候,Wger会把当前 Active 的 Workout 拿出来,然后只选择其中今天要做的部分 (注意,一个 Workout 里面,同一天只会有一组 Exercise),然后按照顺序一个一个让你做,中间夹杂休息时间的计时。

所以对于一周固定时间去健身房,完成固定动作的同学,Wger的使用方法是非常契合的。但是如果是平时参与各种各样的活动来锻炼身体的同学,这个APP能做的就很有限了。

其他

Wger的另外一些方面由于时间关系就没有来得及尝试。包括饮食计划以及体重追踪。之后如果有机会再讲。


最后,我一个不健身的人搞这个没有用,卸载了省点服务器的空间,省点Docker的网段吧 🤦