# OCI Deployment Architecture & Sizing

## Architecture Diagram (Small)

```
                       ┌─────────────────────────────┐
                       │           VM #1             │
                       │    Coolify + Gitea          │
                       └──────────────┬──────────────┘
                                      │
                                      │ Deploys/Manages
                                      ▼
┌─────────────────────────────────────────────────────────────────┐
│                             VM #2                               │
│  ┌─────────────────────┐   ┌───────────────────────────────┐    │
│  │   Next.js App #1     │   │  Next.js App #2 / #3 (future) │    │
│  └──────────┬──────────┘   └───────────────┬───────────────┘    │
│             │                              │                    │
│             └──────────────┬───────────────┘                    │
│                            ▼                                    │
│                    ┌──────────────┐                             │
│                    │  PgBouncer   │  (transaction pooling)      │
│                    └──────┬───────┘                             │
│                           │                                     │
│           ┌───────────────┼───────────────┐                     │
│           ▼                               ▼                     │
│     ┌─────────────┐                 ┌─────────────┐             │
│     │ PostgreSQL  │                 │    Redis    │             │
│     └─────────────┘                 └─────────────┘             │
└─────────────────────────────────────────────────────────────────┘
```

## Workload Assumptions
- Daily users: ~200
- Peak concurrent users: 20–30
- Peak connections: <= 100 (spiky)
- Future: +2 Next.js apps sharing the same Postgres/Redis/PgBouncer

## OCI VM Specs (Current)
- 2 OCPU
- 12 GB RAM
- 100 GB SSD
- Oracle Linux
- 4 GB bandwidth

This is sufficient for the current app and two additional small Next.js apps.

## System Requirements (Recommended for Shared Services)

### Single VM (App + PgBouncer + Redis + Postgres)
- CPU: 2 OCPU (OK) or 4 OCPU (better headroom)
- RAM: 8–12 GB (you have 12 GB, good)
- Disk: 80–120 GB SSD (you have 100 GB, good)

### Split VMs (Optional for more stability)
- VM A: Coolify + Gitea (2 OCPU / 8 GB RAM)
- VM B: App server (2 OCPU / 4–8 GB RAM)
- VM C: Database + PgBouncer + Redis (2 OCPU / 8–12 GB RAM)

## PgBouncer Configuration (Applied)

Location: docker/pgbouncer.ini

- pool_mode = transaction
- max_client_conn = 500
- default_pool_size = 40
- min_pool_size = 10
- reserve_pool_size = 20
- reserve_pool_timeout = 3
- max_db_connections = 120
- max_user_connections = 60
- server_idle_timeout = 120
- server_lifetime = 3600
- server_reset_query = DISCARD ALL
- auth_type = md5
- listen_port = 6432

These values are tuned for:
- 20–30 concurrent users now
- Up to 3 Next.js apps sharing the pool later
- Protecting Postgres from connection spikes

## PostgreSQL Recommendations (Optional)
If you want to pin exact server settings, use:

- max_connections: 150–200
- shared_buffers: 2GB
- work_mem: 16MB
- maintenance_work_mem: 256MB
- effective_cache_size: 6GB

Let me know if you want a mounted postgres.conf for these.

## Redis Recommendations
- Memory: 256–512 MB is enough for sessions and cache at this scale
- Persistence: AOF enabled (already)

## Notes
- PgBouncer sits between apps and Postgres to prevent overload.
- Redis offloads session and cache reads, reducing DB pressure.
- With 12 GB RAM, you have plenty of headroom for 3 apps.

## Next Step (Optional)
If you want, I can:
- Add a postgres.conf and mount it in docker-compose
- Add PgBouncer metrics and health checks
- Provide a production hardening checklist
