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.