<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>DALA Homelabbing </title>
    <link>https://blog.dala-homelab.de/</link>
    <description>Projekte, Technik und das, was ich unterwegs lerne – von Linux-Homelab bis 3D-Druck.</description>
    <pubDate>Sat, 31 Oct 2026 14:42:57 +0100</pubDate>
    <item>
      <title>WriteFreely hinter Nginx Proxy Manager – meine Stolpersteine</title>
      <link>https://blog.dala-homelab.de/writefreely-hinter-nginx-proxy-manager-meine-stolpersteine</link>
      <description>&lt;![CDATA[Gehörst du zu den Menschen, die erst 502 Bad Gateway sehen, dann eine Stunde in die falsche config.ini starren? Dann ist dieser Beitrag für dich. Ich habe kürzlich WriteFreely in meinem Homelab aufgesetzt – hier ist, was dabei schiefging, und wie ich es gelöst habe.&#xA;&#xA;Das Ziel&#xA;&#xA;Ich wollte meinen eigenen Blog: selbst gehostet, minimalistisch, Markdown-basiert, in meinem Proxmox-Homelab. WriteFreely schien mir als ideale Lösung – leichtgewichtig, föderiert (mehr dazu später), und kein WordPress-Ballast.&#xA;Bin durch meine Arbeit stark Plesk geschädigt und präferiere Lösungen nach KISS.&#xA;&#xA;Das Setup:&#xA;&#xA;Proxmox LXC mit WriteFreely (installiert über das Community-Helper-Script)&#xA; Natürlich vorher das Skript durchgecheckt &#xA; &#34;Aber das sollte man anders... und wie kannst du nur!&#34; - ist mir bewusst, bin einfach mal faul&#xA;Nginx Proxy Manager als Reverse Proxy mit Let&#39;s-Encrypt-Zertifikat&#xA;Domain: blog.dala-homelab.de&#xA;&#xA;Klingt nach 20 Minuten und &#34;mal eben&#34;. War dann doch mehr (wär hätte es geahnt?). Hier sind die drei Stolpersteine, die mich Zeit gekostet haben – damit du nicht auf die Nase fällst.&#xA;&#xA;Stolperstein 1: https:// auf Port 80&#xA;&#xA;Das erste, was mir auffiel: Ich konnte meinen ersten Beitrag nicht öffnen. Die URL sah harmlos falsch aus, war aber im Kern ein Konfigurationsproblem.&#xA;&#xA;In meiner config.ini stand:&#xA;&#xA;[app]&#xA;host = https://blog.dala-homelab.de:80&#xA;&#xA;Das :80 war der Fehler. Der host-Eintrag ist nicht nur Deko – WriteFreely baut daraus alle absoluten URLs: Menü-Links, Canonical-Tags, Fediverse-Angaben. Mit dem Port-Suffix generierte WriteFreely also lauter Links nach dem Muster https://…:80/… – HTTPS-Verbindungen auf den Klartext-HTTP-Port. Browser lehnen das zu Recht ab.&#xA;&#xA;Die Lösung:&#xA;&#xA;[app]&#xA;host = https://blog.dala-homelab.de&#xA;&#xA;Merksatz: Der host bekommt Protokoll und Domain, aber nie einen expliziten Port, wenn ein Reverse Proxy vorne sitzt. Die Ports regeln bind/port im [server]-Block und der Proxy – nicht die öffentliche URL.&#xA;&#xA;Stolperstein 2: Die config.ini, die niemand las&#xA;&#xA;Nach der Korrektur startete ich neu – und nichts passierte. Weiterhin Port 80, weiterhin kaputte URLs.&#xA;&#xA;Die Auflösung war fies: Das Proxmox-Helper-Script hatte bei einem Update den Installationspfad geändert. Früher lag die config unter /root/config.ini, inzwischen unter /opt/writefreely/config.ini. Ich bearbeitete also eine Datei, die der Daemon längst ignorierte.&#xA;&#xA;So findest du die config, die wirklich genutzt wird:&#xA;&#xA;systemctl cat writefreely | grep -E &#39;ExecStart|WorkingDirectory&#39;&#xA;&#xA;Das zeigt dir das WorkingDirectory und den Startbefehl – und damit den Pfad der config.ini, die tatsächlich gelesen wird. Wer das früh prüft, erspart sich eine Stunde ForeignKey-artiger Verzweiflung.&#xA;&#xA;Merksatz: Nach Updates von Helper-Scripts immer prüfen, ob Pfade gewandert sind. systemctl cat ist dein Freund.&#xA;&#xA;Zudem hat jedes Helper-Scripts eigene Seiten auf Github, womit Änderungen im Changelog schnell auffindbar sind.&#xA;Das WriteFreely-Script ist zugegeben noch recht jung.&#xA;&#xA;Stolperstein 3: 127.0.0.1, NPM und die Frage, wer wo läuft&#xA;&#xA;Der letzte Stolperstein ist ein Klassiker, wenn Reverse Proxy und Dienst nicht auf demselben Host laufen – bei mir laufen beide als separate LXC-Container.&#xA;&#xA;In der WriteFreely-Doku steht für den Proxy-Betrieb typischerweise:&#xA;&#xA;[server]&#xA;bind = 127.0.0.1:80&#xA;&#xA;Das bedeutet: WriteFreely lauscht nur auf dem Loopback-Interface des eigenen Containers. Vom eigenen Host aus erreichst du es dann über http://127.0.0.1:8080 – aber niemand sonst, auch nicht per LAN-IP und auch nicht der Nginx Proxy Manager im Nachbar-Container. Denn dort würde 127.0.0.1 auf NPM selbst zeigen, nicht auf WriteFreely.&#xA;&#xA;Die Folge: 502 Bad Gateway, obwohl alles „richtig&#34; konfiguriert aussah.&#xA;&#xA;Die Lösung, wenn NPM in einem separaten Container läuft:&#xA;&#xA;[server]&#xA;bind = 0.0.0.0:80&#xA;port = 80&#xA;&#xA;Und im Nginx Proxy Manager als Forward-Host die LAN-IP des WriteFreely-Containers eintragen (nicht 127.0.0.1, nicht localhost), Forward-Port 80.&#xA;&#xA;Merksatz: 127.0.0.1 funktioniert nur, wenn Proxy und Dienst denselben Kernel teilen. Separate Container = 0.0.0.0 binden + LAN-IP als Forward-Host. (Und dann natürlich dafür sorgen, dass nur der Proxy den Port erreichen kann – Firewall sei Dank.)&#xA;&#xA;Die finale, funktionierende Konfiguration&#xA;&#xA;[server]&#xA;bind                 = 0.0.0.0:80&#xA;port                 = 80&#xA;tlscertpath        =&#xA;tlskeypath         =&#xA;autocert             = false&#xA;&#xA;[app]&#xA;host                 = https://blog.dala-homelab.de&#xA;&#xA;Die TLS-Zertifikate macht der Nginx Proxy Manager per Let&#39;s Encrypt – WriteFreely selbst braucht dafür keine Pfade und kein autocert. Wichtig im NPM: X-Forwarded-Proto wird standardmäßig korrekt gesetzt, sonst erzeugt WriteFreely interne Links als http://.&#xA;&#xA;Fazit&#xA;&#xA;Drei Fehler, ein Nachmittag, ein laufender Blog. Was bleibt hängen?&#xA;&#xA;host ohne Port-Suffix, wenn der Proxy die TLS-Terminierung macht&#xA;Nach Helper-Script-Updates den config-Pfad prüfen (systemctl cat writefreely)&#xA;Loopback vs. Container-Netzwerk verstehen – 127.0.0.1 ist immer nur der eigene Host&#xA;&#xA;Wenn du gerade vor einem dieser Probleme sitzt: Du bist nicht allein. Und wenn du einen vierten Stolperstein gefunden hast, den ich übersehen habe – schreib mir gern per E-Mail, ich ergänze den Beitrag.&#xA;&#xA;---&#xD;&#xA;&#xD;&#xA;Dennis Amin Waigner — Linux System Engineer, Bastler, Vater.&#xD;&#xA;&#xD;&#xA;Auf diesem Blog teile ich, was ich in Homelab, Werkstatt und Alltag baue und lerne – von Proxmox-Clustern bis zum 3D-Druck. Wenn ich unterwegs scheitere, steht es hier auch. Versprochen.]]&gt;</description>
      <content:encoded><![CDATA[<p><em>Gehörst du zu den Menschen, die erst 502 Bad Gateway sehen, dann eine Stunde in die falsche config.ini starren? Dann ist dieser Beitrag für dich. Ich habe kürzlich WriteFreely in meinem Homelab aufgesetzt – hier ist, was dabei schiefging, und wie ich es gelöst habe.</em></p>

<h2 id="das-ziel">Das Ziel</h2>

<p>Ich wollte meinen eigenen Blog: selbst gehostet, minimalistisch, Markdown-basiert, in meinem Proxmox-Homelab. WriteFreely schien mir als ideale Lösung – leichtgewichtig, föderiert (mehr dazu später), und kein WordPress-Ballast.
Bin durch meine Arbeit stark Plesk geschädigt und präferiere Lösungen nach KISS.</p>

<p>Das Setup:</p>
<ul><li><strong>Proxmox LXC</strong> mit WriteFreely (installiert über das Community-Helper-Script)
<ul><li>Natürlich vorher das Skript durchgecheckt</li>
<li>“Aber das sollte man anders... und wie kannst du nur!” – ist mir bewusst, bin einfach mal faul</li></ul></li>
<li><strong>Nginx Proxy Manager</strong> als Reverse Proxy mit Let&#39;s-Encrypt-Zertifikat</li>
<li>Domain: <code>blog.dala-homelab.de</code></li></ul>

<p>Klingt nach 20 Minuten und “mal eben”. War dann doch mehr (wär hätte es geahnt?). Hier sind die drei Stolpersteine, die mich Zeit gekostet haben – damit du nicht auf die Nase fällst.</p>

<h2 id="stolperstein-1-https-auf-port-80">Stolperstein 1: <code>https://</code> auf Port 80</h2>

<p>Das erste, was mir auffiel: Ich konnte meinen ersten Beitrag nicht öffnen. Die URL sah harmlos falsch aus, war aber im Kern ein Konfigurationsproblem.</p>

<p>In meiner <code>config.ini</code> stand:</p>

<pre><code class="language-ini">[app]
host = https://blog.dala-homelab.de:80
</code></pre>

<p>Das <code>:80</code> war der Fehler. Der <code>host</code>-Eintrag ist nicht nur Deko – WriteFreely baut daraus <strong>alle</strong> absoluten URLs: Menü-Links, Canonical-Tags, Fediverse-Angaben. Mit dem Port-Suffix generierte WriteFreely also lauter Links nach dem Muster <code>https://…:80/…</code> – HTTPS-Verbindungen auf den Klartext-HTTP-Port. Browser lehnen das zu Recht ab.</p>

<p><strong>Die Lösung:</strong></p>

<pre><code class="language-ini">[app]
host = https://blog.dala-homelab.de
</code></pre>

<p><strong>Merksatz:</strong> Der <code>host</code> bekommt Protokoll und Domain, aber <strong>nie einen expliziten Port</strong>, wenn ein Reverse Proxy vorne sitzt. Die Ports regeln <code>bind</code>/<code>port</code> im <code>[server]</code>-Block und der Proxy – nicht die öffentliche URL.</p>

<h2 id="stolperstein-2-die-config-ini-die-niemand-las">Stolperstein 2: Die config.ini, die niemand las</h2>

<p>Nach der Korrektur startete ich neu – und nichts passierte. Weiterhin Port 80, weiterhin kaputte URLs.</p>

<p>Die Auflösung war fies: Das <strong>Proxmox-Helper-Script</strong> hatte bei einem Update den Installationspfad geändert. Früher lag die config unter <code>/root/config.ini</code>, inzwischen unter <code>/opt/writefreely/config.ini</code>. Ich bearbeitete also eine Datei, die der Daemon längst ignorierte.</p>

<p><strong>So findest du die config, die wirklich genutzt wird:</strong></p>

<pre><code class="language-bash">systemctl cat writefreely | grep -E &#39;ExecStart|WorkingDirectory&#39;
</code></pre>

<p>Das zeigt dir das WorkingDirectory und den Startbefehl – und damit den Pfad der config.ini, die tatsächlich gelesen wird. Wer das früh prüft, erspart sich eine Stunde ForeignKey-artiger Verzweiflung.</p>

<p><strong>Merksatz:</strong> Nach Updates von Helper-Scripts immer prüfen, ob Pfade gewandert sind. <code>systemctl cat</code> ist dein Freund.</p>

<p>Zudem hat jedes Helper-Scripts eigene Seiten auf Github, womit Änderungen im Changelog schnell auffindbar sind.
Das WriteFreely-Script ist zugegeben noch recht jung.</p>

<h2 id="stolperstein-3-127-0-0-1-npm-und-die-frage-wer-wo-läuft">Stolperstein 3: 127.0.0.1, NPM und die Frage, wer wo läuft</h2>

<p>Der letzte Stolperstein ist ein Klassiker, wenn Reverse Proxy und Dienst <strong>nicht auf demselben Host</strong> laufen – bei mir laufen beide als separate LXC-Container.</p>

<p>In der WriteFreely-Doku steht für den Proxy-Betrieb typischerweise:</p>

<pre><code class="language-ini">[server]
bind = 127.0.0.1:80
</code></pre>

<p>Das bedeutet: WriteFreely lauscht <strong>nur auf dem Loopback-Interface</strong> des eigenen Containers. Vom eigenen Host aus erreichst du es dann über <code>http://127.0.0.1:8080</code> – aber <strong>niemand sonst</strong>, auch nicht per LAN-IP und auch nicht der Nginx Proxy Manager im Nachbar-Container. Denn dort würde <code>127.0.0.1</code> auf NPM selbst zeigen, nicht auf WriteFreely.</p>

<p>Die Folge: <code>502 Bad Gateway</code>, obwohl alles „richtig” konfiguriert aussah.</p>

<p><strong>Die Lösung, wenn NPM in einem separaten Container läuft:</strong></p>

<pre><code class="language-ini">[server]
bind = 0.0.0.0:80
port = 80
</code></pre>

<p>Und im Nginx Proxy Manager als Forward-Host die <strong>LAN-IP des WriteFreely-Containers</strong> eintragen (nicht <code>127.0.0.1</code>, nicht <code>localhost</code>), Forward-Port <code>80</code>.</p>

<p><strong>Merksatz:</strong> <code>127.0.0.1</code> funktioniert nur, wenn Proxy und Dienst denselben Kernel teilen. Separate Container = <code>0.0.0.0</code> binden + LAN-IP als Forward-Host. (Und dann natürlich dafür sorgen, dass nur der Proxy den Port erreichen kann – Firewall sei Dank.)</p>

<h2 id="die-finale-funktionierende-konfiguration">Die finale, funktionierende Konfiguration</h2>

<pre><code class="language-ini">[server]
bind                 = 0.0.0.0:80
port                 = 80
tls_cert_path        =
tls_key_path         =
autocert             = false

[app]
host                 = https://blog.dala-homelab.de
</code></pre>

<p>Die TLS-Zertifikate macht der Nginx Proxy Manager per Let&#39;s Encrypt – WriteFreely selbst braucht dafür keine Pfade und kein <code>autocert</code>. Wichtig im NPM: <code>X-Forwarded-Proto</code> wird standardmäßig korrekt gesetzt, sonst erzeugt WriteFreely interne Links als <code>http://</code>.</p>

<h2 id="fazit">Fazit</h2>

<p>Drei Fehler, ein Nachmittag, ein laufender Blog. Was bleibt hängen?</p>
<ol><li><strong><code>host</code> ohne Port-Suffix</strong>, wenn der Proxy die TLS-Terminierung macht</li>
<li><strong>Nach Helper-Script-Updates den config-Pfad prüfen</strong> (<code>systemctl cat writefreely</code>)</li>
<li><strong>Loopback vs. Container-Netzwerk verstehen</strong> – <code>127.0.0.1</code> ist immer nur der eigene Host</li></ol>

<p>Wenn du gerade vor einem dieser Probleme sitzt: Du bist nicht allein. Und wenn du einen vierten Stolperstein gefunden hast, den ich übersehen habe – schreib mir gern per E-Mail, ich ergänze den Beitrag.</p>

<hr>

<p><em>Dennis Amin Waigner</em> — Linux System Engineer, Bastler, Vater.</p>

<p>Auf diesem Blog teile ich, was ich in Homelab, Werkstatt und Alltag baue und lerne – von Proxmox-Clustern bis zum 3D-Druck. Wenn ich unterwegs scheitere, steht es hier auch. Versprochen.</p>
]]></content:encoded>
      <guid>https://blog.dala-homelab.de/writefreely-hinter-nginx-proxy-manager-meine-stolpersteine</guid>
      <pubDate>Thu, 22 Oct 2026 20:04:04 +0200</pubDate>
    </item>
  </channel>
</rss>