238 lines
6.4 KiB
Markdown
238 lines
6.4 KiB
Markdown
# 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:**
|
|
```bash
|
|
# 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:**
|
|
```bash
|
|
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:**
|
|
```bash
|
|
# 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:**
|
|
```bash
|
|
cd ~
|
|
git clone https://your-repo-url/my-recipes.git
|
|
cd my-recipes
|
|
```
|
|
|
|
2. **Configure Environment Variables:**
|
|
```bash
|
|
# 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:
|
|
```env
|
|
# 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:**
|
|
```bash
|
|
cd /home/ec2-user/my-recipes # or /home/ubuntu/my-recipes
|
|
docker-compose up -d --build
|
|
```
|
|
|
|
4. **Verify Services:**
|
|
```bash
|
|
docker-compose ps
|
|
docker-compose logs -f
|
|
```
|
|
|
|
## Step 4: Configure Domain and SSL (Optional but Recommended)
|
|
|
|
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:**
|
|
```bash
|
|
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`:
|
|
```nginx
|
|
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:**
|
|
```bash
|
|
sudo certbot --nginx -d your-domain.com
|
|
sudo systemctl restart nginx
|
|
```
|
|
|
|
## Step 5: Monitoring and Maintenance
|
|
|
|
1. **View Logs:**
|
|
```bash
|
|
docker-compose logs -f backend
|
|
docker-compose logs -f frontend
|
|
```
|
|
|
|
2. **Restart Services:**
|
|
```bash
|
|
docker-compose restart
|
|
```
|
|
|
|
3. **Update Application:**
|
|
```bash
|
|
git pull
|
|
docker-compose down
|
|
docker-compose up -d --build
|
|
```
|
|
|
|
4. **Backup Database:**
|
|
Backups are automatic based on BACKUP_INTERVAL setting. Manual backup:
|
|
```bash
|
|
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:**
|
|
```bash
|
|
docker-compose logs
|
|
```
|
|
|
|
3. **Database connection errors:**
|
|
- Verify DATABASE_URL format
|
|
- Check DB credentials
|
|
- Ensure RDS is accessible from EC2
|
|
|
|
4. **Port conflicts:**
|
|
```bash
|
|
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
|