214 lines
3.8 KiB
Markdown
214 lines
3.8 KiB
Markdown
cd ~/Dokumenti/scripts/Fitnes-tracker
|
||
|
||
# Stop the container
|
||
docker compose down
|
||
|
||
# Create the folder if it doesn't exist (safe to run even if it exists)
|
||
mkdir -p fitness-data
|
||
|
||
# Make sure container user (uid 1000) can write there
|
||
sudo chown -R 1000:1000 fitness-data
|
||
sudo chmod 775 fitness-data
|
||
|
||
# Start again
|
||
docker compose up
|
||
|
||
|
||
Fitness Tracker – Self-Hosted 5×5 Powerlifting App
|
||
|
||
A minimal self-hosted fitness tracker built in Go.
|
||
Includes:
|
||
|
||
Workout logging with start/finish
|
||
|
||
A/B templates (StrongLifts style)
|
||
|
||
Automatic rest-time tracking
|
||
|
||
Volume tracking (today/week/month)
|
||
|
||
SQLite database
|
||
|
||
Fully Dockerized (with UID/GID support)
|
||
|
||
External fitness.db mounted to host
|
||
|
||
This app is designed to be simple, private, and fast, perfect for home servers or local use.
|
||
|
||
📁 Project Structure
|
||
Fitnes-tracker/
|
||
│── main.go
|
||
│── go.mod
|
||
│── Dockerfile
|
||
│── docker-compose.yml
|
||
│── readme.md
|
||
│── fitness-data/ # External volume (database lives here)
|
||
│ └── fitness.db
|
||
|
||
🔥 1. Running Locally (Development Mode)
|
||
Install Go
|
||
|
||
Ubuntu / Debian:
|
||
|
||
sudo apt update
|
||
sudo apt install -y golang-go
|
||
|
||
|
||
Verify:
|
||
|
||
go version
|
||
|
||
Run the app
|
||
|
||
Inside the project folder:
|
||
|
||
cd Fitnes-tracker
|
||
DATABASE_URL=./fitness.db go run main.go
|
||
|
||
|
||
Open in browser:
|
||
|
||
👉 http://localhost:8080
|
||
|
||
Local DB file will be created as:
|
||
|
||
./fitness.db
|
||
|
||
🐳 2. Running with Docker (Recommended)
|
||
|
||
Make sure Docker + docker-compose are installed:
|
||
|
||
sudo apt install -y docker.io docker-compose-plugin
|
||
sudo usermod -aG docker $USER
|
||
newgrp docker
|
||
|
||
Create external DB directory
|
||
mkdir -p fitness-data
|
||
|
||
Fix permissions so container user (UID 1000) can write
|
||
sudo chown -R 1000:1000 fitness-data
|
||
sudo chmod 775 fitness-data
|
||
|
||
Build the Docker image
|
||
docker compose build
|
||
|
||
Start the app
|
||
docker compose up -d
|
||
|
||
|
||
Check logs:
|
||
|
||
docker compose logs -f
|
||
|
||
|
||
You should see:
|
||
|
||
Using database file: /data/fitness.db
|
||
Listening on :8080 ...
|
||
|
||
|
||
Open:
|
||
|
||
👉 http://localhost:8080
|
||
|
||
🔧 3. Docker Compose Explained
|
||
|
||
Your docker-compose.yml:
|
||
|
||
services:
|
||
fitness:
|
||
build: .
|
||
container_name: fitness-tracker
|
||
restart: unless-stopped
|
||
environment:
|
||
- DATABASE_URL=/data/fitness.db
|
||
volumes:
|
||
- ./fitness-data:/data
|
||
ports:
|
||
- "8080:8080"
|
||
|
||
What it does:
|
||
|
||
Mounts ./fitness-data → /data inside container
|
||
|
||
SQLite DB stored on host: fitness-data/fitness.db
|
||
|
||
App always restarts unless manually stopped
|
||
|
||
Binds port 8080 (browser UI)
|
||
|
||
👤 4. Running container as UID 1000:1000
|
||
|
||
The app inside the container runs as a regular Linux user (not root).
|
||
This avoids permission issues and is safer.
|
||
|
||
To check container UID/GID:
|
||
|
||
docker exec -it fitness-tracker id
|
||
|
||
|
||
Expected output:
|
||
|
||
uid=1000(appuser) gid=1000(appuser)
|
||
|
||
|
||
If permissions are wrong, fix host directory:
|
||
|
||
sudo chown -R 1000:1000 fitness-data
|
||
sudo chmod 775 fitness-data
|
||
|
||
📦 5. Rebuilding & Updating
|
||
|
||
Whenever you modify Go code:
|
||
|
||
docker compose build
|
||
docker compose up -d
|
||
|
||
|
||
If you want to clean old images:
|
||
|
||
docker system prune -f
|
||
|
||
📤 6. Production Setup (Traefik Support)
|
||
|
||
To put behind Traefik:
|
||
|
||
Add labels inside docker-compose.yml:
|
||
|
||
labels:
|
||
- "traefik.enable=true"
|
||
- "traefik.http.routers.fitness.rule=Host(`fitness.rozic-dev.com`)"
|
||
- "traefik.http.routers.fitness.entrypoints=websecure"
|
||
- "traefik.http.routers.fitness.tls.certresolver=letsencrypt"
|
||
- "traefik.http.services.fitness.loadbalancer.server.port=8080"
|
||
networks:
|
||
- traefik_default
|
||
|
||
💾 7. Backup
|
||
|
||
Just back up the fitness-data/ folder:
|
||
|
||
cp -r fitness-data fitness-data-backup
|
||
|
||
|
||
Or tar it:
|
||
|
||
tar -czvf fitness-backup.tar.gz fitness-data/
|
||
|
||
📚 8. Git Instructions
|
||
Set your identity once:
|
||
git config --global user.name "Dejan R."
|
||
git config --global user.email "dejan@example.com"
|
||
|
||
Useful Commands
|
||
git add .
|
||
git commit -m "update"
|
||
git push
|
||
|
||
.gitignore (already included)
|
||
*.db
|
||
fitness-data/
|
||
|
||
|
||
DB files will never pollute your git history.
|