# Production Deployment Guide ## Pre-Deployment Checklist - [ ] Environment variables configured in `.env` - [ ] PostgreSQL database created and migrated - [ ] Redis running and accessible - [ ] Telegram credentials verified - [ ] SSL certificates prepared (if needed) - [ ] Log rotation configured - [ ] Monitoring and alerts set up - [ ] Backups configured - [ ] Health checks tested ## Deployment Methods ### 1. Docker Compose on VPS #### 1.1 Prepare Server ```bash # Update system sudo apt update && sudo apt upgrade -y # Install Docker curl -fsSL https://get.docker.com -o get-docker.sh sudo sh get-docker.sh # Install Docker Compose sudo curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose sudo chmod +x /usr/local/bin/docker-compose # Create non-root user for Docker sudo usermod -aG docker $USER newgrp docker ``` #### 1.2 Deploy Application ```bash # Clone repository mkdir -p /home/bot cd /home/bot git clone https://github.com/yourusername/TG_autoposter.git cd TG_autoposter # Create environment file nano .env # Fill in production values # Start services docker-compose -f docker-compose.yml -f docker-compose.prod.yml up -d # Verify services docker-compose ps ``` #### 1.3 Database Migrations ```bash # Run migrations docker-compose exec bot alembic upgrade head # Verify docker-compose exec bot alembic current ``` #### 1.4 Monitoring ```bash # View logs docker-compose logs -f # Monitor specific service docker-compose logs -f bot docker-compose logs -f celery_worker_send # Check health docker-compose ps ``` ### 2. Kubernetes Deployment #### 2.1 Create Kubernetes Manifests ```bash # Create namespace kubectl create namespace telegram-bot kubectl config set-context --current --namespace=telegram-bot # Create ConfigMap for environment variables kubectl create configmap bot-config --from-env-file=.env.prod # Create Secrets for sensitive data kubectl create secret generic bot-secrets \ --from-literal=telegram-bot-token=$TELEGRAM_BOT_TOKEN \ --from-literal=db-password=$DB_PASSWORD \ --from-literal=redis-password=$REDIS_PASSWORD ``` #### 2.2 Deploy Services See `k8s/` directory for manifests: - `postgres-deployment.yaml` - `redis-deployment.yaml` - `bot-deployment.yaml` - `celery-worker-deployment.yaml` - `celery-beat-deployment.yaml` - `flower-deployment.yaml` ```bash # Apply manifests kubectl apply -f k8s/ # Monitor deployment kubectl get pods kubectl logs -f deployment/bot ``` ### 3. Using Systemd Service #### 3.1 Create Service File ```bash sudo tee /etc/systemd/system/tg-autoposter.service > /dev/null < /dev/null < /dev/null 2>&1 || true endscript } EOF ``` ### 2. Prometheus Metrics ```python # app/metrics.py from prometheus_client import Counter, Histogram, Gauge message_sent = Counter('messages_sent_total', 'Total messages sent') message_failed = Counter('messages_failed_total', 'Total failed messages') send_duration = Histogram('message_send_duration_seconds', 'Message send duration') queue_size = Gauge('celery_queue_size', 'Celery queue size') ``` ### 3. Monitoring with ELK Stack ```yaml # docker-compose.prod.yml services: elasticsearch: image: docker.elastic.co/elasticsearch/elasticsearch:8.0.0 kibana: image: docker.elastic.co/kibana/kibana:8.0.0 ports: - "5601:5601" logstash: image: docker.elastic.co/logstash/logstash:8.0.0 volumes: - ./logstash.conf:/usr/share/logstash/pipeline/logstash.conf ``` ## Backup & Recovery ### 1. Database Backup ```bash #!/bin/bash # backup-db.sh BACKUP_DIR="/backups/postgres" TIMESTAMP=$(date +%Y%m%d_%H%M%S) BACKUP_FILE="$BACKUP_DIR/tg_autoposter_$TIMESTAMP.sql" mkdir -p $BACKUP_DIR # Backup docker-compose exec -T postgres pg_dump -U $DB_USER $DB_NAME > $BACKUP_FILE # Compress gzip $BACKUP_FILE # Remove old backups (keep 7 days) find $BACKUP_DIR -name "*.sql.gz" -mtime +7 -delete echo "Backup completed: $BACKUP_FILE.gz" ``` ### 2. Redis Snapshot ```bash #!/bin/bash # backup-redis.sh BACKUP_DIR="/backups/redis" TIMESTAMP=$(date +%Y%m%d_%H%M%S) mkdir -p $BACKUP_DIR # Create snapshot docker-compose exec -T redis redis-cli BGSAVE # Copy snapshot docker-compose exec -T redis cp /data/dump.rdb /data/dump_$TIMESTAMP.rdb echo "Redis backup completed" ``` ### 3. Restore Database ```bash # Drop and recreate database docker-compose exec -T postgres dropdb -U $DB_USER $DB_NAME docker-compose exec -T postgres createdb -U $DB_USER $DB_NAME # Restore from backup gunzip < /backups/postgres/tg_autoposter_*.sql.gz | \ docker-compose exec -T postgres psql -U $DB_USER $DB_NAME ``` ## Security Best Practices ### 1. Environment Hardening ```bash # Restrict file permissions chmod 600 .env chmod 700 /var/log/tg-autoposter chmod 700 /backups # Set ownership sudo chown bot:bot /home/bot/TG_autoposter -R ``` ### 2. Network Security ```yaml # docker-compose.prod.yml services: bot: networks: - backend expose: - 8000 postgres: networks: - backend expose: - 5432 networks: backend: driver: bridge driver_opts: com.docker.network.bridge.name: br_backend ``` ### 3. SSL/TLS ```bash # Generate SSL certificate certbot certonly --standalone -d yourdomain.com # Configure in docker-compose.prod.yml services: nginx: image: nginx:latest volumes: - /etc/letsencrypt:/etc/letsencrypt - ./nginx.conf:/etc/nginx/nginx.conf ports: - "443:443" ``` ## Troubleshooting Production Issues ### Issue: Memory Leaks ```bash # Monitor memory usage docker stats # Restart worker docker-compose restart celery_worker_send # Check logs for errors docker-compose logs celery_worker_send | grep -i error ``` ### Issue: Database Connection Timeouts ```bash # Increase pool size in settings DB_POOL_SIZE = 30 # Check database status docker-compose exec postgres psql -U bot -d tg_autoposter -c "SELECT datname, pid FROM pg_stat_activity;" # Restart database docker-compose restart postgres ``` ### Issue: High CPU Usage ```bash # Identify problematic tasks docker-compose exec flower curl -s http://localhost:5555/api/stats | python -m json.tool # Reduce worker concurrency CELERY_WORKER_CONCURRENCY = 2 ``` ## CI/CD Integration ### GitHub Actions Example ```yaml # .github/workflows/deploy.yml name: Deploy to Production on: push: branches: [main] jobs: deploy: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - name: Deploy to VPS uses: appleboy/ssh-action@master with: host: ${{ secrets.VPS_HOST }} username: ${{ secrets.VPS_USER }} key: ${{ secrets.VPS_SSH_KEY }} script: | cd /home/bot/TG_autoposter git pull origin main docker-compose -f docker-compose.yml -f docker-compose.prod.yml up -d docker-compose exec bot alembic upgrade head ``` ## Support and Monitoring Links - **Flower Dashboard**: http://yourserver.com:5555 - **PostgreSQL Monitoring**: pgAdmin (if enabled) - **Application Logs**: `/var/log/tg-autoposter/` - **Health Check Endpoint**: `/health` (if implemented) ## Maintenance Schedule - **Daily**: Check logs for errors - **Weekly**: Review resource usage - **Monthly**: Security updates, dependency updates - **Quarterly**: Performance analysis, capacity planning ## Contact & Support For issues or questions: 1. Check logs and error messages 2. Review GitHub issues 3. Contact team lead 4. Escalate to DevOps team if needed