Anders är en webbutvecklare och hårdrockare som gillar brädspel, kaffe och öl.

Nya madr.se 2024 - Directus, Metalsmith och containers

Jag har i många år redaktörat madr.se ytterst spartanskt, med en källa bestående en katalog med en samling markdown-filer. Det är kraftfullt i sin enkelhet, men har även sina nackdelar.

  • Jag behöver en dator för att kunna skriva. Det går inte att enkelt skriva ner ett utkast från telefonen eller platta när man får en idé och har någon minut över.
  • Jag behöver synka markdown-filerna mellan de datorer jag vill använda för att skriva, med risk för att filer hamnar ur synk.

Jag har därför lekt litet med tanken på att bygga ett CMS. Det är något som länge stått på min bucket list, då det är en nyttig programmeringsövning alls bör ta sig ann.

Jag snubblade dock över ett färdigt CMS som jag genast ville utvärdera. Directus är ett Headless CMS: det erbjuder ett redaktörsgränssnitt och ett REST API som agerar datakälla.

Metalsmith är en Static Site Generator jag använt sedan 2015. Min konfiguration ändrades senast 2019, och jag tog det som en utmaning att använda konfigurationen i befintligt skick.

Med några python-script är det enkelt att göra bidirektional data-migrering.

  • Importera från markdown in till Directus.
  • Exportera från Directus till katalog med markdown-filer att mata Metalsmith med.

Ett par containers:

  • madrse-ssg, en Node-baserad container som kör Metalsmith och skapar en WWW-rot med HTML. Denna beskrivs på Metalsmith i container
  • madrse-www, en NGINX-container med WWW-roten i default www-katalogen för NGINX.
  • madrse-exporter, Directus till markdown.
  • madrse-importer, markdown till Directus.

Hur madr.se sköts 2024

Först och främst hanterar jag mitt innehåll via Directus. Jag planerar evenemang, sköter Brutal Legend-projektet, skriver artiklar och kommenterar intressanta länkar jag läst.

Såhär ser en export ut.

md_dir=$"$(mktemp -d --tmpdir=.)"

podman pull registry.madr.se/madrse-exporter
podman run -it \
  -v $md_dir:/destination \
  -e HCMS_TOKEN=$HCMS_TOKEN \
  -e HCMS_URL=$HCMS_URL \
registry.madr.se/madrse-exporter

För att sedan bygga en ny version av sajten ser det ut såhär:

html_dir=$"$(mktemp -d --tmpdir=.)"

podman pull registry.madr.se/madrse-ssg
podman run -it \
  --rm \
  -v $html_dir:/app/pub \
  -v $md_dir/assets:/app/assets \
  -v $md_dir/src:/app/src \
registry.madr.se/madrse-ssg

För att paketera den renderade HTML-katalogen i en container används följande Containerfile:

FROM nginx:stable-alpine-slim AS output
ARG src
COPY ${src} /usr/share/nginx/html

Med kommandot:

podman build \
 -f Containerfile.www \
 --build-arg src=$html_dir

Därefter pushar jag upp den nya versionen:

podman tag $(podman images | awk '{print $3}' | awk 'NR==2') registry.madr.se/madrse-www
podman push registry.madr.se/madrse-www

Samt driftsätter den:

ssh aginor podman pull registry.madr.se/madrse-w3
ssh aginor podman run -d \
  --pod=madrse \
  --name=www \
  --replace \
registry.madr.se/madrse-w3:latest

Detta ligger såklart i ett deploy-script som jag kör när jag behöver. Det skulle givetvis vara möjligt att automatisera detta med Directus eller en mikrotjänst för att deploya ny version, men det får bli en övning till en annan dag.

Det jag ville förbättra var att få ett CMS att göra redaktörsarbete i, och det har jag fått.