# Production Deployment Prerequisites Checklist

Vollständige Checkliste für Production Deployment des Custom PHP Frameworks.

## ✅ Server Requirements

### Hardware Minimum
- [ ] **CPU**: 2 Cores minimum, 4+ recommended
- [ ] **RAM**: 4GB minimum, 8GB+ recommended
- [ ] **Storage**: 50GB SSD minimum, 100GB+ recommended
- [ ] **Network**: Static IP address
- [ ] **Bandwidth**: 100 Mbit/s minimum

### Operating System
- [ ] **OS**: Ubuntu 22.04 LTS or Debian 12
- [ ] **User**: Non-root user with sudo privileges
- [ ] **SSH**: Key-based authentication configured
- [ ] **Firewall**: UFW or iptables configured

### DNS Configuration
- [ ] Domain registered and DNS configured
- [ ] A record pointing to server IP
- [ ] AAAA record for IPv6 (optional)
- [ ] CAA record for SSL certificate authority

## ✅ Software Prerequisites

### Docker Installation
- [ ] Docker Engine 24.0+ installed
- [ ] Docker Compose V2 installed
- [ ] Docker user group configured
- [ ] Docker daemon running on boot

```bash
# Install Docker
curl -fsSL https://get.docker.com | sh
sudo usermod -aG docker $USER
newgrp docker

# Verify installation
docker --version
docker compose version
```

### System Packages
- [ ] `git` installed
- [ ] `make` installed
- [ ] `curl` or `wget` installed
- [ ] `ufw` firewall installed

```bash
sudo apt update
sudo apt install -y git make curl ufw
```

## ✅ Security Prerequisites

### SSL/TLS Certificates
- [ ] Domain ownership verified
- [ ] Port 80 (HTTP) accessible for ACME challenge
- [ ] Port 443 (HTTPS) open in firewall
- [ ] Let's Encrypt rate limits understood

### Firewall Configuration
- [ ] Port 22 (SSH) - Restricted to known IPs
- [ ] Port 80 (HTTP) - Open for ACME challenge & redirect
- [ ] Port 443 (HTTPS) - Open for production traffic
- [ ] All other ports closed by default

```bash
# UFW Configuration
sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw allow 22/tcp    # SSH (restrict to your IP)
sudo ufw allow 80/tcp    # HTTP
sudo ufw allow 443/tcp   # HTTPS
sudo ufw enable
```

### SSH Hardening
- [ ] Password authentication disabled
- [ ] Root login disabled
- [ ] SSH key authentication only
- [ ] Fail2ban or similar installed

```bash
# /etc/ssh/sshd_config
PasswordAuthentication no
PermitRootLogin no
PubkeyAuthentication yes
```

## ✅ Environment Configuration

### Environment Variables
- [ ] `.env.production` created (see template below)
- [ ] Database credentials configured
- [ ] Redis password set
- [ ] Vault encryption keys generated
- [ ] OAuth credentials configured (if needed)
- [ ] API keys configured (if needed)

### Secrets Management
- [ ] `VAULT_ENCRYPTION_KEY` generated (32 bytes, base64)
- [ ] `STATE_ENCRYPTION_KEY` generated (32 bytes, base64)
- [ ] Keys stored securely (not in git)
- [ ] Backup encryption key stored separately

```bash
# Generate encryption keys
php -r "echo base64_encode(random_bytes(32)) . PHP_EOL;"
```

## ✅ Database Prerequisites

### PostgreSQL Configuration
- [ ] Database user created with strong password
- [ ] Database created with UTF8 encoding
- [ ] Connection pool limits configured
- [ ] Backup strategy defined
- [ ] `postgresql.production.conf` configured

### Database Migrations
- [ ] All migrations tested in staging
- [ ] Migration rollback plan prepared
- [ ] Database backup before migration
- [ ] Migration execution script ready

## ✅ Application Prerequisites

### Code Repository
- [ ] Production branch created
- [ ] Latest stable code pushed
- [ ] Git hooks configured (if needed)
- [ ] `.gitignore` properly configured

### Composer Dependencies
- [ ] Production dependencies only (`--no-dev`)
- [ ] Autoloader optimized (`--optimize-autoloader`)
- [ ] Classmap authoritative (`--classmap-authoritative`)
- [ ] Composer version 2.x installed

### PHP Configuration
- [ ] OPcache enabled and configured
- [ ] Memory limits appropriate (512M+)
- [ ] Error reporting disabled in production
- [ ] Log rotation configured

## ✅ Docker Configuration

### Images & Builds
- [ ] `docker/nginx/Dockerfile.production` exists
- [ ] `docker/php/Dockerfile.production` exists
- [ ] `docker/worker/Dockerfile.production` exists
- [ ] Production PHP configuration files ready
- [ ] Nginx production configuration ready

### Volumes & Persistence
- [ ] Database volume strategy defined
- [ ] Redis persistence configured
- [ ] Log storage strategy defined
- [ ] Backup storage configured
- [ ] File upload storage configured

### Networks & Security
- [ ] Backend network set to internal-only
- [ ] Cache network set to internal-only
- [ ] Frontend network properly exposed
- [ ] Container security options configured

## ✅ Monitoring & Logging

