#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.