Production deployment notes
Gitea Actions
This repo includes .gitea/workflows/ci-deploy.yml for:
- backend build
- backend tests
- frontend tests
- frontend production build
- deployment to Ubuntu after successful tests on
main
Required secrets in Gitea
PROD_HOSTPROD_USERPROD_SSH_KEY
Ubuntu server setup
Recommended app path:
/opt/job-tracker/app
Persistent runtime secrets path:
/opt/job-tracker/shared/.env
Requirements:
- Docker Engine
- Docker Compose plugin
- reverse proxy in front (Nginx, Caddy, or Traefik)
- shared env file present on server in
/opt/job-tracker/shared/.env - network connectivity from the backend container to your
mariadbcontainer/service
The deploy script will automatically create a symlink from:
/opt/job-tracker/shared/.env
to:
/opt/job-tracker/app/.env
This keeps secrets outside the uploaded repo checkout so they are not wiped by CI deploys.
Frontend API base URL
The production frontend already proxies /api to the backend container via Nginx.
Recommended default:
- leave
REACT_APP_API_BASE_URLunset/empty in production
Only set REACT_APP_API_BASE_URL if the UI must call a different external API origin on purpose.
Example production .env
DATABASE_PROVIDER=mariadb
JOBTRACKER_CONNECTION_STRING=server=mariadb;port=3306;database=jobtracker;user=jobtracker;password=REPLACE_ME
AUTH_JWT_KEY=replace_with_long_random_secret
AUTH_ADMIN_EMAIL=you@example.com
AUTH_ADMIN_PASSWORD=replace_with_strong_password
APP_PUBLIC_BASE_URL=https://your-domain.example
AI_SERVICE_BASE_URL=http://ai-service:8001
OLLAMA_BASE_URL=http://ollama:11434
OLLAMA_MODEL=qwen2.5:7b
EMAIL_FOLLOWUPREMINDERS_ENABLED=true
EMAIL_FOLLOWUPREMINDERS_UPCOMINGDAYS=2
# Optional backward-compatible alias if older config still references the previous name:
SUMMARIZER_BASE_URL=http://ai-service:8001
Database recommendation
For production, yes — use a real database.
Recommended direction
Short term:
- SQLite is acceptable for a single-user or very small deployment
- keep backups and volume persistence
Better production choice:
- MariaDB or PostgreSQL
My recommendation
- PostgreSQL if you want the best long-term maintainability and fewer edge cases
- MariaDB is also fine if that is what you already know or host elsewhere
If you stay on SQLite:
- okay for small personal use
- not ideal for concurrent writes, larger scale, or operational robustness
Practical recommendation for this project
If this app is going to be a real production service on Ubuntu:
- move to PostgreSQL first if possible
- MariaDB is still a reasonable option if preferred
Deployment flow
- push to
main - Gitea Actions runs tests
- if green, workflow uploads repo to server
deploy/deploy.shlinks/opt/job-tracker/shared/.envinto the repo checkout, then runsdocker compose build && docker compose up -d- if
OLLAMA_MODELis set, the deploy script waits for Ollama, pulls the configured model if missing, then restartsai-serviceso hybrid CV classification can use it - workflow checks service status after deployment
Post-deploy verification you should also do manually the first time
- confirm reverse proxy routes to the frontend correctly
- confirm API auth/login works with production config
- confirm backend can connect to MariaDB
- confirm AI service container is reachable from backend
- confirm reminder and admin/system pages load
- verify follow-up reminder emails are enabled only when intended and that links open the correct job/tab hat links open the correct job/tab