# Infrastructure — Disclosure Bureau

Self-hosted stack on a single VPS (16 GB / 4 CPU / 200 GB NVMe) managed via **Coolify**.

```
                   Internet (443/80)
                          │
                ┌─────────▼─────────┐
                │  Caddy (Coolify)  │ ← auto-TLS Let's Encrypt
                └────┬──────────────┘
                     │
       ┌─────────────┼──────────────────────┬──────────────────┐
       ▼             ▼                      ▼                  ▼
  ┌─────────┐   ┌──────────┐         ┌──────────┐       ┌──────────┐
  │ Next.js │   │ Supabase │         │ Supabase │       │  shared  │
  │   web   │   │ disclosure│        │ project-B │       │ services │
  │ :3000   │   │ stack    │         │  stack    │       │ Meili··· │
  └─────────┘   │  ┌─────┐ │         │  ┌─────┐ │       │ Imgproxy │
                │  │PG/GT│ │         │  │PG/GT│ │       │ Dragonfly│
                │  └─────┘ │         │  └─────┘ │       └──────────┘
                └──────────┘         └──────────┘
                disclosure.top       projeto-b.com
```

## Components

| Layer | Service | Notes |
|---|---|---|
| **Orchestration** | [Coolify](https://coolify.io) v4 | Self-hosted PaaS — manages all containers, TLS, backups |
| **Database + Auth + Storage** | Supabase self-hosted (one per project) | Each project gets own Postgres + GoTrue + Storage |
| **Frontend** | Next.js 15 (this repo's `/web`) | Deployed via Coolify Git integration |
| **Search** | Meilisearch (shared) | Full-text search across pages + entities |
| **Cache + Queue** | Dragonfly (shared) | Redis-compatible, multi-threaded |
| **Images** | Imgproxy (shared) | On-the-fly resize / WebP conversion |
| **Backups** | restic + Backblaze B2 | Nightly Postgres + Storage dumps |

## Quick path

1. **[`coolify/INSTALL.md`](coolify/INSTALL.md)** — install Coolify on the fresh VPS (~10 min)
2. **[`coolify/SUPABASE.md`](coolify/SUPABASE.md)** — create the `disclosure` Supabase project (~5 min)
3. Run [`supabase/migrations/0001_chat_schema.sql`](supabase/migrations/0001_chat_schema.sql) via Supabase Studio SQL editor
4. **[`coolify/NEXTJS.md`](coolify/NEXTJS.md)** — deploy the `/web` app pointing at the Supabase URL
5. **[`coolify/SHARED.md`](coolify/SHARED.md)** — bring up Meilisearch, Dragonfly, Imgproxy

## Adding more projects later

For each new project, repeat step 2 (new Supabase project in Coolify UI) and step 4 (new Next.js app). They get their own subdomain, own auth, own data. Total isolation.

## Local development

For dev on macOS/Linux without the VPS, see [`../web/README.md`](../web/README.md) — uses the Supabase CLI to spin up a local stack on `localhost:54321`.
