# Coolify — Deploy the Next.js web app

## Source

Coolify pulls from Git. Set up the repo on GitHub/GitLab/Gitea (private OK; Coolify supports deploy keys).

This repo's `/web` directory is the app root.

## Create the application

1. Coolify → **+ New Resource** → **Application** → **Public Git** (or Private with deploy key).
2. Repository: `git@github.com:youruser/ufo.git` (whatever you push to)
3. Branch: `main`
4. **Base directory**: `/web` ← important, the Next app isn't at the repo root
5. **Build pack**: `Nixpacks` (or `Dockerfile` if you commit one — Nixpacks is simpler for Next 15)
6. **Port**: `3000`
7. **Domain**: `disclosure.top` and `www.disclosure.top`

## Environment variables

Set in the application's **Environment Variables** tab:

```env
# Supabase (from Coolify's Supabase project page)
NEXT_PUBLIC_SUPABASE_URL=https://db.disclosure.top
NEXT_PUBLIC_SUPABASE_ANON_KEY=<paste-anon-key>
SUPABASE_SERVICE_ROLE_KEY=<paste-service-role-key>

# Anthropic (the Claude API for the chat agent)
ANTHROPIC_API_KEY=sk-ant-...
ANTHROPIC_CHAT_MODEL=claude-haiku-4-5

# Paths inside the container (we mount the wiki/ + processing/ volumes)
UFO_ROOT=/data/ufo

# Public URL (for magic-link redirects)
NEXT_PUBLIC_SITE_URL=https://disclosure.top
```

## Volume mounts — the wiki data

The Next.js app reads markdown directly from `/Users/guto/ufo/{wiki,processing,raw}`. On the VPS, mount the data dir into the container at `/data/ufo`.

In Coolify app → **Storages**:

| Source (host) | Target (container) | Mode |
|---|---|---|
| `/data/ufo/wiki`       | `/data/ufo/wiki`       | read-only |
| `/data/ufo/processing` | `/data/ufo/processing` | read-only |
| `/data/ufo/raw`        | `/data/ufo/raw`        | read-only |

**How to populate these on the VPS first time:**

```bash
# On your laptop, after pipeline finishes:
rsync -avz --progress \
  /Users/guto/ufo/wiki/ \
  /Users/guto/ufo/processing/ \
  /Users/guto/ufo/raw/ \
  root@<vps-ip>:/data/ufo/
```

Subsequent updates: just re-rsync. The container reads live (with Next.js page revalidation set appropriately).

## Deploy

Coolify pulls the repo, runs `npm install && npm run build`, then `npm run start` on port 3000.

First deploy ~5 min. Subsequent (cached layer) ~1 min.

## Verify

```bash
curl https://disclosure.top/api/documents | head -c 300
# → {"documents":[{"doc_id":"doc-059uap00011",...
```

## Continuous deploy

Coolify can listen to a Git webhook so every push to `main` triggers a rebuild. Set in Application → Webhooks.

## Next

→ [`SHARED.md`](SHARED.md) — Meilisearch + Dragonfly + Imgproxy
