Statische blogs en websites kun je goed op een Raspberry Pi hosten. Nikola is een open source statische blog en website generator, die makkelijk te installeren en te gebruiken is, met een eenvoudige command line interface.

Matto Fransen

In onzekere en angstige tijden zoeken mensen naar manieren om dichter bij elkaar te komen. Dat bleek ook weer bij de komst van Corona. Fysiek dichter bij elkaar komen werd door het virus ingewikkeld, zeker in landen waar een streng lockdown beleid van kracht is. Dit maakt mensen creatief en zo ontstonden allerlei initiatieven, waaronder bijvoorbeeld de 100 dagen blog-uitdaging. Die uitdaging bestaat er uit, om gedurende 100 dagen elke dag, dus zonder onderbreking, een blogpost te publiceren. Een leuk idee en wij als enthousiaste Linux-gebruikers willen dat natuurlijk met zelf beheerde apparaten doen en zien meteen een leuk Raspberry Pi-project ontstaan.

Statische website

Een statische website biedt veel voordelen. Je kunt volstaan met een lichtgewicht webserver. Een statische website gebruikt weinig resources omdat de server geen databasequeries hoeft af te handelen of HTML-code hoeft te genereren. Wanneer bij een populair framework zoals WordPress of Drupal een kwetsbaarheid bekend is, zie je soms al binnen een dag geautomatiseerde aanvallen daarop. Bij zulke frameworks moet je dus bovenop de updates zitten. Dat soort problemen heb je met een statische website niet. Omdat een statische website geen databasequeries doet, heb je geen online database nodig wat het risico op misbruik van kwetsbaarheden zoals SQL-injectie wegneemt. De webserver heeft veel minder applicaties en libraries nodig, wat de kans op niet-gepatchte bugs flink kleiner maakt. Verder hoef je ook niet bang te zijn dat je site na een update niet meer werkt, wat bij een site op basis van PHP of op basis van een framework zoals WordPress je wellicht kan overkomen.

De content van statische websites beheer je vrijwel altijd in de vorm van platte tekstbestanden, waardoor je deze eenvoudig onder controle brengt van een versiebeheersysteem zoals Git.

De webserver kan de webpagina’s van een statische website sneller leveren, omdat deze niet eerst code moet uitvoeren en omdat statische pagina’s zich goed voor caching lenen. Verder is elke HTTPD daemon geschikt voor een statische website, je zit niet aan een bepaald type server of software vast en de configuratie van die HTTPD daemon is meteen ook een stuk eenvoudiger, waardoor er weer minder mis kan gaan. Kortom, voor de Raspberry Pi is een statische website de beste oplossing.

Ontkoppeling

Een ander voordeel is dat je het beheer van de inhoud van de website geheel kunt loskoppelen van de webserver. Het contentbeheer doe je bijvoorbeeld gewoon op je werkstation of laptop. Je schrijft de tekst voor een nieuwe pagina, of past een eerder geschreven tekst aan, hierna laat je de generator de nieuwe of aangepaste pagina’s genereren, die je uploadt naar de webserver. Dit maakt ook de controle over het eindresultaat minder stressvol. Je kunt de nieuwe pagina’s eerst rustig lokaal bekijken, zodat je zeker weet dat alleen goede pagina’s publiceert. Het is dan ook geen wonder dat statische websites weer volop in de belangstelling staan en ontwikkelaars steeds meer generators ontwikkelen, elk in hun favoriete ontwikkelomgeving, zoals JavaScript, Rust, Ruby, Go, Perl en Python. Vanwege de eenvoud van installatie kiezen wij voor een Python statische website generator, geschikt om blogs mee te maken.

Nikola

Nikola is een platform onafhankelijke open source statische website generator geschreven in Python die gemaakt is om blogs mee te maken, maar ook prima geschikt is voor gewone websites. Nikola is beschikbaar onder de open source MIT licentie. Nikola is eenvoudig te installeren. Je kunt desgewenst naast elkaar meerdere sites onderhouden. Nikola ondersteunt het gebruik van een groot aantal input formaten en geeft je daarmee veel vrijheid. Je kiest het formaat waar je je zelf het prettigst bij voelt. Verder is het daardoor eenvoudiger om content afkomstig van een ander systeem naar Nikola te migreren.

