#heading[Deployment stappen]

Serengo ondersteunt meerdere deployment-scenario's, waaronder Vercel en een self-hosted Docker-omgeving [@docker-docs]. In dit hoofdstuk worden de belangrijkste concepten, vereiste configuratie en een concreet stappenplan beschreven.

== Vereiste environment-variabelen

Voor een werkende productieomgeving zijn minimaal de volgende variabelen nodig (zie ook `logs/logboek.md`):

```bash
DATABASE_URL=          # PostgreSQL-verbinding
GOOGLE_CLIENT_ID=      # Google OAuth client ID
GOOGLE_CLIENT_SECRET=  # Google OAuth secret
R2_ACCOUNT_ID=         # Cloudflare R2 account ID
R2_ACCESS_KEY_ID=      # Cloudflare R2 access key
R2_SECRET_ACCESS_KEY=  # Cloudflare R2 secret key
R2_BUCKET_NAME=        # Cloudflare R2 bucket-naam
VAPID_PUBLIC_KEY=      # Web Push public key
VAPID_PRIVATE_KEY=     # Web Push private key
GOOGLE_MAPS_API_KEY=   # Google Places API key
```

Deze worden tijdens build en runtime ingelezen door de SvelteKit-app en de server-side services (`auth`, `r2`, `push`, `places`).

== Vercel-deployment (cloud)

In een Vercel-scenario wordt de app gedeployed met behulp van `@sveltejs/adapter-vercel` (aanwezig als dependency). Belangrijke aandachtspunten:

- De SvelteKit-app wordt als serverless of edge-functies uitgerold, afhankelijk van de Vercel-configuratie.
- `DATABASE_URL` moet verwijzen naar een publiek bereikbare PostgreSQL-instantie (bijv. een managed database).
- Cloudflare R2 en Web Push blijven extern; de nodige secrets worden als Vercel environment-variabelen ingesteld.

== Self-hosted Docker-deployment

Voor een zelfgehoste omgeving is een uitgebreide Docker-setup voorzien (Phase 7 in het logboek):

- Multi-stage Docker build om een compacte productie-image te maken.
- Health checks om de beschikbaarheid van de container te monitoren.
- Een entrypoint-script dat bij het starten van de container automatisch Drizzle-migraties uitvoert.
- Drizzle als production dependency, zodat migraties ook in de container kunnen draaien.

Typische stappen voor een self-hosted deployment zijn:

1. Zorg voor een draaiende PostgreSQL-instantie (lokaal, via `docker-compose` of extern) en vul de `DATABASE_URL` correct in.
2. Stel alle vereiste environment-variabelen in voor de app (zie boven).
3. Bouw de Docker-image, bijvoorbeeld met:

   ```bash
   docker build -t serengo:latest .
   ```

4. Start de container met de juiste environment-variabelen en netwerkconfiguratie, bijvoorbeeld via
   `docker-compose`:

   ```bash
   docker-compose up -d
   ```

5. Het entrypoint-script in `docker-entrypoint.sh` zorgt ervoor dat `pnpm run db:migrate` (of een equivalent via `drizzle-kit`) uitgevoerd wordt bij het opstarten, zodat de database-schema's up-to-date zijn.
6. Controleer de logs en health checks om na te gaan of de app correct draait.

== Van ontwikkeling naar productie

Samengevat ziet de route van lokale ontwikkeling naar productie er als volgt uit:

1. Lokaal ontwikkelen met `pnpm run dev`, frequent linten en typen checken (`pnpm run lint`, `pnpm run check`).
2. Database- en schemawijzigingen doorvoeren met Drizzle (`db:generate`, `db:migrate`, `db:generate-erd`).
3. De productiebuild genereren met `pnpm run build` en lokaal testen via `pnpm run preview`.
4. Deployen naar Vercel of bouwen en uitrollen van de Docker-image in een self-hosted omgeving.

Door de geautomatiseerde migraties en consistente configuratie is het deploymentproces herhaalbaar en betrouwbaar.

== Aanvullende documentatie en hosting

Naast deze paper is er een aparte API-referentie beschikbaar, opgebouwd met Mintlify en gehost op mijn eigen domein:

- *API-documentatie*: `https://docs.zias.be` – Mintlify-documentatie [@mintlify-docs] voor de Serengo-API.

De volledige broncode van Serengo wordt self-hosted op mijn eigen Git-server:

- *Broncode-repository*: `https://git.zias.be/zias/serengo` – privé Git-instantie met de volledige Serengo broncode.

De productieversie van de Serengo-applicatie draait op mijn eigen Hetzner VPS [@hetzner-cloud], uitgerold met Docker [@docker-docs]:

- *Live-applicatie*: `https://serengo.zias.be` – SvelteKit-app in Docker-container op een Hetzner VPS.

Deze deployment zorgt ervoor dat zowel de code als de infrastructuur volledig in eigen beheer zijn, zonder afhankelijkheid van publieke Git-hosting of PaaS-platformen.
