Från statisk sida till eget CMS, ett år av utveckling
3 min läsning

Från statisk sida till eget CMS, ett år av utveckling

För ett år sedan var min portfolio en hårdkodad Next.js-sida. Snygg, men stel. Varje textändring krävde ett kodredigerings och en ny deploy. Så jag bestämde mig för att bygga ett eget CMS, och gick in i ett av de roligaste och mest kaotiska sidoprojekten jag haft.

Från statisk sida till eget CMS, ett år av utveckling

Det här inlägget är en genomgång av hur min portfolio har vuxit fram, från en enkel statisk HTML-sida till ett fullständigt CMS-drivet system som jag byggt från grunden.

Hur det började

Jag startade med en klassisk statisk sida: HTML, CSS och lite JavaScript. Det fungerade, men varje gång jag ville uppdatera något behövde jag in i koden. Textredigering direkt i VS Code, commit, deploy. Repetitivt och tråkigt.

Jag insåg rätt snabbt att jag ville ha något mer flexibelt — framförallt för blogg och projekt. Tanken på att hårdkoda varje blogginlägg i JSX kändes inte hållbar.

Valet av stack

Jag landade i Next.js med App Router, Prisma som ORM och PostgreSQL som databas. För media-uppladdning använder jag Cloudflare R2, S3-kompatibelt och utan egress-avgifter.

Varför inte ett färdigt CMS som Contentful eller Sanity? Jo, delvis för att jag ville lära mig, men också för att jag ville ha full kontroll. Ett eget system innebär att jag kan lägga till precis den funktionalitet jag behöver, och skippa det jag inte behöver.

Admin-gränssnittet

Jag byggde ett eget admin-gränssnitt för att hantera sidor, sektioner, blogginlägg och projekt. Det är lösenordsskyddat via en enkel session-baserad autentisering.

Några saker som krävde mer arbete än jag förväntade mig:

  • Sektionssystemet, varje sida består av sektioner med olika typer (hero, text, grid, etc). Varje sektion har ett schema som styr vilka fält som visas i admin.

  • Flerspråksstöd, sidor och projekt kan ha översättningar per locale. Det kräver ett genomtänkt databasschema och konsekvent hantering i alla queries.

  • Mediabanken, uppladdning till R2, generering av förhandsvisningar och alt-text per språk.

Deploy-pipeline

Applikationen körs i Docker på en VPS. GitHub Actions bygger imagen vid varje push till main och pushar till GitHub Container Registry. Servern hämtar den nya imagen och startar om containern, hela deployen tar under en minut med ungefär fem sekunders downtime.

Det var inte trivialt att sätta upp, men nu fungerar det smidigt. En av de knepigare buggarna var att docker-compose v1 kraschade med ett KeyError: ContainerConfig,fel mot BuildKit-images, löst med en specifik sekvens av rm -sf + up istället för --force-recreate.

Vad jag lärt mig

Att bygga ett eget CMS är ett utmärkt sätt att verkligen förstå hur de stora systemen fungerar. Jag har fått hands-on erfarenhet av:

  • Databasmodellering med relationer och translations-mönster

  • Server components och streaming i Next.js App Router

  • Docker och grundläggande DevOps

  • Cloudflare Workers och R2 för edge-distribution

Det som tog längst tid var inte koden, det var att förstå varför saker fungerar som de gör. Det är skillnaden mellan att kopiera ett mönster och att faktiskt äga det.

Nästa steg

Det finns fortfarande saker kvar på listan: analytics, bättre SEO-verktyg i admin, och korsreferenser mellan projekt och blogginlägg. Men systemet är stabilt nog för produktionsbruk, vilket den här sidan bevisar.

Från statisk Next.js till eget CMS: En resa genom kod och CI/CD | Max Stolpe