# Stiftung Deployment on IONOS Server (217.154.84.225) ## Server Details - **IP Address**: 217.154.84.225 - **Operating System**: Ubuntu 22.04 LTS - **Provider**: IONOS - **Resources**: TBD (recommended 4 vCPU, 8GB RAM, 100GB SSD) ## Migration Overview This deployment migrates the Stiftung application from Synology NAS to a dedicated IONOS Ubuntu server, incorporating all new features and lessons learned from the original deployment. ## New Features Since Synology Deployment - **HelpBox System**: Editable info boxes with Markdown support on all "New" creation pages - **Central HelpBox Management**: Admin interface at `/help-box/admin/` - **Enhanced Förderung Search**: Improved search functionality - **Template Cleanup System**: Handles orphaned recurring payment templates - **PDF Export Improvements**: Better report generation - **Bootstrap Layout Fixes**: Resolved grid alignment issues ## Pre-Migration Requirements ### 1. Backup Current Synology Data ```bash # On Synology NAS cd /volume1/docker/stiftung/deploy-synology # Create Django data export sudo docker-compose exec web python manage.py dumpdata \ --format=json --indent=2 > full_backup_$(date +%Y%m%d).json # Create PostgreSQL backup sudo docker-compose exec db pg_dump -U stiftung_user -d stiftung \ > db_backup_$(date +%Y%m%d).sql # Backup media files tar -czf media_backup_$(date +%Y%m%d).tar.gz ./data/uploads/ ``` ### 2. Upload Files to Local Machine Download the backup files from Synology and prepare for upload to IONOS server. ## IONOS Server Deployment Steps ### Step 1: Server Setup ```bash # Connect to IONOS server ssh root@217.154.84.225 # Upload and run server setup script wget https://raw.githubusercontent.com/yourusername/stiftung-starter/main/deploy-production/server-setup.sh chmod +x server-setup.sh ./server-setup.sh ``` **server-setup.sh installs:** - Docker and Docker Compose - Nginx web server - Certbot for SSL certificates - UFW firewall - Additional monitoring tools - Creates `stiftung` user with Docker permissions ### Step 2: Application Deployment ```bash # Switch to application user su - stiftung # Clone repository cd /opt/stiftung git clone https://github.com/yourusername/stiftung-starter.git . # Copy production configuration cp deploy-production/docker-compose.prod.yml docker-compose.yml cp deploy-production/.env.production .env # Configure environment variables nano .env ``` **Required .env Configuration:** ```bash # Core Django Settings DEBUG=False SECRET_KEY=your-new-production-secret-key-here ALLOWED_HOSTS=217.154.84.225,your-domain.com,localhost CSRF_TRUSTED_ORIGINS=https://your-domain.com,http://217.154.84.225 # Database Configuration POSTGRES_DB=stiftung_prod POSTGRES_USER=stiftung_user POSTGRES_PASSWORD=secure-production-database-password # Email Configuration EMAIL_HOST=smtp.ionos.com EMAIL_PORT=587 EMAIL_HOST_USER=admin@your-domain.com EMAIL_HOST_PASSWORD=your-email-password EMAIL_USE_TLS=True # HelpBox System (New Feature) HELPBOX_ENABLED=True MARKDOWN_EXTENSIONS=nl2br,fenced_code,tables # Backup Configuration BACKUP_RETENTION_DAYS=30 ``` ### Step 3: Initial Deployment ```bash # Make scripts executable chmod +x deploy-production/deploy.sh chmod +x deploy-production/migrate-data.sh # Run initial deployment ./deploy-production/deploy.sh ``` **This script will:** - Validate environment configuration - Build Docker images with resource limits - Start services in correct order - Run database migrations - Set up HelpBox system with default content - Perform health checks ### Step 4: Data Migration ```bash # Upload backup files to server scp full_backup_*.json root@217.154.84.225:/opt/stiftung/migration-data/ scp db_backup_*.sql root@217.154.84.225:/opt/stiftung/migration-data/ scp media_backup_*.tar.gz root@217.154.84.225:/opt/stiftung/migration-data/ # Run migration script su - stiftung cd /opt/stiftung ./deploy-production/migrate-data.sh ``` **Migration script provides:** - Interactive migration wizard - Multiple restoration options (Django JSON or PostgreSQL dump) - Media files restoration - User account creation guidance - Post-migration verification ### Step 5: Web Server Configuration ```bash # Configure Nginx (as root) sudo cp /opt/stiftung/deploy-production/nginx.conf /etc/nginx/sites-available/stiftung sudo ln -s /etc/nginx/sites-available/stiftung /etc/nginx/sites-enabled/ sudo rm -f /etc/nginx/sites-enabled/default # Test and restart Nginx sudo nginx -t sudo systemctl restart nginx ``` ### Step 6: SSL Certificate Setup ```bash # Install SSL certificate with Let's Encrypt sudo certbot --nginx -d your-domain.com # Test auto-renewal sudo certbot renew --dry-run ``` ## Production Configuration Details ### Docker Compose Resource Limits ```yaml services: web: deploy: resources: limits: memory: 1G cpus: '1.0' db: deploy: resources: limits: memory: 1G cpus: '1.0' worker: deploy: resources: limits: memory: 512M cpus: '0.5' ``` ### Security Configuration - **Firewall**: UFW with ports 22, 80, 443 open - **Fail2ban**: Protection against brute force attacks - **Security Headers**: X-Frame-Options, CSP, etc. - **Rate Limiting**: 10 requests per minute per IP ### Monitoring Setup - **Health Endpoint**: `/health/` for application monitoring - **Container Stats**: `docker stats` for resource monitoring - **Log Management**: Centralized logging with rotation ## New Features Verification ### HelpBox System Testing 1. **Creation Pages**: Test help boxes on all "New" entity pages: - http://217.154.84.225/destinataere/new/ - http://217.154.84.225/foerderungen/new/ - http://217.154.84.225/unterstuetzungen/new/ - http://217.154.84.225/paechter/new/ - http://217.154.84.225/laendereien/new/ 2. **Central Management**: Test admin interface: - http://217.154.84.225/help-box/admin/ 3. **Features to Verify**: - Markdown rendering with syntax highlighting - Edit functionality for superusers - Responsive Bootstrap layout - Real-time updates ### Enhanced Search Testing - Test improved Förderung search functionality - Verify search performance and accuracy - Check pagination and filtering ### PDF Export Testing - Generate various reports - Verify PDF formatting and content - Test download functionality ## Performance Optimization ### Database Optimization ```sql -- Run these queries to optimize PostgreSQL ALTER SYSTEM SET shared_buffers = '256MB'; ALTER SYSTEM SET effective_cache_size = '1GB'; ALTER SYSTEM SET maintenance_work_mem = '64MB'; SELECT pg_reload_conf(); ``` ### Nginx Optimization - Static file caching (1 year) - Gzip compression enabled - Connection keep-alive - Buffer optimization ## Backup Strategy ### Automated Backups ```bash # Daily backup via cron 0 2 * * * /opt/stiftung/deploy-production/backup.sh # Weekly offsite backup 0 3 * * 0 rsync -av /opt/stiftung/backups/ backup-server:/stiftung-backups/ ``` ### Backup Contents - PostgreSQL database dumps - Media files (documents, images) - Configuration files - Docker volumes ## Monitoring and Alerting ### System Monitoring ```bash # Install monitoring tools sudo apt install -y htop iotop nethogs ncdu # Optional: Netdata for real-time monitoring # docker run -d --name=netdata -p 19999:19999 netdata/netdata ``` ### Log Monitoring ```bash # View application logs docker compose logs -f web # Monitor system logs sudo tail -f /var/log/nginx/access.log sudo tail -f /var/log/nginx/error.log ``` ## Maintenance Procedures ### Regular Updates ```bash # Update system packages sudo apt update && sudo apt upgrade -y # Update Docker images docker compose pull docker compose up -d --build # Run database maintenance docker compose exec db vacuumdb -U stiftung_user -d stiftung_prod -z ``` ### Health Checks ```bash # Application health curl -f http://localhost:8000/health/ # Database health docker compose exec db pg_isready -U stiftung_user -d stiftung_prod # Container status docker compose ps ``` ## Troubleshooting Guide ### Common Issues and Solutions 1. **Application Not Responding** ```bash # Check container status docker compose ps # View logs docker compose logs web # Restart services docker compose restart web ``` 2. **Database Connection Issues** ```bash # Check database logs docker compose logs db # Verify credentials docker compose exec web env | grep POSTGRES # Test connection docker compose exec db psql -U stiftung_user -d stiftung_prod -c "SELECT 1;" ``` 3. **HelpBox System Issues** ```bash # Verify HelpBox models docker compose exec web python manage.py shell >>> from stiftung.models import HelpBox >>> HelpBox.objects.all() # Recreate default help boxes docker compose exec web python manage.py shell < recreate_helpboxes.py ``` 4. **SSL Certificate Issues** ```bash # Check certificate status sudo certbot certificates # Renew certificate sudo certbot renew # Test Nginx configuration sudo nginx -t ``` ## Rollback Plan If issues occur during migration: 1. **Immediate DNS Rollback**: Point domain back to Synology NAS 2. **Service Restoration**: Restart Synology services 3. **Data Recovery**: Use pre-migration backups 4. **Issue Documentation**: Log problems for retry ## Success Criteria - [ ] All services running (`docker compose ps` shows "Up") - [ ] Application accessible via http://217.154.84.225 - [ ] Admin interface working at `/admin/` - [ ] HelpBox system functional on all creation pages - [ ] HelpBox admin interface at `/help-box/admin/` - [ ] All data migrated successfully - [ ] New features (search, PDF, templates) working - [ ] SSL certificate installed and working - [ ] Backups configured and tested - [ ] Monitoring active and alerting configured ## Timeline **Estimated Total Time**: 4-6 hours - **Phase 1** (Server Setup): 1 hour - **Phase 2** (Application Deployment): 1 hour - **Phase 3** (Data Migration): 1-2 hours - **Phase 4** (Web Server & SSL): 1 hour - **Phase 5** (Testing & Verification): 1 hour ## Contacts and Resources - **IONOS Support**: [IONOS Control Panel](https://www.ionos.com) - **Server IP**: 217.154.84.225 - **SSH Access**: `ssh root@217.154.84.225` - **Application User**: `stiftung` - **Application Directory**: `/opt/stiftung` ## Post-Deployment Checklist - [ ] Update DNS records to point to 217.154.84.225 - [ ] Configure domain SSL certificate - [ ] Set up monitoring and alerting - [ ] Create admin documentation for users - [ ] Train users on new HelpBox features - [ ] Schedule regular backup tests - [ ] Plan decommissioning of Synology deployment --- **Deployment Date**: `________________` **Deployed By**: `________________` **Verification**: `________________` **Production Go-Live**: `________________` **Notes**: `________________`