Nach dem vor kurzem schon wieder eine Wordpress-Sicherheitslücke ausgenutzt wurde habe ich angefangen mich mal nach Alternativen umzusehen. Ich hatte einfach keine Lust mehr auf PHP und den ganzen Update-Wahnsinn den Wordpress ebenso mit sich bringt. Seit dem ich auch nicht mehr als Webentwickler nebenbei arbeite, hat sich das auch mit dem Interesse an Wordpress stark zurückentwickelt.

Die Wahl des neuen Blog-Systems ist bei mir auf Jekyll gefallen. Ich mag Markdown, ich mag Git und es ist kein PHP mehr dabei. Passte also. Jekyll ist ein Static-Site Generator: Ich schreibe mein Posts in Markdown, führe dann jekyll build aus und heraus fallen einige HTML-Dateien. Ja, genau, wie früher. Ohne dynamischen Kram und ohne Caching. Einfach statische HTML-Dateien.

Das hat natürlich nicht nur Vorteile. So gibt es zum Beispiel keine Suche mehr. Die versuche ich noch nachzubauen, aber die Lösungen die ich bisher gefunden habe, fand ich noch nicht besonders zufriedenstellend. Außerdem gibt es keine Kommentare mehr. Ob das jetzt ein Vor- oder Nachteil ist kommt ganz drauf an: In diesem Blog spielt es keine Rolle denn es wurde kaum Kommentiert und ich muss mich nicht mehr um den ganzen Spam kümmern. Wer sich trotzdem bei mir melden will, darf mir gern eine Email schreiben oder mich antwittern.

Mit Jekyll gibt es keinen Admin-Bereich wie mit Wordpress in dem neue Artikel geschrieben werden, sondern ich habe ein Git-Repository auf meinem Rechner in dem ich für jeden neuen Post eine Markdown-Datei anlege. Die committe ich dann. Damit ich jetzt nicht alles alleine machen muss hilft mir Gitlab mit Gitlab-CI. Immer wenn ich in den Branch production pushe wird automatisch die Seite neu gebaut und in den Webroot kopiert. Wenn alles glatt gelaufen ist bekomme ich eine E-Mail und alles ist live. Ganz einfach.

Dafür habe ich mir einfach eine kleine .gitlab-ci.yml gebaut:

before_script:
- bundle install

stages:
  - test
  - deploy

test:
  stage: test
  script:
  - bundle exec jekyll doctor

deploy_staging:
  stage: deploy
  variables:
    STAGING_PATH: /path/to/staging/web/root/
  script:
  - bundle exec jekyll build -d $STAGING_PATH
  environment:
    name: staging
    url: https://staging.tld
  only:
  - staging

deploy_production:
  stage: deploy
  variables:
    PRODUCTION_PATH: /path/to/production/web/root/
  script:
  - JEKYLL_ENV=production bundle exec jekyll build -d $PRODUCTION_PATH
  environment:
    name: production
    url: https://blog.kanedo.net
  only:
  - production

Durch die Umstellung liegen allerdings auch alle alten Posts jetzt an einem anderen Ort. Meine vorige URL-Struktur war /:post_id,:title.html und ist jetzt /:year/:month/:day/:title.html. Die Posts habe ich übrigens mit dem jekyll-import Plugin direkt aus der Datenbank geholt. Das habe ich allerdings noch angepasst, damit es mit meinen Wordpress-Anpassungen umgehen kann. Die werde ich vielleicht auch noch in einem separaten Post veröffentlichen. Dabei legt der jekyll-import jeweils ein wordpress_id Feld an. Das benutze ich in einer .htaccess Datei für die Weiterleitungen (der Dateiname selbst htaccess ohne .):

---
permalink: .htaccess
---
RewriteEngine On
RewriteBase /
Redirect 301 /feed /feed.xml
# Wordpress Redirects{% for post in site.posts reversed %}
{% if post.wordpress_id != "" and post.wordpress_id != nil %}
	RewriteRule ^{{ post.wordpress_id }},(.*)\.html https://%{HTTP_HOST}{{ post.url}} [R=301,L]
{% endif %}
{% endfor %}
# End Wordpress Redirects

Einziges Problem: jedes Statement erzeugt eine Zeile in der htaccess-Datei: Etwas unschön aber jekyll unterstützt den {%- -%}-Syntax (noch?) nicht.

Mobiles Bloggen funktioniert mit der neuen Lösung zwar nicht so einfach, ich denke aber das ich mit der Gitlab-Api durchaus etwas basteln kann. Mal sehen. So oft benutze ich es sowieso nicht.

Apropos Gitlab: Ich habe auf Version 9 aktualisiert und musste einiges anpassen, damit es wieder rund läuft. Das werde ich die Tage auch mal zusammenschreiben.

Wenn euch also noch was auffällt, dann gebt mir Bescheid. Bei so einer Umstellung vergisst man doch häufiger was.