<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Posts on PDMC | Blog</title><link>/posts/</link><description>PDMC | Blog (Posts)</description><generator>Hugo -- gohugo.io</generator><language>en-us</language><managingEditor>blog@pdmc.net
(Stefan Palm)</managingEditor><lastBuildDate>Fri, 21 Feb 2025 13:35:18 +0100</lastBuildDate><atom:link href="/posts/index.xml" rel="self" type="application/rss+xml"/><item><title>Nginx hinter Traefik</title><link>/posts/nginx-hinter-traefik/</link><pubDate>Fri, 21 Feb 2025 13:35:18 +0100</pubDate><author>blog@pdmc.net (Stefan Palm)</author><guid>/posts/nginx-hinter-traefik/</guid><description>&lt;p>Heute habe ich das Blog auf eine neue VM umgezogen und stand dabei vor dem Problem, dass ich statischen Content bereitstellen muss aber nur einen &lt;a href="https://traefik.io">Traefik&lt;/a> installiert hatte. Da Traefik aber ein reiner ReverseProxy ist, der keinen Content ausliefern kann, musste also mit &lt;a href="https://nginx.org">nginx&lt;/a> ein klassischer Webserver her. Im konkreten Fall habe ich mich für das offizielle Docker-Image von nginx entschieden und das dann per Docker Compose eingebunden. Das Compose-File ist recht einfach gehalten:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#e2e4e5;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-yaml" data-lang="yaml">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#ff6ac1">services&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff6ac1">webserver&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff6ac1">image&lt;/span>: nginx:stable
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff6ac1">restart&lt;/span>: unless-stopped
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff6ac1">volumes&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> - /srv/docker/data/nginx/config:/etc/nginx/templates
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> - /srv/docker/data/nginx/data:/var/www
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff6ac1">networks&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> - frontend
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff6ac1">labels&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> - &lt;span style="color:#5af78e">&amp;#34;traefik.enable=true&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> - &lt;span style="color:#5af78e">&amp;#34;traefik.docker.network=frontend&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> - &lt;span style="color:#5af78e">&amp;#34;traefik.http.routers.nginx-websecure.rule=Host(`www.pdmc.net`) || Host(`blog.pdmc.net`)&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> - &lt;span style="color:#5af78e">&amp;#34;traefik.http.routers.nginx-websecure.entrypoints=websecure&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> - &lt;span style="color:#5af78e">&amp;#34;traefik.http.routers.nginx-websecure.tls=true&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> - &lt;span style="color:#5af78e">&amp;#34;traefik.http.routers.nginx-websecure.tls.certresolver=leresolver&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#ff6ac1">networks&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff6ac1">frontend&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff6ac1">external&lt;/span>: &lt;span style="color:#ff6ac1">true&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Es werden zwei Volumes definiert; im ersten liegen die Configs für die virtuellen Hosts und im zweiten dann die passenden Daten dazu, sprich der Content den man ausliefern möchte.
In den Labels finden sich die notwenigen Infos für Traefik, sprich für welche Hosts/Domains nginx als Backend genutzt werden soll, dass (nach außen) TLS gesprochen wird und woher die notwendigen Zertifikate zu holen sind. Es finden sich keine Ports in dem Compose-File, weil sich Traefik um die Anbindung an die Außenwelt kümmern soll.&lt;/p>
&lt;p>Die Konfiguration der vHosts wird dann nicht, wie sonst unter Debian/Ubuntu üblich, unter &lt;code>/etc/nginx/site-available&lt;/code> abgelegt und nach &lt;code>/etc/nginx/site-enabled&lt;/code> verlinkt, sondern unter &lt;code>/etc/nginx/templates&lt;/code> (bzw. &lt;code>/srv/docker/data/nginx/config &lt;/code>) abgelegt. Bei Startup des Containers werden dann alle Dateien, die auf &lt;code>.template&lt;/code> enden, von &lt;code>/etc/nginx/templates&lt;/code> nach &lt;code>/etc/nginx/conf.d&lt;/code> kopiert. Die Templates sind ganz normale nginx-Configs:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#e2e4e5;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-nginx" data-lang="nginx">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#ff6ac1">server&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff6ac1">listen&lt;/span> &lt;span style="color:#ff9f43">80&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff6ac1">server_name&lt;/span> &lt;span style="color:#5af78e">blog.pdmc.net&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff6ac1">location&lt;/span> &lt;span style="color:#5af78e">/&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff6ac1">root&lt;/span> &lt;span style="color:#5af78e">/var/www/blog&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Jetzt noch die passenden Daten unter &lt;code>/var/www/blog&lt;/code>, was auf dem Server dann &lt;code>/srv/docker/data/nginx/data/blog&lt;/code> entspricht, ablegen und fertig.&lt;/p></description></item><item><title>Kurzurlaub in Irland</title><link>/posts/kurzurlaub-irland-2025/</link><pubDate>Tue, 11 Feb 2025 11:23:36 +0100</pubDate><author>blog@pdmc.net (Stefan Palm)</author><guid>/posts/kurzurlaub-irland-2025/</guid><description>&lt;p>&lt;strong>Tag 1&lt;/strong>
&lt;img src="https://blog.pdmc.net/images/kurzurlaub-irland-2025/tag1.png" alt="tag1">
Wir sind mittags am Flughafen in Dublin angekommen und dann direkt mit einem Mietwagen in Richtung Galway/Oranmore aufgebrochen.&lt;/p>
&lt;p>Unterwegs haben wir einen Stopp in &lt;a href="https://de.wikipedia.org/wiki/Clonmacnoise">Clonmacnoise&lt;/a>, einer Klosterruine aus dem 6. Jahrhundert direkt am Shannon, eingelegt. Bei gutem Wetter sollte man die ca. 25 Minuten Umweg auf jeden Fall einplanen, die Anlage zwar nicht sonderlich groß aber auf jeden Fall sehenswert.&lt;/p>
&lt;p>Nach der Ankunft im Hotel in Oranmore und kurzer Pause sind wir dann weiter nach Galway. Etwas Sightseeing in der Stand, Fish &amp;amp; Chips bei &lt;a href="http://www.mcdonaghs.net">Mc Donagh&amp;rsquo;s&lt;/a> und dann wieder zurück zum Hotel.&lt;/p>
&lt;p>&lt;strong>Tag 2&lt;/strong>
&lt;img src="https://blog.pdmc.net/images/kurzurlaub-irland-2025/tag2.png" alt="tag2">
Nach dem Frühstück ging es zur &lt;a href="https://aillweeburrenexperience.ie/ailwee-cave-the-burren/">Aillwee Cave&lt;/a> mit Tour durch die Höhle und die Greifvogel-Flugshow haben wir dann noch direkt mitgenommen. Im Anschluß weiter nach Doolin Pier, wo man schon mal einen ersten Eindruck von den Cliffs of Moher bekommt und dann im &lt;a href="https://gusoconnorsdoolin.com/">Gus O&amp;rsquo;Connor&amp;rsquo;s Pub&lt;/a> Mittag gegessen. Weiter ging es zu den Cliffs of Moher, die sahen in echt tatsächlich noch besser als auf den meisten Fotos aus. Wir hatten aber auch sehr viel Glück mit dem Wetter, bei Regen und Wind macht der Besuch dort wahrscheinlich keinen Spaß. Weiter zur Leamenah Castle Ruine. Die war leider etwas enttäuschend, da man vor Ort nicht anständig halten/parken kann und auch nicht wirklich nah an das Gebäude ran kommt. Dafür hat aber die Landschaft auf der Fahrt entschädigt. Auf der Rückfahrt zum Hotel haben wir dann noch kurz einen Fotostopp am Dunguaire Castle gemacht.&lt;/p>
&lt;p>&lt;strong>Tag 3&lt;/strong>
&lt;img src="https://blog.pdmc.net/images/kurzurlaub-irland-2025/tag3.png" alt="tag3">
Erster Stopp war Aughnanure Castle, zur Abwechselung mal keine Ruine, aber Glück hatten wir damit trotzdem nicht. Dank Sturm Éowyn waren die letzten Meter zur Burg nicht begehbar und diese daher geschlossen. Also weiter nach Kylemore Abbey und wenn ich am 2. Tag schon die Burren-Landschaft wunderbar fand, war das noch besser. Viel besser. Die Fahrt über die R344 vorbei am Lough Inagh ist ein absolutes Muss. Aber Vorsicht: Hinter jeder Kurve kann ein Schaf auf der Straße stehen. In Kylemore Abbey haben wir dann, inklusive Mittagessen, fast 3 Stunden verbracht, bis es dann weiter zur Clifdon Castle Ruine ging. Dummerweise bringen einen weder Apple- noch Google-Maps zum Ziel, die Ruine ist anscheinend nur über nicht ausgeschilderten Fußweg zu erreichen, den wir erst nach fast 40 Minuten Suchen entdeckt haben. Im Anschluss ging es dann wieder zurück in’s Hotel nach Oranmore.&lt;/p>
&lt;p>&lt;strong>Tag 4 &amp;amp; 5&lt;/strong>&lt;br/>
Die letzten beiden Tage haben wir dann in Dublin verbracht, bevor es mit dem Abendflug wieder zurück nach Hause ging.&lt;/p></description></item><item><title>Resize LVM on LUKS</title><link>/posts/resize-lvm-on-luks/</link><pubDate>Sun, 26 Jun 2022 13:17:32 +0200</pubDate><author>blog@pdmc.net (Stefan Palm)</author><guid>/posts/resize-lvm-on-luks/</guid><description>&lt;p>Freitag früh ist mir beim morgentlichen Stubenrundgang aufgefallen, dass ein Filesystem kurz vor dem Anschlag steht. Der in Icinga definierte Schwellwert war ist noch nicht erreicht, aber es war eigentlich nur eine Frage von Tagen bis das Monitoring Alarm schlägt und daher hatte ich schon mal pro-aktiv in Proxmox die Festplatte der VM um 20GB vergrößert.
Um die 20GB dann auch tatsächlich nutzbar zu machen waren noch ein paar Schritte zusätzlich notwendig, da die Platte per LUKS verschlüsselt ist und LVM nutzt.&lt;/p>
&lt;p>Zunächst die Disk und die ID des LUKS-Devices per &lt;code>lsblk&lt;/code> ermitteln.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#e2e4e5;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>$ lsblk
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>sda 8:0 &lt;span style="color:#ff9f43">0&lt;/span> 320G &lt;span style="color:#ff9f43">0&lt;/span> disk
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>├─sda1 8:1 &lt;span style="color:#ff9f43">0&lt;/span> 1G &lt;span style="color:#ff9f43">0&lt;/span> part /boot
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>└─sda2 8:2 &lt;span style="color:#ff9f43">0&lt;/span> 319G &lt;span style="color:#ff9f43">0&lt;/span> part
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> └─luks-e4f9f1bc-5271-4afe-b145-394c4a5fa157 252:0 &lt;span style="color:#ff9f43">0&lt;/span> 319G &lt;span style="color:#ff9f43">0&lt;/span> crypt
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> ├─ol-root 252:1 &lt;span style="color:#ff9f43">0&lt;/span> 36.9G &lt;span style="color:#ff9f43">0&lt;/span> lvm /
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> ├─ol-swap 252:2 &lt;span style="color:#ff9f43">0&lt;/span> 2.1G &lt;span style="color:#ff9f43">0&lt;/span> lvm &lt;span style="color:#ff6ac1">[&lt;/span>SWAP&lt;span style="color:#ff6ac1">]&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> └─ol-barman 252:3 &lt;span style="color:#ff9f43">0&lt;/span> 280G &lt;span style="color:#ff9f43">0&lt;/span> lvm /var/lib/barman
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Dann die Partion vergrößern. Dazu nutze ich im konkreten Beispiel &lt;code>cfdisk /dev/sda&lt;/code>, wähle die Partition &lt;code>sda2&lt;/code> aus und vergrößere per &lt;code>resize&lt;/code>. Speichern (&lt;code>write&lt;/code>) nicht vergessen.
Im Anschluss per &lt;code>cryptsetup&lt;/code> die Größe anpassen, hier also &lt;code>cryptsetup resize &amp;lt;id&amp;gt;&lt;/code>. Den Erfolg der Aktion kann man dann mit &lt;code>cryptsetup status &amp;lt;id&amp;gt;&lt;/code> überprüfen.
Abschließend dann die üblichen Schritte bei LVM, also &lt;code>pveresize&lt;/code>, &lt;code>lvxetend&lt;/code> und &lt;code>xfs_growfs&lt;/code> (oder halt &lt;code>resize2fs&lt;/code> bei EXT4).&lt;/p>
&lt;p>Vollständig:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#e2e4e5;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>$ cfdisk /dev/sda
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>$ cryptsetup resize luks-e4f9f1bc-5271-4afe-b145-394c4a5fa157
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>$ pveresize /dev/mapper/luks-e4f9f1bc-5271-4afe-b145-394c4a5fa157
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>$ lvextend -l +100%FREE /dev/mapper/ol-barman
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>$ xfs_growfs /dev/mapper/ol-barman
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div></description></item><item><title>Blog Restart</title><link>/posts/blog-restart/</link><pubDate>Thu, 16 Jun 2022 11:28:16 +0200</pubDate><author>blog@pdmc.net (Stefan Palm)</author><guid>/posts/blog-restart/</guid><description>&lt;p>Nach &lt;a href="https://wordpress.com/">WordPress&lt;/a> und &lt;a href="https://ghost.org/">Ghost&lt;/a> jetzt also &lt;a href="https://gohugo.io/">Hugo&lt;/a>.&lt;/p>
&lt;p>Dies ist jetzt der - ich glaube - dritte Versuch mit dem Blog live zu gehen und live zu bleiben. Der erste Versuch muss so grob 10-12 Jahre her sein und basierte auf einer selbst-gehosteten WordPress 3.x Installation. Ein Alptraum. Die Installation selbst war zwar schnell gemacht, die Konfiguration, vor allem der Module, war dagegen unnötig kompliziert und die permanenten (Sicherheits-) Updates nervtötend. In den grob anderthalb Jahren, in denen ich WordPress genutzt habe, habe ich vermutlich doppelt so viel Zeit für die Pflege der Installation als für die Inhalte investieren müssen.&lt;/p>
&lt;p>Dann stolperte ich per Zufall über Ghost. Das klang zunächst so vielversprechend: klein, schlank, fokussiert. Und tatsächlich war es am Anfang großartig, auch wenn ich nicht wirklich produktiv war. Aber dann kam der Kommerz (das “Verstecken” der kostenlosen Ghost-Version, 08/15-Themes für dreistellige Dollar-Beträge, …), die Entscheidung den PostgreSQL-Support für Ghost einzustellen (ohne einen Migrationspfad aufzuzeigen) sowie meine ersten Zweifel an Node.js und dem npm-Ökosystem (Stichwort “left-pad”).&lt;/p>
&lt;p>Die Idee, das Blog wiederzubeleben und dafür einen statischen Site-Generator wie Jekyll oder Hugo zu benutzen, hatte ich eigentlich schon während meines Sommerurlaubs 2018 in der Bretagne. Und tatsächlich habe ich zwischendurch immer wieder mal mit Hugo gespielt. Warum ich mich für Hugo anstatt für Jekyll entschieden habe, kann ich heute gar nicht mehr mit Bestimmtheit sagen. Vermutlich weil für Hugo ein einzelnes Binary reicht und nicht wie bei Jekyll eine ganze Ruby-Installation benötigt wird. Nach WordPress/PHP und Ghost/Node.js erscheint mir das jedenfalls als großer Pluspunkt.&lt;/p>
&lt;p>Nun, jetzt also der 3. Versuch. Mal sehen ob ich dieses Mal die Zeit und die Motivation habe, um das Blog am Leben zu halten. Grobes Ziel sind 1-2 Posts im Monat rund um technische Themen, die mir als Gedächtnisstütze helfen sollen und dabei ja vielleicht dem einen oder anderen weiterhelfen können.
Und vielleicht packe ich ja noch zusätzlich ein paar Reiseberichte mit rein. Das wird sich im anstehenden Kanada-Urlaub entscheiden.&lt;/p></description></item></channel></rss>