Skip to main content

Docker Deployment Guide

Docker provides an easy, reproducible way to deploy Chirp with all its dependencies. This guide covers everything from basic Docker setup to enterprise-grade container orchestration.

Why Use Docker?

Benefits

  • 🐳 Consistent Environment: Same configuration everywhere
  • 🔄 Easy Updates: Simple container replacement
  • 📦 Dependency Isolation: No system conflicts
  • 🚀 Quick Deployment: One-command setup
  • 📈 Scalability: Easy horizontal scaling
  • 🔒 Security: Isolated containers

Use Cases

  • Quick Start: Get running in minutes
  • Development: Consistent dev environments
  • Testing: Isolated test environments
  • Production: Reliable deployments
  • Multi-tenant: Run multiple instances

Prerequisites

  • Docker 20.10+ and Docker Compose 2.0+
  • Domain name (for production)
  • Basic Docker knowledge

Quick Start with Docker Compose

1. Clone Repository

git clone https://git.eidenz.moe/Eidenz/chirp.git
cd chirp

2. Configure Environment

# Edit configuration
nano docker-compose.yml

Basic configuration:

NODE_ENV=production
PORT=3001
BASE_URL=https://your-domain.com

# Database (will use PostgreSQL container)
DB_HOST=postgres
DB_PORT=5432
DB_USER=chirp
DB_PASSWORD=secure_password_here
DB_NAME=chirp
DB_SSL=false

# Security
JWT_SECRET=your_super_secure_jwt_secret_64_chars_minimum
ADMIN_KEY=your_secure_admin_key

# Redis (will use Redis container)
REDIS_HOST=redis
REDIS_PORT=6379

3. Start Services

# Start all services
docker-compose up -d

# View logs
docker-compose logs -f

# Check status
docker-compose ps

Access Chirp at http://localhost:5173 (development) or configure reverse proxy for production.

Nginx Configuration

nginx/nginx.conf:

events {
worker_connections 1024;
}

http {
include /etc/nginx/mime.types;
default_type application/octet-stream;

# Logging
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;

# Performance settings
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;

# Security headers
add_header X-Frame-Options DENY;
add_header X-Content-Type-Options nosniff;
add_header X-XSS-Protection "1; mode=block";

# Gzip compression
gzip on;
gzip_vary on;
gzip_min_length 1024;
gzip_types text/plain text/css text/xml text/javascript application/javascript application/xml+rss application/json;

# Include site configurations
include /etc/nginx/conf.d/*.conf;
}

nginx/sites/default.conf:

server {
listen 80;
server_name your-domain.com www.your-domain.com;

# Redirect to HTTPS
return 301 https://$server_name$request_uri;
}

server {
listen 443 ssl http2;
server_name your-domain.com www.your-domain.com;

# SSL configuration
ssl_certificate /etc/ssl/certs/your-domain.crt;
ssl_certificate_key /etc/ssl/certs/your-domain.key;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;

# File uploads
client_max_body_size 100M;

# Serve static files
location /uploads/ {
alias /var/www/uploads/;
expires 1y;
add_header Cache-Control "public, immutable";
}

# Proxy to Chirp app
location / {
proxy_pass http://chirp-server:3001;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_cache_bypass $http_upgrade;
}

# WebSocket support
location /socket.io/ {
proxy_pass http://chirp-server:3001;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}

Deployment Commands

# Start development environment
docker-compose up -d

# View logs
docker-compose logs -f chirp-server
docker-compose logs -f chirp-web

# Stop services
docker-compose down

# Rebuild and restart
docker-compose up -d --build

Database Management

Backups

# Database backup
docker-compose exec postgres pg_dump -U chirp chirp | gzip > backup.sql.gz

# Automated backup script
cat > backup.sh << 'EOF'
#!/bin/bash
DATE=$(date +%Y%m%d_%H%M%S)
BACKUP_DIR="./backups"

mkdir -p $BACKUP_DIR

# Database backup
docker-compose exec -T postgres pg_dump -U chirp chirp | gzip > $BACKUP_DIR/db_backup_$DATE.sql.gz

# Files backup
docker run --rm -v chirp_chirp_uploads:/data -v $PWD/backups:/backup alpine tar czf /backup/files_backup_$DATE.tar.gz -C /data .

# Clean old backups (keep 30 days)
find $BACKUP_DIR -name "*.gz" -mtime +30 -delete
EOF

chmod +x backup.sh

# Add to crontab for daily backups
echo "0 2 * * * /path/to/chirp/backup.sh" | crontab -

Restore

# Restore database
gunzip -c backup.sql.gz | docker-compose exec -T postgres psql -U chirp chirp

# Restore files
docker run --rm -v chirp_chirp_uploads:/data -v $PWD/backups:/backup alpine tar xzf /backup/files_backup_DATE.tar.gz -C /data

Monitoring and Maintenance

Health Checks

# Check service health
docker-compose ps

# View resource usage
docker stats

# Check logs
docker-compose logs chirp-server

Log Management

# Rotate logs
docker-compose exec chirp-server logrotate /etc/logrotate.d/chirp

# View real-time logs
docker-compose logs -f --tail=100

# Export logs
docker-compose logs --no-color > chirp-logs.txt

Updates

# Update containers
docker-compose pull
docker-compose build
docker-compose up -d

Production Best Practices

Security

  1. Run as non-root user (configured in Dockerfile)
  2. Limit container resources (deploy section in compose)
  3. Use secrets for sensitive data

Backup Strategy

  1. Regular database backups (daily)
  2. File backups (weekly)
  3. Off-site storage for critical backups
  4. Test restores periodically

Monitoring

  1. Container health checks (configured in Dockerfile)
  2. Resource monitoring (docker stats)
  3. Log aggregation (ELK stack or similar)
  4. Alerting for critical failures

Troubleshooting

Common Issues

Container won't start:

# Check logs
docker-compose logs chirp-server

# Check configuration
docker-compose config

# Rebuild container
docker-compose build --no-cache chirp-server

Database connection issues:

# Check database container
docker-compose ps postgres
docker-compose logs postgres

# Test connection
docker-compose exec chirp-server ping postgres

Permission issues:

# Fix file permissions
docker-compose exec chirp-server chown -R chirp:chirp /app/uploads

# Check user permissions
docker-compose exec chirp-server id

Performance issues:

# Check resource usage
docker stats

# Optimize Docker image
docker history chirp:latest

# Clean up unused images
docker system prune -a

Next Steps

  1. Production Setup Guide - Manual setup instructions
  2. Configuration Guide - Detailed configuration options

Need help? Check our troubleshooting guide.