Nikola werkt op basis van incrementele rebuilds. Dit betekent dat na een aanpassing alleen die pagina’s gegenereerd worden, die daadwerkelijk gewijzigd zijn. Hierdoor blijft Nikola snel, iets wat van belang is wanneer je site groter wordt. De lijst met features die Nikola biedt is lang, voor een blog krijg je out of the box bijvoorbeeld index-pagina’s, RSS- en Atom-feeds, tags en categories en een archief, naar keuze per maand of per jaar. Verder biedt Nikola zaken zoals “gewone” statische pagina’s, rendering van wiskundige formules, een sitemap, meertaligheid (internationalisatie), thema’s, image galleries, enzovoorts.

Nikola maakt automatisch mooie URL’s in het zogenoemde “slug-formaat”. Bijvoorbeeld een blogpagina met de titel “Linux Magazine is mijn lijfblad”, krijgt als URL “linux-magazine-is-mijn-lijfblad”. Dat is makkelijk voor de bezoekers en goed voor de ranking in de zoekmachines.

Verschillende invoerformaten

Nikola ondersteunt verschillende invoerformaten. Het standaard invoerformaat is reStructuredText, een platte tekst opmaakformaat dat eenvoudig te lezen en te schrijven is. Dit is het opmaakformaat voor de officiële Python documentatie. Werk je liever in Markdown, dan is dat geen probleem, Nikola ondersteunt Markdown zonder dat je daarvoor aanvullende software moet installeren.

Met behulp van zogenoemde compilers kan Nikola ook met andere formaten overweg, zoals Jupyter Notebook formaat, HTML, Emacs org-mode, AsciiDoc en vele andere, waaronder ook IRC-logs. Alle Pandoc input-formaten kun je overigens ook gebruiken. Naast de keuze uit meerdere formaten voor het opstellen van de content ondersteunt Nikola ook een aantal verschillende metadata-formaten. Hiermee voeg je de metadata aan je content toe, zoals bijvoorbeeld de titel en de aanmaakdatum van je posting, de naam van de schrijver of schrijfster, de slug waarmee straks bij het genereren de URL opgebouwd wordt, enzovoorts. Het grote voordeel van de ondersteuning van zoveel verschillende invoerformaten en metadata-formaten is dat dit het mogelijk maakt vanuit veel verschillende omgevingen over te stappen op Nikola. Wanneer je vanuit een andere omgeving op Nikola overstapt, migreer je eerst de bestaande content met behulp van de betreffende compiler. Nadat de import in Nikola achter de rug is, ben je vrij in kiezen van een invoerformaat voor de nieuwe content.

Themes en plugins

Elke zichzelf respecterende website generator biedt de keuze uit een aantal themes en plugins. Ook Nikola biedt een palet aan opmaakmogelijkheden. Op themes.getnikola.com vind je een aantal themes om uit te kiezen. Verder kun je natuurlijk ook je eigen theme maken, zie hiervoor de theming tutorial. Op plugins.getnikola.com staan een aantal uiteenlopende plugins.

Comments

Nikola is ontwikkeld om een blog mee te onderhouden. Wanneer je de lezers van je blog de gelegenheid wilt bieden om te reageren dan kun je gebruik maken van een extern comment-systeem uit de cloud. Op die manier houd je de lokale site compleet statisch en veilig. Nikola ondersteunt het gebruik van verschillende cloud comment-systemen, zoals bijvoorbeeld DISQUS, IntenseDebate, Isso en Commento. En voor wie dat wil, ook Facebook.

Automatische galerij

Om een galerij met afbeeldingen te maken, hoef je nauwelijks iets te doen. In de directory van de website content vind je een subdirectory “galleries”. Hierin maak je een nieuwe subdirectory aan en vult deze met afbeeldingen. Met “nikola build” wordt automatisch een galerij gemaakt van je nieuwe subdirectory inclusief thumbnails. Zorg dat bezoekers van de website je nieuwe galerij kunnen vinden door ergens in je site nog even een linkje op te nemen naar “/galleries/<subdirectory>/”.

De galerij opent met een overzichtspagina met thumbnails. Klik op een thumbnail om een afbeelding te openen, deze wordt nu in origineel formaat getoond, samen met knoppen naar de vorige en volgende afbeelding.

