Complete guide for deploying the TrackShare application (backend + frontend).
- Docker or Podman installed
- Docker Compose installed
- Ports 80, 8080, and 5432 available
From the src directory, run:
cd src
docker-compose up -dThis will start:
- PostgreSQL database on port 5432
- Backend API on port 8080
- Frontend web server on port 80
- Frontend: http://localhost/
- Track Viewer: http://localhost/track.html?id=YOUR_TRACK_ID
- Backend API: http://localhost:8080/api/tracks
cd src/backend/TrackShare.Api
dotnet restore
dotnet runBackend will be available at http://localhost:5032
cd src/frontend
npm install
npm run devFrontend will be available at http://localhost:8080
Note: When developing, update the API_BASE_URL in public/js/app.js to point to the backend.
curl -X POST http://localhost:8080/api/tracks/upload \
-H "Content-Type: application/json" \
-H "X-API-Key: dev-api-key-12345" \
-d '{
"id": "test-track-001",
"gpxContent": "<?xml version=\"1.0\"?><gpx version=\"1.1\" creator=\"test\"><trk><name>Test Track</name><trkseg><trkpt lat=\"47.3769\" lon=\"8.5417\"><ele>408</ele><time>2026-01-22T10:00:00Z</time></trkpt><trkpt lat=\"47.3779\" lon=\"8.5427\"><ele>410</ele><time>2026-01-22T10:05:00Z</time></trkpt></trkseg></trk></gpx>"
}'Open in browser: http://localhost/track.html?id=test-track-001
curl -X DELETE http://localhost:8080/api/tracks/test-track-001 \
-H "X-API-Key: dev-api-key-12345"Update docker-compose.yml for production:
backend:
environment:
ASPNETCORE_ENVIRONMENT: Production
ConnectionStrings__DefaultConnection: "Host=postgres;Database=trackshare;Username=your_user;Password=your_secure_password"
ApiKey: "your-secure-api-key-here"Add Traefik labels to docker-compose.yml:
frontend:
labels:
- "traefik.enable=true"
- "traefik.http.routers.trackshare.rule=Host(`trackshare.yourdomain.com`)"
- "traefik.http.routers.trackshare.entrypoints=websecure"
- "traefik.http.routers.trackshare.tls.certresolver=letsencrypt"- Change default passwords in docker-compose.yml
- Use strong API key for production
- Enable HTTPS via reverse proxy
- Restrict database access to backend only
- Set up backup for PostgreSQL data volume
docker-compose ps# All services
docker-compose logs -f
# Specific service
docker-compose logs -f backend
docker-compose logs -f frontend
docker-compose logs -f postgresdocker exec -it trackshare-postgres psql -U postgres -d trackshareCheck logs:
docker-compose logs backendCommon issues:
- Database not ready (wait for healthcheck)
- Port 8080 already in use
- Invalid connection string
Check nginx logs:
docker-compose logs frontendCommon issues:
- Port 80 already in use (requires sudo/root)
- Backend not accessible
- nginx configuration syntax error
Verify database is running:
docker-compose exec postgres pg_isready -U postgresCheck browser console for errors:
- F12 → Console tab
- Look for fetch errors or CORS issues
Common issues:
- Track ID doesn't exist
- Invalid GPX format
- API endpoint not accessible
Already configured in nginx.conf:
- Static assets cached for 1 year
- Gzip compression enabled
For production, consider:
- Indexing on Track.Id (already primary key)
- Connection pooling (configured in backend)
- Regular VACUUM operations
Horizontal scaling options:
- Multiple backend instances behind load balancer
- Shared PostgreSQL database
- Static frontend served via CDN
docker exec trackshare-postgres pg_dump -U postgres trackshare > backup.sqldocker exec -i trackshare-postgres psql -U postgres trackshare < backup.sqldocker run --rm -v trackshare_postgres_data:/data -v $(pwd):/backup alpine tar czf /backup/postgres_data.tar.gz /datacd src/backend
docker-compose down
git pull
docker-compose build
docker-compose up -dBackend:
cd src/backend/TrackShare.Api
dotnet restoreFrontend:
cd src/frontend
npm updatecd src/backend
docker-compose downdocker-compose down -v