Blogumzug von Wordpress zu Jekyll

Umzug meiner Wordpress Seite zu Jekyll incl. Tutorial zur Installation
- Was ist Jekyll?
- Gründe für meinen Wechsel
- Installation von Jekyll
- Jekyll Webseite anlegen
- Wordpress Daten exportieren
- Jekyll anapssen
In den letzten Jahren habe ich immer wieder aus verschiedenen Gründen die Blogsoftware gewechselt. Dieses Mal bin ich von Wordpress zu Jekyll umgezogen. Mein Vorgehen und Gründe möchte ich in diesem Beitrag erläutern.
Was ist Jekyll?
Jekyll ist eine Blogsoftware bzw. ein sogenannter Static Site Generator. Primär wird Jekyll von GitHub Pages verwendet. Die meisten Tutorials die man so im Internet finden beziehen auch genau darauf. Grundlegend baut die Software Markdown-Dateien zu statischen HTML Dateien um diese mit einem einfachen Webserver ausliefern zu können. Im bequemsten Fall sogar mit dem integriertem.
Gründe für meinen Wechsel
Gründe könnten mannigfaltig sein. Schlussendlich läuft es aber darauf hinaus, dass Wordpress immer mächtiger wird. Das hat seine Vor- und Nachteile. Sicherlich ist es sehr praktisch für jeden Anwendungsfall Wordpress verwenden zu können, denn die verschiedenen Plugins und Themes machen das möglich. Viele großen Webseiten basieren auf Wordpress und mit dem notwendigen Know-How und Ressourcen lassen sich auch sehr Performance Webseiten bauen. Der Nachteil der Erweiterbarkeit liegt entsprechend auch in der Pflege und den Bemühungen einen guten Wert für den LCP zu erreichen. Mir ist es im Laufe der Zeit nicht gelungen einen guten Wert zu erreichen. Am Hoster Netcup liegt es nicht, da ich hier auch verschiedene ausprobiert habe. Zudem bin ich im Moment dabei mich von verschiedenen großen Softwareprodukten zu trennen und auf freiere Software zu setzen.
In der Webentwicklung steht LCP für “Largest Contentful Paint”. Es handelt sich um eine wichtige Metrik für die Ladeleistung einer Webseite. LCP misst die Zeit, die benötigt wird, um den größten sichtbaren Inhalt im Viewport eines Nutzers während des Seitenladens zu rendern. Ein guter LCP-Wert ist wichtig, um sicherzustellen, dass Webseiten schnell und reibungslos geladen werden und Benutzer eine bessere Erfahrung haben.
Installation von Jekyll
Die Installation von Jekyll kann unter verschiedenen Betriebssystemen durchgeführt werden. Allerdings ist Windows nicht mit dabei. Wenn man allerdings den Umweg über WSL2 geht, kann man der regulären Linux Installation für die verwendete Linux-Distribution folgen. In dieser Anleitung gehe ich erst mal auf die Installation unter MacOS ein, da ich persönlich dieses Betriebssystem verwende. Alternative Installationen finden sich natürlich in der offiziellen Dokumentation. Gern kann dort diese entsprechend verwendet werden.
Installation unter MacOS
Installation des Paketmanagers brew
MacOS Nutzer haben in der Regel schon den Paketmanager brew
installiert. Falls du das noch nicht getan hast, lässt sich das mittels
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
erledigen. Grundsätzlich sollte aber immer beim Ausführen von Programmen direkt aus dem Internet vorsichtig sein! Sobald das erledigt ist, brauchen wir jetzt den Ruby Installer denn Jekyll ist in der entsprechenden Programiersprache geschrieben.
Installation von ruby
brew install chruby ruby-install xz
Dies kann durchaus ein paar Minuten dauern, das ist nicht ungewöhnlich. Nun installieren wir noch ruby selbst.
ruby-install ruby 3.2.2
Beachte, dass die Version 3.2.2 die zum Zeitpunkt des Artikels die aktuellste Version ist, dass kann zum jetzigen Zeitpunkt anders sein. Der nächste Schritt ist, dass wir ruby und die ganzen Environment Variablen noch aktivieren und in die MacOS Konfiguration speichern
echo "source $(brew --prefix)/opt/chruby/share/chruby/chruby.sh" >> ~/.zshrc
echo "source $(brew --prefix)/opt/chruby/share/chruby/auto.sh" >> ~/.zshrc
echo "chruby ruby-3.2.2" >> ~/.zshrc # run 'chruby' to see actual version
Installation von Jekyll
Endlich kommen wir zu dem Punkt, dass wir Jekyll selbst installieren können.
gem install jekyll
Auch der Schritt kann einige Zeit lang brauchen. Anschließend haben wir Jekyll installiert.
Jekyll Webseite anlegen
Sobald wir also eine lauffähige Version von Jekyll haben, können wir nun eine Webseite anlegen. Wir suchen uns also einen entsprechenden Ordner aus in dem die Installation durchgeführt werden soll. Ich mache sowas immer in einem Unterordner in meinem Homeverzeichnis.
cd ~
Den Namen den wir im install Befehl mitgeben wird auch der Name des Ordners sein. Natürlich kann der Prozess beliebig oft ausgeführt werden, falls euch das nicht gefällt.
jekyll new blog
Es entsteht dann eine ungefähr solche Ausgabe
Running bundle install in /Users/teqqy/blog...
Bundler: Fetching gem metadata from https://rubygems.org/............
Bundler: Resolving dependencies...
Bundler: Fetching rouge 4.1.3
Bundler: Installing rouge 4.1.3
Bundler: Bundle complete! 7 Gemfile dependencies, 33 gems now installed.
Bundler: Use `bundle info [gemname]` to see where a bundled gem is installed.
New jekyll site installed in /Users/teqqy/blog.
[21:31:33] [cost 3.162s] jekyll new blog
Nun wechseln wir in das Verzeichnis und gucken mal was so für Dateien und Ordner dort hinterlegt sind.
[21:32:50] [~/blog] ❱❱❱ ls -l
total 48
-rw-r--r-- 1 teqqy staff 419 31 Jul 21:31 404.html
-rw-r--r-- 1 teqqy staff 1309 31 Jul 21:31 Gemfile
-rw-r--r-- 1 teqqy staff 2052 31 Jul 21:31 Gemfile.lock
-rw-r--r-- 1 teqqy staff 2079 31 Jul 21:31 _config.yml
drwxr-xr-x 3 teqqy staff 96 31 Jul 21:31 _posts
-rw-r--r-- 1 teqqy staff 539 31 Jul 21:31 about.markdown
-rw-r--r-- 1 teqqy staff 175 31 Jul 21:31 index.markdown
Wie man sieht, sind das nicht viele Dateien. Nun sollten wir die _config.yml
anpassen. Die Begriffe sollten selbsterklärend sein. Die Werte sind aber erst mal keine Pflicht. Um jetzt die HTML Dateien bauen zu lassen verwenden wir folgenden Befehl
jekyll serve
Es erscheinen diverse Fehlermeldungen und Warnungen auf Grund von veralteten Abhängigkeiten. Leider sind diese immer noch nicht sauber gefixt. Die letzte Ausgabe sollte etwas in der Art von
Run in verbose mode to see all warnings.
done in 0.401 seconds.
Auto-regeneration: enabled for '/Users/teqqy/blog'
Server address: http://127.0.0.1:4000/
Server running... press ctrl-c to stop.
Enthalten. Jetzt könnt ihr euren Browser öffnen und die URL http://127.0.0.1:4000
verwenden.
Die Standardwebseite von Jekyll erstrahlt in frischem Glanz.
Wir brechen dann wieder den laufenden Server mit CTRL-C
ab. Wenn wir jetzt nochmal die Verzeichnisse auflisten sehen wir, dass dort ein neuer Ordner _site
erstellt worden ist.
[21:40:43] [~/blog] ❱❱❱ ls -l
total 48
-rw-r--r-- 1 teqqy staff 419 31 Jul 21:31 404.html
-rw-r--r-- 1 teqqy staff 1309 31 Jul 21:31 Gemfile
-rw-r--r-- 1 teqqy staff 2052 31 Jul 21:31 Gemfile.lock
-rw-r--r-- 1 teqqy staff 2079 31 Jul 21:31 _config.yml
drwxr-xr-x 3 teqqy staff 96 31 Jul 21:31 _posts
drwxr-xr-x 8 teqqy staff 256 31 Jul 21:35 _site
-rw-r--r-- 1 teqqy staff 539 31 Jul 21:31 about.markdown
-rw-r--r-- 1 teqqy staff 175 31 Jul 21:31 index.markdown
Dieser Ordner ist nun schlussendlich das wichtige. Dieser kann auf einen Webserver kopiert und ausgeliefert werden.
Webseite bereitstellen
Viele Tutorials im Internet verwenden den jekyll serve
Befehl um die Webseite auszuliefern und richten einen Webserver wie NGINX oder apache2 als reverse proxy ein. Dies ist allerdings nicht der vom Hersteller empfohlene Weg. Ich für meinen Teil habe das Verzeichnis auf meinen Webserver kopiert und liefere es mit einem Nginx Docker-Container aus. Dieser hat entsprechende Traefik Labels, welches sich um die Zertifikate etc kümmert. Sicherlich kein Setup für jeden.
Nginx Docker Container
Meine verwendete docker-compose.yaml
Datei kannst du natürlich übernehmen wenn du möchtest. Du müsstest nur die Werte entsprechend anpassen.
---
version: "3.8"
services:
nginx:
image: nginx
container_name: nginx
volumes:
- ./_site:/usr/share/nginx/html
- ./nginx.conf:/etc/nginx/conf.d/www_nginx.conf
labels:
- "traefik.enable=true"
- "traefik.http.middlewares.nginx-https.redirectscheme.scheme=https"
- "traefik.http.middlewares.nginx-compress.compress=true"
- "traefik.http.routers.nginx-http.entrypoints=web"
- "traefik.http.routers.nginx-http.rule=Host(`www.example.com`) || Host(`example.com`)"
- "traefik.http.routers.nginx-http.middlewares=teqqy-https@docker"
- "traefik.http.routers.nginx.entrypoints=websecure"
- "traefik.http.routers.teqqy.rule=Host(`www.example.com``) || Host(`example.com``)"
- "traefik.http.routers.nginx.tls=true"
- "traefik.http.routers.nginx.tls.certresolver=default"
- "traefik.http.routers.nginx.middlewares=secHeaders@file"
- "traefik.http.routers.nginx.middlewares=teqqy-compress"
- "traefik.http.services.nginx.loadbalancer.server.port=80"
networks:
- teqqywp
- traefik_proxy
networks:
traefik_proxy:
external:
name: traefik_proxy
teqqywp:
driver: bridge
Nginx Konfiguration
Ich binde noch eine eigene nginx.conf
Datei ein in der ich noch Anpassungen für Caching und anderes mache.
server {
listen 80;
server_name example.com www.example.com
root /usr/share/nginx/html;
index index.html index.htm;
if (!-f "${request_filename}index.html") {
rewrite ^/(.*)/$ /$1 permanent;
}
if ($request_uri ~* "/index.html") {
rewrite (?i)^(.*)index\.html$ $1 permanent;
}
if ($request_uri ~* ".html") {
rewrite (?i)^(.*)/(.*)\.html $1/$2 permanent;
}
error_page 404 /404.html;
location / {
try_files $uri $uri.html $uri/ =404;
}
location ~* \.(?:ico|css|js|gif|jpe?g|png)$ {
expires 30d;
add_header Pragma public;
add_header Cache-Control "public";
}
# reduce the data that needs to be sent over network -- for testing environment
gzip on;
# gzip_static on;
gzip_min_length 10240;
gzip_comp_level 1;
gzip_vary on;
gzip_disable msie6;
gzip_proxied expired no-cache no-store private auth;
gzip_types
# text/html is always compressed by HttpGzipModule
text/css
text/javascript
text/xml
text/plain
text/x-component
application/javascript
application/x-javascript
application/json
application/xml
application/rss+xml
application/atom+xml
font/truetype
font/opentype
application/vnd.ms-fontobject
image/svg+xml;
# allow the server to close connection on non responding client, this will free up memory
reset_timedout_connection on;
# request timed out -- default 60
client_body_timeout 10;
# if client stop responding, free up memory -- default 60
send_timeout 2;
# server will close connection after this time -- default 75
keepalive_timeout 30;
# number of requests client can make over keep-alive -- for testing environment
keepalive_requests 100000;
}
Nun kann der Container gestartet werden und nach kurzer Zeit könnt ihr die Seite über die angegebene URL aufrufen.
Wordpress Daten exportieren
Für den Export habe ich das Wordpress Plugin Wordpress to Jekyll Exporter verwendet. Es nicht das beste Plugin aber für mich hat es gereicht. In Wordpress können wir dann unter Werkzeuge den Export ausführen und bekommen eine ZIP-Datei zum Download. Die Inhalte können wir direkt in unser Jekyll Verzeichnis kopieren und die Seiten neu genierieren lassen.
jekyll serve
Nun können wir den Ordner _site
wieder auf unseren Webserver kopieren. Den Container müssen wir nicht neu starten, denn nginx liefert die Dateien direkt aus. Ein einfacher reload im Browser reicht dafür aus.
Jekyll anapssen
Jetzt liegt es an euch, Jekyll entsprechend den Bedürfnissen anzu passen. Heißt ein Theme herunter zu laden oder mit Plugins zu erweitern.