aboutsummaryrefslogtreecommitdiff
path: root/content/blog/2023-01-28-self-hosting-wger.md
blob: 9fddc17760c118265592a7544218129375f1f3b6 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
+++
date = 2023-01-28
title = "Self-Hosting Wger Workout Manager"
description = ""
draft = false
+++

# Wger: The Self-Hosted Workout Manager

[Wger Workout Manager](https://wger.de) is a fitness tracking tool for
those who enjoy self-hosting their data. You can also register an
account on their main website if you\'d prefer to try without
self-hosting.

## Features

I didn\'t see a full listing of features anywhere, so I compiled this
list of my own after installing wger:

1.  Dashboard

    -   Dashboard view of Workout Schedule, Nutrition Plan, Weight
        Graph, & last 5 Weight Logs

2.  Training

    -   Workout Log
    -   Workout Schedule
    -   Calendar (shows weight logs and Bad/Neutral/Good days)
    -   Gallery (shows images you upload)
    -   Workout templates
    -   Public templates
    -   Exercises

3.  Nutrition

    -   Nutrition plans
    -   BMI calculator
    -   Daily calories calculator
    -   Ingredient overview

4.  Body Weight

    -   Weight overview

## Documentation

In order to self-host wger, I opted to use the Docker version of the
application. You can read the README within the
[wger-project/docker](https://github.com/wger-project/docker) project on
GitHub for information and installation instructions.

## Installation

To start the installation, I created a folder for wger and started
creating the three necessary files:

```sh
mkdir ~/wger && mkdir ~/wger/config
touch ~/wger/docker-compose.yml && \
touch ~/wger/config/prod.env && \
touch ~/wger/config/nginx.conf
```

Once you have the folders and files created, you will need to copy the
contents of the `docker-compose.yml`, `prod.env`,
and `nginx.conf` from the GitHub link above.

A few notes to explain the changes I made to the default files:

-   I updated the `ALLOW_REGISTRAION` variable in
    `prod.env` to `False` after I created an
    account via my LAN connection, **before\*** I connected this app to
    a publicly-available domain.
-   I uncommented and updated `CSRF_TRUSTED_ORIGINS` to be
    equal to the public version of this app:
    `https://wger.example.com`.
-   I updated the port within `docker-compose.yml`, within
    the `nginx` block. The port I updated this to will be
    reflected in my nginx configuration file on the server (NOT the wger
    nginx.conf file).

## Deploy

Once all files are created and modified to your needs, simply start the
container.

```sh
docker-compose up -d
```

You can now visit the website on your LAN by going to
`localhost:YOUR_PORT` or by the server\'s IP, if you\'re not
on the same machine that is running the container.

If you wish to connect this app to a public domain name, you\'ll need to
point an `A` DNS record from the domain to your server\'s
public IP. You\'ll then need to create a configuration file for
whichever web server or reverse proxy you\'re using.

Wger\'s README suggests the following reverse proxy configuration for
Nginx:

``` conf
upstream wger {
    # This port should match the port in the `nginx` block of docker-compose.yml
    # If the container is running on this same machine, replace this with 
    # server 127.0.0.1:8080
    server 123.456.789.0:8080;
}

server {
    listen 80;
    listen [::]:443 ssl;
    listen 443 ssl;

    location / {
        proxy_pass http://wger;
        proxy_set_header Host $http_host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_redirect off;
    }

    server_name my.domain.example.com;

    ssl_certificate /path/to/https/certificate.crt;
    ssl_certificate_key /path/to/https/certificate.key;
}
```

# Thoughts on Wger

I\'m still playing around with the app itself, but it seems to be a
solid all-around workout manager, weight log, and food log.

I like that the weight log graph is fluid and updates quickly. You can
also import or export data in CSV format if you\'d like to move your
data elsewhere.

The workout manager is slightly odd, as it requires you to enter sets
and reps for each exercise when you enter it into the plan. Then, when
you add a log entry for performing a workout, you then add what you
actually performed, in terms of reps and weight.

I haven\'t tried the food log yet and I likely will not, at least for a
while. I have no need for a food log or calorie tracker at the moment.

## Screenshot Example

You can see an example of a dashboard with placeholder data here:

![wger dashboard](https://img.cleberg.net/blog/20230128-wger/wger.png)