bmc_hub/PRODUCTION_DEPLOYMENT.md

318 lines
7.2 KiB
Markdown
Raw Normal View History

2025-12-17 16:47:35 +01:00
# 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
1. Gå til https://g.bmcnetworks.dk/user/settings/applications
2. Klik "Generate New Token"
3. Giv tokenet et navn: "BMC Hub Production"
4. Vælg scopes: `repo` (read)
5. Gem tokenet sikkert - det vises kun én gang
### 2. Tag en Release i Gitea
Fra din lokale udviklings-mac:
```bash
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
```bash
# 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
```bash
# Kopier template
cp .env.example .env
# Rediger .env med production værdier
nano .env
```
**VIGTIGE ÆNDRINGER I .env:**
```bash
# 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
```bash
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
```bash
# 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
```bash
# 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:
```json
{
"status": "healthy",
"database": "connected",
"version": "v1.0.0"
}
```
## 🔄 Opdatering til Ny Version
```bash
# 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:
```bash
# 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
1. **Passwords**: Brug minimum 32 tegn, tilfældige passwords
2. **Secret Key**: Generer med `secrets.token_urlsafe(32)`
3. **Gitea Token**: Begræns til read-only scope for production
4. **Firewall**: Åbn kun nødvendige porte (8000, 5432 hvis remote access)
5. **HTTPS**: Brug reverse proxy (nginx/traefik) med SSL i production
6. **Backups**: Sæt automatisk backup op for PostgreSQL data volume
## 📊 Monitoring
```bash
# 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
```bash
# 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
```bash
# 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
```bash
# 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
```bash
# Æ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
```bash
# 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
```bash
# 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)
- [ ] `.env` fil 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