Step 5
Manage & update
Day-to-day operations: reading logs, restarting services, upgrading, and fixing the issues that come up most often.
Logs
Application logs come from PM2; database and service logs come from the Supabase containers:
bash
pm2 logs timetracker-server
cd ~/timetracker/supabase/docker && docker compose logs -fRestart services
bash
# Restart the app
pm2 restart timetracker-server
# Restart Supabase
cd ~/timetracker/supabase/docker && docker compose restart
# Restart the reverse proxy
sudo systemctl restart caddyThe daily-summary cron
The installer adds an hourly cron job that calls POST /api/daily-summary, authorized with a generated CRON_SECRET. You don't need to do anything — view it any time with crontab -l.
Upgrade to a new release
Download the new release package, extract it over your existing install, re-run the installer (it reuses your secrets), then restart the app and push any new migrations:
bash
curl -L -o timetracker-server.tar.gz <new-release-asset-url>
tar -xzf timetracker-server.tar.gz -C ~/timetracker/server
cd ~/timetracker/server
python3 install.py
pm2 restart timetracker-serverThen re-apply migrations
After upgrading, run the database push step again so any new migrations in the release are applied.
Troubleshooting
- TLS / certificate errors — Caddy can only issue certificates once your domains resolve to the VPS. Confirm the DNS A records have propagated, then restart Caddy.
- "permission denied" talking to Docker — your shell hasn't picked up the
dockergroup yet. Start a fresh login session (sudo su - $USERor reconnect) and re-run the installer. - Port already in use — the installer warns when 80, 443, 8000, or 5432 are occupied. Stop the conflicting service before continuing.
- App won't start — check
pm2 logs timetracker-serverand confirm Supabase is healthy withdocker compose psin~/timetracker/supabase/docker.