- Move 12 markdown files from root to docs/ subdirectories - Organize documentation by category: • docs/troubleshooting/ (1 file) - Technical troubleshooting guides • docs/deployment/ (4 files) - Deployment and security documentation • docs/guides/ (3 files) - Feature-specific guides • docs/planning/ (4 files) - Planning and improvement proposals Root directory cleanup: - Reduced from 16 to 4 markdown files in root - Only essential project files remain: • CLAUDE.md (AI instructions) • README.md (Main project readme) • CLEANUP_PLAN.md (Current cleanup plan) • SRC_STRUCTURE_IMPROVEMENTS.md (Structure improvements) This improves: ✅ Documentation discoverability ✅ Logical organization by purpose ✅ Clean root directory ✅ Better maintainability
195 lines
5.5 KiB
Markdown
195 lines
5.5 KiB
Markdown
# Production SSL Setup for michaelschiemer.de
|
|
|
|
This guide explains how to fix the SSL configuration for the production domain https://michaelschiemer.de/
|
|
|
|
## Current Status
|
|
|
|
✅ **Nginx Configuration Fixed**
|
|
- Updated server_name from `localhost` to `localhost michaelschiemer.de`
|
|
- Both HTTP redirect and HTTPS server blocks now support the production domain
|
|
- Health check mapping updated to allow `michaelschiemer.de` domain
|
|
|
|
✅ **Deployment Script Enhanced**
|
|
- Added SSL certificate checks in `deploy.sh`
|
|
- Automatic creation of temporary self-signed certificates if Let's Encrypt certificates are missing
|
|
- Ensures Docker containers can start even without valid SSL certificates
|
|
|
|
## Setup Instructions
|
|
|
|
### Step 1: Deploy Updated Configuration
|
|
|
|
```bash
|
|
# Deploy the updated nginx configuration
|
|
./deploy.sh
|
|
```
|
|
|
|
This will deploy the updated nginx configuration and create temporary self-signed certificates if needed.
|
|
|
|
### Step 2: Generate Let's Encrypt SSL Certificates
|
|
|
|
**Important**: Make sure `michaelschiemer.de` points to your server IP `94.16.110.151` before running this.
|
|
|
|
```bash
|
|
# Run the SSL setup script
|
|
./setup-production-ssl.sh
|
|
```
|
|
|
|
This script will:
|
|
- Check DNS resolution for the domain
|
|
- Install certbot on the production server
|
|
- Stop nginx temporarily
|
|
- Generate Let's Encrypt certificates using HTTP-01 challenge
|
|
- Copy certificates to the expected location (`/var/www/ssl/`)
|
|
- Restart the application with valid SSL certificates
|
|
- Set up automatic certificate renewal (twice daily)
|
|
|
|
### Step 3: Verify SSL Setup
|
|
|
|
1. **Test HTTPS Access**:
|
|
```bash
|
|
curl -I https://michaelschiemer.de/
|
|
```
|
|
|
|
2. **Check Certificate Details**:
|
|
```bash
|
|
echo | openssl s_client -servername michaelschiemer.de -connect michaelschiemer.de:443 2>/dev/null | openssl x509 -noout -dates
|
|
```
|
|
|
|
3. **Verify Docker Containers**:
|
|
```bash
|
|
ssh deploy@94.16.110.151 'cd /home/deploy/michaelschiemer && docker compose ps'
|
|
```
|
|
|
|
## Configuration Changes Made
|
|
|
|
### 1. Nginx Configuration (`docker/nginx/default.conf`)
|
|
|
|
**Health Check Mapping**:
|
|
```nginx
|
|
map $host $block_health {
|
|
default 1; # Block everything by default
|
|
localhost 0; # Allow localhost (development)
|
|
michaelschiemer.de 0; # Allow production domain
|
|
}
|
|
```
|
|
|
|
**HTTP Server Block**:
|
|
```nginx
|
|
server {
|
|
listen 80;
|
|
server_name localhost michaelschiemer.de; # Support both domains
|
|
return 301 https://$host$request_uri;
|
|
}
|
|
```
|
|
|
|
**HTTPS Server Block**:
|
|
```nginx
|
|
server {
|
|
listen 443 ssl;
|
|
server_name localhost michaelschiemer.de; # Support both domains
|
|
|
|
ssl_certificate /var/www/ssl/fullchain.pem;
|
|
ssl_certificate_key /var/www/ssl/privkey.pem;
|
|
# ... rest of SSL configuration
|
|
}
|
|
```
|
|
|
|
### 2. Docker Compose Volume Mounting
|
|
|
|
SSL certificates are mounted from `./ssl` to `/var/www/ssl` in the nginx container:
|
|
|
|
```yaml
|
|
volumes:
|
|
- ./ssl:/var/www/ssl:ro
|
|
```
|
|
|
|
### 3. Enhanced Deployment Script
|
|
|
|
The deployment script now:
|
|
- Checks for existing SSL certificates
|
|
- Creates temporary self-signed certificates if Let's Encrypt certificates are missing
|
|
- Ensures the application can start regardless of certificate status
|
|
|
|
## Certificate Renewal
|
|
|
|
Automatic renewal is set up with a cron job that runs twice daily:
|
|
```bash
|
|
0 12,0 * * * /home/deploy/renew-certificates.sh >> /var/log/letsencrypt-renewal.log 2>&1
|
|
```
|
|
|
|
The renewal script:
|
|
1. Stops the nginx container
|
|
2. Renews certificates using certbot
|
|
3. Copies renewed certificates to the correct location
|
|
4. Restarts all services
|
|
|
|
## Troubleshooting
|
|
|
|
### Common Issues
|
|
|
|
1. **Domain not resolving to server IP**:
|
|
```bash
|
|
dig +short michaelschiemer.de
|
|
# Should return: 94.16.110.151
|
|
```
|
|
|
|
2. **Firewall blocking port 80/443**:
|
|
```bash
|
|
# Check if ports are open
|
|
nmap -p 80,443 94.16.110.151
|
|
```
|
|
|
|
3. **Certificate generation fails**:
|
|
- Ensure domain points to server IP
|
|
- Check if port 80 is accessible from internet
|
|
- Verify no other services are using port 80 during certificate generation
|
|
|
|
4. **Docker container won't start**:
|
|
```bash
|
|
# Check container logs
|
|
ssh deploy@94.16.110.151 'cd /home/deploy/michaelschiemer && docker compose logs web'
|
|
```
|
|
|
|
### Manual Certificate Check
|
|
|
|
```bash
|
|
# SSH to production server
|
|
ssh deploy@94.16.110.151
|
|
|
|
# Check certificate files
|
|
ls -la /home/deploy/michaelschiemer/ssl/
|
|
cat /home/deploy/michaelschiemer/ssl/fullchain.pem | openssl x509 -noout -text
|
|
```
|
|
|
|
### Force Certificate Regeneration
|
|
|
|
```bash
|
|
# SSH to production server
|
|
ssh deploy@94.16.110.151
|
|
|
|
cd /home/deploy/michaelschiemer
|
|
|
|
# Remove existing certificates
|
|
rm -rf ssl/live ssl/archive ssl/*.pem
|
|
|
|
# Run the SSL setup script again
|
|
./setup-production-ssl.sh
|
|
```
|
|
|
|
## Security Considerations
|
|
|
|
1. **Certificate Storage**: Certificates are stored in `/var/www/ssl/` and mounted read-only in containers
|
|
2. **Automatic Renewal**: Certificates automatically renew before expiration
|
|
3. **Strong SSL Configuration**: TLS 1.2+ with secure cipher suites
|
|
4. **Security Headers**: HSTS, CSP, and other security headers configured
|
|
5. **HTTP to HTTPS Redirect**: All HTTP traffic redirected to HTTPS
|
|
|
|
## Next Steps After SSL Setup
|
|
|
|
1. **Test the Application**: Visit https://michaelschiemer.de/
|
|
2. **Monitor Logs**: Check nginx and application logs for any issues
|
|
3. **Set up Monitoring**: Consider setting up SSL certificate expiration monitoring
|
|
4. **Performance Testing**: Run performance tests with SSL enabled
|
|
5. **Security Audit**: Run SSL Labs test: https://www.ssllabs.com/ssltest/
|
|
|
|
The SSL configuration is now production-ready and should provide secure HTTPS access to your Custom PHP Framework application. |