### Logging Configuration
- [ ] Log aggregation strategy defined
- [ ] Log rotation configured
- [ ] Error notification configured
- [ ] Access logs configured

### Monitoring Setup
- [ ] Health check endpoints configured
- [ ] Uptime monitoring configured
- [ ] Performance metrics collection
- [ ] Alert thresholds defined

### Backup Strategy
- [ ] Database backup frequency defined (daily recommended)
- [ ] Backup retention policy defined (30 days recommended)
- [ ] Backup encryption configured
- [ ] Backup restoration tested
- [ ] Off-site backup storage configured

## ✅ Deployment Automation

### Deployment Scripts
- [ ] `deploy.sh` script created
- [ ] Zero-downtime deployment strategy
- [ ] Rollback script prepared
- [ ] Health check validation
- [ ] Post-deployment tests defined

### CI/CD Pipeline (Optional)
- [ ] GitHub Actions / GitLab CI configured
- [ ] Automated tests on push
- [ ] Automated deployment to staging
- [ ] Manual approval for production
- [ ] Deployment notifications

## ✅ Performance Optimization

### PHP Optimizations
- [ ] OPcache validate_timestamps=0
- [ ] OPcache preloading configured (optional)
- [ ] JIT enabled (PHP 8.4)
- [ ] Memory limits tuned
- [ ] Execution timeouts configured

### Database Optimizations
- [ ] Connection pooling configured
- [ ] Query optimization completed
- [ ] Indexes properly configured
- [ ] VACUUM strategy defined
- [ ] Statistics collection configured

### Caching Strategy
- [ ] Redis persistence configured (AOF + RDB)
- [ ] Cache warming strategy defined
- [ ] Cache invalidation strategy defined
- [ ] Cache monitoring configured

### CDN & Assets (Optional)
- [ ] Static assets minified
- [ ] Asset versioning configured
- [ ] CDN configured (if applicable)
- [ ] Image optimization configured

## ✅ Documentation

### Required Documentation
- [ ] Deployment procedure documented
- [ ] Rollback procedure documented
- [ ] Disaster recovery plan documented
- [ ] Architecture diagram created
- [ ] Runbook for common issues

### Team Knowledge
- [ ] Team trained on deployment process
- [ ] Access credentials shared securely
- [ ] On-call rotation defined
- [ ] Escalation procedures defined

## ✅ Testing & Validation

### Pre-Deployment Testing
- [ ] All unit tests passing
- [ ] Integration tests passing
- [ ] E2E tests passing (if applicable)
- [ ] Load testing completed
- [ ] Security scan completed

### Staging Environment
- [ ] Staging environment mirrors production
- [ ] Deployment tested on staging
- [ ] Performance tested on staging
- [ ] SSL certificates tested on staging

### Post-Deployment Validation
- [ ] Health check endpoints responding
- [ ] SSL certificate valid
- [ ] Database connections working
- [ ] Redis connections working
- [ ] Queue workers running
- [ ] Scheduled tasks running
- [ ] Monitoring alerts functional

## ✅ Final Checklist Before Go-Live

### Critical Path
1. [ ] **Backup current data** (if migrating)
2. [ ] **DNS TTL lowered** (24h before)
3. [ ] **Maintenance page ready**
4. [ ] **Team notified and available**
5. [ ] **Rollback plan reviewed**

### Go-Live Steps
1. [ ] Enable maintenance mode
2. [ ] Pull latest production code
3. [ ] Run database migrations
4. [ ] Build and start containers
5. [ ] Verify health checks
6. [ ] Update DNS records (if new server)
7. [ ] Monitor for 30 minutes
8. [ ] Disable maintenance mode
9. [ ] Announce deployment

### Post Go-Live Monitoring
- [ ] Monitor error logs (30 min)
- [ ] Check performance metrics (1 hour)
- [ ] Verify all services running (2 hours)
- [ ] Review user feedback (24 hours)

## ⚠️ Emergency Contacts

### Critical Issues
- [ ] Emergency contact list prepared
- [ ] Hosting provider support number
- [ ] Database administrator contact
- [ ] Senior developer on-call

## 📋 Environment-Specific Checklists

### Staging Environment
- [ ] All prerequisites met
- [ ] Deployment tested successfully
- [ ] Performance acceptable
- [ ] No critical bugs

### Production Environment
- [ ] All prerequisites met
- [ ] Staging tests passed
- [ ] Backup and rollback tested
- [ ] Team approval obtained

---

## Next Steps

After completing this checklist:

1. **Create `.env.production`** - See `docs/deployment/env-production-template.md`
2. **Configure SSL Certificates** - See `docs/deployment/ssl-setup.md`
3. **Run Deployment Script** - See `scripts/deploy-production.sh`
4. **Verify Health Checks** - See `docs/deployment/health-checks.md`
5. **Monitor Logs** - See `docs/deployment/monitoring.md`

## Additional Resources

- **Deployment Guide**: `docs/deployment/deployment-guide.md`
- **Troubleshooting**: `docs/deployment/troubleshooting.md`
- **Rollback Guide**: `docs/deployment/rollback-guide.md`
- **Security Hardening**: `docs/deployment/security-hardening.md`
