CMS-update week 44: het CMS draait nu op Rust

De vorige CMS-update verscheen in week 29. Sindsdien is er behoorlijk wat veranderd, al zul je daar tijdens het beheren van je website weinig van merken. De grootste verandering zit namelijk achter de schermen: we hebben de server waarop ons CMS draait opnieuw geschreven, dit keer in Rust.

Je website blijft bereikbaar op dezelfde adressen en ook de beheeromgeving werkt zoals je gewend bent. De nieuwe server gebruikt alleen veel minder geheugen, reageert sneller en is eenvoudiger te onderhouden. In deze update leggen we uit waarom we die overstap hebben gemaakt en wat er verder is verbeterd.

Waarom we zijn overgestapt op Rust

De vorige versie van de server was gebouwd met JavaScript. Daar is op zichzelf niets mis mee, maar in de loop der tijd waren we afhankelijk geworden van honderden externe pakketten. Die moesten allemaal worden bijgehouden en konden ieder hun eigen fouten of beveiligingsproblemen introduceren.

Met Rust hebben we een groot deel van die afhankelijkheden kunnen weghalen. Bovendien helpt de taal om bepaalde geheugenfouten al tijdens het compileren te voorkomen. Dat maakt niet automatisch alle software veilig, maar het neemt wel een bekende categorie problemen weg.

We hebben meteen een paar andere zaken aangepakt:

  • Minder afhankelijkheden: In plaats van honderden losse pakketten bestaat de server nu uit één programma met een veel kleinere set afhankelijkheden. Die controleren we bij iedere release automatisch op bekende kwetsbaarheden.

  • Striktere plugins: Plugins kunnen geen eigen servercode meer uitvoeren. Ze leveren voortaan alleen inhoud en opmaak aan. Zo houden we zelf controle over de code die op de server draait.

  • Automatische controles: Voor een nieuwe versie wordt uitgebracht, draaien er 175 automatische tests. Als die niet slagen, wordt de release tegengehouden.

  • Een kleinere installatie: De serverinstallatie is teruggebracht van 1,9 GB naar ongeveer 0,8 GB. Er hoeft daardoor minder software te worden onderhouden en bijgewerkt.

We hebben de overstap niet in één keer gemaakt. Eerst bouwden we een kopie van de bestaande productieomgeving. Vervolgens hebben we de uitvoer van de oude en nieuwe server onderdeel voor onderdeel vergeleken, waar nodig tot op byteniveau. Pas nadat de controles goed waren verlopen, hebben we de nieuwe versie in gebruik genomen.

Wat merk je ervan op je website?

Vooral dat de server sneller en zuiniger werkt. Een pagina die al in het geheugen staat, wordt nu in minder dan een milliseconde door de server afgehandeld. Voorheen was dat ongeveer vijf milliseconden. Ook stylesheets worden ongeveer vier keer zo snel afgeleverd.

Het verschil in geheugengebruik is nog groter: waar de oude server tussen de 500 MB en 1 GB gebruikte, heeft de nieuwe doorgaans ongeveer 30 MB nodig. Dat geeft ons meer ruimte om pieken in het bezoek op te vangen en websites efficiënt te hosten.

Verder hebben we een onnodige vertraging van ongeveer 40 milliseconden bij het versturen van bestanden weggehaald. Dat gold onder meer voor afbeeldingen, scripts en stylesheets.

Ook het beheer van de database is eenvoudiger geworden. Bij het opstarten controleert het CMS of de benodigde databaseonderdelen aanwezig zijn en vult het ontbrekende onderdelen automatisch aan. We hoeven daardoor bij updates niet meer handmatig in te grijpen om die onderdelen aan te maken.

Voor bezoekersstatistieken gebruiken we Umami. Deze statistieken worden pas bijgehouden nadat een bezoeker toestemming heeft gegeven. Hetzelfde geldt voor heatmaps en sessieopnames.

Afbeeldingen en mediabeheer

Het CMS optimaliseert afbeeldingen nog steeds automatisch. Een afbeelding wordt in de benodigde formaten en afmetingen klaargezet en daarna hergebruikt. Zo hoeft dezelfde bewerking niet bij ieder bezoek opnieuw te gebeuren.

Sinds september laten we het zwaardere afbeeldingswerk uitvoeren door aparte workers. Daardoor hoeft de webserver daar zelf geen capaciteit aan te besteden. De workers maken waar mogelijk AVIF-bestanden. Is er geen worker beschikbaar, dan kan de server zelf een WebP-versie maken.

Kort na de overstap liepen we tegen een probleem aan met fotopagina's waarop meer dan honderd afbeeldingen stonden. De beveiliging zag de hoeveelheid verzoeken ten onrechte als mogelijke overbelasting. Dat hebben we inmiddels opgelost.

In de beheeromgeving kun je nu ook zien welke afbeeldingsopdrachten in de wachtrij staan. Er is een logboek beschikbaar en je kunt waar nodig zelf ingrijpen.

Beheeromgeving en back-ups

Aan de beheeromgeving hebben we bewust zo weinig mogelijk veranderd. Je vindt de schermen, knoppen en instellingen nog op dezelfde plek. Je hoeft dus niet opnieuw te leren hoe het CMS werkt.

Ook het maken, controleren en terugzetten van back-ups werkt zoals voorheen. Versleutelde back-ups blijven ondersteund. De nauwelijks gebruikte koppelingen met Google Drive en SFTP hebben we wel verwijderd. Je kunt back-ups nog gewoon als bestand downloaden.

Doordat plugins geen eigen servercode meer mogen uitvoeren, moeten sommige plugins worden aangepast. Dat geldt bijvoorbeeld voor de top-bannerplugin, die we opnieuw bouwen.

De stylesheets van je thema worden na een wijziging nog steeds automatisch opgebouwd met Tailwind. Dat gebeurt nu rechtstreeks vanuit het CMS.

Inloggen en beveiliging

Je kunt op dezelfde manier blijven inloggen, ook als je tweestapsverificatie of single sign-on (SSO) gebruikt. Bestaande sessies zijn bij de overstap geldig gebleven.

Daarnaast blijft de beveiliging tegen herhaalde mislukte inlogpogingen actief. Wanneer vanaf hetzelfde adres te vaak verkeerd wordt ingelogd, worden nieuwe pogingen automatisch afgeremd.

Blog en RSS

Ook voor het blog hebben we ervoor gezorgd dat de overstap niets verandert aan de bestaande uitvoer. Blogoverzichten, RSS-feeds, archieven en vertalingen zijn gelijk gebleven. Bestaande RSS-abonnees en zoekmachines kunnen de inhoud dus op dezelfde manier blijven ophalen.

Tot slot

Deze update ging vooral over werk dat je normaal gesproken niet ziet. Dat was ook de bedoeling. We wilden de techniek achter het CMS vernieuwen zonder de dagelijkse bediening te veranderen.

Met de overstap naar Rust hebben we nu een kleinere server met minder afhankelijkheden, een lager geheugengebruik en betere mogelijkheden om nieuwe versies vooraf te controleren. Dat geeft ons een prettigere basis voor het verdere onderhoud en de ontwikkeling van het CMS.