Subdomener uten å miste forstanden
Hvordan jeg satt opp geish.no med fem subdomener som peker på samme Next.js-app, uten å eksponere monorepo-strukturen.
Plan: ett hovedsite (geish.no), fem subdomener (bake.geish.no, hund.geish.no, osv.), én Next.js-app, én deploy. Hver subdomene rendrer sitt eget grensesnitt, men deler underliggende ting (auth, DB, design).
Det høres ut som et monorepo med fem packages. Det er det ikke. Det er én Next.js-app med Vercel rewrites.
Trikset
Vercel støtter at du putter en vercel.json på roten med en rewrites-blokk:
{
"rewrites": [
{ "source": "/", "has": [{ "type": "host", "value": "bake.geish.no" }], "destination": "/_apps/bake" },
{ "source": "/:path*", "has": [{ "type": "host", "value": "bake.geish.no" }], "destination": "/_apps/bake/:path*" }
]
}
Da rendrer en request til bake.geish.no/oppskrifter faktisk /_apps/bake/oppskrifter internt — men URL-en brukeren ser er fortsatt bake.geish.no/oppskrifter. Du eksponerer ikke _apps/bake i URL-bar-en. App Router-strukturen får ligge under src/app/_apps/.
Hvorfor ikke en app per subdomene?
Den åpenbare løsningen er fem Next.js-apper, fem deployer, fem CI-pipelines. Jeg gikk gjennom argumentene:
- Felles auth. Hvis jeg vil at en pålogget bruker på
geish.no/stuaogså er pålogget påbake.geish.no, må jeg dele cookie/session. Med én app er det automatisk; med fem er det enten cross-domain-cookies eller en token-server. - Felles DB-skjema. Drizzle-skjema bor ett sted. Migrasjon kjører en gang.
- Felles designsystem. Endrer jeg en token-verdi, oppdateres alle subdomener med samme deploy.
Mot fem-apper-løsningen taler at hvert site får isolert dependency-tree, kan deployes uavhengig, og krasjer ikke alle samtidig. For mitt scope — fem småprosjekter, én utvikler — er det negative ikke verdt det.
Det er ikke trivielt
Ting jeg snublet i:
next.config.tsmå ikke ha noe som matcher rewrites på path-prefix. Hvis du har enredirects-regel som flytter/_apps/baketil noe, vil rewriten din ikke virke.- Image-optimization går mot hovedsite-domene (
geish.no/_next/image?...). Forbake.geish.nobetyr det at bilder lastes fra en annen domene — Vercel håndterer det riktig hvis du pekerimages.domainskorrekt. - Hvis du har en sitemap, må den genereres per host.
bake.geish.no/sitemap.xmlskal ikke vise lenker tilgeish.no-poster.
Konklusjon
Én app, fem subdomener, Vercel rewrites. Magisk om du forstår hvordan rewrites jobber under panseret, frustrerende om du tror du har en monorepo. Når jeg er ferdig med å sette opp dette og noen leser det her, har det forhåpentligvis spart en kveld eller to.