# Amar Mascotas Infrastructure as Code

Pulumi configurations for deploying the Amar Mascotas backend to different cloud providers.

## Structure

```
infra/
├── digitalocean/   # DigitalOcean configuration
├── aws/            # AWS configuration
├── gcp/            # Google Cloud configuration
└── shared/         # Shared Python utilities
```

## Prerequisites

```bash
# Install Pulumi
curl -fsSL https://get.pulumi.com | sh

# Install Python dependencies
pip install pulumi pulumi-digitalocean pulumi-aws pulumi-gcp

# Login to Pulumi (free tier, or use local state)
pulumi login --local  # Local state (no account needed)
# OR
pulumi login          # Pulumi Cloud (free tier available)
```

## Cloud Provider Setup

### DigitalOcean
```bash
export DIGITALOCEAN_TOKEN="your-api-token"
```

### AWS
```bash
aws configure
# Or set environment variables:
export AWS_ACCESS_KEY_ID="xxx"
export AWS_SECRET_ACCESS_KEY="xxx"
export AWS_REGION="us-east-1"
```

### GCP
```bash
gcloud auth application-default login
export GOOGLE_PROJECT="your-project-id"
```

## Usage

```bash
cd infra/digitalocean  # or aws, gcp

# Preview changes
pulumi preview

# Deploy
pulumi up

# Destroy
pulumi destroy
```

## Cost Comparison (Estimated Monthly)

| Resource | DigitalOcean | AWS | GCP |
|----------|--------------|-----|-----|
| Compute (4GB RAM) | $24 | $35 | $30 |
| Managed Postgres | $15 | $25 | $25 |
| Managed Redis | $15 | $15 | $20 |
| Load Balancer | $12 | $18 | $18 |
| **Total** | **~$66** | **~$93** | **~$93** |

## Architecture

All configurations deploy:
- 1x App server (Django + Gunicorn + Celery)
- 1x Managed PostgreSQL with PostGIS
- 1x Managed Redis
- VPC/Network isolation
- Firewall rules (SSH, HTTP, HTTPS)

## Provider Comparison

### Code Complexity

| Aspect | DigitalOcean | AWS | GCP |
|--------|--------------|-----|-----|
| Lines of code | ~180 | ~280 | ~260 |
| Resources created | 8 | 15 | 14 |
| Networking setup | Simple (VPC only) | Complex (VPC + subnets + IGW + routes) | Medium (VPC + subnet + peering) |
| Learning curve | Low | High | Medium |

### Feature Comparison

| Feature | DigitalOcean | AWS | GCP |
|---------|--------------|-----|-----|
| **Managed Postgres** | Yes (DO Database) | Yes (RDS) | Yes (Cloud SQL) |
| **PostGIS** | Via extension | Via extension | Via flags |
| **Managed Redis** | Yes (DO Database) | Yes (ElastiCache) | Yes (Memorystore) |
| **Private networking** | VPC | VPC + subnets | VPC + peering |
| **Load balancer** | $12/mo | $18/mo | $18/mo |
| **Auto-scaling** | Limited | Full (ASG) | Full (MIG) |
| **Regions** | 15 | 30+ | 35+ |
| **Free tier** | None | 12 months | $300 credit |

### When to Choose Each

**DigitalOcean:**
- Simple deployments
- Cost-sensitive
- Small teams
- Latin America (São Paulo region)

**AWS:**
- Enterprise requirements
- Need advanced services (Lambda, SQS, etc.)
- Complex networking needs
- Compliance requirements (HIPAA, PCI)

**GCP:**
- Machine learning integration
- Kubernetes-first approach
- Good free credits to start
- BigQuery/analytics needs

### Real Cost Breakdown (Your App)

```
DigitalOcean (~$66/mo):
├── Droplet 4GB         $24
├── Managed Postgres    $15
├── Managed Redis       $15
└── Load Balancer       $12 (optional)

AWS (~$93/mo):
├── EC2 t3.medium       $35
├── RDS db.t3.micro     $25
├── ElastiCache         $15
└── ALB                 $18 (optional)

GCP (~$93/mo):
├── e2-medium           $30
├── Cloud SQL           $25
├── Memorystore         $20
└── Load Balancer       $18 (optional)
```

### Migration Effort

If you ever need to switch providers:

| From → To | Effort | Notes |
|-----------|--------|-------|
| DO → AWS | Medium | Postgres dump/restore, reconfigure Redis |
| DO → GCP | Medium | Same as above |
| AWS → GCP | Medium | Similar services, different APIs |
| Any → Kubernetes | High | Need to containerize everything |

The Pulumi code is portable - only the provider-specific resources change.