Installatie

We beginnen met het installeren van Pyhton3, Pip, Pillow en Pyzmq:

sudo apt-get install python3 python3-pip python3-venv python-pil python3-zmq

Hierna installeren we de setuptools:

sudo sudo pip3 install -U pip setuptools wheel

Vervolgens zetten we voor onze user een eigen Nikola omgeving op:

cd
python3 -m venv nikola
cd nikola
source bin/activate
bin/python -m pip install -U "Nikola[extras]"

Nu starten we de wizard in onze home-directory om een nieuwe site te maken met wat demo-content met “nikola init –demo mijn-site”.

De wizard stelt wat vragen en richt de omgeving voor “mijn-site’ in. Wanneer dit afgerond is, maken we onze eerste blogpost post in Markdown formaat met “nikola new_post -f markdown”. Nikola vraagt om de titel en maakt een nieuw Markdown-bestand aan. Open de het bestand in je favoriete editor en schrijf een stukje tekst. Wanneer dit klaar is, genereer je de site met: “nikola build”. De eerste keer neemt dit iets meer tijd in beslag, volgende builds duren korten omdat dan alleen de wijzigingen worden verwerkt. Je kunt het eindresultaat bekijken met “nikola auto -b”. Nikola start nu een lokale server op port 8000 en opent je browser naar deze server. Je kunt ook alleen de server opstarten, zonder je browser te connecten, met “nikola serve”. Bij volgende wijzigingen kun je volstaan met “nikola auto -b”, dit genereert de website opnieuw, start een server en opent die in je webbrowser.

Naast de blogposts heb je natuurlijk ook een aantal “gewone” webpagina’s, bijvoorbeeld “Contact”, of “About”. Een dergelijke pagina maak je in Markdown met “nikola new_page -f markdown”. Je pages komen in de website in de directory “/pages”. Je neemt een of meer pages in het hoofdmenu op door deze in conf.py toe te voegen bij “NAVIGATION_LINKS”. Wanneer je de webpagina’s niet in de subdirectory “/pages” wilt, maar rechtstreeks in de root directory, dan pas je dat aan in de conf.py. Met een soortgelijke aanpassing zetten wij de blogposts in “/blog” in plaats van in “/posts”. Na deze aanpassingen geef je een nieuw build commando, en past desgewenst de “NAVIGATION_LINKS” aan.

Een blog in Nikola.

Website uploaden

In de directory mijn-site vind je tal van subdirectory’s. Je blogposts staan in “posts”, je “gewone” webpagina’s staan in “pages”, afbeeldingen zet je in “images”, enzovoorts. Vergeet niet van deze directory’s een back-up te maken of zet ze een versiebeheersysteem zoals Git (bijvoorbeeld op een Raspberry Pi). In de directory “mijn-site/output” vind je de complete website, inclusief subdirectory’s zoals images, posts, assets, enzovoorts en bestanden zoals robots.txt, rss.xml en sitemap.xml. Je kunt deze output directory overzetten naar je webserver, bijvoorbeeld met rsync over SSH. Na toevoegen of wijzigen van de content doe je dan weer een rsync, en zo onderhoud je met weinig werk je website.

Een webpagina in Nikola.

Theme aanpassen

Op themes.getnikola.com staan een aantal themes, deze kun je zo gebruiken of als basis nemen om zelf een theme te maken. Wij kiezen theme “foundation6”. In de directory mijn-site geven we het commando: “nikola theme -i foundation6”. Vervolgens wijzigen we in het configuratiebestand conf.py  de regel die begint met THEME en doen een nieuwe “nikola build”. Een aantal voorbeelden van websites en blogs die met Nikola gemaakt zijn vind je op users.getnikola.com, zoals bijvoorbeeld mate-desktop.org, en ubuntu-mate.org, wxpython.org en natuurlijk de website van Nikola zelf, maar ook veel sites van wetenschappers en bloggers. Wij kunnen hier maar beperkt de mogelijkheden van Nikola laten zien. Nikola is een uitgebreide statische website generator die makkelijk te installeren en eenvoudig te gebruiken is.

Het theme “Foundations6”.