7.2 KiB
7.2 KiB
BMC Hub - Production Deployment Guide
📋 Forudsætninger
- Linux server med Podman eller Docker installeret
- Adgang til Gitea repository:
https://g.bmcnetworks.dk/ct/bmc_hub - Gitea Personal Access Token med læseadgang
🚀 Deployment Trin-for-Trin
1. Opret Gitea Personal Access Token
- Gå til https://g.bmcnetworks.dk/user/settings/applications
- Klik "Generate New Token"
- Giv tokenet et navn: "BMC Hub Production"
- Vælg scopes:
repo(read) - Gem tokenet sikkert - det vises kun én gang
2. Tag en Release i Gitea
Fra din lokale udviklings-mac:
cd /Users/christianthomas/DEV/bmc_hub_dev
# Commit alle ændringer
git add .
git commit -m "Prepare for production v1.0.0"
# Tag release
git tag v1.0.0
git push origin main
git push origin v1.0.0
3. Forbered Production Server
# SSH til production server
ssh user@your-production-server.com
# Opret deployment directory
mkdir -p /opt/bmc_hub
cd /opt/bmc_hub
# Download kun nødvendige filer fra Gitea
curl -H "Authorization: token YOUR_GITEA_TOKEN" \
https://g.bmcnetworks.dk/api/v1/repos/ct/bmc_hub/raw/docker-compose.prod.yml?ref=v1.0.0 \
-o docker-compose.yml
curl -H "Authorization: token YOUR_GITEA_TOKEN" \
https://g.bmcnetworks.dk/api/v1/repos/ct/bmc_hub/raw/Dockerfile?ref=v1.0.0 \
-o Dockerfile
curl -H "Authorization: token YOUR_GITEA_TOKEN" \
https://g.bmcnetworks.dk/api/v1/repos/ct/bmc_hub/raw/.env.prod.example?ref=v1.0.0 \
-o .env.example
# Opret migrations directory
mkdir -p migrations
# Download alle migrations (init.sql og andre)
curl -H "Authorization: token YOUR_GITEA_TOKEN" \
https://g.bmcnetworks.dk/api/v1/repos/ct/bmc_hub/raw/migrations/init.sql?ref=v1.0.0 \
-o migrations/init.sql
# Download requirements.txt (til Dockerfile)
curl -H "Authorization: token YOUR_GITEA_TOKEN" \
https://g.bmcnetworks.dk/api/v1/repos/ct/bmc_hub/raw/requirements.txt?ref=v1.0.0 \
-o requirements.txt
4. Konfigurer Environment Variables
# Kopier template
cp .env.example .env
# Rediger .env med production værdier
nano .env
VIGTIGE ÆNDRINGER I .env:
# Release version (matcher git tag)
RELEASE_VERSION=v1.0.0
# Gitea token
GITHUB_TOKEN=din_gitea_personal_access_token
# SKIFT ALLE PASSWORDS!
POSTGRES_PASSWORD=et_meget_stærkt_password_her
SECRET_KEY=$(python3 -c "import secrets; print(secrets.token_urlsafe(32))")
# Production settings
LOG_LEVEL=WARNING
CORS_ORIGINS=https://yourdomain.com
# BEHOLD SAFETY SWITCHES PÅ!
ECONOMIC_READ_ONLY=true
ECONOMIC_DRY_RUN=true
5. Opret Nødvendige Directories
cd /opt/bmc_hub
# Opret data directories
mkdir -p logs uploads data/invoice_templates
# Sæt permissions (hvis nødvendigt)
chmod 755 logs uploads data
6. Start Services med Podman Compose
# Pull og build images
podman-compose -f docker-compose.yml build --no-cache
# Start services
podman-compose -f docker-compose.yml up -d
# Følg logs
podman-compose -f docker-compose.yml logs -f
7. Verificer Deployment
# Check container status
podman ps
# Test health endpoint
curl http://localhost:8000/health
# Check database
podman exec -it bmc-hub-postgres-prod psql -U bmc_hub_prod -d bmc_hub_prod -c "\dt"
Expected output:
{
"status": "healthy",
"database": "connected",
"version": "v1.0.0"
}
🔄 Opdatering til Ny Version
# På din Mac - tag ny release
cd /Users/christianthomas/DEV/bmc_hub_dev
git tag v1.1.0
git push origin v1.1.0
# På production server
cd /opt/bmc_hub
# Opdater RELEASE_VERSION i .env
nano .env # Ændr til v1.1.0
# Rebuild og genstart
podman-compose down
podman-compose build --no-cache
podman-compose up -d
# Verificer
podman-compose logs -f api
🗄️ Database Migrations
Når der tilføjes nye migrations:
# Download nye migration filer til /opt/bmc_hub/migrations/
curl -H "Authorization: token YOUR_TOKEN" \
https://g.bmcnetworks.dk/api/v1/repos/ct/bmc_hub/raw/migrations/XXX_new_migration.sql?ref=v1.1.0 \
-o migrations/XXX_new_migration.sql
# Kør migration manuelt
podman exec -i bmc-hub-postgres-prod psql -U bmc_hub_prod -d bmc_hub_prod < migrations/XXX_new_migration.sql
VIGTIGT: init.sql kører KUN ved første database initialization. Nye migrations skal køres manuelt.
🔒 Sikkerhed Best Practices
- Passwords: Brug minimum 32 tegn, tilfældige passwords
- Secret Key: Generer med
secrets.token_urlsafe(32) - Gitea Token: Begræns til read-only scope for production
- Firewall: Åbn kun nødvendige porte (8000, 5432 hvis remote access)
- HTTPS: Brug reverse proxy (nginx/traefik) med SSL i production
- Backups: Sæt automatisk backup op for PostgreSQL data volume
📊 Monitoring
# Container status
podman-compose ps
# Resource usage
podman stats
# Application logs
podman-compose logs -f api
# Database logs
podman-compose logs -f postgres
# Health check
curl http://localhost:8000/health
curl http://localhost:8000/api/v1/system/health
🆘 Troubleshooting
Database Connection Issues
# Check postgres logs
podman-compose logs postgres
# Test connection
podman exec -it bmc-hub-postgres-prod psql -U bmc_hub_prod -d bmc_hub_prod
# Check network
podman network inspect bmc-hub-network_bmc-hub-network
API Won't Start
# Check detailed logs
podman logs bmc-hub-api-prod
# Verify environment variables
podman exec bmc-hub-api-prod env | grep -E "DATABASE|RELEASE"
# Check if database is ready
podman exec bmc-hub-postgres-prod pg_isready
Gitea Download Fails
# Test token manually
curl -H "Authorization: token YOUR_TOKEN" \
https://g.bmcnetworks.dk/api/v1/repos/ct/bmc_hub/tags
# Verify release exists
curl https://g.bmcnetworks.dk/ct/bmc_hub/releases
🔄 Rollback Procedure
# Ændr RELEASE_VERSION til tidligere version
nano .env # v1.1.0 → v1.0.0
# Rebuild med gammel version
podman-compose down
podman-compose build --no-cache
podman-compose up -d
📦 Backup & Restore
Backup Database
# Automated backup script
podman exec bmc-hub-postgres-prod pg_dump -U bmc_hub_prod bmc_hub_prod > backup_$(date +%Y%m%d).sql
# Eller med podman-compose
podman-compose exec postgres pg_dump -U bmc_hub_prod bmc_hub_prod > backup.sql
Restore Database
# Stop API først
podman-compose stop api
# Restore
podman exec -i bmc-hub-postgres-prod psql -U bmc_hub_prod -d bmc_hub_prod < backup.sql
# Start API
podman-compose start api
🎯 Production Checklist
- Gitea token oprettet med read-only scope
- Release tagged i Git (f.eks. v1.0.0)
.envfil udfyldt med production værdier- Alle passwords ændret fra defaults
- SECRET_KEY genereret tilfældigt
- CORS_ORIGINS sat til production domain
- Safety switches aktiveret (READ_ONLY=true, DRY_RUN=true)
- Directories oprettet (logs, uploads, data)
- Migrations downloaded til
migrations/directory - Database initialiseret med init.sql
- Containers startet og healthy
- Health endpoints verificeret
- Backup strategi implementeret
- Firewall konfigureret
- SSL certifikat installeret (reverse proxy)
- Monitoring setup (optional: Uptime Kuma)
📞 Support
Ved problemer, kontakt: ct@bmcnetworks.dk