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 -f

Restart 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 caddy

The 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-server

Then 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 docker group yet. Start a fresh login session (sudo su - $USER or 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-server and confirm Supabase is healthy with docker compose ps in ~/timetracker/supabase/docker.