Self-host wger
updated Sep 2026deployed by usprices checked · Jul 2026Install verified on Ubuntu 26.04 · Sep 2026 · how we test
We earn commissions when you shop through the links below. Full disclosure →
Workout and fitness manager: build routines with automatic weight-progression rules, log workouts, body weight and measurements, and track nutrition against the Open Food Facts database. Includes an exercise wiki, a REST API, basic gym-management features and companion apps for Android, iOS and Flathub.
Key facts
CategoryFitness
LicenseAGPL-3.0-or-later
StackPython, Django, PostgreSQL, Redis, Celery
Min RAM1536 MB
Official imageyes
Measured idle RAM917 MB
Difficulty
Websitewger.de (opens in new tab)
What you need
- Any VPS with at least 1536 MB of RAM
- A domain you control — most self-hosted setups need HTTPS in front of them
- Under an hour if you've used Docker before
Where to host itaffiliate disclosure
Hetzner Cloudrun it on
From $23.59/mo · 2 vCPU / 4 GB / 80 GB · EU + USKamaterafree trial
From $4/mo · 1 vCPU / 1 GB / 20 GB · US + EU + AsiaDigitalOceanalso works on
From $6/mo · 1 vCPU / 1 GB / 25 GB · US + EU + AsiaPaid link — we earn a commission if you shop through it.
Install
Run these commands on your server:
# wger — the official production stack from wger-project/docker (gunicorn + nginx + PostgreSQL + Redis + Celery + PowerSync)
git clone https://github.com/wger-project/docker.git wger && cd wger
sed -i "s|^SECRET_KEY=.*|SECRET_KEY=$(openssl rand -hex 32)|" config/prod.env
docker compose up -d
# one-time, idempotent: storage for the mobile-app sync service
docker compose exec -T web ./manage.py setup-powersync-storage
# → http://SERVER_IP:80 — log in as admin / adminadmin, then change that password and run: docker compose exec web ./manage.py generate-jwt-keysMore self-hosted tools
Forum
Discourse
Ruby on RailsEmber.jsPostgreSQLRedis
easyRead guide →
Newsletter
Keila
ElixirPhoenixPostgreSQL
easyRead guide →
SSO & Identity
Logto
TypeScriptNode.jsPostgreSQL
easyRead guide →
RSS reader
Miniflux
GoPostgreSQL
easyRead guide →