Header-Bild

Nutzung von Hetzner S3 mit Discourse

Discourse bietet die Option, Dateien nach S3 „auszulagern“. Das hat den Vorteil, dass Bilder, Videos und sonstige Anhänge, die im Forum gepostet werden, nicht die Festplatte eures Servers beanspruchen. Bei größeren Communities kommen hier schnell viele Gigabyte zusammen.

Seit einigen Monaten bietet Hetzner S3-kompatiblen Speicher in seinem Cloud-Portfolio an. Dieser ist verhältnismäßig günstig, performant und einfach eingerichtet.

Diese Anleitung beschreibt, wie man Hetzner S3 sowohl für Anhänge, als auch für Backups konfiguriert.

Um Discourse mit Hetzner S3 zu nutzen, muss zunächst via Cloud Console der entsprechende Object Storage angelegt werden:

Ich empfehle, jeweils die gleiche Region auszuwählen, in der auch euer Cloud Server liegt (sofern ihr einen Hetzner Cloud Server nutzt).

Anschließend müssen Zugangsdaten für den Object Storage angelegt werden, bestehend aus Access Key und Secret Key.

In nachfolgendem Beispiel nutzen wir folgende Buckets in Falkenstein:

Um Discourse mit Hetzner S3 zu konfigurieren, müssen folgende Einträge in die app.yml eingefügt werden:

DISCOURSE_S3_ENDPOINT: https://fsn1.your-objectstorage.com
DISCOURSE_S3_ACCESS_KEY_ID: MY_ACCESS_KEY
DISCOURSE_S3_SECRET_ACCESS_KEY: MY_SECRET_KEY
DISCOURSE_S3_BUCKET: discourse-s3-demo
DISCOURSE_S3_BACKUP_BUCKET: discourse-s3-demo-backup
DISCOURSE_S3_REGION: hetzner

Discourse wird sich jedoch beschweren, dass kein Content Delivery Netzwerk konfiguriert ist. Dies lässt sich beheben, indem man DISCOURSE_S3_CDN_URL wie folgt in der app.yml konfiguriert:

DISCOURSE_S3_CDN_URL: https://discourse-s3-demo.fsn1.your-objectstorage.com

Hetzner bietet (noch) kein eigenes CDN an, da der „Asset-Bucket“ jedoch als öffentlicher Bucket konfiguriert ist, stellt dies kein größeres Problem dar.

Discourse möchte aber, sobald ein CDN konfiguriert ist, alle Assets (CSS und JS) per CDN laden. Damit diese dort veröffentlicht werden, müssen in der app.yml noch folgende Einträge hinzugefügt werden:

  after_assets_precompile:
    - exec:
        cd: $home
        cmd:
          - sudo -E -u discourse bundle exec rake s3:upload_assets
          - sudo -E -u discourse bundle exec rake s3:expire_missing_assets

Durch den s3:upload_assets-Befehl werden die Assets automatisch in den S3-Bucket geladen.

In der Discourse-Konfiguration muss jetzt noch folgende Einstellungen gesetzt werden:

Migration bestehender Assets nach S3

Sofern du ein bestehendes Discourse-Forum anpassen und die bestehenden Anhänge nach S3 migrieren möchtest, kannst du das via Kommandozeile durchführen:

cd /var/discourse
./launcher enter app
rake uploads:migrate_to_s3
rake posts:rebake_uncooked_posts

Der Befehl rake posts:rebake_uncooked_posts ist dabei optional und kann, je nach Größe des Forums, lange dauern. Dabei werden alle Posts unter der Verwendung der neuen Asset-Location neu gerendert. Lässt man diesen Befehl aus, werden die Posts im Hintergrund neu gerendert, was noch viel länger dauern wird, die Last auf dem Server jedoch reduziert.

© 2025 Sebastian Widmann