my-recipes/AWS_DEPLOYMENT.md

6.4 KiB

AWS EC2 Deployment Guide

This guide explains how to deploy the my-recipes application on AWS EC2 with RDS database.

Prerequisites

  1. AWS Account with EC2 and RDS access
  2. Docker and Docker Compose installed on EC2 instance
  3. RDS PostgreSQL database instance created
  4. Domain name (optional, but recommended)
  5. SSL certificate (optional, but recommended for production)

Step 1: Set Up AWS RDS

  1. Create RDS PostgreSQL Instance:

    • Go to AWS RDS Console
    • Click "Create database"
    • Choose PostgreSQL engine
    • Select version 15 or higher
    • Choose appropriate instance size (db.t3.micro for testing, db.t3.small+ for production)
    • Set Master username (e.g., recipes_user)
    • Set Master password (strong password)
    • Database name: recipes_db
    • Enable public accessibility if needed (not recommended for production)
    • Configure VPC security group to allow connections from EC2
  2. Security Group Configuration:

    • Create/modify security group for RDS
    • Add inbound rule: PostgreSQL (port 5432) from EC2 security group
    • Note the endpoint: your-db-instance.xxxx.region.rds.amazonaws.com
  3. Initialize Database Schema:

    # Connect to RDS and run schema.sql
    psql -h your-rds-endpoint.region.rds.amazonaws.com \
         -U recipes_user \
         -d recipes_db \
         -f backend/schema.sql
    

Step 2: Set Up AWS EC2

  1. Launch EC2 Instance:

    • Choose Ubuntu 22.04 LTS or Amazon Linux 2023
    • Instance type: t3.micro (minimum), t3.small+ (recommended)
    • Configure security group:
      • SSH (port 22) - your IP only
      • HTTP (port 80) - 0.0.0.0/0
      • HTTPS (port 443) - 0.0.0.0/0
      • Custom TCP (port 8000) - optional, for direct API access
    • Add storage: 20GB minimum
    • Assign Elastic IP (recommended)
  2. Connect to EC2:

    ssh -i your-key.pem ec2-user@your-ec2-public-ip
    # or for Ubuntu:
    ssh -i your-key.pem ubuntu@your-ec2-public-ip
    
  3. Install Docker and Docker Compose:

    # Update system
    sudo yum update -y  # For Amazon Linux
    # sudo apt update && sudo apt upgrade -y  # For Ubuntu
    
    # Install Docker
    sudo yum install docker -y  # Amazon Linux
    # sudo apt install docker.io -y  # Ubuntu
    
    sudo systemctl start docker
    sudo systemctl enable docker
    sudo usermod -a -G docker ec2-user  # or ubuntu
    
    # 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
    
    # Logout and login again for group changes to take effect
    exit
    

Step 3: Deploy Application

  1. Clone Repository:

    cd ~
    git clone https://your-repo-url/my-recipes.git
    cd my-recipes
    
  2. Configure Environment Variables:

    # Copy the example env file from root to backend directory
    cp .env.example backend/.env
    nano backend/.env  # or vim backend/.env
    

    Update the following variables:

    # Database Configuration (from RDS)
    DB_USER=recipes_user
    DB_PASSWORD=your_rds_password
    DB_NAME=recipes_db
    DB_HOST=your-rds-endpoint.region.rds.amazonaws.com
    DB_PORT=5432
    
    # Frontend URL (your domain or EC2 public IP)
    FRONTEND_URL=http://your-ec2-ip
    # or FRONTEND_URL=https://your-domain.com
    
    # Update OAuth redirect URIs
    GOOGLE_REDIRECT_URI=http://your-ec2-ip/auth/google/callback
    AZURE_REDIRECT_URI=http://your-ec2-ip/auth/azure/callback
    
    # Update other configurations as needed
    
  3. Build and Start Services:

    cd /home/ec2-user/my-recipes  # or /home/ubuntu/my-recipes
    docker-compose up -d --build
    
  4. Verify Services:

    docker-compose ps
    docker-compose logs -f
    
  1. Set Up Domain:

    • Point your domain's A record to EC2 Elastic IP
    • Update FRONTEND_URL in .env file
  2. Install Nginx and Certbot:

    sudo yum install nginx certbot python3-certbot-nginx -y  # Amazon Linux
    # sudo apt install nginx certbot python3-certbot-nginx -y  # Ubuntu
    
  3. Configure Nginx: Create /etc/nginx/conf.d/recipes.conf:

    server {
        listen 80;
        server_name your-domain.com;
    
        location / {
            proxy_pass http://localhost:80;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
        }
    
        location /api {
            proxy_pass http://localhost:8000;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
        }
    }
    
  4. Get SSL Certificate:

    sudo certbot --nginx -d your-domain.com
    sudo systemctl restart nginx
    

Step 5: Monitoring and Maintenance

  1. View Logs:

    docker-compose logs -f backend
    docker-compose logs -f frontend
    
  2. Restart Services:

    docker-compose restart
    
  3. Update Application:

    git pull
    docker-compose down
    docker-compose up -d --build
    
  4. Backup Database: Backups are automatic based on BACKUP_INTERVAL setting. Manual backup:

    docker-compose exec backend python backup_db.py
    

Troubleshooting

  1. Can't connect to RDS:

    • Check security group rules
    • Verify VPC and subnet configuration
    • Test connection: telnet rds-endpoint 5432
  2. Services won't start:

    docker-compose logs
    
  3. Database connection errors:

    • Verify DATABASE_URL format
    • Check DB credentials
    • Ensure RDS is accessible from EC2
  4. Port conflicts:

    sudo netstat -tulpn | grep :80
    sudo netstat -tulpn | grep :8000
    

Security Best Practices

  1. Use strong passwords for DB and admin accounts
  2. Enable SSL/TLS for all connections
  3. Keep EC2 security groups restrictive
  4. Don't expose RDS publicly
  5. Use IAM roles for AWS service access
  6. Regularly update Docker images and system packages
  7. Enable CloudWatch monitoring
  8. Set up automated backups
  9. Use secrets management (AWS Secrets Manager or Parameter Store)

Cost Optimization

  1. Use reserved instances for long-term deployments
  2. Enable auto-shutdown for non-production environments
  3. Monitor and optimize RDS instance size
  4. Use S3 or R2 for backups (already configured)
  5. Consider using Application Load Balancer for multiple instances