# Production Deployment Guide - Post-ERG This guide will help you deploy the production nginx configuration with proper security and permissions. ## ๐ŸŽฏ Overview Your current setup: - **Server IP**: 192.168.6.125 (internal) - **PHP Version**: 8.4 - **SSL/TLS**: Handled by reverse proxy (already working) - **Issue**: File permissions preventing nginx from reading files ## ๐Ÿš€ Quick Deployment From your local machine: ```bash # Deploy the production config and deployment script just deploy-nginx-production # SSH to the server and run the deployment ssh posterg sudo /tmp/deploy-production.sh ``` ## ๐Ÿ“‹ Step-by-Step Deployment ### 1. Set Up Admin Password (First Time Only) ```bash ssh posterg sudo htpasswd -c /etc/nginx/.htpasswd-posterg admin # Enter a strong password when prompted ``` **๐Ÿ’ก Tip**: Generate a strong password: ```bash openssl rand -base64 32 ``` ### 2. Deploy Configuration From your local machine: ```bash # Upload nginx config and deployment script rsync -vur ./nginx/posterg-production.conf posterg:/tmp/posterg.conf rsync -vur ./nginx/deploy-production.sh posterg:/tmp/deploy-production.sh ``` ### 3. Run Deployment Script On the server: ```bash ssh posterg sudo chmod +x /tmp/deploy-production.sh sudo /tmp/deploy-production.sh ``` The script will: - โœ… Fix file permissions (set to posterg group) - โœ… Install nginx configuration - โœ… Test nginx configuration - โœ… Reload nginx - โœ… Check PHP-FPM status ## ๐Ÿ”ง Manual Deployment (Alternative) If you prefer to do it manually: ### Step 1: Fix Permissions ```bash ssh posterg # Set correct ownership (posterg group) sudo chown -R theophile:posterg /var/www/html/ # Set directory permissions sudo find /var/www/html -type d -exec chmod 755 {} \; # Set file permissions (group readable) sudo find /var/www/html -type f -exec chmod 640 {} \; # Make upload directories writable sudo chmod 775 /var/www/html/formulaire/data/theses sudo chmod 775 /var/www/html/formulaire/data/covers # Protect database sudo chmod 640 /var/www/html/database/posterg.db sudo chown www-data:posterg /var/www/html/database/posterg.db ``` ### Step 2: Deploy Nginx Config ```bash # Copy config sudo cp /tmp/posterg.conf /etc/nginx/sites-available/posterg # Enable site sudo ln -sf /etc/nginx/sites-available/posterg /etc/nginx/sites-enabled/posterg # Disable default site sudo rm -f /etc/nginx/sites-enabled/default # Test configuration sudo nginx -t # Reload nginx sudo systemctl reload nginx ``` ### Step 3: Verify PHP-FPM ```bash # Check PHP-FPM is running sudo systemctl status php8.4-fpm # If not running, start it sudo systemctl start php8.4-fpm sudo systemctl enable php8.4-fpm ``` ## ๐Ÿงช Testing ### Test Public Site ```bash # Should return 200 OK curl -I http://localhost/ # Should return 200 OK with HTML curl http://localhost/index.php ``` ### Test Admin Protection ```bash # Should return 401 Unauthorized curl -I http://localhost/formulaire/ # Should return 200 OK with credentials curl -u admin:your_password http://localhost/formulaire/ ``` ### Test File Protection ```bash # These should all return 403 Forbidden curl -I http://localhost/database/posterg.db curl -I http://localhost/README.md curl -I http://localhost/shared/Database.php curl -I http://localhost/.git/config ``` ### Test Security Headers ```bash curl -I http://localhost/ | grep -E "X-Frame|X-Content|X-XSS" ``` ### From Your Browser Visit https://posterg.erg.be/ - should work now! ## ๐Ÿ” Troubleshooting ### Still Getting 403 Forbidden **Check file permissions:** ```bash ls -la /var/www/html/index.php # Should show: -rw-r----- 1 theophile posterg ... ``` **Check nginx user is in posterg group:** ```bash groups www-data # Should show: www-data : www-data posterg ``` **Check directory permissions:** ```bash ls -lad /var/www/html # Should show: drwxr-xr-x ... posterg ``` ### 502 Bad Gateway **Check PHP-FPM:** ```bash sudo systemctl status php8.4-fpm sudo systemctl restart php8.4-fpm ``` **Check socket file:** ```bash ls -la /var/run/php/php8.4-fpm.sock # Should exist and be writable by www-data ``` ### Admin Password Not Working **Reset password:** ```bash sudo htpasswd /etc/nginx/.htpasswd-posterg admin ``` **Check file exists:** ```bash ls -la /etc/nginx/.htpasswd-posterg # Should show: -rw-r--r-- 1 root root ... ``` ### Database Not Accessible to PHP **Fix database permissions:** ```bash sudo chown www-data:posterg /var/www/html/database/posterg.db sudo chmod 640 /var/www/html/database/posterg.db sudo chmod 755 /var/www/html/database/ ``` ### Can't Write Uploaded Files **Fix upload directory permissions:** ```bash sudo chmod 775 /var/www/html/formulaire/data/theses sudo chmod 775 /var/www/html/formulaire/data/covers sudo chown -R theophile:posterg /var/www/html/formulaire/data/ ``` ## ๐Ÿ“Š Monitoring ### Watch Logs ```bash # Access logs sudo tail -f /var/log/nginx/posterg_access.log # Error logs sudo tail -f /var/log/nginx/posterg_error.log # PHP errors sudo tail -f /var/log/php8.4-fpm.log ``` ### Check Nginx Status ```bash sudo systemctl status nginx sudo nginx -t ``` ### Check Resource Usage ```bash # Nginx processes ps aux | grep nginx # PHP-FPM processes ps aux | grep php-fpm # Disk usage df -h /var/www/html ``` ## ๐Ÿ”’ Security Checklist After deployment, verify: - [ ] โœ… Public site accessible at https://posterg.erg.be/ - [ ] โœ… Admin panel requires password - [ ] โœ… Database files return 403 Forbidden - [ ] โœ… Sensitive files (.md, .sql) return 403 Forbidden - [ ] โœ… Shared directory returns 403 Forbidden - [ ] โœ… Security headers present in responses - [ ] โœ… PHP-FPM running and accessible - [ ] โœ… File uploads work in admin panel - [ ] โœ… Search functionality works - [ ] โœ… Logs are being written ## ๐Ÿ”„ Updating the Site For future updates: ```bash # Deploy code changes just deploy # Reload nginx if config changed ssh posterg "sudo systemctl reload nginx" # Clear PHP opcache if needed ssh posterg "sudo systemctl reload php8.4-fpm" ``` ## ๐Ÿ†˜ Emergency Recovery If something goes wrong: ### Restore Default Config ```bash ssh posterg sudo rm /etc/nginx/sites-enabled/posterg sudo ln -s /etc/nginx/sites-available/default /etc/nginx/sites-enabled/default sudo systemctl reload nginx ``` ### Reset Permissions ```bash ssh posterg sudo chown -R www-data:www-data /var/www/html sudo find /var/www/html -type d -exec chmod 755 {} \; sudo find /var/www/html -type f -exec chmod 644 {} \; sudo systemctl reload nginx ``` ## ๐Ÿ“ž Support Resources - **Nginx docs**: https://nginx.org/en/docs/ - **PHP-FPM docs**: https://www.php.net/manual/en/install.fpm.php - **Let's Encrypt**: https://letsencrypt.org/ - **Security headers**: https://securityheaders.com/ ## ๐ŸŽ‰ Success Criteria You know the deployment is successful when: 1. โœ… Visit https://posterg.erg.be/ - shows homepage 2. โœ… Visit https://posterg.erg.be/formulaire/ - asks for password 3. โœ… Search works correctly 4. โœ… Individual thesis pages load 5. โœ… Admin can upload files 6. โœ… No 403 or 502 errors in logs 7. โœ… Security headers present (check with curl -I) --- **Need help?** Check the error logs first: ```bash sudo tail -f /var/log/nginx/posterg_error.log ```