cgX13

Hinter Den Kulissen: Wie Diese Seite Betrieben Wird

Eigentlich war der Plan ein komplett anderer. Ich hatte einen VPS, auf dem ich ursprünglich einige Apps wie NextCloud oder Gitea betrieben habe. Nachdem ich diese Dienste aber auf meinen Heimserver gezogen hatte, wollte ich den VPS eigentlich kündigen. Mit der Idee, wieder zu bloggen, war die Kündigung noch nicht vom Tisch, denn für die Auslieferung einer statischen Webseite reicht eigentlich ein ganz kleiner VPS mit einer CPU, einem GB RAM und 10GB Storage. Und eigentlich wollte ich mit diesem Mini-VPS dann auch mal gänzlich neue Dinge probieren, beispielsweise mal ein Debian als Betriebssystem einsetzen.

Aber aus irgend einem Grund habe ich mich dann anders entschieden. Ich habe meinen alten VPS schlicht mal leer geräumt. Auf dem System selber ist bereits alles konfiguriert und installiert, was ich für den Betrieb einer Webseite benötige:

  • Betriebssystem: Rocky Linux 9
  • Container: Docker CE mit Compose Plugin
  • Firewall-Regeln für :80, :443 und :22 sind eingerichtet
  • sshd ist konfiguriert, root-Login nicht zuzulassen und ansonten nur SSH-Keys zu erlauben

Im Endeffekt also die perfekte grüne Wiese, um einfach loszulegen. Natürlich ist der Strato VC 2-4 mit 2 vCores, 120GB Storage und 4GB RAM deutlich überprovisioniert für eine statische Webseite. Aber für 4€ im Monat kann ich mir die Reserve durchaus erlauben.

Was Neues habe ich dennoch probiert. Normalerweise nutze ich Traefik als Ingress-Router und würde dahinter die Webseite über nginx bereitstellen. Da ich für die Webseite jedoch kein aufwändiges Routing in irgendwelche Docker Container benötige, nutze ich schlicht Caddy für alles: Routing, File-Server, TLS mit Let’s Encrypt. Das Setup was so einfach, dass es fast schon langweilig ist.

Für das Deployment habe ich auch mal einen alternativen Ansatz genommen. Ich habe Webseiten, die ich über Github Pages bereitstelle, und bei denen die Build-Pipeline über Github Actions nach jedem Commit in main passiert. Die Quellen für diese Seite habe ich jedoch in einer Gitea Instanz auf meinem Heim-Server und wollte mir Commit-Hooks ersparen. Stattdessen erfolgt das Deployment über ein Rezept in einer makefile:

deploy:
        $(HUGO) --environment production --minify --cleanDestinationDir
        rsync \
                -e "ssh -i /home/user/.ssh/keyfile" \
                --exclude='.DS_Store' \
                --exclude='Thumbs.db' \
                --exclude='.git*' \
                --progress \
                -avz --delete $(PUBLIC_DIR)/ $(DEPLOY_TARGET)
        @echo "Deployed at $(DATE) $(TIME)"

In meiner Hugo-Konfiguration in config/production/hugo.yml steht lediglich die baseURL zu der öffentlichen Adresse des Blogs. In meiner config/dev/hugo.yml steht die lokals .home-Adresse für meine Staging-Umgebung.

Keep it simple, stupid.