<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Homelab on SecretMine.de</title><link>https://secretmine.de/categories/homelab/</link><description>Recent content in Homelab on SecretMine.de</description><generator>Hugo -- gohugo.io</generator><language>de-DE</language><lastBuildDate>Mon, 10 Aug 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://secretmine.de/categories/homelab/index.xml" rel="self" type="application/rss+xml"/><item><title>Planka - leider keine Empfehlung mehr</title><link>https://secretmine.de/blog/2026/2026-08-10-planka-keine-empfehlung-mehr/</link><pubDate>Mon, 10 Aug 2026 00:00:00 +0000</pubDate><guid>https://secretmine.de/blog/2026/2026-08-10-planka-keine-empfehlung-mehr/</guid><description>&lt;p&gt;Ich habe Planka lange gerne eingesetzt. Das hat sich leider geändert, da sich die Entwickler dazu entschlossen haben, Single-Sign-On in die kostenpflichtige Pro-Version zu verschieben und aus der Community-Version zu entfernen. Die Erläuterung der Entwickler lässt sich hier nachlesen: &lt;a class="link" href="https://github.com/plankanban/planka/issues/1754" target="_blank" rel="noopener"
 &gt;https://github.com/plankanban/planka/issues/1754&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;SSO ist für mich ein ziemlich grundlegendes Feature, vor allem bei OIDC. Ich kann generell auch verstehen, wenn Entwickler nicht alle Features kostenfrei anbieten möchten, aber ein bereits bestehendes Feature aus der kostenfreien Version zu entfernen bzw. kostenpflichtig zu machen, gefällt mir gar nicht. Außerdem ist SSO bei mir quasi Voraussetzung, vor allem bei den Tools, die meine Partnerin ebenfalls nutzt.&lt;/p&gt;
&lt;p&gt;Daher suche ich gerade eine Alternative. Mein Bruder ist mit Vikunja soweit glücklich, das werde ich mir selbst genauer ansehen. Auch gibt es Fork von einer früheren Version von Planka, das steht auch auf der Liste. Eine Migration ist für mich leider nicht so ganz einfach, da ich bspw. mit dem &lt;a class="link" href="https://secretmine.de/blog/2025/2025-09-20-plankaprinter-bondrucker/" &gt;PlankaPrinter&lt;/a&gt; die API von Planka nutze, um damit zu interagieren. Nextcloud Deck ist für mich leider keine Alternative, das kann zu wenig.&lt;/p&gt;
&lt;p&gt;Es wird ein weiterer Post folgen, wenn ich mich für etwas entschieden habe.&lt;/p&gt;</description></item><item><title>Was hostet man zuhause - und was eher nicht</title><link>https://secretmine.de/blog/2026/2026-07-24-was-hostet-man-zuhause-was-nicht/</link><pubDate>Fri, 24 Jul 2026 00:00:00 +0000</pubDate><guid>https://secretmine.de/blog/2026/2026-07-24-was-hostet-man-zuhause-was-nicht/</guid><description>&lt;p&gt;Selfhosting ist cool, aber nicht automatisch die beste Lösung für alles. Manches ergibt zuhause mehr Sinn, manches ist auf einem vServer im Rechenzentrum besser aufgehoben und anderes würde ich wiederum gar nicht selbst hosten.&lt;/p&gt;
&lt;h2 id="die-möglichkeiten"&gt;Die Möglichkeiten
&lt;/h2&gt;&lt;h3 id="zuhause-hosten"&gt;Zuhause hosten
&lt;/h3&gt;&lt;p&gt;Zuhause ist oft die beste Wahl für Dienste, bei denen lokale Kontrolle, niedrige Kosten und direkte Datenhoheit wichtiger sind als maximale Verfügbarkeit. Besonders bei speicher- oder rechenintensiven Diensten rechnet sich das Hosten zuhause häufig recht schnell. Das gilt besonders für Dinge, die nur du oder die Familie nutzt und die auch mal einen kurzen Ausfall verkraften können.&lt;/p&gt;
&lt;p&gt;Typische Kandidaten sind:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Medienserver wie Jellyfin oder Plex&lt;/li&gt;
&lt;li&gt;HomeAssistant und andere Smarthome-Dienste&lt;/li&gt;
&lt;li&gt;Wiki, Dokumentenmanagementsystem, Zusatzdienste wie Collabora&lt;/li&gt;
&lt;li&gt;Monitoring für das eigene Heimnetz oder das Homelab&lt;/li&gt;
&lt;li&gt;Interne Tools, die nur im LAN oder per VPN erreichbar sein müssen.&lt;/li&gt;
&lt;li&gt;Gameserver&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Kritischere Dienste (wie bei mir bspw. Nextcloud) müssen genauer abgewägt werden. Ich hoste meine Nextcloud zuhause, da der Speicherplatz dadurch deutlich günstiger ist und ich mit Ausfällen häufig leben kann.&lt;/p&gt;
&lt;h3 id="lieber-auf-einen-vserver"&gt;Lieber auf einen vServer
&lt;/h3&gt;&lt;p&gt;Ein vServer lohnt sich vor allem dann, wenn Erreichbarkeit, feste Außenanbindung und sauberer Betrieb wichtiger sind als physische Kontrolle. Das gilt besonders für Dienste, die öffentlich erreichbar sein sollen oder eine bessere Upload-Anbindung brauchen, als sie zuhause realistisch verfügbar ist. Auch für kleine, aber internetnahe Workloads ist ein VPS oft die pragmatischere Lösung.&lt;/p&gt;
&lt;p&gt;Gute Kandidaten sind:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Eigene Websites und kleine Webanwendungen&lt;/li&gt;
&lt;li&gt;Reverse Proxies für externe Zugriffe&lt;/li&gt;
&lt;li&gt;VPN-Endpunkte oder Jumphosts&lt;/li&gt;
&lt;li&gt;Chatserver (Matrix)&lt;/li&gt;
&lt;li&gt;Mailserver (zumindest Empfangen und Speichern)&lt;/li&gt;
&lt;li&gt;Öffentliche APIs, Statusseiten oder kleine SaaS-nahe Dienste&lt;/li&gt;
&lt;li&gt;Kleine Gameserver&lt;/li&gt;
&lt;li&gt;Voice-Server wie bspw. TeamSpeak3&lt;/li&gt;
&lt;li&gt;Single-Sign-On-Lösungen wie Keycloak und Authentik&lt;/li&gt;
&lt;li&gt;Kennwortmanager wie Vaultwarden (sofern Ende-zu-Ende-Verschlüsselung vorhanden ist)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ein vServer ist oft der bessere Kompromiss, wenn du Kontrolle behalten willst, aber nicht die typischen Heimnetzprobleme mit Strom, Router, DynDNS, NAT und Bandbreite haben möchtest. Gerade bei Diensten mit höherer Verfügbarkeit oder mehreren externen Nutzern ist ein VPS meist robuster. Dienste wie Vaultwarden sind hier eine kleine Besonderheit, die würde ich nur dann auf fremder Hardware betreiben, wenn Ende-zu-Ende-Verschlüsselung sauber implementiert ist.&lt;/p&gt;
&lt;h3 id="besser-extern-nutzen-bzw-nicht-selbst-hosten"&gt;Besser extern nutzen bzw. nicht selbst hosten
&lt;/h3&gt;&lt;p&gt;Manche Dienste sollte man trotz Selfhosting-Mentalität lieber outsourcen. Das ist kein Eingeständnis von Schwäche, sondern oft die vernünftigste Entscheidung. Besonders dann, wenn Ausfall, Sicherheitsaufwand oder Betriebsrisiko in keinem guten Verhältnis zum Nutzen stehen.&lt;/p&gt;
&lt;p&gt;Typische Beispiele sind:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;E-Mail, wenn man keine Lust hat, sich selbst um Whitelisting und generelle Zustellungsprobleme zu kümmern (zumindest ausgehendes SMTP)&lt;/li&gt;
&lt;li&gt;Backups, zumindest von den kritischen Daten&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Gerade E-Mail hat sich mit der Zeit leider zu etwas entwickelt, was man lieber von anderen machen lässt. Einen eigenen Mailserver kann man weiterhin betreiben, ich würde aber zumindest den ausgehenden Mailserver über ein externes Relay schicken.&lt;/p&gt;
&lt;h2 id="fazit"&gt;Fazit
&lt;/h2&gt;&lt;p&gt;Für mich lässt sich anhand weniger Fragen entscheiden, ob bzw. wie ich Dienste selbst betreiben möchte:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Welche Anforderungen habe ich an die Verfügbarkeit?&lt;/li&gt;
&lt;li&gt;Wie hoch ist der Ressourcenbedarf?&lt;/li&gt;
&lt;li&gt;Was kostet externes Hosting?&lt;/li&gt;
&lt;li&gt;Wie viel Aufwand ist der Betrieb?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Damit kann ich eigentlich immer eine gute Entscheidung treffen, wo ich Services betreiben möchte.&lt;/p&gt;</description></item><item><title>Firefly III - Self-Hosted und Open Source Haushaltsbuch</title><link>https://secretmine.de/blog/2026/2026-06-06-firefly-iii/</link><pubDate>Sat, 06 Jun 2026 00:00:00 +0000</pubDate><guid>https://secretmine.de/blog/2026/2026-06-06-firefly-iii/</guid><description>&lt;p&gt;Firefly III ist ein Open-Source Tool zur Verwaltung persönlicher Finanzen. Es eignet sich ideal als Haushaltsbuch für den privaten Einsatz oder geteilte Konten in der Familie (oder für Paare) und bietet detaillierte Berichte für einen klaren Überblick.&lt;/p&gt;
&lt;h2 id="warum-überhaupt-so-ein-tool"&gt;Warum überhaupt so ein Tool?
&lt;/h2&gt;&lt;p&gt;Vorher fand das ganze in einer Excel-Tabelle statt, die wurde aber mit der Zeit immer komplexer. Deshalb habe ich mir eine Software dafür gesucht.&lt;/p&gt;
&lt;p&gt;Voraussetzung war aufgrund der Sensibilität ganz klar, dass ich es selbst betreiben können muss. Außerdem wollte ich ein verbreitetes System haben, wofür es auch schon Apps und ähnliches gibt. Gute Auswertungsmöglichkeiten waren mir auch wichtig.&lt;/p&gt;
&lt;p&gt;Firefly III ist eher auf Niveau einer Buchhaltungssoftware als ein Haushaltsbuch. Es gibt auch einfachere Tools wie beispielsweise Actual Budget. Alternativen hatten für mich aber zu wenig Features.&lt;/p&gt;
&lt;h2 id="installation-und-betrieb"&gt;Installation und Betrieb
&lt;/h2&gt;&lt;p&gt;Wie bei den meisten Dingen gibt es auch hierfür fertige Docker-Container, man findet auch offizielle Compose-Vorlagen. Der Stack besteht dabei aus der Anwendung, einer Datenbank (MariaDB) sowie einem Cron-Container. Von der Ressourcenauslastung her ist es eher auf der schlankeren Seite, also mehr als vertretbar.&lt;/p&gt;
&lt;h2 id="bedienung"&gt;Bedienung
&lt;/h2&gt;&lt;p&gt;Durch die Komplexität bzw. den Featureumfang ist Firefly anfangs etwas gewöhnungsbedürftig. Grundsätzlich bedient es sich aber ziemlich gut - Bestandskonten anlegen, danach kann man schon mit dem Anlegen von Transaktionen anfangen. Das lässt sich in Kategorien einteilen, Tags zuweisen und auch Budgets z.B. pro Monat definieren. Ich selbst nutze Firefly III nun seit 3 Jahren aktiv, dabei gemischt zwischen Rechner und Handy (via Waterfly III für mich und Abacus für die gemeinsamen Finanzen). Mittlerweile ist auch meine Partnerin von einer simplen Excel-Tabelle auf Firefly umgestiegen.&lt;/p&gt;
&lt;p&gt;Die Auswertungen gefallen mir sehr gut, ich kriege schnell einen guten Überblick darüber, wie der aktuelle Monat im Vergleich zu anderen dasteht und wohin das Geld geflossen ist. Über die Daueraufträge habe ich alle regelmäßigen Buchungen abgedeckt, was den Aufwand deutlich reduziert. Mit den Regeln lassen sich zusätzlich auch Kategorien, Tags und noch mehr automatisch anhand beispielsweise des Buchungstitels festlegen. So landen bei den gemeinsamen Finanzen alle Buchungen, die &lt;code&gt;&amp;lt;Laden&amp;gt; Lebensmittel&lt;/code&gt; als Titel haben, automatisch in der entsprechenden Kategorie und werden dem passenden Budget zugeordnet.&lt;/p&gt;
&lt;p&gt;Die UI ist nichts besonderes, erfüllt aber auf verschiedenen Bildschirmgrößen gut ihren Zweck.&lt;/p&gt;
&lt;h2 id="fazit"&gt;Fazit
&lt;/h2&gt;&lt;p&gt;Firefly III gehört für meine Partnerin und mich zu den zentralen Anwendungen, die am meisten verwendet werden. Wir nutzen es dabei fast täglich.&lt;/p&gt;</description></item><item><title>Matrix selbst hosten - Synapse, Element und warum das mehr als nur ein Messenger ist</title><link>https://secretmine.de/blog/2026/2026-05-29-matrix/</link><pubDate>Fri, 29 May 2026 00:00:00 +0000</pubDate><guid>https://secretmine.de/blog/2026/2026-05-29-matrix/</guid><description>&lt;p&gt;Messenger gibt es viele. Matrix ist dabei eine Besonderheit, da es nicht direkt eine App meint, sondern ein offenes Protokoll für dezentrale Echtzeitkommunikation, auf dem verschiedene Clients und Server miteinander sprechen können.&lt;/p&gt;
&lt;h2 id="was-ist-matrix"&gt;Was ist Matrix?
&lt;/h2&gt;&lt;p&gt;Matrix ist ein offenes, föderiertes Kommunikationsprotokoll für Chat, Gruppenräume, Sprach- und Videokommunikation. Synapse ist dabei der klassische Matrix-Homeserver, also die Server-Software, die das eigenes Matrix-System betreibt.&lt;/p&gt;
&lt;p&gt;Als Client wird sehr häufig Element genutzt, weil es auf Desktop und Mobilgeräten breit verfügbar ist und den größten Teil der üblichen Messenger-Funktionen abdeckt und sich wie andere bekannte Messenger anfühlt. Es gibt auch diverse andere Clients wie z.B. Cinny, was von der UI her näher an Discord ist.&lt;/p&gt;
&lt;p&gt;Der größte Unterschied zu klassischen Messengern ist die Dezentralität. Man ist nicht an einen einzigen Anbieter gebunden, sondern kann mit anderen Matrix-Servern kommunizieren, ähnlich wie beispielsweise auch E-Mail über viele Anbieter hinweg funktioniert.&lt;/p&gt;
&lt;p&gt;Dazu kommt die offene Architektur: Der Server ist selbst hostbar und man kann den Client frei wählen. Das macht Matrix auch nicht nur für die private Kommunikation interessant, auch in Unternehmen und co bietet sich die Nutzung an. Dort kann man beispielsweise auch die Förderation für rein interne Kommunikation deaktivieren.&lt;/p&gt;
&lt;p&gt;Aber: Durch die Architektur und auch die Ende-zu-Ende-Verschlüsselung ist Matrix komplizierter in der Einrichtung, was schnell abschreckend wirkt.&lt;/p&gt;
&lt;h3 id="politischer-kontext"&gt;Politischer Kontext
&lt;/h3&gt;&lt;p&gt;Ja, ein Thema was ich sonst nicht betrachte. Finde ich hier aber erwähnenswert.&lt;/p&gt;
&lt;p&gt;Matrix passt ziemlich gut in die aktuelle Diskussion um digitale Souveränität, Datenschutz und unabhängige (Kommunikations-)Infrastruktur. Gerade in Europa und auch in Deutschland ist das Interesse an offenen Alternativen zu großen Plattformen seit Jahren hoch und auch diverse öffentliche Einrichtungen und Hochschulen nutzen Matrix als sicheren Messenger.&lt;/p&gt;
&lt;h2 id="installation"&gt;Installation
&lt;/h2&gt;&lt;p&gt;Ein alltagstaugliches Matrix-Setup besteht aus mehreren Komponenten:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Synapse als Homeserver (es gibt auch andere, aber Synapse ist der gängigste)&lt;/li&gt;
&lt;li&gt;Element als Frontend im Browser&lt;/li&gt;
&lt;li&gt;Synapse-Admin zur Benutzerverwaltung&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Von der Domaingestaltung habe ich bei mir etwa folgendes Setup:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Synapse unter &lt;code&gt;matrix.example.com&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Element unter &lt;code&gt;chat.example.com&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Wobei &lt;code&gt;example.com&lt;/code&gt; als Basis-URL für die Identitäten dient, das wird über eine &lt;code&gt;.well-known&lt;/code&gt; an die Subdomain &lt;code&gt;matrix.example.com&lt;/code&gt; delegiert&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Die Delegation hat den großen Vorteil, dass die Hauptdomain als Matrix-Adresse genutzt werden kann, aber nicht von Synapse belegt wird. Über eine kleine &amp;ldquo;Hinweis-Datei&amp;rdquo; auf der Hauptdomain wissen Clients (und andere Homeserver) dann, dass diese sich zu &lt;code&gt;matrix.example.com&lt;/code&gt; verbinden müssen.&lt;/p&gt;
&lt;p&gt;In diesem Fall wird Synapse mit sqlite installiert. Für kleine Setups ist das vollkommen in Ordnung, ich selbst nutze Postgres als Datenbank.&lt;/p&gt;
&lt;h3 id="docker"&gt;Docker
&lt;/h3&gt;&lt;p&gt;Wie das meiste betreibe ich Matrix in Docker. Meine Compose (&lt;code&gt;10.0.0.2&lt;/code&gt; ist die interne IP dieses Servers):&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;span class="lnt"&gt;24
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;services&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;synapse&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;image&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;docker.io/matrixdotorg/synapse:latest&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;restart&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;unless-stopped&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;environment&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;SYNAPSE_CONFIG_PATH=/data/homeserver.yaml&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;volumes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;./data:/data&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;ports&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="m"&gt;10.0.0.2&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="m"&gt;8008&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="m"&gt;8008&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;element&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;image&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;vectorim/element-web:latest&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;restart&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;unless-stopped&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;volumes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;./config/element-config.json:/app/config.json&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;ports&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="m"&gt;10.0.0.2&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="m"&gt;8009&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="m"&gt;80&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;synapse-admin&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;image&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;ghcr.io/etkecc/synapse-admin:latest&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;restart&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;unless-stopped&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;volumes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;./config/synapse-admin-config.json:/app/config.json&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;ports&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="m"&gt;10.0.0.2&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="m"&gt;8010&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="m"&gt;8080&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Die grundlegende Konfiguration für Synapse lässt sich generieren:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker compose run --rm -e &lt;span class="nv"&gt;SYNAPSE_SERVER_NAME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;example.com synapse generate
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Die relevanten Config-Files:&lt;/p&gt;
&lt;p&gt;Element (&lt;code&gt;config/element-config.json&lt;/code&gt;):&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;default_server_config&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;m.homeserver&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;base_url&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;https://matrix.example.com&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;disable_custom_urls&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;disable_guests&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;brand&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Mein Chatserver&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Synapse-Admin (&lt;code&gt;config/synapse-admin-config.json&lt;/code&gt;):&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;restrictBaseUrl&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;https://matrix.example.com&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Die eigentliche Config von Synapse (&lt;code&gt;data/homeserver.yaml&lt;/code&gt;) habe ich minimal modifiziert:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;span class="lnt"&gt;24
&lt;/span&gt;&lt;span class="lnt"&gt;25
&lt;/span&gt;&lt;span class="lnt"&gt;26
&lt;/span&gt;&lt;span class="lnt"&gt;27
&lt;/span&gt;&lt;span class="lnt"&gt;28
&lt;/span&gt;&lt;span class="lnt"&gt;29
&lt;/span&gt;&lt;span class="lnt"&gt;30
&lt;/span&gt;&lt;span class="lnt"&gt;31
&lt;/span&gt;&lt;span class="lnt"&gt;32
&lt;/span&gt;&lt;span class="lnt"&gt;33
&lt;/span&gt;&lt;span class="lnt"&gt;34
&lt;/span&gt;&lt;span class="lnt"&gt;35
&lt;/span&gt;&lt;span class="lnt"&gt;36
&lt;/span&gt;&lt;span class="lnt"&gt;37
&lt;/span&gt;&lt;span class="lnt"&gt;38
&lt;/span&gt;&lt;span class="lnt"&gt;39
&lt;/span&gt;&lt;span class="lnt"&gt;40
&lt;/span&gt;&lt;span class="lnt"&gt;41
&lt;/span&gt;&lt;span class="lnt"&gt;42
&lt;/span&gt;&lt;span class="lnt"&gt;43
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# Configuration file for Synapse.&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;#&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# This is a YAML file: see [1] for a quick introduction. Note in particular&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# that *indentation is important*: all the elements of a list or dictionary&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# should have the same indentation.&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;#&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# [1] https://docs.ansible.com/ansible/latest/reference_appendices/YAMLSyntax.html&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;#&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# For more information on how to configure Synapse, including a complete accounting of&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# each option, go to docs/usage/configuration/config_documentation.md or&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# https://element-hq.github.io/synapse/latest/usage/configuration/config_documentation.html&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;server_name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;example.com&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;pid_file&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;/data/homeserver.pid&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;listeners&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;port&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;8008&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;resources&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;compress&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;names&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;client&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;federation&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;tls&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;http&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;x_forwarded&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;database&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;sqlite3&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;args&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;database&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;/data/homeserver.db&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;log_config&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;/data/example.com.log.config&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;media_store_path&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;/data/media_store&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;registration_shared_secret&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;[...]&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;macaroon_secret_key&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;[...]&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;form_secret&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;[...]&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;signing_key_path&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;/data/example.com.signing.key&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;trusted_key_servers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;server_name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;matrix.org&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# Modifikationen&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;public_baseurl &lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;https://matrix.example.com&amp;#34;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# URL, über die Synapse von außen erreichbar ist&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;report_stats&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;enable_registration&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="reverse-proxy"&gt;Reverse-Proxy
&lt;/h3&gt;&lt;p&gt;Ich habe Caddy als Reverse-Proxy im Einsatz. Die relevante Konfiguration in der Caddyfile sieht bei mir so aus:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;matrix.example.com {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; reverse_proxy 10.0.0.2:8008
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;chat.example.com {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; reverse_proxy 10.0.0.2:8009
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;synapse-admin.example.com {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; # siehe https://caddyserver.com/docs/caddyfile/directives/basic_auth
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; basic_auth {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; # User hier
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; reverse_proxy 10.0.0.2:8010
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Synapse-Admin habe ich hinter Basic-Auth versteckt. Das ist an sich meiner Meinung nach nicht notwendig, aber fühlt sich besser an.&lt;/p&gt;
&lt;h3 id="delegation-einrichten"&gt;Delegation einrichten
&lt;/h3&gt;&lt;p&gt;Bei der Hauptdomain &lt;code&gt;example.com&lt;/code&gt; müssen einige Dateien angelegt werden.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;.well-known/matrix/server&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;m.server&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;matrix.example.com:443&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;code&gt;.well-known/matrix/client&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;m.homeserver&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;base_url&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;https://matrix.example.com&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Damit sollte nun Förderation auch funktionieren. Mit dem Federation Tester (&lt;a class="link" href="https://federationtester.matrix.org/" target="_blank" rel="noopener"
 &gt;federationtester.matrix.org&lt;/a&gt;) lässt sich das prüfen.&lt;/p&gt;
&lt;h3 id="initialen-user-erstellen"&gt;Initialen User erstellen
&lt;/h3&gt;&lt;p&gt;Mittels&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker compose &lt;span class="nb"&gt;exec&lt;/span&gt; -it synapse register_new_matrix_user http://localhost:8008 -c /data/homeserver.yaml
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;lässt sich nun der initiale Admin-User (und auch weitere User natürlich) anlegen.&lt;/p&gt;
&lt;h2 id="clients-einrichten"&gt;Clients einrichten
&lt;/h2&gt;&lt;p&gt;An den Clients sollte ein Login auf &lt;code&gt;example.com&lt;/code&gt; nun funktionieren. Durch die Delegation werden Clients zu &lt;code&gt;matrix.example.com&lt;/code&gt; weitergeschickt.&lt;/p&gt;</description></item><item><title>Verteilter Speicher im Homelab</title><link>https://secretmine.de/blog/2026/2026-05-17-verteilter-speicher-im-homelab/</link><pubDate>Sun, 17 May 2026 00:00:00 +0000</pubDate><guid>https://secretmine.de/blog/2026/2026-05-17-verteilter-speicher-im-homelab/</guid><description>&lt;p&gt;Ich habe bekanntlich seit einiger Zeit Docker Swarm im Einsatz. Als Storage war anfangs ein mit NFS geteiltes DRBD-Volume im Einsatz, also replizierter Blockspeicher. Funktioniert hat das, war aber langsam.&lt;/p&gt;
&lt;p&gt;Daher habe ich mir diverse Lösungen für verteilten bzw. replizierten Speicher angesehen und ausprobiert. Ziel war einerseits, replizierten und ausfallsicheren Storage für Docker Swarm zu bekommen, andererseits aber auch, einen größeren Speicherbereich für unwichtige Daten zu erhalten.&lt;/p&gt;
&lt;h2 id="anforderungen"&gt;Anforderungen
&lt;/h2&gt;&lt;p&gt;Um eine vernünftige Auswahl treffen zu können, sollten vorher natürlich die konkreten Anforderungen klar sein.&lt;/p&gt;
&lt;p&gt;Muss:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Unterstützung von verteiltem und repliziertem Storage&lt;/li&gt;
&lt;li&gt;Hochverfügbarkeit (weiterhin funktionsfähig bei Ausfall von 1/3 Nodes)&lt;/li&gt;
&lt;li&gt;Kostenfrei nutzbar&lt;/li&gt;
&lt;li&gt;(halbwegs) aktives Projekt, nicht abgekündigt bzw. sichtbar inaktiv&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Soll:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Open Source&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Kann:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Metriken/Monitoring&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="softwarelösungen"&gt;Softwarelösungen
&lt;/h2&gt;&lt;h3 id="ceph"&gt;Ceph
&lt;/h3&gt;&lt;p&gt;Ceph ist eine gängige Lösung für hochverfügbaren Speicher und wird im sehr großen Stil eingesetzt. Es ist zudem in Proxmox VE integriert, womit sich schnell ein hyperconverged Cluster einrichten lässt.&lt;/p&gt;
&lt;p&gt;Die Performance hat mir sehr gut gefallen, es war die schnellste getestete Lösung. Ceph lässt sich auch super konfigurieren und Pools mit verschiedenen Replikationsregeln erstellen. Der Ausfall einer Node wurde gut verkraftet, nach dem Hinzufügen war die Redundanz auch sehr schnell wiederhergestellt.&lt;/p&gt;
&lt;p&gt;Problematisch für mich ist hier allerdings der Ressourcenbedarf. Ceph hat mit allen Komponenten pro Node 2-3 GB an RAM verbraucht, das ist mir mit den Thin Clients zu viel. Außerdem ist Ceph bekannt dafür, eine hohe Schreiblast auf den Datenträgern zu erzeugen. Auf Dauer könnte Ceph aber trotzdem die präferierte Lösung sein.&lt;/p&gt;
&lt;h3 id="glusterfs"&gt;GlusterFS
&lt;/h3&gt;&lt;p&gt;Im Vergleich zu Ceph arbeitet GlusterFS auf Datei- und nicht auf Blockebene. Replizierte und verteilte Volumes werden unterstützt, auch erasure-code-basierte Volumes sind möglich. Es ist trotzdem weniger flexibel als Ceph, was die Replikationsoptionen angeht. Monitoring ist leider auch eher schwierig, es gibt aber einen halbwegs gepflegten Prometheus-Exporter.&lt;/p&gt;
&lt;p&gt;GlusterFS wurde irgendwann von Red Hat gekauft, die es dann neben der Open-Source-Version als Red Hat Gluster Storage vermarktet haben. Das Red Hat Produkt hat allerdings Ende 2024 das Ende seines Lebenszyklus erreicht. Die Aktivität bei Github ist in den letzten Jahren auch stark gesunken, letztes Jahr waren es ~20 Commits im Repo. Das spricht deutlich gegen GlusterFS.&lt;/p&gt;
&lt;p&gt;Vom Ressourcenbedarf her ist es angenehm, ich sehe kaum nennenswerten RAM- und CPU-Bedarf. Die Performance ist insgesamt auch okay, wenn auch geringer als bei Ceph.&lt;/p&gt;
&lt;h3 id="moosefs"&gt;MooseFS
&lt;/h3&gt;&lt;p&gt;Vom Prinzip her gefällt mir MooseFS. Man kann pro Verzeichnis die Anzahl der Kopien festlegen, beim über- oder unterschreiten durch Entfernen bzw. Hinzufügen von Volumes wird dann automatisch nachgesteuert. Die Performance ist ebenfalls in Ordnung, auch wenn es primär für Medien und andere größere Dateien ausgelegt ist. Bei vielen kleinen Dateien habe ich - zumindest bei den Forks von MooseFS - deutlich geringere Performance als bei Ceph gesehen.&lt;/p&gt;
&lt;p&gt;Das Ausschlusskriterium für MooseFS war allerdings die fehlende Hochverfügbarkeit in der Open-Source-Version. Für dieses Feature benötigt man eine Pro-Lizenz.&lt;/p&gt;
&lt;h3 id="lizardfs"&gt;LizardFS
&lt;/h3&gt;&lt;p&gt;Das ist ein Fork von MooseFS, der von den Funktionen her ziemlich gleich ist, allerdings auch Hochverfügbarkeit enthält. LizardFS wird allerdings seit mehreren Jahren nicht mehr weiterentwickelt, das Repo bei Github ist inaktiv.&lt;/p&gt;
&lt;h3 id="leilfs-vorher-saunafs"&gt;LeilFS (vorher SaunaFS)
&lt;/h3&gt;&lt;p&gt;LeilFS ist ein Fork von LizardFS, laut den Infos, die ich finden konnte, sind wohl diverse Entwickler von LizardFS dort nun aktiv. Prinzipiell sieht LeilFS gut aus, es gibt bisher allerdings nur für Ubuntu fertige Pakete. Ich habe aber mit wenig Aufwand Pakete für Debian 13 kompilieren können.&lt;/p&gt;
&lt;p&gt;Die Dokumentation lässt (zumindest bisher) auch sehr zu wünschen übrig. Das meiste habe ich mir bei LizardFS angesehen und nur die entsprechenden Bezeichnungen angepasst. Trotzdem hinterlässt das einen etwas faden Beigeschmack.&lt;/p&gt;
&lt;p&gt;Dennoch ist es eine flexible und eher ressourcensparsame Option.&lt;/p&gt;
&lt;h3 id="weitere-lösungen"&gt;Weitere Lösungen
&lt;/h3&gt;&lt;p&gt;Folgende Möglichkeiten möchte ich zumindest erwähnt haben, auch wenn ich nicht im Detail darauf eingehen werde:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;LINSTOR&lt;/strong&gt;: Verteilte Block-Devices, basiert auf DRBD&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;S3 plus JuiceFS&lt;/strong&gt;: Mit hochverfügbarem S3 in Verbindung mit JuiceFS lässt sich theoretisch auch ein hochverfügbares Dateisystem aufsetzen&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;DRBD plus NFS&lt;/strong&gt;: Etwas klassischer, aber funktioniert&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ZFS mit Replikation&lt;/strong&gt;: Proxmox bietet Unterstützung dafür. Nicht direkt volles HA, aber für Homelab und kleine Produktion wahrscheinlich ausreichend&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="fazit"&gt;Fazit
&lt;/h2&gt;&lt;p&gt;Ceph ist eine gebräuchliche Lösung, weit verbreitet, aktiv gepflegt und auch schnell. Also eigentlich ideal. Es benötigt aber leider zu viele Ressourcen, ist also bei den aktuellen RAM-Preise eher eine Lösung für &amp;ldquo;irgendwann&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;Aktuell wird jetzt DRBD erst einmal durch GlusterFS ersetzt. Ich habe damit in der Vergangenheit viel zu tun gehabt und kenne mich weit genug aus, auch wenn es seine Nachteile hat. Regelmäßige Sicherungen mache ich natürlich, daher halte ich das Risiko für Datenverlust für überschaubar.&lt;/p&gt;
&lt;p&gt;Für Massenspeicher kommt neben GlusterFS auch LeilFS zum Einsatz, da liegen z.B. ISOs/Templates für Proxmox, Medien und anderer Kram darauf. Ich habe mir verschiedene Storage-Klassen konfiguriert, die teilweise auch hochverfügbar sind. Dazu aber in einem weiteren Beitrag mehr.&lt;/p&gt;
&lt;p&gt;GlusterFS ist für mich trotzdem nur eine Zwischenlösung, auf Dauer bleibt Ceph (inkl. CephFS) das Ziel. Einfach weil es verbreiteter und besser gepflegt ist. Aber das wird auf niedrigere RAM-Preise warten müssen.&lt;/p&gt;</description></item><item><title>Hochverfügbarkeit mit Keepalived</title><link>https://secretmine.de/blog/2026/2026-05-03-hochverfuegbarkeit-mit-keepalived/</link><pubDate>Sun, 03 May 2026 00:00:00 +0000</pubDate><guid>https://secretmine.de/blog/2026/2026-05-03-hochverfuegbarkeit-mit-keepalived/</guid><description>&lt;p&gt;Wer schon einmal mit mehreren Servern gearbeitet hat, kennt das Problem: Ein Dienst soll zwecks Ausfallsicherheit auf mehreren Servern laufen und parallel unter einer festen IP erreichbar sein. Natürlich mit Failover.&lt;/p&gt;
&lt;p&gt;An dieser Stelle kommt Keepalived ins Spiel. Das kleine, aber mächtige Tool übernimmt die Verwaltung von Floating IPs (oder Virtual IPs, kurz VIPs) und sorgt so für Hochverfügbarkeit für theoretisch beliebige Dienste.&lt;/p&gt;
&lt;h2 id="wie-funktioniert-das"&gt;Wie funktioniert das?
&lt;/h2&gt;&lt;p&gt;Keepalived setzt auf das VRRP-Protokoll (Virtual Router Redundancy Protocol), um eine virtuelle IP-Adresse an genau einen Master-Knoten zu vergeben.&lt;/p&gt;
&lt;p&gt;Wenn der Master ausfällt, erkennt Keepalived das automatisch und weist die IP einem Backup-Knoten zu. Meistens passiert das innerhalb von wenigen Sekunden. Dienste hinter dieser IP bleiben dadurch durchgängig erreichbar.&lt;/p&gt;
&lt;h2 id="typische-szenarien"&gt;Typische Szenarien
&lt;/h2&gt;&lt;h3 id="dns"&gt;DNS
&lt;/h3&gt;&lt;p&gt;Ein Klassiker. DNS hat zwar an sich durch die Angabe mehrerer DNS-Server schon auf der Ebene Ausfallsicherheit integriert, hier lässt sich aber auch Keepalived gut einsetzen. Zwei (oder mehr) Server sind dabei identisch eingerichtet und können beide jederzeit DNS-Anfragen beantworten.&lt;/p&gt;
&lt;p&gt;Keepalived sorgt hier nun für eine virtuelle IP, die immer auf einen der beiden Server gebunden ist und damit beim Ausfall des aktuell aktiven Servers innerhalb von kurzer Zeit auf den zweiten umgeschaltet wird.&lt;/p&gt;
&lt;h3 id="webserver"&gt;Webserver
&lt;/h3&gt;&lt;p&gt;Eigentlich exakt das selbe Prinzip wie bei DNS, hier müssen nur die Website-Daten auch auf einem gemeinsamen Storage liegen oder anderweitig allen Nodes bekannt sein.&lt;/p&gt;
&lt;h2 id="keepalived-und-docker-swarm"&gt;Keepalived und Docker Swarm
&lt;/h2&gt;&lt;p&gt;Hier wirds cool.&lt;/p&gt;
&lt;p&gt;Swarm hat Mesh Routing. Das heißt, dass jede Node Anfragen zu einem Service entgegen nehmen kann und intern dann zum richtigen Knoten weiterleitet. Heißt, es ist egal, welche Node man anspricht, die Antwort kommt auf jeden Fall.&lt;/p&gt;
&lt;p&gt;In Verbindung mit Keepalived kann man so Services in Docker Swarm wirklich hochverfügbar machen. Die virtuelle IP zeigt immer auf einen der Knoten, das interne Mesh-Routing erledigt dann den Rest. Wenn ein Knoten ausfällt, wird die IP umgeschaltet, parallel sorgt Swarm dafür, dass alle Services weiterhin verfügbar sind und bei Bedarf auf einem anderen Knoten neu gestartet werden.&lt;/p&gt;
&lt;p&gt;DNS-Einträge können damit immer auf die virtuelle IP eingestellt werden, alles weitere passiert automatisch.&lt;/p&gt;
&lt;h3 id="beispielkonfiguration"&gt;Beispielkonfiguration
&lt;/h3&gt;&lt;p&gt;Hier eine kurze Beispielconfig:&lt;/p&gt;
&lt;p&gt;Node &lt;code&gt;swarm-1&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;global_defs &lt;span class="o"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; router_id swarm-1
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;vrrp_instance VI_SWARM &lt;span class="o"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; state MASTER
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; interface eth0
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; virtual_router_id &lt;span class="m"&gt;60&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; priority &lt;span class="m"&gt;255&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; advert_int &lt;span class="m"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; authentication &lt;span class="o"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; auth_type PASS
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; auth_pass meinsicherespw
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; virtual_ipaddress &lt;span class="o"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 192.168.1.60/24
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Node &lt;code&gt;swarm-2&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;global_defs &lt;span class="o"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; router_id swarm-2
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;vrrp_instance VI_SWARM &lt;span class="o"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; state BACKUP
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; interface eth0
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; virtual_router_id &lt;span class="m"&gt;60&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; priority &lt;span class="m"&gt;254&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; advert_int &lt;span class="m"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; authentication &lt;span class="o"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; auth_type PASS
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; auth_pass meinsicherespw
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; virtual_ipaddress &lt;span class="o"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 192.168.1.60/24
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Die &lt;code&gt;router_id&lt;/code&gt; ist hierbei immer Node-spezifisch. Die virtual_router_id ist letztendlich die Instanzkennung. Bei mir ist &lt;code&gt;swarm-1&lt;/code&gt; normalerweise der Master, hier ist durch die höhere Priorität auch ein Fail-Back (also das Zurückschalten von einer der anderen Nodes zurück zu &lt;code&gt;swarm-1&lt;/code&gt;) konfiguriert. Wenn die Prioritäten identisch sind, passiert kein Fail-Back.&lt;/p&gt;
&lt;p&gt;Die restlichen Optionen sind weitestgehend selbsterklärend, ansonsten findet man im Internet auch genügend Informationen zu Keepalived.&lt;/p&gt;
&lt;h3 id="kubernetes"&gt;Kubernetes
&lt;/h3&gt;&lt;p&gt;Bei Kubernetes lässt sich dieses Konstrukt mit MetalLB im Layer-2-Modus ziemlich identisch umsetzen. Die Erkennung von ausgefallenen Nodes läuft etwas anders, aber das Endergebnis (virtuelle IP, unter der immer eine Node erreichbar ist) ist das selbe.&lt;/p&gt;
&lt;h2 id="fazit"&gt;Fazit
&lt;/h2&gt;&lt;p&gt;Mir gefällt das Setup in dieser Kombination wirklich gut. Swarm kümmert sich um die Services, Keepalived sorgt für eine einheitliche IP für alle Services. Und dabei braucht Keepalived auch fast nichts an Ressourcen.&lt;/p&gt;</description></item><item><title>PCIe-Möglichkeiten beim Fujitsu Futro S740</title><link>https://secretmine.de/blog/2026/2026-04-25-futro-s740-pcie/</link><pubDate>Sat, 25 Apr 2026 00:00:00 +0000</pubDate><guid>https://secretmine.de/blog/2026/2026-04-25-futro-s740-pcie/</guid><description>&lt;p&gt;Von den Futro S740ern habe ich mittlerweile diverse, mit dem neuen Storage-Cluster sind es nun fünf.&lt;/p&gt;
&lt;p&gt;Im Internet findet man verstreut einige Infos dazu, was an PCIe beim S740 möglich ist, aber insgesamt eher wenig konkretes.&lt;/p&gt;
&lt;p&gt;Das WLAN-Modul ist offensichtlich via PCIe angebunden, da hier normale Module einfach funktionieren. Den Slot habe ich bei mehreren meiner Futros auch schon für NVMe-SSDs mittels Adapter benutzt.&lt;/p&gt;
&lt;p&gt;Zum M.2 SATA-Slot für das eMMC-Modul bzw. eine SATA-SSD habe ich widersprüchliche Infos gefunden, aber keine wirklich klare Aussage dazu, ob dieser Slot nun PCIe hat oder nicht. Daher habe ich mir einen günstigen Adapter gekauft und getestet.&lt;/p&gt;
&lt;h2 id="der-test"&gt;Der Test
&lt;/h2&gt;&lt;p&gt;&lt;img alt="PCIe-Test mit zwei Geräten" class="gallery-image" data-flex-basis="456px" data-flex-grow="190" height="1051" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://secretmine.de/blog/2026/2026-04-25-futro-s740-pcie/images/s740_pcie_1.jpg" srcset="https://secretmine.de/blog/2026/2026-04-25-futro-s740-pcie/images/s740_pcie_1_hu_277629d9a854c3a1.jpg 800w, https://secretmine.de/blog/2026/2026-04-25-futro-s740-pcie/images/s740_pcie_1_hu_c45131e67ed07173.jpg 1600w, https://secretmine.de/blog/2026/2026-04-25-futro-s740-pcie/images/s740_pcie_1.jpg 2000w" width="2000"&gt;&lt;/p&gt;
&lt;p&gt;Im Slot für das eMMC-Modul steckt mit Adapter ein SATA-HBA, im WLAN-Slot ein normales WLAN-Modul. Das WLAN-Modul wird etwas verdeckt, das Setup ist generell nur für einen kurzen Test so aufgebaut gewesen.&lt;/p&gt;
&lt;h2 id="ergebnis"&gt;Ergebnis
&lt;/h2&gt;&lt;p&gt;Beide Geräte werden erkannt. Da ich das ganze von einem temporären Boot-System getestet habe, musste ich hier mal ein &amp;ldquo;Bildschirmfoto&amp;rdquo; machen.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Ausgabe von lspci" class="gallery-image" data-flex-basis="2112px" data-flex-grow="880" height="284" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://secretmine.de/blog/2026/2026-04-25-futro-s740-pcie/images/s740_pcie_2.jpg" srcset="https://secretmine.de/blog/2026/2026-04-25-futro-s740-pcie/images/s740_pcie_2_hu_2d5796c73623a24f.jpg 800w, https://secretmine.de/blog/2026/2026-04-25-futro-s740-pcie/images/s740_pcie_2_hu_e63e8e9a4bbf4150.jpg 1600w, https://secretmine.de/blog/2026/2026-04-25-futro-s740-pcie/images/s740_pcie_2_hu_2b85f88f54d09117.jpg 2400w, https://secretmine.de/blog/2026/2026-04-25-futro-s740-pcie/images/s740_pcie_2.jpg 2500w" width="2500"&gt;&lt;/p&gt;
&lt;p&gt;Beide Slots haben nach meinen Wissen jeweils eine PCIe 2.0 Lane.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;root@test:~# lspci -vv
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;01:00.0 SATA controller: ASMedia Technology Inc. ASM1166 Serial ATA Controller &lt;span class="o"&gt;(&lt;/span&gt;rev 02&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;prog-if &lt;span class="m"&gt;01&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;AHCI 1.0&lt;span class="o"&gt;])&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;[&lt;/span&gt;...&lt;span class="o"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Capabilities: &lt;span class="o"&gt;[&lt;/span&gt;80&lt;span class="o"&gt;]&lt;/span&gt; Express &lt;span class="o"&gt;(&lt;/span&gt;v2&lt;span class="o"&gt;)&lt;/span&gt; Endpoint, IntMsgNum &lt;span class="m"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;[&lt;/span&gt;...&lt;span class="o"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; LnkSta: Speed 5GT/s &lt;span class="o"&gt;(&lt;/span&gt;downgraded&lt;span class="o"&gt;)&lt;/span&gt;, Width x1 &lt;span class="o"&gt;(&lt;/span&gt;downgraded&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="fazit"&gt;Fazit
&lt;/h2&gt;&lt;p&gt;Der Futro S740 hat die Möglichkeit, zwei PCIe-Geräte anzubinden. PCIe 2.0 x1 ist zwar nicht besonders schnell, reicht aber trotzdem für vieles.&lt;/p&gt;</description></item><item><title>Latenzmessungen mit Smokeping</title><link>https://secretmine.de/blog/2026/2026-04-18-latenzmessungen-mit-smokeping/</link><pubDate>Sat, 18 Apr 2026 00:00:00 +0000</pubDate><guid>https://secretmine.de/blog/2026/2026-04-18-latenzmessungen-mit-smokeping/</guid><description>&lt;p&gt;Ich nutze nun schon seit vielen Jahren Smokeping zur Überwachung von Latenzen zu diversen Zielen. Primär mit dem Ziel, die Performance meiner Internetanbindung zu überwachen und Probleme gut identifizieren zu können, daneben aber auch, um Änderungen am Routing zwischen meinem Internetprovider und dem entsprechenden Ziel anhand von Latenzänderungen zu erkennen.&lt;/p&gt;
&lt;p&gt;Das Tool ist an sich recht alt, bietet aber trotzdem einen super Einblick in die Latenzen.&lt;/p&gt;
&lt;h2 id="ping-ziele"&gt;Ping-Ziele
&lt;/h2&gt;&lt;p&gt;Neben meinem Router (und dem Router im Keller im zweiten Homelab) pinge ich regelmäßig diverse Ziele im Internet. Dazu gehören neben den DNS-Servern von Google, Cloudflare und Quad9 auch die Test-Targets von Hetzner an allen derer Standorte, alle meine eigenen Server auch das VPN-Gateway meines Arbeitgebers.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Generische Internet-Ziele" class="gallery-image" data-flex-basis="317px" data-flex-grow="132" height="547" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://secretmine.de/blog/2026/2026-04-18-latenzmessungen-mit-smokeping/images/targets_internet.png" width="723"&gt;&lt;/p&gt;
&lt;h2 id="konfiguration"&gt;Konfiguration
&lt;/h2&gt;&lt;p&gt;Die gesamte Konfiguration liegt unter &lt;code&gt;/etc/smokeping/&lt;/code&gt;, wenn Smokeping einfach als Systempaket installiert wurde. In der Datei &lt;code&gt;/etc/smokeping/config.d/Targets&lt;/code&gt; lassen sich die Ziele definieren, die Syntax ist dabei recht einfach. Hier ein Auszug aus meiner Config:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;span class="lnt"&gt;24
&lt;/span&gt;&lt;span class="lnt"&gt;25
&lt;/span&gt;&lt;span class="lnt"&gt;26
&lt;/span&gt;&lt;span class="lnt"&gt;27
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-ini" data-lang="ini"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt;+ Local&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt;menu&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;Local&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt;title&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;Local Network&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt;++ Gateway&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt;menu&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;Gateway&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt;title&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;Gateway&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt;host&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;192.168.1.1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt;+ Internet&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt;menu&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;Internet&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt;title&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;Internet&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt;++ GoogleDNS1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt;menu&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;Google DNS&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt;title&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;Google DNS&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt;host&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;8.8.8.8&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt;++ CloudflareDNS&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt;menu&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;Cloudflare DNS&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt;title&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;Cloudflare DNS&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt;host&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;1.1.1.1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt;++ Quad9DNS&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt;menu&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;Quad9 DNS&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt;title&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;Quad9 DNS&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt;host&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;9.9.9.9&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Viel mehr außer die Targets habe ich nicht modifiziert, es lassen sich aber viel mehr Dinge noch konfigurieren.&lt;/p&gt;
&lt;h2 id="statistiken"&gt;Statistiken
&lt;/h2&gt;&lt;p&gt;Hier ein Beispiel von einem Ping-Ziel. Die Daten gehen dabei über ein Jahr zurück. Bei den längeren Statistiken sieht man hier und da ein bisschen Packetloss, das kann bei größeren Downloads bzw. generell Auslastung der Internetleitung zwischenzeitlich passieren.&lt;/p&gt;
&lt;p&gt;Schön zu sehen ist auch ein genereller Internetausfall im Juni für mehrere Tage mit Fallback zu LTE.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Google - 3 Stunden" class="gallery-image" data-flex-basis="542px" data-flex-grow="225" height="397" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://secretmine.de/blog/2026/2026-04-18-latenzmessungen-mit-smokeping/images/google_1.png" srcset="https://secretmine.de/blog/2026/2026-04-18-latenzmessungen-mit-smokeping/images/google_1_hu_5bcc754b4c99f4cd.png 800w, https://secretmine.de/blog/2026/2026-04-18-latenzmessungen-mit-smokeping/images/google_1.png 897w" width="897"&gt; &lt;img alt="Google - 30 Stunden" class="gallery-image" data-flex-basis="542px" data-flex-grow="225" height="397" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://secretmine.de/blog/2026/2026-04-18-latenzmessungen-mit-smokeping/images/google_2.png" srcset="https://secretmine.de/blog/2026/2026-04-18-latenzmessungen-mit-smokeping/images/google_2_hu_f3160cd446fc58d4.png 800w, https://secretmine.de/blog/2026/2026-04-18-latenzmessungen-mit-smokeping/images/google_2.png 897w" width="897"&gt; &lt;img alt="Google - 10 Tage" class="gallery-image" data-flex-basis="542px" data-flex-grow="225" height="397" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://secretmine.de/blog/2026/2026-04-18-latenzmessungen-mit-smokeping/images/google_3.png" srcset="https://secretmine.de/blog/2026/2026-04-18-latenzmessungen-mit-smokeping/images/google_3_hu_2e3e6119a934b626.png 800w, https://secretmine.de/blog/2026/2026-04-18-latenzmessungen-mit-smokeping/images/google_3.png 897w" width="897"&gt; &lt;img alt="Google - 365 Tage" class="gallery-image" data-flex-basis="542px" data-flex-grow="225" height="397" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://secretmine.de/blog/2026/2026-04-18-latenzmessungen-mit-smokeping/images/google_4.png" srcset="https://secretmine.de/blog/2026/2026-04-18-latenzmessungen-mit-smokeping/images/google_4_hu_9d09d21ac71ee715.png 800w, https://secretmine.de/blog/2026/2026-04-18-latenzmessungen-mit-smokeping/images/google_4.png 897w" width="897"&gt;&lt;/p&gt;
&lt;h2 id="alternativen-zu-smokeping"&gt;Alternativen zu Smokeping
&lt;/h2&gt;&lt;p&gt;Als Alternativen zu Smokeping für Latenz-, Jitter- und Packetloss-Monitoring bietet sich Uptime Kuma oder der Blackbox Exporter an.&lt;/p&gt;
&lt;p&gt;Uptime Kuma ist ein selfhostbares Tool mit simplem Docker-Setup, das Ping-Monitoring inklusive Latenz, Packetloss und Up/Down-Status bietet – ergänzt durch schöne Dashboards, Status-Seiten und Notifications via Discord oder diverser anderer Kanäle. Jitter ist hier zwar nicht so detailliert wie bei Smokeping, aber die moderne Web-UI ist mobilfreundlich und ideal für Homelabs, wo man schnell loslegen will, ohne viel Konfigurationsaufwand. Uptime Kuma ist generell ein schönes Monitoring-Tool, mit dem man seine selbst betriebenen (oder auch externe) Dienste überwachen kann.&lt;/p&gt;
&lt;p&gt;Wenn man eh schon den klassischen Metriken-Stack mit Prometheus und Grafana hat, ist der Blackbox Exporter einen Blick wert. Der kann neben ICMP auch diverse andere Messungen bzw. Tests ausführen und Ziele überwachen. Durch die Nutzung von Grafana sind deutlich umfangreichere Visualisierungen möglich, auch mehrere Probe-Quellen sind gut umzusetzen. Der initiale Aufwand ist natürlich höher als bei Smokeping oder Uptime Kuma, aber der Blackbox Exporter skaliert deutlich weiter und kann am Ende mehr.&lt;/p&gt;
&lt;h2 id="fazit"&gt;Fazit
&lt;/h2&gt;&lt;p&gt;Obwohl die Software eher alt ist und visuell auch nicht die schönste ist, ist es trotzdem ein zentrales Tool in meinem Netzwerkmonitoring. Und das seit bald 10 Jahren. Das Tool funktioniert einfach, ist wartungsarm und liefert gute (wenn auch alt aussehende) Graphen. Daher wird es bei mir auch nicht in absehbarer Zeit abgelöst.&lt;/p&gt;</description></item><item><title>Memos - Notizen und Tagebuch</title><link>https://secretmine.de/blog/2026/2026-04-04-memos/</link><pubDate>Sat, 04 Apr 2026 00:00:00 +0000</pubDate><guid>https://secretmine.de/blog/2026/2026-04-04-memos/</guid><description>&lt;p&gt;Ich nutze nun seit über zwei Jahren Memos (&lt;a class="link" href="https://usememos.com/" target="_blank" rel="noopener"
 &gt;https://usememos.com/&lt;/a&gt;) als Tool im Homelab. Es dient mir zum Notieren von Gedanken und Ideen, zusätzlich nutze ich es auch als eine Art unregelmäßig gepflegtes Tagebuch. Alles wird lokal gespeichert, es ist schlicht, braucht wenig Ressourcen und &amp;ldquo;just works&amp;rdquo; - perfekt, um mal eben etwas zu notieren.&lt;/p&gt;
&lt;h2 id="deployment"&gt;Deployment
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;services&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;memos&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;image&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;neosmemo/memos:stable&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;ports&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="m"&gt;5230&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="m"&gt;5230&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;volumes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;./data/:/var/opt/memos/&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&amp;hellip; ja, das wars schon. Davor sitzt dann noch Caddy als Reverse-Proxy, um SSL zu machen und das ganze erreichbar zu bekommen. In Caddy ist auch noch eine zusätzliche Authentifizierungsschicht eingebaut, dazu schreibe ich irgendwann noch mal mehr.&lt;/p&gt;
&lt;h2 id="nutzung-im-alltag"&gt;Nutzung im Alltag
&lt;/h2&gt;&lt;p&gt;Ich habe Memos als Lesezeichen auf dem Rechner, auf dem Handy ist es als PWA installiert. Damit habe ich es immer griffbereit, um mir schnell etwas zu notieren und es später auch wiederzufinden. Dazu sind die Tags super hilfreich, damit kann man die Memos schön organisieren. Anhänge wie Bilder sind auch vorgesehen, diese lassen sich lokal, in der Datenbank oder in einem S3-Bucket speichern. Ich nutze dabei die lokale Option, das reicht vollkommen aus. Standardmäßig kommt Memos mit SQLite als Datenbank. Hier werden aber auch andere Datenbanktypen unterstützt.&lt;/p&gt;
&lt;p&gt;Zur Formatierung ist Markdown vorgesehen, das mag ich generell. Markdown ist für mich ein guter Mittelweg zwischen reinen Textdateien und erweiterten Formaten wie AsciiDoc oder LaTeX, kann aber trotzdem für das allermeiste genug.&lt;/p&gt;
&lt;p&gt;Auch die gemeinsame Nutzung ist vorgesehen - dafür gibt es mehrere Sichtbarkeitsstufen für einzelne Einträge. &lt;code&gt;Private&lt;/code&gt; ist nur für den Ersteller sichtbar, &lt;code&gt;Protected&lt;/code&gt; können angemeldete Benutzer sehen und &lt;code&gt;Public&lt;/code&gt; ist öffentlich. Gruppen oder ähnliches sind nicht vorgesehen, das fehlt mir allerdings auch nicht.&lt;/p&gt;
&lt;h2 id="fazit"&gt;Fazit
&lt;/h2&gt;&lt;p&gt;Mir gefällt Memos und ich nutze es im Alltag regelmäßig. Daher fand ich einen Post nach all der Zeit angemessen, vor allem, da es ein eher wenig bekanntes Open-Source-Produkt ist. Als Wiki-Lösung nutze ich allerdings zusätzlich noch eine andere Software, dazu folgt wahrscheinlich auch mal ein Beitrag.&lt;/p&gt;</description></item><item><title>HP T430 - ThinPro 9 vs. Windows</title><link>https://secretmine.de/blog/2026/2026-03-31-hp-t430-os-thinpro-9/</link><pubDate>Tue, 31 Mar 2026 00:00:00 +0000</pubDate><guid>https://secretmine.de/blog/2026/2026-03-31-hp-t430-os-thinpro-9/</guid><description>&lt;p&gt;Ich habe nun seit &lt;img alt="groß einem Jahr" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://secretmine.de/blog/2025/2025-05-03-hp-t430/"&gt; einen HP T430 Thin Client, den ich im Vergleich zu meinen ganzen anderen Thin Clients auch tatsächlich so benutze, wie es vorgesehen ist.&lt;/p&gt;
&lt;p&gt;Zumindest größtenteils.&lt;/p&gt;
&lt;h2 id="wie-man-updates-für-einen-thin-client-bekommt"&gt;Wie man Updates für einen Thin Client bekommt
&lt;/h2&gt;&lt;p&gt;Für HP-Thin-Clients gibt es das Tool HP ThinUpdate, mit dem man Images für Thin Clients herunterladen und einen USB-Stick vorbereiten kann. Von dem Stick bootet man den Thin Client dann und kann das Image einspielen.&lt;/p&gt;
&lt;p&gt;&lt;img alt="HP ThinUpdate" class="gallery-image" data-flex-basis="224px" data-flex-grow="93" height="713" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://secretmine.de/blog/2026/2026-03-31-hp-t430-os-thinpro-9/images/thinupdate.png" width="666"&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Randnotiz: Mit einem IODD-Gerät lässt sich ein USB-Laufwerk emulieren. ThinUpdate weigert sich zwar, das virtuelle Laufwerk als Ziel auszuwählen, man kann aber den Boot-Stick einmal so erstellen (einen normalen Stick nehmen und dann die Daten übertragen) und einzelne Images einfach als Datei übertragen.&lt;/em&gt;&lt;/p&gt;
&lt;h2 id="hp-thinpro-8"&gt;HP ThinPro 8
&lt;/h2&gt;&lt;p&gt;Bisher war HP ThinPro 8 das neuste OS für diesen Client. Das ist ein für Thin-Clients entwickeltes OS auf Linux-Basis, was abgesehen von Remote-Verbindungen diverser Art (RDP, Citrix, Omnissa Horizon und co) nicht viel kann.&lt;/p&gt;
&lt;p&gt;Das hat soweit auch funktioniert, war mir vom Booten her aber eher zu langsam und RDP war auch nicht komplett flüssig - das bin ich vom normalen Microsoft-Client aus anders gewohnt.&lt;/p&gt;
&lt;p&gt;&lt;img alt="HP ThinPro 8" class="gallery-image" data-flex-basis="426px" data-flex-grow="177" height="1080" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://secretmine.de/blog/2026/2026-03-31-hp-t430-os-thinpro-9/images/thinpro-8.jpg" srcset="https://secretmine.de/blog/2026/2026-03-31-hp-t430-os-thinpro-9/images/thinpro-8_hu_91002a0043d4cb06.jpg 800w, https://secretmine.de/blog/2026/2026-03-31-hp-t430-os-thinpro-9/images/thinpro-8_hu_ceb53327c3f476ca.jpg 1600w, https://secretmine.de/blog/2026/2026-03-31-hp-t430-os-thinpro-9/images/thinpro-8.jpg 1920w" width="1920"&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;(Ich habe nur für dieses Bild ThinPro 8 noch mal auf dem Thin Client installiert&amp;hellip;)&lt;/em&gt;&lt;/p&gt;
&lt;h2 id="hp-thinpro-9"&gt;HP ThinPro 9
&lt;/h2&gt;&lt;p&gt;Seit Anfang des Jahres gibt es nun ThinPro 9, was das ganze modernisiert. Die Features sehen grob gleich aus, aus meiner Sicht ist vor allem die Oberfläche etwas moderner. Die installierte Version vom RDP-Client ist neuer, trotzdem ist die Performance verbesserungswürdig.&lt;/p&gt;
&lt;p&gt;&lt;img alt="HP ThinPro 9" class="gallery-image" data-flex-basis="426px" data-flex-grow="177" height="1080" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://secretmine.de/blog/2026/2026-03-31-hp-t430-os-thinpro-9/images/thinpro-9.jpg" srcset="https://secretmine.de/blog/2026/2026-03-31-hp-t430-os-thinpro-9/images/thinpro-9_hu_9f762fb9eb003be5.jpg 800w, https://secretmine.de/blog/2026/2026-03-31-hp-t430-os-thinpro-9/images/thinpro-9_hu_4716401f374c4786.jpg 1600w, https://secretmine.de/blog/2026/2026-03-31-hp-t430-os-thinpro-9/images/thinpro-9.jpg 1920w" width="1920"&gt;&lt;/p&gt;
&lt;h2 id="windows-10"&gt;Windows 10
&lt;/h2&gt;&lt;p&gt;Als Alternative wollte ich Windows 10 testen, Windows 11 braucht noch mehr Ressourcen. Der Thin Client hat aber nur 2 GB RAM und 16 GB eMMC. Bei den 2 GB RAM kann ich wenig tun, beim Speicher gibt es aber natürlich immer irgendwelche Optionen.&lt;/p&gt;
&lt;p&gt;Generell gibt es den HP T430 auch in einer Version mit 4 GB RAM und 32 GB eMMC, die dann auch für Windows gedacht ist und damit ausgeliefert wird.&lt;/p&gt;
&lt;h3 id="klappt-es-mit-16-gb-vielleicht-trotzdem"&gt;Klappt es mit 16 GB vielleicht trotzdem?
&lt;/h3&gt;&lt;p&gt;Ein frisch installiertes Windows 10 braucht etwa 14 GB. Was gerade so noch passt. Aber spätestens nach Treibern (leider gibt es vom Intel Grafiktreiber keine &amp;ldquo;Lite-Version&amp;rdquo;) war hier Ende. Ich habe auch versucht, mit NTLite die Treiber und Updates direkt mit ins Image zu backen, aber das hat auch nicht geholfen.&lt;/p&gt;
&lt;h3 id="aufrüsten-vom-speicher"&gt;Aufrüsten vom Speicher
&lt;/h3&gt;&lt;p&gt;Bis auf den M.2-Slot für das WiFi-Modul gibt es im Inneren des T430 keinerlei verfügbare Schnittstellen, alles andere ist verlötet.&lt;/p&gt;
&lt;p&gt;Aber das reicht ja, WiFi-Module sind ja meistens über PCIe angebunden. Und für die Slots findet man günstig Adapter. Dementsprechend ist das eMMC-Modul aus meinem Steam Deck mit 64 GB in dem Slot gelandet. Das ist weiterhin nicht super üppig, aber reicht für ein schlankes Windows ohne nennenswert installierte Software mehr als aus.&lt;/p&gt;
&lt;p&gt;&lt;img alt="64GB eMMC-Modul mit Adapter im WiFi-Slot" class="gallery-image" data-flex-basis="279px" data-flex-grow="116" height="2148" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://secretmine.de/blog/2026/2026-03-31-hp-t430-os-thinpro-9/images/t430.jpg" srcset="https://secretmine.de/blog/2026/2026-03-31-hp-t430-os-thinpro-9/images/t430_hu_7b0fb7004a706a88.jpg 800w, https://secretmine.de/blog/2026/2026-03-31-hp-t430-os-thinpro-9/images/t430_hu_c0cc28cc01ad3de8.jpg 1600w, https://secretmine.de/blog/2026/2026-03-31-hp-t430-os-thinpro-9/images/t430_hu_90eeecc0fdd80932.jpg 2400w, https://secretmine.de/blog/2026/2026-03-31-hp-t430-os-thinpro-9/images/t430.jpg 2500w" width="2500"&gt;&lt;/p&gt;
&lt;h3 id="installation"&gt;Installation
&lt;/h3&gt;&lt;p&gt;Die Installation lief wie eine normale Windows-Installation abläuft. Nur eben etwas langsamer.&lt;/p&gt;
&lt;h3 id="benutzung"&gt;Benutzung
&lt;/h3&gt;&lt;p&gt;Man merkt schon, dass die CPU nicht viel kann. Nur das Öffnen der Einstellungen lastet den Prozessor zu 100% aus, auch Updates dauern länger als gewöhnlich. An die Nutzung als normalen Windows-Rechner braucht man kaum zu denken, dafür reichen die 2 GB RAM (von denen ca 1,5 GB nutzbar sind) und auch die CPU einfach nicht aus. Nur das Herunterladen und Installieren von Firefox hat schon deutlich mehr Zeit gekostet als üblich, normal Surfen ist schwierig.&lt;/p&gt;
&lt;p&gt;Als Client für MS RemoteDesktop oder auch Omnissa Horizon macht der T430 mit Windows aber tatsächlich eine gute Figur. Alles läuft so flüssig wie es soll und zumindest in meiner Umgebung läuft RDP spürbar besser als mit ThinPro.&lt;/p&gt;
&lt;p&gt;Vorteilhaft ist auch, dass man die normale Auswahl an Treibern zur Verfügung hat, damit kann ich eine alte USB-Grafikkarte auch problemlos am T430 betreiben. Game-Streaming mit Parsec geht damit theoretisch auch, praktisch habe ich es noch nicht getestet.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Windows 10" class="gallery-image" data-flex-basis="426px" data-flex-grow="177" height="1080" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://secretmine.de/blog/2026/2026-03-31-hp-t430-os-thinpro-9/images/windows.png" srcset="https://secretmine.de/blog/2026/2026-03-31-hp-t430-os-thinpro-9/images/windows_hu_1bc438e1acc42aee.png 800w, https://secretmine.de/blog/2026/2026-03-31-hp-t430-os-thinpro-9/images/windows_hu_1c6fdc005a08307b.png 1600w, https://secretmine.de/blog/2026/2026-03-31-hp-t430-os-thinpro-9/images/windows.png 1920w" width="1920"&gt;&lt;/p&gt;
&lt;p&gt;Wahrscheinlich bleibt es vorerst bei Windows 10. Vielleicht schaue ich, ob man Lizenzen für Windows 10 Enterprise IoT LTSC günstig findet, das wäre ja genau die passende Windows-Edition für einen Thin Client.&lt;/p&gt;
&lt;h2 id="boot-zeiten"&gt;Boot-Zeiten
&lt;/h2&gt;&lt;p&gt;Aus Interesse habe ich Boot-Zeiten verglichen. Ich habe jeweils zwei Messungen durchgeführt, die bis auf wenige Sekunden identisch waren. Gemessen habe ich durch Aufzeichnen des HDMI-Signals mit einer Capture-Card, von erstem Bild bis zum betriebsbereiten Thin-Client.&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th style="text-align: center"&gt;&lt;/th&gt;
					&lt;th style="text-align: center"&gt;Boot-Zeit&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td style="text-align: center"&gt;ThinPro 9 Onboard&lt;/td&gt;
					&lt;td style="text-align: center"&gt;58s&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: center"&gt;TinPro 9 eMMC&lt;/td&gt;
					&lt;td style="text-align: center"&gt;52s&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: center"&gt;Windows 10 eMMC&lt;/td&gt;
					&lt;td style="text-align: center"&gt;23s&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Die Ergebnisse finde ich durchaus spannend. Ich hätte einerseits erwartet, dass das eMMC-Modul vom Steam Deck die Boot-Zeiten deutlich verbesser (der interne Speicher hat wirklich niedrige Lese-/Schreibraten), andererseits hätte ich auch nicht gedacht, dass Windows grob doppelt so schnell bootet und einsatzbereit ist.&lt;/p&gt;
&lt;h2 id="fazit"&gt;Fazit
&lt;/h2&gt;&lt;p&gt;HPs ThinPro ist insgesamt die passendere Lösung für einen Thin Client, das funktioniert einfach. Für mich ist Windows hier aber das bessere OS, da es schneller einsatzbereit ist, besser mit anderen Geräten kompatibel ist (Treiber) und sich RDP auch einfach flüssiger anfühlt.&lt;/p&gt;</description></item><item><title>Storage-Cluster - Part 2: Erster PoC und Planänderungen</title><link>https://secretmine.de/blog/2026/2026-03-28-storage-cluster-poc-und-planaenderungen/</link><pubDate>Sat, 28 Mar 2026 00:00:00 +0000</pubDate><guid>https://secretmine.de/blog/2026/2026-03-28-storage-cluster-poc-und-planaenderungen/</guid><description>&lt;h1 id="storage-cluster---ein-erster-poc"&gt;Storage-Cluster - Ein erster PoC
&lt;/h1&gt;&lt;p&gt;Der Plan sieht Futro S740er mit SATA-Controllern vor. Einen entsprechenden Controller auf Basis des ASM1166 (energieeffizienter und gut unterstützter SATA-Controller) habe ich gekauft und mit einem NVMe-Adapter verbaut.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Proof of Concept" class="gallery-image" data-flex-basis="229px" data-flex-grow="95" height="2000" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://secretmine.de/blog/2026/2026-03-28-storage-cluster-poc-und-planaenderungen/images/storage_poc.jpg" srcset="https://secretmine.de/blog/2026/2026-03-28-storage-cluster-poc-und-planaenderungen/images/storage_poc_hu_1b3a6d9d9ab42c7c.jpg 800w, https://secretmine.de/blog/2026/2026-03-28-storage-cluster-poc-und-planaenderungen/images/storage_poc_hu_2fb146a9c9fd2dbc.jpg 1600w, https://secretmine.de/blog/2026/2026-03-28-storage-cluster-poc-und-planaenderungen/images/storage_poc.jpg 1915w" width="1915"&gt;&lt;/p&gt;
&lt;p&gt;Zugegeben, der PoC sieht etwas wild aus. Am HBA hängen drei SSDs, den Strom bekommen die SSDs über USB zu SATA-Strom-Adapter. Das funktioniert, da 2,5-Zoll-Laufwerke normalerweise nur 5V und keine 12V benötigen, SATA hat eigentlich auch 12V anliegen.&lt;/p&gt;
&lt;p&gt;Auf dem Futro läuft Proxmox, der Thin Client ist in meinen normalen Cluster eingebunden.&lt;/p&gt;
&lt;h2 id="ergebnisse-vom-poc"&gt;Ergebnisse vom PoC
&lt;/h2&gt;&lt;p&gt;Erst habe ich Ceph getestet. Hier hat sich schnell gezeigt, dass 4GB RAM für Ceph einfach zu wenig ist. Das ist schade, da ich Ceph eigentlich gerne genutzt hätte. Es war aber absehbar, dass das nicht klappt.&lt;/p&gt;
&lt;p&gt;Ohne Proxmox und weitere Services würde es vermutlich knapp passen, es ist mir allerdings zu heikel.&lt;/p&gt;
&lt;h2 id="alternative-zu-ceph"&gt;Alternative zu Ceph
&lt;/h2&gt;&lt;p&gt;Ich brauche eine Lösung, die halbwegs brauchbare IOPS liefern kann. SaunaFS ist zwar sehr flexibel und kann natürlich auch Replikation, erreicht aber nicht die IOPS-Werte, die ich benötige.&lt;/p&gt;
&lt;p&gt;Daher kommt vorerst GlusterFS zum Einsatz, das benutze ich auch jetzt schon für meinen Docker Swarm für persistenten Speicher. GlusterFS ist sehr viel schlanker als Ceph, allerdings auch langsamer und insgesamt schlechter zu administrieren. Ob es tatsächlich die bessere Wahl für mich ist wird sich mit der Zeit zeigen.&lt;/p&gt;
&lt;h2 id="wie-es-weitergeht"&gt;Wie es weitergeht
&lt;/h2&gt;&lt;p&gt;Ich habe die weitere Hardware für den Cluster hier schon liegen, von daher dürfte zeitnahe auch der Post zum vollständigen Setup kommen. Nebenbei bin ich dabei, Ansible-Rollen für die diversen Services zu entwickeln, da ich keine Lust habe, das meiste von Hand zu machen.&lt;/p&gt;
&lt;p&gt;Auch habe ich ein 3D-Modell für eine alternative Abdeckung mit großer Öffnung für die SATA-Kabel erstellt, das habe ich auch schon gedruckt und getestet. Damit kann ich die Futros trotzdem schließen und muss die originale Abdeckung nicht beschädigen.&lt;/p&gt;
&lt;p&gt;Zusätzlich habe ich auch ein Modell erstellt, was als Halterung für die Futros und die SSDs/HDDs dient. Davon passen dann auch drei nebeneinander in ein Kallax-Fach. Das dürfte insgesamt für mehr Ordnung sorgen und trotzdem Zugriff zu allem ermöglichen.&lt;/p&gt;</description></item><item><title>Code-Server</title><link>https://secretmine.de/blog/2026/2026-03-21-code-server/</link><pubDate>Sat, 21 Mar 2026 00:00:00 +0000</pubDate><guid>https://secretmine.de/blog/2026/2026-03-21-code-server/</guid><description>&lt;p&gt;Ich nutze für meinen Blog mittlerweile Code-Server zum Schreiben und Bearbeiten der Beiträge. Da sich das für mich als überaus praktisch herausgestellt hat, möchte ich die Lösung hier einmal vorstellen.&lt;/p&gt;
&lt;h2 id="hintergrund"&gt;Hintergrund
&lt;/h2&gt;&lt;p&gt;Dieser Blog basiert auf Hugo, einem Static Site Generator. Ich habe ein Git-Repo, wo der gesamte Content (und natürlich Dinge wie CI-Files) enthalten sind. Bislang habe ich auf jedem Rechner, wo ich am Blog arbeiten möchte, Visual Studio Code und Hugo (sowie ein paar weitere Tools dafür) installiert. Ich musste auch immer daran denken, im Repo zu committen und zu pushen, wenn ich an einem anderen Rechner weiterarbeiten wollte. Das hat mehrfach dazu geführt, dass ich Merge-Konflikte hatte und auf verschiedenen Rechnern verschiedene Stände.&lt;/p&gt;
&lt;h2 id="meine-lösung"&gt;Meine Lösung
&lt;/h2&gt;&lt;p&gt;Ich kenne Code-Server schon einige Zeit und habe es in anderem Kontext schon verwendet. Letztendlich handelt es sich &amp;ldquo;einfach nur&amp;rdquo; um ein VS Code im Webbrowser, was auf einem Server läuft. Das habe ich in einem LXC installiert, daneben natürlich noch die notwendigen Tools wie Hugo.
Als Reverse-Proxy sitzt Caddy dazwischen, die Authentifizierung bzw. Absicherung ist über Forward-Auth zusammen mit Authentik gelöst. Damit kann ich sicher von überall auf den Code-Server zugreifen und an meinem Blog schreiben und bin nicht vom Rechner selbst abhängig.&lt;/p&gt;
&lt;h3 id="proxy-für-preview"&gt;Proxy für Preview
&lt;/h3&gt;&lt;p&gt;Standardmäßig lassen sich auf einem Subpfad von Code-Server freigegebene Ports (z.B. der integrierte Preview-Server von Hugo) unter &lt;code&gt;/proxy/&amp;lt;port&amp;gt;&lt;/code&gt; aufrufen. Hugo hat hier allerdings ein Problem, da der Subpfad für Hugo nicht sichtbar ist. Damit laden Assets wie CSS und JS nicht.&lt;/p&gt;
&lt;p&gt;Abhilfe schafft hier die Nutzung von &lt;code&gt;/absproxy/&amp;lt;port&amp;gt;&lt;/code&gt;, in Verbindung mit den Argumenten &lt;code&gt;--baserURL=https://coder.local/absproxy/1313/ --appendPort=false&lt;/code&gt; beim Aufruf von Hugo, damit einerseits der Subpfad vor Hugo nicht versteckt wird und andererseits Hugo für die Nutzung auf diesem Subpfad konfiguriert wird.&lt;/p&gt;
&lt;h2 id="fazit"&gt;Fazit
&lt;/h2&gt;&lt;p&gt;Der neue Workflow funktioniert für mich wirklich gut, ich kann auch während der Schreibphase für einen neuen Post problemlos zwischen Rechnern wechseln und habe immer die selbe Codebasis zur Verfügung. Das hat den Overhead durch genannte Merge-Konflikte (oder das Hochfahren von einem anderen Rechner, um die Änderungen noch ins Repo zu schreiben) spürbar reduziert.&lt;/p&gt;
&lt;p&gt;Ob das auf Dauer gut funktioniert weiß ich nicht, aber es sind mittlerweile 4 Monate, seit dem ich Code-Server nutze. Code-Server lässt sich auch für vieles anderes (und deutlich aufwändigeres) nutzen, als ich hier tue.&lt;/p&gt;</description></item><item><title>Lokales Multiroom-Audio Part 2 - Wechsel zu Snapcast</title><link>https://secretmine.de/blog/2026/2026-03-13-snapcast/</link><pubDate>Fri, 13 Mar 2026 00:00:00 +0000</pubDate><guid>https://secretmine.de/blog/2026/2026-03-13-snapcast/</guid><description>&lt;p&gt;Bisher hatte ich für das lokale Multiroom-Audio-Setup &lt;a class="link" href="https://secretmine.de/blog/2025/2025-07-29-lyrion-music-server-und-squeezelite/" &gt;Lyrion Music Server&lt;/a&gt; im Einsatz. Grundsätzlich funktioniert das - es gibt allerdings einige Punkte, die mich stören.&lt;/p&gt;
&lt;h2 id="was-mir-fehlt-bzw-was-mich-stört"&gt;Was mir fehlt bzw. was mich stört
&lt;/h2&gt;&lt;h3 id="spotify-connect"&gt;Spotify Connect
&lt;/h3&gt;&lt;p&gt;Das Lyrion-Plugin für Spotify hatte ursprünglich Unterstützung für Spotify Connect, auch wenn das schon immer eher hakelig war und schnell die Verbindung verloren hat. Dieses Feature musste der Entwickler vom Plugin allerdings irgendwann entfernen, seit dem ist die Wiedergabe nur noch über LMS selbst möglich. Auf diesem Weg lässt sich zwar immer noch Musik von Spotify wiedergeben, trotzdem ist es deutlich schneller und angenehmer, einfach von der Spotify-App aus das Audio-Setup als Ziel auswählen zu können. Dieser Umweg hat auch dafür gesorgt, dass meine Partnerin das Soundsystem alleine ungefähr nie benutzt.&lt;/p&gt;
&lt;h3 id="synchronisierung"&gt;Synchronisierung
&lt;/h3&gt;&lt;p&gt;Die Synchronisierung von Lautsprechern funktioniert generell gut. Bei Verbindungsproblemen wird bei LMS allerdings die Wiedergabe auf allen Lautsprechern kurz unterbrochen. Snapcast lässt alle anderen Lautsprecher weiterlaufen, der Lautsprecher mit Verbindungsproblemen synchronisiert sich dann selbst wieder zum Rest. Die Aussetzer betreffen also nur den Player, der die Verbindungsprobleme hat.&lt;/p&gt;
&lt;h3 id="zu-viele-features"&gt;Zu viele Features
&lt;/h3&gt;&lt;p&gt;Wir brauchen zuhause eigentlich nur Spotify Connect. Lyrion bringt ein eigenes WebUI inkl. Verwaltungsmöglichkeiten für eine eigene Mediathek mit, das brauchen wir nicht. Snapcast ist insgesamt spürbar schlanker und braucht weniger Ressourcen.&lt;/p&gt;
&lt;h2 id="das-neue-setup"&gt;Das neue Setup
&lt;/h2&gt;&lt;p&gt;Bisher hatte ich bei den drei Playern jeweils piCorePlayer im Einsatz, das ist eine minimalistische Linux-Distribution speziell für die Nutzung eines Raspberry Pis für Squeezelite bzw. Lyrion Music Server. LMS selbst lief in Docker in einem LXC, mit einer Squeezelite-Instanz daneben für lokale Wiedergabe.&lt;/p&gt;
&lt;h3 id="server"&gt;Server
&lt;/h3&gt;&lt;p&gt;Der Server ist ein Debian 13 mit installiertem &lt;code&gt;snapserver&lt;/code&gt;. Librespot für Spotify Connect habe ich aus den Quellen selbst kompiliert, um eine möglichst neue Version zu haben. Ich habe zusätzlich noch &lt;code&gt;snapweb&lt;/code&gt; installiert, das ist ein moderner Webclient für Snapserver, der vor allem Gruppierung und Lautstärkeregelung ermöglicht und für Mobilgeräte optimiert ist. Damit entfällt die Notwendigkeit einer eigenen App für die Steuerung.&lt;/p&gt;
&lt;p&gt;Meine Konfiguration sieht wie folgt aus (&lt;code&gt;/etc/snapserver.conf&lt;/code&gt;):&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[server]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[http]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;enabled = true
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;doc_root = /usr/share/snapweb # for snapweb
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[tcp-control]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;enabled = true
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[stream]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;source = pipe:///tmp/snapfifo?name=default
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;source = librespot:///librespot?name=Spotify%201&amp;amp;devicename=Home%201&amp;amp;bitrate=320&amp;amp;volume=90
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;source = librespot:///librespot?name=Spotify%202&amp;amp;devicename=Home%202&amp;amp;bitrate=320&amp;amp;volume=90
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[streaming_client]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;initial_volume = 80
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Die Config ist generell sehr minimal gehalten. Für Spotify Connect habe ich zwei Quellen definiert, damit beispielsweise ich im Arbeitszimmer und meine Partnerin im Wohnzimmer verschiedene Musik hören können.&lt;/p&gt;
&lt;h3 id="clients"&gt;Clients
&lt;/h3&gt;&lt;h4 id="thin-clients"&gt;Thin-Clients
&lt;/h4&gt;&lt;p&gt;Im Arbeitszimmer stehen an beiden Arbeitsplätzen Lautsprecher, diese sind mit je einem meiner Thin-Clients (Futro S740) verbunden. Der eine &lt;code&gt;snapclient&lt;/code&gt; läuft im selben LXC wie der Server, ich habe die Audiogeräte dafür durchgereicht. Für den zweiten läuft ein weiterer LXC, der eigentlich nur &lt;code&gt;snapclient&lt;/code&gt; installiert hat.&lt;/p&gt;
&lt;p&gt;Die Config (&lt;code&gt;/etc/defaults/snapclient&lt;/code&gt;):&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;SNAPCLIENT_OPTS=&amp;#34;--hostID arbeitszimmer-1 --soundcard hw:CARD=PCH,DEV=0 tcp://[Snapserver-IP]&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h4 id="raspberry-pis"&gt;Raspberry Pis
&lt;/h4&gt;&lt;p&gt;Hier bin ich einen anderen Weg gegangen als vorher. Alle drei Pis haben Raspberry Pi OS Lite bekommen, also die Variante ohne GUI.&lt;/p&gt;
&lt;p&gt;Auch hier ist Snapclient installiert, die Config sieht minimal anders aus (&lt;code&gt;/etc/defaults/snapclient&lt;/code&gt;):&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;SNAPCLIENT_OPTS=&amp;#34;--soundcard plug:plugequal --hostID wohnzimmer tcp://[Snapserver-IP]&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Das Zielgerät ist hier ein virtuelles Gerät von Alsa, um über den Equalizer Korrekturen vornehhmen zu können.&lt;/p&gt;
&lt;p&gt;Daher sieht die Konfiguration für Alsa so aus (&lt;code&gt;/etc/asound.conf&lt;/code&gt;):&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-js" data-lang="js"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;ctl&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;equal&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;equal&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;pcm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;plugequal&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;equal&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;slave&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;pcm&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;plughw:CARD=Audio,DEV=0&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;pcm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;equal&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;plug&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;slave&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;pcm&lt;/span&gt; &lt;span class="nx"&gt;plugequal&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Die Steuerung vom Equalizer ist via &lt;code&gt;sudo -u snapclient alsamixer -D equal&lt;/code&gt; möglich.&lt;/p&gt;
&lt;h5 id="relais-für-verstärker"&gt;Relais für Verstärker
&lt;/h5&gt;&lt;p&gt;An zwei Pis hängt an den GPIOs jeweils ein Relais, was einen Verstärker steuert. piCorePlayer hatte native Unterstützung dafür, dort musste ich nur den GPIO-Pin einstellen. Für Snapcast brauchte ich eine eigene Lösung.&lt;/p&gt;
&lt;p&gt;Das Ergebnis ist ein kleines Script, was in Dauerschleife prüft, ob auf einer Soundkarte Audio abgespielt wird und darüber einen GPIO-Output steuert.&lt;/p&gt;
&lt;p&gt;Das Script liegt bei mir unter &lt;code&gt;/usr/local/bin/amp-control.sh&lt;/code&gt;.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;span class="lnt"&gt;24
&lt;/span&gt;&lt;span class="lnt"&gt;25
&lt;/span&gt;&lt;span class="lnt"&gt;26
&lt;/span&gt;&lt;span class="lnt"&gt;27
&lt;/span&gt;&lt;span class="lnt"&gt;28
&lt;/span&gt;&lt;span class="lnt"&gt;29
&lt;/span&gt;&lt;span class="lnt"&gt;30
&lt;/span&gt;&lt;span class="lnt"&gt;31
&lt;/span&gt;&lt;span class="lnt"&gt;32
&lt;/span&gt;&lt;span class="lnt"&gt;33
&lt;/span&gt;&lt;span class="lnt"&gt;34
&lt;/span&gt;&lt;span class="lnt"&gt;35
&lt;/span&gt;&lt;span class="lnt"&gt;36
&lt;/span&gt;&lt;span class="lnt"&gt;37
&lt;/span&gt;&lt;span class="lnt"&gt;38
&lt;/span&gt;&lt;span class="lnt"&gt;39
&lt;/span&gt;&lt;span class="lnt"&gt;40
&lt;/span&gt;&lt;span class="lnt"&gt;41
&lt;/span&gt;&lt;span class="lnt"&gt;42
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#!/bin/bash
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;GPIO&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;14&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;CHECK_INTERVAL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;POWER_ON_DELAY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;3&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;IDLE_TIMEOUT&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;30&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;amp_on&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;last_audio&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;audio_detected&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;pinctrl &lt;span class="nb"&gt;set&lt;/span&gt; &lt;span class="nv"&gt;$GPIO&lt;/span&gt; op
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;pinctrl &lt;span class="nb"&gt;set&lt;/span&gt; &lt;span class="nv"&gt;$GPIO&lt;/span&gt; dl
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;while&lt;/span&gt; true&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; grep -q RUNNING /proc/asound/card*/pcm*/sub*/status&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;audio_detected&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;last_audio&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;date +%s&lt;span class="k"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;else&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;audio_detected&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;fi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;now&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;date +%s&lt;span class="k"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# Amp einschalten&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[[&lt;/span&gt; &lt;span class="nv"&gt;$audio_detected&lt;/span&gt; -eq &lt;span class="m"&gt;1&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nv"&gt;$amp_on&lt;/span&gt; -eq &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="o"&gt;]]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; pinctrl &lt;span class="nb"&gt;set&lt;/span&gt; &lt;span class="nv"&gt;$GPIO&lt;/span&gt; dh
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;amp_on&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; sleep &lt;span class="nv"&gt;$POWER_ON_DELAY&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;fi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# Amp ausschalten&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[[&lt;/span&gt; &lt;span class="nv"&gt;$amp_on&lt;/span&gt; -eq &lt;span class="m"&gt;1&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="k"&gt;$((&lt;/span&gt;now-last_audio&lt;span class="k"&gt;))&lt;/span&gt; -gt &lt;span class="nv"&gt;$IDLE_TIMEOUT&lt;/span&gt; &lt;span class="o"&gt;]]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; pinctrl &lt;span class="nb"&gt;set&lt;/span&gt; &lt;span class="nv"&gt;$GPIO&lt;/span&gt; dl
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;amp_on&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;fi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; sleep &lt;span class="nv"&gt;$CHECK_INTERVAL&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;done&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Dazu gehört natürlich dann auch ein Systemd-Service, damit das ganze beim Systemstart mitstartet. Der Service liegt unter &lt;code&gt;/etc/systemd/system/amp-control.service&lt;/code&gt;.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[Unit]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Description=Snapclient Amp Control
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;After=snapclient.service
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[Service]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ExecStart=/usr/local/bin/amp-control.sh
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Restart=always
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[Install]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;WantedBy=multi-user.target
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h5 id="read-only-root"&gt;Read-Only-Root
&lt;/h5&gt;&lt;p&gt;Nach der fertigen Konfiguration habe ich die SD-Karte via &lt;code&gt;overlayfs&lt;/code&gt; als Read-Only gemoutet, damit das System das Trennen vom Strom problemlos übersteht. Das geht einfach via &lt;code&gt;raspi-config&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id="fazit"&gt;Fazit
&lt;/h2&gt;&lt;p&gt;Ich habe Snapcast jetzt seit wenigen Wochen im Einsatz, bisher bin ich zufrieden damit. Nach dem initialen Setup musste ich mich nicht mehr darum kümmern, Spotify Connect läuft auch sehr zuverlässig damit.&lt;/p&gt;</description></item><item><title>Planka - einfach nur Kanban</title><link>https://secretmine.de/blog/2026/2026-03-08-planka/</link><pubDate>Sun, 08 Mar 2026 00:00:00 +0000</pubDate><guid>https://secretmine.de/blog/2026/2026-03-08-planka/</guid><description>&lt;blockquote class="alert alert-note"&gt;
 &lt;div class="alert-header"&gt;
 &lt;span class="alert-icon"&gt;📝&lt;/span&gt;
 &lt;span class="alert-title"&gt;Hinweis&lt;/span&gt;
 &lt;/div&gt;
 &lt;div class="alert-body"&gt;
 &lt;p&gt;Dieser Post entspricht nicht mehr dem aktuellen Stand, mehr dazu &lt;a class="link" href="https://secretmine.de/blog/2026/2026-08-10-planka-keine-empfehlung-mehr/" &gt;hier&lt;/a&gt;&lt;/p&gt;
 &lt;/div&gt;
 &lt;/blockquote&gt;
&lt;p&gt;Ich war lange auf der Suche nach einer ToDo-Lösung für mich.&lt;/p&gt;
&lt;h2 id="ein-bisschen-historie"&gt;Ein bisschen Historie
&lt;/h2&gt;&lt;p&gt;Ganz früher habe ich Wunderlist verwendet (heute Microsoft Todo), das hat aber nicht sonderlich lange funktioniert. Dann hatte ich über mehrere Jahre einen eigenen Jira-Server - das lief soweit gut, war aber für den normalen Alltag so viel Overkill wie nur geht. Klar, die Integration mit Confluence und auch die mobilen Apps dazu waren gut, trotzdem ist Jira eher für größeres Projektmanagement als für die eigene ToDo gebaut. Und die Server-Lizenzen für wenige Dollar gibts auch schon lange nicht mehr, Atlassian stellt die selbst hostbaren Produkte ja nach und nach komplett ein. Also zurück zu Microsoft Todo. Das war aber irgendwie immernoch nicht das Wahre. Auf der Suche nach einer weiteren neuen Lösung habe ich mir dann einige Softwareprodukte angesehen. Und gelandet bin ich am Ende bei Planka.&lt;/p&gt;
&lt;h2 id="was-kann-planka"&gt;Was kann Planka?
&lt;/h2&gt;&lt;p&gt;Ganz ehrlich? Nicht viel. Planka kann Kanban-Boards, genau dafür ist es entwickelt worden. Und abseits davon gibts auch nicht viel zu sehen. Aber die Boards sind übersichtlich, Planka braucht eher wenig Ressourcen, lässt sich mit SSO gut integrieren, hat fürs Handy zumindest die Möglichkeit für eine PWA und &lt;em&gt;just works&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Im Vergleich zu anderen Kanban-Lösungen ist Planka minimalistisch gehalten und konzentriert sich auf den Kerngedanken. Gefällt mir gut.&lt;/p&gt;
&lt;h2 id="wie-nutze-ich-planka"&gt;Wie nutze ich Planka?
&lt;/h2&gt;&lt;p&gt;Ich habe ein großes Board, mit Spalten für Irgendwann, Zeitnahe, Morgen, Heute, In Arbeit, Blocked und Fertig. Das ist also angelehnt an klassisches Kanban, aber mehr auf die Nutzung als persönliche ToDo getrimmt. Das ganze ist mit einer eigenen Software (&lt;a class="link" href="https://secretmine.de/blog/2025/2025-09-20-plankaprinter-bondrucker/" &gt;Plankaprinter&lt;/a&gt;) auch halbwegs automatisiert und bindet z.B. meinen Kalender an (und druckt ToDos für heute automatisch auf einem Kassenbondrucker aus). Dadurch kann ich auch sagen, dass sich die API gut nutzen lässt.&lt;/p&gt;
&lt;p&gt;Ich habe Planka als Web-App auf allen Rechnern &amp;ldquo;installiert&amp;rdquo;, auf dem Handy genauso. Die mobile Nutzung ist nicht perfekt, aber brauchbar.&lt;/p&gt;
&lt;p&gt;Das ganze funktioniert so gut, dass meine Partnerin jetzt ebenfalls von Microsoft Todo zu Planka gewechselt hat und Planka einer der zentralen Dienste neben Nextcloud und HomeAssistant geworden ist.&lt;/p&gt;
&lt;h2 id="was-fehlt-mir"&gt;Was fehlt mir?
&lt;/h2&gt;&lt;p&gt;Zugegeben, das neue Planka v2 habe ich mir noch nicht großartig angeschaut. Daher bezieht sich alles auf v1.&lt;/p&gt;
&lt;p&gt;Die mobile Nutzung ist nicht optimal. Vor allem die Meldung, dass die Serververbindung unterbrochen wurde, nachdem man die &amp;ldquo;App&amp;rdquo; eine Weile nicht benutzt hat, nervt. Verschieben von Karten funktioniert, teilweise scrollt der Ausschnitt aber zu weit zur Seite und man trifft nicht die korrekte Spalte.&lt;/p&gt;
&lt;p&gt;Auch das, was bei Jira die Epics sind, fehlt mir ein wenig. Also größere Aufgaben, zu der dann mehrere Karten gehören. Aber das ist eben nicht das Ziel von Planka, es ist kein volles Projektmanagement-Tool.&lt;/p&gt;
&lt;p&gt;Ansonsten wüsste ich aber nicht viel. Eigentlich funktioniert Planka wirklich solide.&lt;/p&gt;
&lt;h2 id="fazit"&gt;Fazit
&lt;/h2&gt;&lt;p&gt;Planka hat sich jetzt über mehrere Monate hinweg als hilfreich für die eigene Organisation erwiesen. Es kann genug (aber auch nicht zu viel), um als Kanban-Lösung für den Zweck ziemlich gut zu passen. Was will man mehr?&lt;/p&gt;</description></item><item><title>Storage-Cluster - Part 1: Der Plan</title><link>https://secretmine.de/blog/2026/2026-02-28-storage-cluster-der-plan/</link><pubDate>Sat, 28 Feb 2026 00:00:00 +0000</pubDate><guid>https://secretmine.de/blog/2026/2026-02-28-storage-cluster-der-plan/</guid><description>&lt;h1 id="storage-cluster---der-plan"&gt;Storage-Cluster - der Plan
&lt;/h1&gt;&lt;p&gt;Wer regelmäßig mit Virtualisierung, Containern und Selfhosting arbeitet, kennt das Problem: der Storage wächst einem über den Kopf. Auch bei mir sind die bisherigen Nodes inzwischen so stark ausgelastet, dass für größere Storage-Aufgaben schlicht kein Platz mehr ist. Zeit also für den nächsten Ausbauschritt in meinem Homelab – ein (weitestgehend) dedizierter, energieeffizienter und möglichst robuster Storage-Cluster.&lt;/p&gt;
&lt;h2 id="das-ziel"&gt;Das Ziel
&lt;/h2&gt;&lt;p&gt;Wie auch in größeren IT-Projekten üblich, beginnt alles mit der Zielsetzung bzw. der Erfassung der Anforderungen.&lt;/p&gt;
&lt;p&gt;Ich brauche einerseits Storage, der schnell ist und den Ausfall einer von drei geplanten Nodes verkraftet, andererseits Massenspeicher für z.B. Medien, LXC-Templates, ISOs und co, der nicht hochverfügbar sein muss und auch nicht die selben Geschwindigkeiten erreichen muss. Auf dem schnellen Speicher sollen wichtige VMs/LXCs liegen (bspw. DNS und HomeAssistant), daneben soll dieser Bereich auch als Speicher für Docker Swarm dienen.&lt;/p&gt;
&lt;p&gt;Am liebsten hätte ich hier natürlich vollständige Hochverfügbarkeit, also keinen einzelnen Single-Point-of-Failure (redundantes Netzwerk, redundante Stromversorgung, &amp;hellip;). Das ist für Zuhause aber einerseits overkill und andererseits weder finanziell noch energetisch sinnvoll. Daher möchte ich eine möglichst gute Verfügbarkeit erreichen, ohne dabei komplett in den Enterprise-Bereich vorzudringen.&lt;/p&gt;
&lt;p&gt;Die bisherigen Nodes sind mit ihren eigentlichen Aufgaben zu stark ausgelastet, um hier sinnvoll auch noch Storage machen zu können. Das ist so gerade zwar im Einsatz, ich merke allerdings, dass ich mich damit zu nahe an der Grenze bewege.&lt;/p&gt;
&lt;h2 id="der-plan"&gt;Der Plan
&lt;/h2&gt;&lt;p&gt;Ich habe über die letzten Wochen einen Plan erarbeitet, PoCs aufgesetzt und vieles ausprobiert. Bisher ist der Cluster noch nicht aufgebaut, aber ich denke, dass ich mit der Auswahl an Hardware und Software mein Ziel erreiche.&lt;/p&gt;
&lt;h3 id="hardware-natürlich-thin-clients"&gt;Hardware. Natürlich Thin-Clients
&lt;/h3&gt;&lt;p&gt;Die Hardwarebasis bilden drei Fujitsu Futro S740 Thin Clients. Dass ich die Dinger mag, ist bekannt. Die Wahl fiel auf dieses Modell, da es günstig ist, sehr energieeffizient läuft und genügend Erweiterungsmöglichkeiten bietet. Der Plan ist hierbei, in der ersten Ausbaustufe den WiFi-Slot für einen SATA-Controller zu nutzen. Später soll der SATA-Controller dann in den SSD-Slot (der laut Internet neben SATA auch PCIe-Anbindung hat) wandern und der WiFi-Slot für eine 2,5 GBit/s Netzwerkkarte genutzt werden.&lt;/p&gt;
&lt;p&gt;Geplanter Ausbau pro Node:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;4 GB RAM&lt;/li&gt;
&lt;li&gt;1x 16/32GB für das OS (meistens dabei)&lt;/li&gt;
&lt;li&gt;1× 480 GB SSD (für Ceph)&lt;/li&gt;
&lt;li&gt;1× 1 TB HDD (für SaunaFS oder Alternativen)&lt;/li&gt;
&lt;li&gt;SATA-Controller über den WiFi-Slot (Adapterlösung)&lt;/li&gt;
&lt;li&gt;Später Upgrade auf 2,5 Gbit/s LAN&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Das Netzwerk wird anfangs über meine bestehende 1 GBit/s-Infrastruktur gelöst, später ist hier ein zusätzlicher 2,5 GBit/s Switch geplant. Ich rechne ohne Datenträger mit Kosten von ca 75 € pro Knoten, was ich für nicht viel halte. Ohne Datenträger bekomme ich damit für etwas über 200 € einen weitestgehend redundanten Storage-Cluster.&lt;/p&gt;
&lt;h3 id="software"&gt;Software
&lt;/h3&gt;&lt;p&gt;Für den Storage-Cluster sollen zwei Software-Lösungen zum Einsatz kommen. Ceph wird für den schnellen Speicher genutzt, der Massenspeicher wird nach aktuellem Stand auf SaunaFS aufbauen. Ceph habe ich ausgesucht, da es von Proxmox nativ unterstützt wird und dort sogar gut integriert ist. Neben Blockspeicher kann ich dort über CephFS auch Freigaben auf Dateiebene erzeugen, was ich für Docker Swarm benötige. Es ist zudem performant und im Enterprise-Bereich stark vertreten. Für den langsameren Speicher habe ich lange überlegt, was ich nutzen möchte. Erst hatte ich GlusterFS vorgesehen. Mittlerweile habe ich mich hier aber umentschieden und möchte SaunaFS einsetzen. Das ist ein Fork von LizardFS, was wiederum ein Fork von MooseFS ist. Es ist für verteilten Massenspeicher ausgelegt, hat eher wenig Overhead und bietet sogar die Option, die Anzahl der Replikas pro Ordner festzulegen.&lt;/p&gt;
&lt;p&gt;Auf jedem der Futros wird dementsprechend Proxmox VE installiert und die Nodes in den bisherigen Cluster eingefügt. Die SSDs werden als OSDs für Ceph genutzt, die zusätzlichen Datenträger dann als Mountpoints an einen LXC pro Node angebunden. Dort wird dann SaunaFS installiert. SaunaFS kann ich aufgrund der Voraussetzung von Ubuntu als OS leider nicht direkt auf den Knoten installieren, die Variante mit SaunaFS habe ich jetzt aber auch schon eine Weile im Haupt-Cluster im Testbetrieb erfolgreich genutzt.&lt;/p&gt;
&lt;p&gt;Das SaunaFS-Volume wird dann von einem Knoten via Samba und NFS freigegeben. Das hat den Hintergrund, dass es mit vielen Dingen kompatibel ist und sich so z.B. auch in Proxmox als Speicher für Templates und ISOs gut einbinden lässt.&lt;/p&gt;
&lt;h2 id="weitere-ideen-und-mögliche-dienste"&gt;Weitere Ideen und mögliche Dienste
&lt;/h2&gt;&lt;p&gt;Wenn die Performance passt, sollen auf dem Storage-Cluster später auch leichte Dienste laufen und damit die bestehenden Nodes etwas entlastet werden. Kandidaten dafür sind Dinge wie der Proxmox Backup Server oder auch Komponenten von meinem Monitoring-Stack.&lt;/p&gt;
&lt;p&gt;Ob das mit 4 GB RAM pro Node praktikabel ist, wird sich erst zeigen - mehr RAM kaufen ist aber aufgrund der Lage am Markt gerade keine Option.&lt;/p&gt;
&lt;h2 id="nächste-schritte"&gt;Nächste Schritte
&lt;/h2&gt;&lt;p&gt;Ich habe Hardware bestellt, um einen Futro mal mit einem SATA-Controller auszustatten und damit schonmal als Storage (ohne Ceph oder Replikation oder so) einzusetzen. Das dient als erster Test. Wenn das so funktioniert, wie ich mir das vorstelle, werden weitere Futro S740er gekauft und der Cluster aufgebaut.&lt;/p&gt;
&lt;p&gt;Ich nehme dafür den Futro, den ich eigentlich für den 3D-Drucker gekauft hatte. Dort kommt einfach wieder der S520 hin. Das bietet sich an, da ich für den 3D-Drucker wenig Leistung brauche, der Futro S520 eh nichts zu tun hat und ich so gut etwas Geld sparen kann.&lt;/p&gt;</description></item><item><title>Authentifizierung und Single-Sign-On im Homelab mit Authentik</title><link>https://secretmine.de/blog/2026/2026-02-22-authentifizierung-und-sso-im-homelab-mit-authentik/</link><pubDate>Sun, 22 Feb 2026 00:00:00 +0000</pubDate><guid>https://secretmine.de/blog/2026/2026-02-22-authentifizierung-und-sso-im-homelab-mit-authentik/</guid><description>&lt;p&gt;Zentrale Authentifizierung bringt selbst im Homelab klare Vorteile: Einmalige Anmeldung spart Zeit, erhöht die Sicherheit durch weniger Passwörter und erleichtert die Verwaltung von Zugriffsrechten – perfekt für ein Homelab mit vielen Services. Nebenbei bekommt man damit auch Anwendungen, die zwar SSO können, aber keine Multifaktorauthentisierung beherrschen, mit MFA ausgestattet.&lt;/p&gt;
&lt;h2 id="vorteile-gegenüber-anderen-lösungen-keycloak"&gt;Vorteile gegenüber anderen Lösungen (Keycloak)
&lt;/h2&gt;&lt;p&gt;Ich hatte früher Keycloak im Einsatz, was mir aber aufgrund seiner Komplexität im Homelab einfach zu überladen war. Keycloak kann sicherlich mehr als Authentik (denke ich zumindest), ist für mich zuhause allerdings overkill. Authentik ist zwar auch nicht trivial, trotzdem empfinde ich die Konfiguration als angenehmer. Für mich ist der Hauptzweck im Homelab OpenID Connect (OIDC), andere Protokolle wie SAML spielen bei mir keine Rolle.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Admin-Oberfläche von Authentik" class="gallery-image" data-flex-basis="460px" data-flex-grow="191" height="800" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://secretmine.de/blog/2026/2026-02-22-authentifizierung-und-sso-im-homelab-mit-authentik/images/admin.png" srcset="https://secretmine.de/blog/2026/2026-02-22-authentifizierung-und-sso-im-homelab-mit-authentik/images/admin_hu_3af7f69f9b865def.png 800w, https://secretmine.de/blog/2026/2026-02-22-authentifizierung-und-sso-im-homelab-mit-authentik/images/admin.png 1534w" width="1534"&gt;&lt;/p&gt;
&lt;h2 id="outposts"&gt;Outposts
&lt;/h2&gt;&lt;p&gt;Ein weiterer großer Vorteil von Authentik sind die sogenannten Outposts, mit denen neben SSO-Protokollen auch LDAP-Dienste, Remotedesktop-Zugriff und Proxy-Authentifizierung angeboten werden.&lt;/p&gt;
&lt;p&gt;Über den Proxy-Outpost kann man die Authentifizierung direkt in einem Reverse-Proxy bzw. Webserver integrieren. Dadurch lassen sich interne Anwendungen sehr sicher über das Internet erreichbar machen. Bei mir laufen viele Anwendungen mit OIDC-Anbindung, einige interne Dienste sind zudem über Caddy mit Forward-Auth abgesichert. Mein Proxmox-Cluster ist sogar direkt per LDAP-Outpost an Authentik angebunden, was den Sync von Usern und Gruppen einfach macht.​ Ob das sinnvoll ist, ist allerdings eine andere Sache, immerhin bin ich der einzige Benutzer. Andere Services wie beispielsweise Nextcloud oder Planka nutze ich hingegen nicht nur alleine.&lt;/p&gt;
&lt;p&gt;Relativ neu ist der Remote Access Control (RAC) Outpost, womit sich Remotedesktop-Dienste anbinden lassen. Die Technik dahinter ist am Ende allerdings &amp;ldquo;nur&amp;rdquo; ein Apache Guacamole, den ich schon &lt;a class="link" href="https://secretmine.de/blog/2025/2025-06-09-guacamole/" &gt;anderweitig betreibe&lt;/a&gt; und durch den getrennten Betrieb bessere Kontrolle und mehr Konfigurationsmöglichkeiten erhalte.&lt;/p&gt;
&lt;h3 id="konfiguration-für-forward-auth-mit-caddy"&gt;Konfiguration für Forward-Auth mit Caddy
&lt;/h3&gt;&lt;p&gt;Hier ein kurzes Config-Snippet für Auth mit Caddy:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;(authentik_forwardauth) {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; reverse_proxy /outpost.goauthentik.io/* http://proxy-outpost:9000
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; forward_auth http://proxy-outpost:9000 {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; uri /outpost.goauthentik.io/auth/caddy
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; copy_headers X-Authentik-Username X-Authentik-Groups X-Authentik-Entitlements X-Authentik-Email X-Authentik-Name X-Authentik-Uid X-Authentik-Jwt X-Authentik-Meta-Jwks X-Authentik-Meta-Outpost X-Authentik-Meta-Provider X-Authentik-Meta-App X-Authentik-Meta-Version
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; trusted_proxies private_ranges
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;proxmox.example.com {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; import authentik_forwardauth
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; reverse_proxy 192.168.0.2:8006 {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; transport http {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; tls_insecure_skip_verify
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;In Authentik muss Proxmox mit der entsprechenden Domain als Proxy-Provider angelegt werden, mit dem Modus &amp;ldquo;Forward Auth&amp;rdquo;. Beim Outpost selbst muss dieser Provider dann noch zugewiesen werden, danach sollte alles schon funktionieren.&lt;/p&gt;
&lt;p&gt;Der Proxy Outpost kann wohl auch direkt Proxy spielen - mit der Lösung via Caddy und Forward-Auth kann ich allerdings mehrere Anwendungen anbinden, ohne mehrere Outposts zu benötigen.&lt;/p&gt;
&lt;h2 id="weitere-praktische-features"&gt;Weitere praktische Features
&lt;/h2&gt;&lt;p&gt;Neben der eigentlichen Authentifizierung zeigt Authentik die eingerichteten Anwendungen auch auf einer übersichtlichen Hub-Oberfläche an. Die Anwendungen lassen sich in Gruppen ordnen, es werden auch nur die Anwendungen angezeigt, die zu denen der entsprechende Benutzer Zugang hat. Das erspart den Betrieb von einer getrennten Homepage bzw. Hub-Oberfläche.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Authentik Hub" class="gallery-image" data-flex-basis="482px" data-flex-grow="200" height="672" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://secretmine.de/blog/2026/2026-02-22-authentifizierung-und-sso-im-homelab-mit-authentik/images/hub.png" srcset="https://secretmine.de/blog/2026/2026-02-22-authentifizierung-und-sso-im-homelab-mit-authentik/images/hub_hu_c68b7ce971da903d.png 800w, https://secretmine.de/blog/2026/2026-02-22-authentifizierung-und-sso-im-homelab-mit-authentik/images/hub.png 1350w" width="1350"&gt;&lt;/p&gt;
&lt;h2 id="fazit"&gt;Fazit
&lt;/h2&gt;&lt;p&gt;Nach mehreren Jahren im Betrieb funktioniert Authentik zuverlässig und stabil. Es ist eine empfehlenswerte Alternative zu Keycloak, wenn man eine sichere, moderne Authentifizierungslösung mit erträglichem Konfigurationsaufwand im Homelab sucht.​ Vor allem die Outposts sind ein klarer Vorteil von Authentik gegenüber anderer Lösungen.&lt;/p&gt;</description></item><item><title>Harbor als lokale Container-Registry</title><link>https://secretmine.de/blog/2026/2026-02-06-harbor-als-lokale-container-registry/</link><pubDate>Fri, 06 Feb 2026 00:00:00 +0000</pubDate><guid>https://secretmine.de/blog/2026/2026-02-06-harbor-als-lokale-container-registry/</guid><description>&lt;p&gt;Harbor ist eine Open-Source-Container-Registry-Plattform, die Docker-Images und Helm-Charts speichert und verwaltet. Neben der Nutzung als normale Registry zum Speichern von Images kann Harbor auch als Proxy-Registry dienen. Das ist bei mir der primäre Einsatzzweck. Nebenbei kann Harbor auch die Images mit Trivy auf bekannte Schwachstellen scannen. Die Übersichtsseite leuchtet leider schnell wie ein Weihnachtsbaum - man sieht schnell, welche Images lange nicht mehr aktualisiert wurden oder veraltete Softwareversionen nutzen. Trivy ist hierbei einer der gängigen Scanner, der die im Image vorhandenen Komponenten gegen Datenbanken mit bekannten Schwachstellen prüft (nicht nur normale Pakete, es werden bei diversen Programmiersprachen auch die verwendeten Libraries geprüft).&lt;/p&gt;
&lt;p&gt;Registries wie Docker Hub haben oft Pull-Limits, besonders bei häufigen Updates im Homelab ist das schnell nervig. Mit Harbor dazwischen reduziere ich die Anzahl der Pulls direkt von Docker Hub und kann auch schon gespeicherte Images oder Layer schneller ausliefern. Vor allem durch meine Verwendung von Docker Swarm ist das von Vorteil, da sonst bei der Migration eines Services von einer Node zu einer anderen das Image neu von der Quelle heruntergeladen wird. Mit Harbor als Proxy bzw. Cache kommt das Image dann direkt aus dem lokalen Netz.&lt;/p&gt;
&lt;h2 id="installation"&gt;Installation
&lt;/h2&gt;&lt;p&gt;Die Einrichtung ist unkompliziert, allerdings etwas anders, als man es von anderen containerisierten Diensten kennt. Man benötigt den Harbor-Installer von z.B. Github. Dann muss noch die harbor.yml erstellt bzw. angepasst werden (Hostname, HTTPS, Admin-Passwort), dann wird der Installer ausgeführt. Die Services sind am Ende ein normaler Docker Compose Stack.&lt;/p&gt;
&lt;p&gt;Sinnvoll ist hier auch die Nutzung eines Reverse-Proxies mit SSL, da Docker (und auch andere Container-Runtimes) Pulls aus unsicheren (=http) Registries ohne weitere Konfiguration verweigern. Am einfachsten ist ein Zertifikat von bspw. Lets Encrypt, mit der DNS-Verifizierungsmethode geht das dann auch, ohne dass Harbor von außen erreichbar ist. Selbstsignierte Zertifikate (z.B. via ACME von [Step-CA]({&amp;laquo; ref &amp;ldquo;/blog/2025/2025-02-28-lokale-ssl-zertifikate-mit-caddy-und-step-ca/index.md&amp;rdquo; &amp;raquo;})) sind möglich, dann muss das entsprechende Root-Zertifikat allerdings auf jedem System, das die lokale Registry nutzen soll, hinterlegt werden.&lt;/p&gt;
&lt;h2 id="cache-repo-einrichten"&gt;Cache-Repo einrichten
&lt;/h2&gt;&lt;p&gt;Damit man ein Cache-Repository einrichten kann, muss zuerst die Upstream-Registry unter Administration -&amp;gt; Registries hinzugefügt werden. Wenn ein Cache für Docker Hub angelegt werden soll, ist es hierbei empfehlenswert, Zugangsdaten mit anzugeben, um von den höheren Pull-Limits zu profitieren.&lt;/p&gt;
&lt;p&gt;Danach kann unter Projekte ein neues Projekt mit aktivem &lt;code&gt;Proxy Cache&lt;/code&gt; eingerichtet werden und der entsprechende Upstream (z.B. die angelegte Docker-Hub-Registry) ausgewählt werden.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Cache-Repository" class="gallery-image" data-flex-basis="460px" data-flex-grow="191" height="763" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://secretmine.de/blog/2026/2026-02-06-harbor-als-lokale-container-registry/images/cache_repo.png" srcset="https://secretmine.de/blog/2026/2026-02-06-harbor-als-lokale-container-registry/images/cache_repo_hu_c1ee0ab411e3d054.png 800w, https://secretmine.de/blog/2026/2026-02-06-harbor-als-lokale-container-registry/images/cache_repo.png 1464w" width="1464"&gt;&lt;/p&gt;
&lt;h2 id="client-einrichten"&gt;Client einrichten
&lt;/h2&gt;&lt;p&gt;In Harbor lassen sich Robot-Zugänge unter Administration anlegen. Bei den Berechtigungen habe ich folgendes vergeben:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Artifact: Auflisten, Lesen&lt;/li&gt;
&lt;li&gt;Repository: Auflisten, Pull, Lesen&lt;/li&gt;
&lt;li&gt;Tag: Auflisten&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Danach muss nur noch der Client (hier Docker) angemeldet werden.&lt;/p&gt;
&lt;p&gt;Im Fall von Docker ist das schnell gemacht:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker login harbor.local
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Danach zieht man Images einfach über &lt;code&gt;harbor.local/dockerhub-cache/image:tag&lt;/code&gt; (natürlich mit korrektem Hostnamen und Registry-Namen) - Harbor übernimmt den Rest automatisch. In Compose-Dateien lässt sich die Cache-Registry dann natürlich auch nutzen.&lt;/p&gt;
&lt;h2 id="fazit"&gt;Fazit
&lt;/h2&gt;&lt;p&gt;Harbor funktioniert bei mir ziemlich gut, allerdings waren auch schon 1-2 Mal die Container morgens nicht mehr gestartet. Man schafft sich damit leider auch einen Single Point of Failure, da der Betrieb von allen Containern im Lab von der Registry abhängt. Vor allem beim Betrieb von vielen Containern oder bei Nutzung eines Orchestrators (wie Kubernetes oder Docker Swarm) ist ein lokaler Cache zur Verminderung von Pulls aber definitiv sinnvoll und verringert die Startzeiten von Containern auf neuen Nodes spürbar.&lt;/p&gt;</description></item><item><title>Outline als (persönliches) Wiki</title><link>https://secretmine.de/blog/2026/2026-01-31-outline/</link><pubDate>Sat, 31 Jan 2026 00:00:00 +0000</pubDate><guid>https://secretmine.de/blog/2026/2026-01-31-outline/</guid><description>&lt;p&gt;Lange Zeit habe ich Confluence als Wiki genutzt. Funktionsreich, hübsch und mit Jira integriert. Aber irgendwann kamen die bekannten Punkte: hoher Ressourcenbedarf und aktiver Rückbau der selbstgehosteten Version durch Entfernung der günstigen Lizenzen (und zukünftig auch aller selbsthostbaren Varianten). Also begann die Suche nach einer Alternative, die möglichst schlank, aber trotzdem gut nutzbar sein sollte.&lt;/p&gt;
&lt;p&gt;Ich habe mir dabei diverses angesehen. XWiki kannte ich von der Arbeit, gefiel mir aber weder optisch noch von der Bedienung her. Von den Ressourcen war es auch eher auf dem Level von Confluence. MediaWiki hat für nicht funktioniert - als Wiki generell nicht schlecht, für &amp;ldquo;mal eben&amp;rdquo; aber irgendwie unhandlich. Wiki.js habe ich mir ebenfalls angesehen, aber auch damit bin ich nicht so wirklich warm geworden. Die Bedienung ging nicht so von der Hand, wie ich mir das vorgestellt habe.&lt;/p&gt;
&lt;p&gt;Dann hat mir mein Bruder Outline gezeigt. Was für mich ziemlich perfekt aussah. Minimalistisch, schnell, gute und intuitive Bedienung. Es fühlt sich modern an, ohne überladen zu sein. Und ist auch noch Markdown-basiert. Eine native App gibt es zwar nicht, die PWA funktioniert aber gut.&lt;/p&gt;
&lt;p&gt;Der Funktionsumfang und auch Gestaltungsmöglichkeiten sind natürlich deutlich unter dem, was Confluence kann, aber davon vermisse ich auch nach vielen Jahren wenig.&lt;/p&gt;
&lt;h2 id="betrieb"&gt;Betrieb
&lt;/h2&gt;&lt;p&gt;Selfhosting bei Outline ist nicht so einfach wie bei anderen Softwareprodukten. Neben einer Postgres-Datenbank wird Redis benötigt - soweit so gut. Zwingend erforderlich ist aber auch ein externer Auth-Provider - in meinem Fall OIDC via Authentik. Früher war auch ein S3-Bucket als Speicher für Anhänge erforderlich, die Anforderung ist aber dank dem neu hinzugekommenen lokalen Storage nicht mehr verpflichtend. Trotzdem fühlt es sich so an, als ob Selfhosting zwar offiziell unterstützt wird, der Hersteller aber den Fokus klar auf dem eigenen SaaS-Angebot in der Cloud hat.&lt;/p&gt;
&lt;p&gt;Hat man das Setup aber einmal laufen, ist Outline sehr stabil. Ich nutze es nun seit gut drei Jahren in meiner Umgebung, und es ist dabei geblieben – einfach, weil es funktioniert.&lt;/p&gt;
&lt;h2 id="fazit"&gt;Fazit
&lt;/h2&gt;&lt;p&gt;Outline hat sich bei mir nun wirklich bewährt. Minimalistisch, aber trotzdem genügend Features; selbst hostbar, gute Bedienung. Alternativ lohnt sich ein Blick auf Bookstack. Das habe ich mir zwar lange nicht mehr angesehen, war aber der Alternativkandidat, falls Outline mir nicht gefallen hätte.&lt;/p&gt;</description></item><item><title>Minecraft-Server - meine Best Practises</title><link>https://secretmine.de/blog/2026/2026-01-24-minecraft-server-best-practises/</link><pubDate>Sat, 24 Jan 2026 00:00:00 +0000</pubDate><guid>https://secretmine.de/blog/2026/2026-01-24-minecraft-server-best-practises/</guid><description>&lt;p&gt;Da ich über 10 Jahre Erfahrung im Betrieb von Minecraft-Servern habe und das zwischenzeitlich auch im größeren Stil gemacht habe, möchte ich hier einmal meine Best Practises dokumentieren.&lt;/p&gt;
&lt;p&gt;Vieles werde ich hier anhand meines eigenen Servers beschreiben. Dabei handelt es sich um einen Survival-Server, der seit bald 6 Jahren aktiv ist (gestartet während der ersten Corona-Zeiten). Der Server hat einige Plugins, das meiste davon aber rein serverseitig und ohne direkten Einfluss auf das Spielerlebnis.&lt;/p&gt;
&lt;p&gt;Dieser Post bezieht sich komplett auf die Java-Edition. Mit der Bedrock-Edition habe ich wenig Erfahrung, da ich diese selbst nicht spiele.&lt;/p&gt;
&lt;h2 id="nutzungsprofil-erstellen"&gt;Nutzungsprofil erstellen
&lt;/h2&gt;&lt;p&gt;Bevor man überhaupt mit der genaueren Planung bzw. Umsetzung beginnt, sollte feststehen, was überhaupt das Ziel ist, wie viele Spieler erwartet werden (Gesamt/Peak/Durchschnitt). Auch ist es ein großer Unterschied, ob die Spieler in einem recht kleinen Bereich aktiv sind (bspw. bei Minigames) oder verteilt auf einer großen Welt spielen. Ich habe auch häufig beobachtet, dass der Ressourcenbedarf bei einem Server z.B. in einer Freundesgruppe in den ersten Tagen deutlich höher ist als in der darauf folgenden Zeit. Dort kann es sinnvoll sein, erst kurzzeitig einen größeren virtuellen Server bei einem Anbieter zu mieten, der stundenweise bzw. tagesweise abrechnet und danach für den längerfristigen Betrieb auf einen günstigeren Server oder z.B. auch den Betrieb im Homelab zu wechseln.&lt;/p&gt;
&lt;h2 id="hardware-bzw-plattform"&gt;Hardware bzw. Plattform
&lt;/h2&gt;&lt;h3 id="cpu"&gt;CPU
&lt;/h3&gt;&lt;p&gt;Bei Minecraft läuft, wie bei vielen anderen Spielen auch, ein großer Teil der Spiellogik in einem Haupt-Thread ab. Das heißt, dass man eher wenige schelle CPU-Kerne benötigt als viele. Große Server-CPUs mit vielen Kernen sind hier meistens eher weniger geeignet, außer man möchte viele Minecraft-Server parallel betreiben. Die (halbwegs) aktuellen Desktop-CPUs von Intel und AMD mit min. 4 (Performance) Cores sind hier meistens eine solide Wahl.&lt;/p&gt;
&lt;h3 id="ram"&gt;RAM
&lt;/h3&gt;&lt;p&gt;Als Minimum sehe ich 4GB, darunter kommt es schnell zu Problemen. Mehr ist bis zu einem gewissen Punkt besser, über ca 30GB RAM würde ich unter normalen Umständen nicht gehen. Mehr Mods und Plugins benötigen mehr RAM, die Sichtweite und Verteilung der Spieler (und damit die Zahl der geladenen Chunks) ist hier auch relevant. Mein eigener Server läuft normalerweise mit 8GB.&lt;/p&gt;
&lt;h3 id="ssd-vs-hdd"&gt;SSD vs HDD
&lt;/h3&gt;&lt;p&gt;Minecraft profitiert von schnellem Speicher. SSD ist in meinen Augen ein Muss, NVMe ist zu bevorzugen. Die benötigte Größe hängt hauptsächlich von der Weltgröße und eingesetzten Plugins (bspw. Dynmap) ab, 20GB reichen meistens aber mehr als aus.&lt;/p&gt;
&lt;h3 id="internetanbindung"&gt;Internetanbindung
&lt;/h3&gt;&lt;p&gt;Ein Punkt, der beim Betrieb zuhause öfter mal übersehen wird. Leistungsstarke Hardware bringt wenig, wenn nicht genügend Bandbreite zur Verfügung steht. Ich kalkuliere normalerweise mit ca 2-5 MBit/s pro gleichtzeitigem Spieler. Wenn keine Chunks geladen werden, ist der Bedarf an Bandbreite niedriger, bei einem Weltwechsel oder schnellem Bewegen auf der Karte entstehen deutlich größere Peaks. Mit ca 50 MBit/s an verfügbarer Upload-Bandbreite kann man aber schon einige Spieler bedienen.&lt;/p&gt;
&lt;p&gt;Wenn man zuhause hostet, ist aus verschiedenen Gründen das Tunneln über einen Server in einem Rechenzentrum hilfreich. Einerseits gibt man damit seine Heim-IP nicht preis, andererseits ist durch bessere Peerings von Rechenzentren im Vergleich zu ISPs untereinander auch die Verbindungsqualität höher. Nebenbei kann man damit auch Einschränkungen durch CGNAT umgehen und den Server auch bei Nutzung einer zweiten Internetleitung für Failover erreichbar halten.&lt;/p&gt;
&lt;h2 id="software"&gt;Software
&lt;/h2&gt;&lt;h3 id="betriebssystem"&gt;Betriebssystem
&lt;/h3&gt;&lt;p&gt;Hier ist irgendeine gängige Linux-Distribution, die Docker-Support hat, sinnvoll. Ich verwende meistens Debian oder Ubuntu. Docker benötige ich für die verwendete Verwaltungssoftware, aber auch ohne ist der Betrieb von einem MC-Server in Docker häufig angenehmer als direkt auf dem Server.&lt;/p&gt;
&lt;h3 id="management-tool"&gt;Management-Tool
&lt;/h3&gt;&lt;p&gt;Ich nutze bisher Pterodactyl (&lt;a class="link" href="https://pterodactyl.io/" target="_blank" rel="noopener"
 &gt;pterodactyl.io&lt;/a&gt;) als webbasiertes Gameserver-Panel. Lange Jahre kam bei mir Multicraft zum Einsatz - da ist allerdings das letzte Release von Februar 2022 und die letzte Preview-Version von November 2023. Alternativ zu Pterodactyl möchte ich zeitnahe Pelican (&lt;a class="link" href="https://pelican.dev/" target="_blank" rel="noopener"
 &gt;pelican.dev&lt;/a&gt;) testen. Pelican ist ein Fork von Pterodactyl und soll trotz Beta-Stadiums sehr gut nutzbar sein. Daneben gibt es noch einige weitere erwähnenswerte Panels:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Crafty (&lt;a class="link" href="https://craftycontrol.com/" target="_blank" rel="noopener"
 &gt;craftycontrol.com&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;PufferPanel (&lt;a class="link" href="https://www.pufferpanel.com/" target="_blank" rel="noopener"
 &gt;pufferpanel.com&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;AMP (kommerziell, &lt;a class="link" href="https://cubecoders.com/AMP" target="_blank" rel="noopener"
 &gt;cubecoders.com&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Vor ein paar Jahren hätte ich noch Multicraft empfohlen, das fand ich insgesamt am angenehmsten in der Nutzung; aber da dieses Produkt scheinbar nicht mehr gepflegt wird, würde ich es nicht mehr einsetzen.&lt;/p&gt;
&lt;h3 id="server-software"&gt;Server-Software
&lt;/h3&gt;&lt;p&gt;Kommen wir zum Kernpart. Hier ist erst einmal entscheidend, ob Mods, Plugins oder keins von beidem zum Einsatz kommen sollen. Plugins sind hierbei rein serverseitige Modifikationen bzw. Erweiterungen, normalerweise basierend auf der Spigot-API. Mods sind client- und/oder serverseitige Erweiterungen/Modifikationen, meistens geht es dabei mehr um Erweiterung des Spielinhalts (neue Blöcke, Biome, Kreaturen, Spielmechaniken, &amp;hellip;).&lt;/p&gt;
&lt;h4 id="server-mit-mods"&gt;Server mit Mods
&lt;/h4&gt;&lt;p&gt;Hier wird meistens Fabric (&lt;a class="link" href="https://fabricmc.net/" target="_blank" rel="noopener"
 &gt;fabricmc.net&lt;/a&gt;) als Modloader verwendet, dieser startet dann den eigentlichen Server.&lt;/p&gt;
&lt;h4 id="server-mit-plugins"&gt;Server mit Plugins
&lt;/h4&gt;&lt;p&gt;Für Plugins und generell als Serversoftware ist PaperMC (&lt;a class="link" href="https://papermc.io/" target="_blank" rel="noopener"
 &gt;papermc.io&lt;/a&gt;) der Quasi-Standard. Es fing mit Bukkit an (Vanilla-Server mit Pluginfähigkeit), daraus entstand dann SpigotMC (optimiertes Bukkit), wovon dann wieder PaperMC geforkt wurde. Auch unterhalb von PaperMC geht die Fork-Kette weiter, wobei PaperMC als guter Kompromiss von Performance und akkuraten Spielmechaniken gilt und meistens empfohlen wird. Es gibt im Wiki von PaperMC auch einen Artikel, der beschreibt, wie man PaperMC vom Gameplay-Verhalten möglichst nahe an Vanilla annähern kann.&lt;/p&gt;
&lt;p&gt;Kurz erwähnen möchte ich hier auch Folia, eine weitere Serversoftware von PaperMC - allerdings ausgelegt auf wirklich große survival-artige Server. Die Besonderheit bei Folia ist, dass es den einen großen Haupt-Game-Thread gibt, in dem alle Aktionen passieren. Folia teilt die Welt in distinkte Regionen auf, die getrennt voneinander arbeiten. Dadurch gibt es einen Game-Thread pro Region, wodurch sich die Last deutlich besser auf viele CPU-kerne verteilen lässt. Relevant wird das aber erst bei großen Spielerzahlen, Folia hat zudem auch viele Nachteile (Plugin-Kompatibilität, Entwicklungsstadium der Software, Bugs in Spielmechaniken, &amp;hellip;).&lt;/p&gt;
&lt;h3 id="proxies"&gt;Proxies
&lt;/h3&gt;&lt;p&gt;Es gibt für Minecraft spezielle Proxy-Software. Damit lassen sich mehrere Server zu einem &amp;ldquo;Netzwerk&amp;rdquo; verbinden und Spieler können via Commands oder andere Wege zwischen den Servern wechseln. Seit einiger Zeit gibt es im originalen Minecraft auch den Befehl &lt;code&gt;/transfer&lt;/code&gt;, mit dem Spieler zu einem anderen Server transferiert werden können.&lt;/p&gt;
&lt;p&gt;Ein Proxy ist sinnvoll, wenn man z.B. mehrere Minecraft-Server betreibt und zwischen diesen nahtlos wechseln können möchte oder auch dann, wenn man den eigentlichen Server zuhause betreibt, die Spieler aber über einen vServer beitreten sollen.&lt;/p&gt;
&lt;p&gt;Wenn nur ein einzelner Server hinter einem Proxy betrieben werden soll, kann auch einfach eine Software wie HAProxy eingesetzt werden; PaperMC unterstützt bspw. das Proxy-Protokoll, mit dem die originale Client-IP erhalten bleibt.&lt;/p&gt;
&lt;p&gt;Von den Entwicklern von SpigotMC gibt es hier Bungeecord, von den Entwicklern von PaperMC Velocity. Ich selbst nutze Velocity, da es die modernere Software ist und viele Plugins dafür existieren.&lt;/p&gt;
&lt;h4 id="geysermc"&gt;GeyserMC
&lt;/h4&gt;&lt;p&gt;Ein Spezialfall bei den Proxies ist Geyser. Das ist eine Software, die es Client mit der Bedrock Edition erlaubt, auf einem Server der Java-Edition zu spielen. Dazu werden fehlende Blöcke und Features möglichst nahe mit dem angehähert, was die Bedrock Edition bietet. Spieler verbinden sich mit Geyser, der dann wiederum die Verbindung zum eigentlichen Server aufbaut und übersetzt.
Geyser läuft entweder als Plugin/Mod direkt auf dem Server, als Plugin auf dem Proxy oder Standalone, ich selbst habe es als Plugin auf dem Proxy installiert.&lt;/p&gt;
&lt;h3 id="empfohlene-plugins"&gt;Empfohlene Plugins
&lt;/h3&gt;&lt;p&gt;Sofern der Server mit Plugins betrieben wird, habe ich hier einige Empfehlungen für Plugins, die ich fast immer installiere. Für Fabric gibt es diverse der genannten Plugins allerdings auch.&lt;/p&gt;
&lt;h4 id="chunky-plugin-und-mod"&gt;Chunky (Plugin und Mod)
&lt;/h4&gt;&lt;p&gt;Chunky gibt es für alle relevanten Modloader und Servertypen, also sowohl PaperMC als auch Fabric (und weitere). Das ist ein Tool, mit dem man Weltteile bzw. Chunks vorgenerieren kann. Vor dem Start eines neuen Servers generiere ich meistens mindestens 1000 Blöcke um den Spawn herum vor, da das Generieren von Chunks einer der rechenintensiveren Vorgänge auf einem Minecraft-Server ist. Vor allem am Anfang, wenn noch viele Spieler aktiv sind, merkt man einen Unterschied. Auch im Nether sollte man Weltteile vorgenerieren. Im End geht das auch, bringt aber aufgrund der Verteilung der End-Cities meiner Erfahrung nach nicht ganz so viel.&lt;/p&gt;
&lt;h4 id="worldedit-bzw-fastasyncworldedit"&gt;WorldEdit (bzw. FastAsyncWorldEdit)
&lt;/h4&gt;&lt;p&gt;Einer der Klassiker, das Plugin gibt es gefühlt schon immer. Wer es nicht kennt: Damit kann man schnell große Teile der Welt bearbeiten, Blöcke ersetzen, neu generieren usw.&lt;/p&gt;
&lt;p&gt;FastAsyncWorldEdit ist für Server die bessere Wahl, da die Änderungen an der Welt asynchron ausgeführt werden und damit der Server nicht einfriert.&lt;/p&gt;
&lt;h4 id="worldguard"&gt;WorldGuard
&lt;/h4&gt;&lt;p&gt;Auch ein Klassiker. Damit kann z.B. festgelegt werden, dass nur bestimmte Spieler/Gruppen in einem Bereich bauen dürfen, auch Mob-Spawning lässt sich damit für einzelne Bereiche deaktiveren.&lt;/p&gt;
&lt;h4 id="dynmap"&gt;Dynmap
&lt;/h4&gt;&lt;p&gt;Das ist auch ein eher altes Plugin, allerdings bis heute gut gepflegt. Es erlaubt das Generieren einer webbasierten Karte des Servers, und das in 2D und auch in 3D. Das Plugin benötigt (vor allem bei den höheren Detailstufen) viel Rechenpower zum Rendern und auch einiges an Speicher bei größeren Welten. Ein Webserver ist integriert, es lässt sich allerdings auch ein externer Webserver dafür nutzen. Ich habe &lt;code&gt;lowres&lt;/code&gt; als Qualitätslevel einstellt, das genügt mir. Wer etwas leichtgewichtigeres sucht, ist beim nächsten Plugin besser aufgehoben.&lt;/p&gt;
&lt;h4 id="squaremap"&gt;squaremap
&lt;/h4&gt;&lt;p&gt;squaremap bietet, ähnlich wie Dynmap, auch eine webbasierte Karte des Servers mit integriertem Webserver an, allerdings in geringerer Auflösung und ausschließlich in 2D. Dafür geht das Rendern sehr viel schneller und das Plugin ist generell auch leichtgewichtiger. Für einen kleinen privaten Server genügt squaremap vollkommen.&lt;/p&gt;
&lt;h4 id="bluemap"&gt;BlueMap
&lt;/h4&gt;&lt;p&gt;Das nächste Tool für eine webbasierte Karte. Bluemap hat die große Besonderheit, dass die Karte als 3D-Modelle gespeichert wird und sich die Welt im Browser daher frei erkunden lässt. Man kann beliebig zoomen, drehen usw, da die 3D-Modelle an den Browser übertragen werden und erst dort gerendet werden. BlueMap lässt sich zudem auch komplett unabhängig vom Server benutzen, so habe ich es auch im Einsatz. Ein kleines Script kopiert in regelmäßigen Abständen die Welt des Servers, führt BlueMap-CLI aus und stellt die generierten Daten über einen Webserver (Caddy, was auch sonst) bereit. Damit belastet es den Server selbst nicht, trotzdem finde ich es eine schöne Ergänzung zu Dynmap oder squaremap. Vor allem, um &amp;ldquo;mal eben&amp;rdquo; Freunden eigene Bauten auf dem Server auf dem Handy zeigen zu können, ist BlueMap wirklich super.&lt;/p&gt;
&lt;h4 id="plan"&gt;Plan
&lt;/h4&gt;&lt;p&gt;Plan ist ein Statistikplugin, das Einblicke in die Nutzung des Servers bietet. Man erfährt damit beispielsweise, wie die Auslastung des Servers aussieht, wann meistens gespielt wird und kann auch erkennen, ob neue Spieler erhalten bleiben oder eine hohe Fluktuation herrscht. Plan unterstützt auch diverse Plugins, um zusätzliche Daten anzuzeigen.&lt;/p&gt;
&lt;h4 id="viaversion-und-viabackwards"&gt;ViaVersion (und ViaBackwards)
&lt;/h4&gt;&lt;p&gt;Mit ViaVersion können Spieler mit neueren Minecraft-Versionen als der Server trotzdem beitreten. ViaBackwards hingegen erlaubt das Beitreten mit älteren Client-Versionen als der Server. Es gibt zusätzlich auch noch ViaRewind, damit können selbst Clients mit Version 1.7 und 1.8 noch beitreten - ob das sinnvoll ist, sei mal dahingestellt.&lt;/p&gt;
&lt;h4 id="luckperms"&gt;LuckPerms
&lt;/h4&gt;&lt;p&gt;LuckPerms ist so mit das bekannteste Plugin, um Permissions und Benutzergruppen zu verwalten. Mit MySQL oder einer anderen Datenbank als Backend lassen sich damit Berechtigungen auch über mehrere Server hinweg synchronisieren. Es gibt davon auch Versionen für Velocity, Fabric, Forge und weitere Server.&lt;/p&gt;
&lt;h4 id="discordsrv"&gt;DiscordSRV
&lt;/h4&gt;&lt;p&gt;DiscordSRV ist eine Verbindung zwischen Discord und einem Minecraft-Server. Damit lässt sich bspw. der Ingame-Chat mit einem Discord-Channel verbinden. Auch lassen sich Discord-Rollen mit Permissions-Gruppen koppeln.&lt;/p&gt;
&lt;h4 id="distant-horizons-server-plugin"&gt;Distant Horizons server plugin
&lt;/h4&gt;&lt;p&gt;Distant Horizons ist eine Client-Mod, die eine deutlich höhere Sichtweite erlaubt. Dafür werden Versionen der Karte mit niedrigeren &amp;ldquo;Auflösungen&amp;rdquo; (LODs) generiert und alles außerhalb der gerade normal geladenen Chunks damit aufgefüllt. Damit ist der Performance-Einfluss eher gering. Distant Horizons braucht an sich keinen serverseitigen Support, die Mod speichert einfach Weltteile vom Server zwischen und generiert die LODs lokal.&lt;/p&gt;
&lt;p&gt;Seit einiger Zeit gibt es ein Plugin für Server, womit die LOD-Dateien serverseitig generiert und vorgehalten werden können. Damit muss man nicht mehr jeden Weltteil besucht haben, um LODs dafür zu sehen. Es ist allerdings empfehlenswert, in der Config &lt;code&gt;generate_new_chunks: false&lt;/code&gt; zu setzen, da sonst für die LODs neue Chunks generiert werden, was deutlich Ressourcen kostet.&lt;/p&gt;
&lt;h3 id="weitere-plugins"&gt;Weitere Plugins
&lt;/h3&gt;&lt;h4 id="tabtps"&gt;TabTPS
&lt;/h4&gt;&lt;p&gt;Damit lässt sich die aktuelle Performance des Servers (TPS, MSPT und weitere) an verschiedenen Positionen (Tabliste, Bossbar, Actionbar) anzeigen. Ich nutze das Plugin gerne, um die Leistung beim Spielen laufend im Auge zu behalten.&lt;/p&gt;
&lt;h4 id="multiverse-core"&gt;Multiverse-Core
&lt;/h4&gt;&lt;p&gt;Damit lassen sich mehrere Welten anlegen und verwalten, Spieler können auch zwischen den Welten wechseln. Ich habe auf meinem Server beispielsweise eine Kreativwelt, wo Spieler Gebäude vorbauen oder mit Redstone experimentieren können.&lt;/p&gt;
&lt;p&gt;Mit weiteren Addons wie Multiverse-Inventories lassen sich die Features von Multiverse-Core noch erweitern.&lt;/p&gt;
&lt;h4 id="simplevoicechat"&gt;SimpleVoiceChat
&lt;/h4&gt;&lt;p&gt;Das ist ein Plugin, was Ingame Voicechat hinzufügt. Dieser ist auf die direkte Umgebung des Spielers begrenzt und ermöglicht ein realistischeres Spielerlebnis. Es wird allerdings auch Client-Seitig eine Mod benötigt.&lt;/p&gt;
&lt;h4 id="coreprotect"&gt;CoreProtect
&lt;/h4&gt;&lt;p&gt;Mit CoreProtect werden alle Aktionen auf dem Server geloggt und können damit auch rückgängig gemacht werden. Das ist vor allem für Survival-Server ohne ein System für &amp;ldquo;Grundstücke&amp;rdquo; praktisch und hat sich bei vergangenen Projekten bewährt.&lt;/p&gt;
&lt;h4 id="essentialsx"&gt;EssentialsX
&lt;/h4&gt;&lt;p&gt;Ein Plugin, was viele kleinere Features (z.B. Befehle für Home oder Teleport-Anfragen) bündelt. Den Vorgänger habe ich früher viel genutzt, heutzutage installiere ich die benötigten Features als einzelne Plugins.&lt;/p&gt;</description></item><item><title>Nutzung alter Hardware als Minecraft-Server</title><link>https://secretmine.de/blog/2025/2025-12-01-nutzung-alter-hardware-als-minecraft-server/</link><pubDate>Mon, 01 Dec 2025 00:00:00 +0000</pubDate><guid>https://secretmine.de/blog/2025/2025-12-01-nutzung-alter-hardware-als-minecraft-server/</guid><description>&lt;p&gt;Für ein temporäres Projekt brauchte ich genügend Ressourcen für einen Modded Minecraft Server. Auf dem &lt;a class="link" href="https://secretmine.de/blog/2024/2024-12-16-lenovo-thinkcentre-m715q-tiny/" &gt;Mini-PC&lt;/a&gt;, den ich für meinen Hauptserver gekauft hatte, habe ich allerdings nicht genügend freie Ressourcen. Dementsprechend habe ich mich im Keller umgesehen und passende Hardware gefunden - ein PC mit einem i5 4440, 16GB RAM und genügend SSD-Platz. Eine GPU war auch noch verbaut, die habe ich entfernt. Der PC diente zwischenzeitlich als Experimentierumgebung mit Ollama, genutzt habe ich den aber tatsächlich jetzt fast ein Jahr lang nicht mehr.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Der Server-Rechner" class="gallery-image" data-flex-basis="298px" data-flex-grow="124" height="1206" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://secretmine.de/blog/2025/2025-12-01-nutzung-alter-hardware-als-minecraft-server/images/pc.jpg" srcset="https://secretmine.de/blog/2025/2025-12-01-nutzung-alter-hardware-als-minecraft-server/images/pc_hu_a47c30726a2097ee.jpg 800w, https://secretmine.de/blog/2025/2025-12-01-nutzung-alter-hardware-als-minecraft-server/images/pc.jpg 1500w" width="1500"&gt;&lt;/p&gt;
&lt;h2 id="hardware"&gt;Hardware
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Intel Core i5 4440 (4x 3,1 GHz, Haswell)&lt;/li&gt;
&lt;li&gt;2x 8GB DDR3 RAM&lt;/li&gt;
&lt;li&gt;16GB SSD (OS)&lt;/li&gt;
&lt;li&gt;240GB SSD (MC-Server)&lt;/li&gt;
&lt;li&gt;OS: Debian&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="software"&gt;Software
&lt;/h2&gt;&lt;p&gt;Als OS habe ich Debian installiert, hier geht aber auch fast jedes beliebige andere Linux. Letztendlich läuft auf dem Rechner eigentlich nur Wings für Pterodactyl. Installiert habe ich Debian über mein &lt;a class="link" href="https://secretmine.de/blog/2025/2025-11-21-iodd-st400/" &gt;IODD ST400&lt;/a&gt;, das war jetzt der erste richtige und erfolgreiche Praxistest für das Gerät.&lt;/p&gt;
&lt;p&gt;Auf dem Debian ist ansonsten Docker installiert, das benötigt Wings zum Ausführen der eigentlichen Gameserver. Daneben ist ansonsten noch der Prometheus Node Exporter installiert, damit ich Metriken für mein Monitoring abgreifen kann.&lt;/p&gt;
&lt;h2 id="stromverbrauch"&gt;Stromverbrauch
&lt;/h2&gt;&lt;p&gt;Der Stromverbrauch liegt deutlich höher als beim Mini-PC: Im Idle ca 25 Watt, unter Last auch bis zu ca 60 Watt. Wie groß der Verbrauch in der Praxis dann ist weiß ich natürlich noch nicht. Das kostet auf Dauer natürlich mehr Geld, aber da ich diesen Server vermutlich nur wenige Wochen so benötige, ist es die wirtschaftlichste Option. Im Vergleich zu einem gemieteten vServer hat dieser Rechner auch den Vorteil, dass der Minecraft-Server die CPU vollständig für sich hat und es keine &amp;ldquo;noisy neighbors&amp;rdquo; gibt. Ein vServer mit diesen Leistungseckdaten ist bei den gängigen Anbietern auch etwas teurer als mich der Strom hier kostet.&lt;/p&gt;
&lt;h2 id="benchmark"&gt;Benchmark
&lt;/h2&gt;&lt;p&gt;Die Benchmarks sind in einem ähnlichen Bereich wie beim &lt;a class="link" href="https://secretmine.de/blog/2024/2024-12-16-lenovo-thinkcentre-m715q-tiny/" &gt;Lenovo ThinkCentre M715q Tiny&lt;/a&gt;, an einigen Stellen trotz des Alters besser.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;span class="lnt"&gt;24
&lt;/span&gt;&lt;span class="lnt"&gt;25
&lt;/span&gt;&lt;span class="lnt"&gt;26
&lt;/span&gt;&lt;span class="lnt"&gt;27
&lt;/span&gt;&lt;span class="lnt"&gt;28
&lt;/span&gt;&lt;span class="lnt"&gt;29
&lt;/span&gt;&lt;span class="lnt"&gt;30
&lt;/span&gt;&lt;span class="lnt"&gt;31
&lt;/span&gt;&lt;span class="lnt"&gt;32
&lt;/span&gt;&lt;span class="lnt"&gt;33
&lt;/span&gt;&lt;span class="lnt"&gt;34
&lt;/span&gt;&lt;span class="lnt"&gt;35
&lt;/span&gt;&lt;span class="lnt"&gt;36
&lt;/span&gt;&lt;span class="lnt"&gt;37
&lt;/span&gt;&lt;span class="lnt"&gt;38
&lt;/span&gt;&lt;span class="lnt"&gt;39
&lt;/span&gt;&lt;span class="lnt"&gt;40
&lt;/span&gt;&lt;span class="lnt"&gt;41
&lt;/span&gt;&lt;span class="lnt"&gt;42
&lt;/span&gt;&lt;span class="lnt"&gt;43
&lt;/span&gt;&lt;span class="lnt"&gt;44
&lt;/span&gt;&lt;span class="lnt"&gt;45
&lt;/span&gt;&lt;span class="lnt"&gt;46
&lt;/span&gt;&lt;span class="lnt"&gt;47
&lt;/span&gt;&lt;span class="lnt"&gt;48
&lt;/span&gt;&lt;span class="lnt"&gt;49
&lt;/span&gt;&lt;span class="lnt"&gt;50
&lt;/span&gt;&lt;span class="lnt"&gt;51
&lt;/span&gt;&lt;span class="lnt"&gt;52
&lt;/span&gt;&lt;span class="lnt"&gt;53
&lt;/span&gt;&lt;span class="lnt"&gt;54
&lt;/span&gt;&lt;span class="lnt"&gt;55
&lt;/span&gt;&lt;span class="lnt"&gt;56
&lt;/span&gt;&lt;span class="lnt"&gt;57
&lt;/span&gt;&lt;span class="lnt"&gt;58
&lt;/span&gt;&lt;span class="lnt"&gt;59
&lt;/span&gt;&lt;span class="lnt"&gt;60
&lt;/span&gt;&lt;span class="lnt"&gt;61
&lt;/span&gt;&lt;span class="lnt"&gt;62
&lt;/span&gt;&lt;span class="lnt"&gt;63
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;root@mc:~# curl -sL yabs.sh | bash -s -- -r -5 -6
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## #
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# Yet-Another-Bench-Script #
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# v2025-04-20 #
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# https://github.com/masonr/yet-another-bench-script #
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## #
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Mon Nov 17 08:34:30 PM CET 2025
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Basic System Information:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;---------------------------------
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Uptime : 0 days, 0 hours, 0 minutes
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Processor : Intel(R) Core(TM) i5-4440 CPU @ 3.10GHz
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;CPU cores : 4 @ 3093.207 MHz
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;AES-NI : ✔ Enabled
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;VM-x/AMD-V : ✔ Enabled
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;RAM : 15.5 GiB
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Swap : 953.0 MiB
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Disk : 232.7 GiB
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Distro : Debian GNU/Linux 13 (trixie)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Kernel : 6.12.57+deb13-amd64
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;VM Type : NONE
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;IPv4/IPv6 : ✔ Online / ❌ Offline
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;IPv4 Network Information:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;---------------------------------
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ISP : Vodafone Kabel Deutschland
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ASN : AS3209 Vodafone GmbH
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Host : Vodafone Kabel Deutschland GmbH
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Location : Cadenberge, Lower Saxony (NI)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Country : Germany
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;fio Disk Speed Tests (Mixed R/W 50/50) (Partition /dev/sdb2):
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;---------------------------------
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Block Size | 4k (IOPS) | 64k (IOPS)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ------ | --- ---- | ---- ----
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Read | 22.98 MB/s (5.7k) | 31.36 MB/s (490)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Write | 22.98 MB/s (5.7k) | 31.74 MB/s (495)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Total | 45.96 MB/s (11.4k) | 63.10 MB/s (985)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; | |
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Block Size | 512k (IOPS) | 1m (IOPS)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ------ | --- ---- | ---- ----
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Read | 32.14 MB/s (62) | 32.97 MB/s (32)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Write | 34.56 MB/s (67) | 35.51 MB/s (34)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Total | 66.71 MB/s (129) | 68.49 MB/s (66)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Geekbench 5 Benchmark Test:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;---------------------------------
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Test | Value
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; |
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Single Core | 918
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Multi Core | 3049
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Full Test | https://browser.geekbench.com/v5/cpu/23910060
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Geekbench 6 Benchmark Test:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;---------------------------------
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Test | Value
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; |
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Single Core | 1194
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Multi Core | 3614
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Full Test | https://browser.geekbench.com/v6/cpu/15090984
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;YABS completed in 13 min 41 sec
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;</description></item><item><title>Der Fujitsu Futro S740 im Homelab – Der ideale Server?</title><link>https://secretmine.de/blog/2025/2025-11-27-der-fujitsu-futro-s740-der-ideale-server/</link><pubDate>Thu, 27 Nov 2025 00:00:00 +0000</pubDate><guid>https://secretmine.de/blog/2025/2025-11-27-der-fujitsu-futro-s740-der-ideale-server/</guid><description>&lt;p&gt;Der Fujitsu Futro S740 ist nun seit fast drei Jahren zentraler Bestandteil meines Homelabs und ist auch hier im Blog regelmäßig Thema. Es wird Zeit, mal Bilanz zu ziehen und etwas zu meinen Langzeiterfahrungen zu schreiben.&lt;/p&gt;
&lt;h2 id="leistung-und-einsatz-im-cluster"&gt;Leistung und Einsatz im Cluster
&lt;/h2&gt;&lt;p&gt;Die Leistung des Futro S740 reicht für viele Homelab-Anwendungen aus, ist jedoch begrenzt. Aber gut, was erwartet man auch von einem Gerät, das als Thin Client konzipiert wurde und einen passiv gekühlten Intel Celeron verbaut hat. Gerade bei Single-Thread-Anwendungen und virtuellen Maschinen merkt man schnell den Overhead und die begrenzte CPU-Power. Deshalb bevorzuge ich Proxmox LXC-Container, die deutlich ressourcenschonender sind, schneller starten und effizienter laufen. Für wirklich rechenintensive Anwendungen ist der S740 einfach nicht gebaut.&lt;/p&gt;
&lt;p&gt;Neben zwei Futro S740 läuft in meinem Proxmox-Cluster auch ein leistungsstärkerer Mini-PC. Auf diesem laufen Workloads, die mehr CPU-Leistung brauchen, wie Gameserver, Windows-VMs und Linux-Workstation-VMs. So verteile ich die Last passend und nutze die Hardware im Cluster optimal.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Mein Lab - zwei Fujitsu Futro S740 und ein Lenovo ThinkCentre M715q Tiny" class="gallery-image" data-flex-basis="200px" data-flex-grow="83" height="1799" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://secretmine.de/blog/2025/2025-11-27-der-fujitsu-futro-s740-der-ideale-server/images/lab-2025-2.jpg" srcset="https://secretmine.de/blog/2025/2025-11-27-der-fujitsu-futro-s740-der-ideale-server/images/lab-2025-2_hu_3f5577a7a9bb78e2.jpg 800w, https://secretmine.de/blog/2025/2025-11-27-der-fujitsu-futro-s740-der-ideale-server/images/lab-2025-2.jpg 1500w" width="1500"&gt;&lt;/p&gt;
&lt;h2 id="hardwareerweiterungen"&gt;Hardwareerweiterungen
&lt;/h2&gt;&lt;p&gt;Meistens kommt der Futro S740 mit 8/16 GB EMMC-Speicher und 4 GB RAM. Das lässt sich aber deutlich aufrüsten.&lt;/p&gt;
&lt;h3 id="speicher"&gt;Speicher
&lt;/h3&gt;&lt;p&gt;Eine gute SATA-SSD ist für den Futro Pflicht, um vernünftige I/O-Performance zu gewährleisten. Ich habe zusätzlich eine NVMe-SSD im M.2-Slot für Wifi mit einem simplen Adapter eingebaut. Der Einbau erfordert etwas unorthodoxe Maßnahmen, funktioniert aber auch auf Dauer stabil. Obwohl dieser Slot technisch nicht die volle NVMe-Bandbreite bietet, spürt man die geringeren Latenzen und deutlich höheren IOPS trotzdem. Wichtig ist, hier auf gute Qualität zu achten und lieber kein QLC-Modell zu verwenden. Auch wenn der Slot limitiert ist, lohnt sich die Investition in eine zuverlässige und langlebige SSD, damit der Storage nicht zum Flaschenhals wird.&lt;/p&gt;
&lt;p&gt;Auf ZFS habe ich bei den Futros verzichtet, auch wenn ich sonst wegen der transparenten Komprimierung und dem integrierten Volume-Manager ein großer Fan bin. Auf den Thin Clients hat sich Thin LVM als deutlich schlanker und von den Features her ausreichend bewiesen.&lt;/p&gt;
&lt;h3 id="ram"&gt;RAM
&lt;/h3&gt;&lt;p&gt;Der maximale RAM-Ausbau liegt bei 16 GB, was für die meisten Homelab-Nutzer ausreicht. Damit lässt sich auf jeden Fall einiges erreichen. Wer mehr will, muss sich nach anderer Hardware umsehen. Es empfiehlt sich auch, möglichst gleich 16 GB zu verbauen, um genug Reserven zu haben und nicht später noch wieder neuen RAM kaufen zu müssen.&lt;/p&gt;
&lt;h2 id="stromverbrauch-und-lautstärke"&gt;Stromverbrauch und Lautstärke
&lt;/h2&gt;&lt;p&gt;Das Highlight ist der sehr niedrige Stromverbrauch: Der Futro benötigt im Alltag oft nur um die 5 Watt, was ihn ideal für den Dauerbetrieb macht. Die passive Kühlung macht ihn auch komplett lautlos, wobei man beim Betrieb von mehreren Futros auf eine gute Belüftung achten sollte. Ich habe bei mir einen 120mm-Lüfter, der für Kühlung sorgt.&lt;/p&gt;
&lt;h2 id="was-ich-auf-den-futros-betreibe"&gt;Was ich auf den Futros betreibe
&lt;/h2&gt;&lt;p&gt;Die Liste ist tatsächlich recht lang.&lt;/p&gt;
&lt;p&gt;Zentral ist HomeAssistant, dazu ist am ersten Futro S740 auch ein Zigbee-Stick angeschlossen. Außerdem habe ich einen ADSB-Empfänger, womit ich Daten an z.B. FlightRadar24 übertrage. Dazu folgt vielleicht auch mal ein Post.&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="https://secretmine.de/blog/2024/2024-10-19-zweiter-futro-s740/" &gt;Nextcloud&lt;/a&gt; mit Collabora ist ein weiterer sehr zentraler Dienst, das ist die Hauptaufgabe vom zweiten Futro. Dazu (und auch zu diversen anderen Services) gehört natürlich auch ein Reverse-Proxy, wofür Caddy in einem weiteren LXC läuft.&lt;/p&gt;
&lt;p&gt;Ansonsten laufen zwei &lt;a class="link" href="https://secretmine.de/blog/2025/2025-05-18-blocky-eine-alternative-zu-adguard-home-und-pihhole/" &gt;Blocky-Instanzen&lt;/a&gt; für redundantes DNS, Bind als authoritativer DNS-Server für lokale DNS-Zonen, der Unifi-Controller für meinen Access Point und Smokeping für Latenz-Monitoring. Prometheus, Alertmanager und Grafana darf natürlich auch nicht fehlen. Harbor als lokale Registry (dazu könnte ich auch mal schreiben), &lt;a class="link" href="https://secretmine.de/blog/2025/2025-07-29-lyrion-music-server-und-squeezelite/" &gt;Lyrion Music Server&lt;/a&gt;, Memos als Notizbuch, Code-Server als Blog-Editor und Firefly3 für die Haushaltsfinanzen. Uptime-Kuma darf natürlich auch nicht fehlen.&lt;/p&gt;
&lt;p&gt;Und das ist mit Sicherheit noch nicht alles, das ist nur das, was ich gerade im Kopf habe. Generell lässt sich sagen, dass man mit den Futros mehr machen kann, als man so denkt. Die meisten der Services benötigen im Normalbetrieb fast keine Rechenleistung, damit lande ich bei um die 40 % konstante CPU-Last auf beiden Hosts. Beim RAM sind jeweils 11-12GB voll.&lt;/p&gt;
&lt;p&gt;Generell kann man eigentlich alles auf den Dingern betreiben, nur von Dingen wie einer Windows-Workstation-VM oder einem Minecraft-Server würde ich wegen der fehlenden Single-Core-Performance eher absehen.&lt;/p&gt;
&lt;h2 id="weitere-mögliche-szenarien"&gt;Weitere mögliche Szenarien
&lt;/h2&gt;&lt;p&gt;Mit einem DAS, also einem per USB angebundenen Gehäuse für mehrere Festplatten, lässt sich der S740 mit einem OS wie TrueNAS oder unRAID auch sicherlich gut als NAS verwenden. Die integrierte Intel-GPU kann hier bei einem Mediaserver wie Plex auch Transcoding durchführen. Über den Wifi-Slot lässt sich statt der SSD laut dem Internet auch eine zweite Netzwerkkarte (mit z.B. auch 2,5 GBit/s) verbauen, damit wäre auch der Einsatz als Router denkbar.&lt;/p&gt;
&lt;p&gt;Ein effizienter Kubernetes-Cluster ist auch möglich. Zu Container-Orchestrierung folgt auch in den nächsten Wochen noch ein Post.&lt;/p&gt;
&lt;p&gt;Klar, als klassischer Thin Client - wofür der Futro eigentlich auch gebaut wurde - ist der auch geeignet, ein modernes Desktop-OS (egal ob Windows oder Linux) dürfte auch für einfache Aufgaben brauchbar und flüssig laufen. Als Mediaplayer am Fernseher oder Retro-Spielekonsolen-Emulator taugt der Thin Client sicherlich auch.&lt;/p&gt;
&lt;p&gt;Ich selbst setze einen Futro als Printserver für einen 3D-Drucker ein, funktioniert super.&lt;/p&gt;
&lt;p&gt;Ich finde es erstaunlich, wie vielseitig sich dieses Gerät einsetzen lässt, vor allem bei dem Preis, zu dem man den Futro heutzutage bekommt. Bei mehreren Händlern für Refurbished Hardware gibt es immer mal wieder Angebote mit etwa 40 € pro Stück.&lt;/p&gt;
&lt;h2 id="alter-der-hardware"&gt;Alter der Hardware
&lt;/h2&gt;&lt;p&gt;Auch, wenn ich fast nur positives berichten kann:&lt;/p&gt;
&lt;p&gt;Ich denke, die Hauptzeit des Fujitu Futro S740 ist langsam vorbei. Die CPU ist von 2017 und geht damit langsam auf die 10 Jahre zu und es gibt zunehmend mehr Alternativen.&lt;/p&gt;
&lt;p&gt;Wenn man myDealz und ähnliche Plattformen ansieht, taucht der HP T740 zunehmend häufiger auf. Für mittlerweile unter 100 € bekommt man deutlich mehr Leistung und etwas bessere Aufrüstoptionen. Die CPU-Leistung vom T740 liegt grob beim Dreifachen der des S740. Wenn ich etwas Spielgeld über habe, werde ich mir davon vermutlich auch mal einen zulegen.&lt;/p&gt;
&lt;p&gt;Ansonsten sind Mini-PCs mit dem Intel N100 recht weit verbreitet, ich selbst hatte davon allerdings noch keinen in der Hand. Mini-PCs wie der Lenovo oder auch diverse Modelle von HP oder Dell sind für ein Homelab ebenfalls eine gute Wahl - benötigen aber deutlich mehr Strom.&lt;/p&gt;
&lt;p&gt;Trotz der Alternativen bleibt der Futro S740 auch heute noch eine gute Wahl, vor allem bei den Preisen, zu dem die Geräte mittlerweile erhältlich sind.&lt;/p&gt;
&lt;h2 id="fazit"&gt;Fazit
&lt;/h2&gt;&lt;p&gt;Der Fujitsu Futro S740 ist seit fast drei Jahren ein zuverlässiger, stromsparender Baustein in meinem Homelab. Für leichte bis mittlere Aufgaben reicht die Leistung gut. Vor allem im Cluster mit mehreren Geräten lässt sich viel machen, sogar hochverfügbarkeit mit Ceph ist denkbar. Vor allem als Smart-Home-Zentrale und für leichte bis mittelschwere Services wie Nextcloud, Immich und die anderen üblichen Verdächtigen zum selbst hosten ist der S740 gut geeignet.&lt;/p&gt;
&lt;p&gt;Das größte Argument für mich ist aber tatsächlich die Kombination aus Preis, Leistung und dem Stromverbrauch von um die 5 Watt, das ist einfach kaum schlagbar.&lt;/p&gt;</description></item><item><title>Scriptausführung mit Healthchecks überwachen</title><link>https://secretmine.de/blog/2025/2025-10-31-scriptausfuehrung-mit-healthchecks-ueberwachen/</link><pubDate>Fri, 31 Oct 2025 00:00:00 +0000</pubDate><guid>https://secretmine.de/blog/2025/2025-10-31-scriptausfuehrung-mit-healthchecks-ueberwachen/</guid><description>&lt;p&gt;Ich nutze für regelmäßige Backups von Daten (z.B. Nextcloud) ein kleines Script, das Restic verwendet. Ich hatte allerdings schon mehrfach den Fall, dass ein Backup nicht sauber durchlief und das Backup-Repository damit gesperrt war und weitere Backups fehlschlugen, was ich dann natürlich erst Wochen (okay, Monate) später bemerkt habe.&lt;/p&gt;
&lt;p&gt;Abhilfe schafft hier das Tool Healthchecks (&lt;a class="link" href="https://github.com/healthchecks/healthchecks%29" target="_blank" rel="noopener"
 &gt;https://github.com/healthchecks/healthchecks)&lt;/a&gt;. Das funktioniert so, dass man Checks einrichtet und dafür eine Webhook-URL bekommt. In einem Script ruft man dann diese URL auf und setzt damit den Timer zurück. Sofern der Webhook nicht innerhalb der richtigen Zeit aufgerufen wird, wird ein Alert ausgelöst. Insgesamt also recht simpel.&lt;/p&gt;
&lt;h2 id="installation"&gt;Installation
&lt;/h2&gt;&lt;p&gt;Ich nutze hier, wie üblich, Docker. Hier meine &lt;code&gt;docker-compose.yml&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;span class="lnt"&gt;24
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;services&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;healthchecks&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;image&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;healthchecks/healthchecks:latest&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;container_name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;healthchecks&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;environment&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;DB=sqlite&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;DB_NAME=/data/hc.sqlite&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;DEBUG=False&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;DEFAULT_FROM_EMAIL=me@example.com&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;EMAIL_HOST=smtp.example.com&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;EMAIL_HOST_PASSWORD=MyMailPassword&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;EMAIL_HOST_USER=me@example.com&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;EMAIL_PORT=587&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;EMAIL_USE_TLS=True&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;SECRET_KEY=Hok4K0Va6EwaYltk4ah7muc223rUVmz3&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;SITE_ROOT=https://checks.example.com&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;DISCORD_CLIENT_ID=123123&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;DISCORD_CLIENT_SECRET=123123&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;REGISTRATION_OPEN=False&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;ports&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="m"&gt;8000&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="m"&gt;8000&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;volumes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;./data:/data&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;restart&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;unless-stopped&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;code&gt;REGISTRATION_OPEN&lt;/code&gt; muss initial auf &lt;code&gt;True&lt;/code&gt; gestellt werden, damit man sich selbst registrieren kann, danach sollte das allerdings wieder auf &lt;code&gt;False&lt;/code&gt; gesetzt werden, damit sich keine fremden User registrieren können. Ich habe hier direkt die Discord-Integration eingerichtet, damit ich auf dem Weg auch Notifications verschicken kann. Die beiden Variablen sind aber natürlich optional.&lt;/p&gt;
&lt;p&gt;Das Datenverzeichnis muss die richtigen Zugriffsrechte haben, damit der Container starten kann. Das geht schnell mittels&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;mkdir ./data
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;chown -R 999:999 ./data
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Danach lässt sich der Stack mit &lt;code&gt;docker compose up -d&lt;/code&gt; starten und die Seite aufrufen. Dort kann man sich dann mit einer E-Mail-Adresse registrieren.&lt;/p&gt;
&lt;h2 id="einbindung-in-ein-script"&gt;Einbindung in ein Script
&lt;/h2&gt;&lt;p&gt;Um jetzt einen Check einzurichten, muss zuerst im Webinterface ein neuer Check erstellt werden. Dabei wird auch das normale Intervall (z.B. täglich) sowie eine Karenzzeit eingestellt.&lt;/p&gt;
&lt;p&gt;Nun wird eine Check-URL angezeigt, ich nehme hier &lt;code&gt;https://checks.example.com/ping/bla-bla-blub&lt;/code&gt; als Beispiel.&lt;/p&gt;
&lt;h3 id="simpler-check"&gt;Simpler Check
&lt;/h3&gt;&lt;p&gt;Für einen einfachen Check, ob das Script gelaufen ist, reicht es, einen Befehl wie z.B.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;curl -fsS -m &lt;span class="m"&gt;10&lt;/span&gt; --retry &lt;span class="m"&gt;5&lt;/span&gt; https://checks.example.com/ping/bla-bla-blub
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;mit der Check-URL auszuführen. Der Befehl sollte im Script als letztes ausgeführt werden, damit er erst ausgeführt wird, wenn alles andere funktioniert hat.&lt;/p&gt;
&lt;h3 id="check-mit-laufzeitberechnung"&gt;Check mit Laufzeitberechnung
&lt;/h3&gt;&lt;p&gt;Healthchecks kann auch die Laufzeit eines Scripts mit prüfen. Dazu wird erst der Endpunkt &lt;code&gt;https://checks.example.com/ping/bla-bla-blub/start&lt;/code&gt; aufgerufen und nach Fertigstellung dann &lt;code&gt;https://checks.example.com/ping/bla-bla-blub&lt;/code&gt;. Hierbei sollte auch noch eine Request-ID mitgegeben werden, um die einzelnen Ausführungen voneinander unterscheiden zu können.&lt;/p&gt;
&lt;p&gt;Ich habe das bspw. so umgesetzt:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;span class="lnt"&gt;8
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;set&lt;/span&gt; -e
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;RID&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sb"&gt;`&lt;/span&gt;uuidgen&lt;span class="sb"&gt;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;HEALTHCHECK_ID&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;bla-bla-blub
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;curl -fsS -m &lt;span class="m"&gt;10&lt;/span&gt; --retry &lt;span class="m"&gt;5&lt;/span&gt; https://checks.example.com/ping/&lt;span class="nv"&gt;$HEALTHCHECK_ID&lt;/span&gt;/start?rid&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$RID&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# do backup&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;curl -fsS -m &lt;span class="m"&gt;10&lt;/span&gt; --retry &lt;span class="m"&gt;5&lt;/span&gt; https://checks.example.com/ping/&lt;span class="nv"&gt;$HEALTHCHECK_ID&lt;/span&gt;?rid&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$RID&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Nachdem das Script ausgeführt wurde, sieht das im Webinterface so aus:&lt;/p&gt;
&lt;p&gt;&lt;img alt="Ausgeführter Check" class="gallery-image" data-flex-basis="430px" data-flex-grow="179" height="573" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://secretmine.de/blog/2025/2025-10-31-scriptausfuehrung-mit-healthchecks-ueberwachen/images/check.png" srcset="https://secretmine.de/blog/2025/2025-10-31-scriptausfuehrung-mit-healthchecks-ueberwachen/images/check_hu_5c0e8ac9055829a.png 800w, https://secretmine.de/blog/2025/2025-10-31-scriptausfuehrung-mit-healthchecks-ueberwachen/images/check.png 1027w" width="1027"&gt;&lt;/p&gt;
&lt;p&gt;Sollte ein Check nicht innerhalb der eingestellten Zeit aufgerufen werden, wird eine Notification ausgelöst. So sollte ich in Zukunft fehlschlagende Backups schneller bemerken.&lt;/p&gt;</description></item><item><title>Die Historie meines Labs (2016 bis Q3 2025)</title><link>https://secretmine.de/blog/2025/2025-10-22-homelab-historie/</link><pubDate>Wed, 22 Oct 2025 00:00:00 +0000</pubDate><guid>https://secretmine.de/blog/2025/2025-10-22-homelab-historie/</guid><description>&lt;p&gt;Mein Homelab existiert seit 2016 - wenn man es als dauerhaften Betrieb von irgendwelchen Servern/Services zu Hause
definiert. Wenn die Definition auch nur temporär aktive Server beinhaltet, geht es sogar noch weiter zurück, wobei ich dann das
Jahr nicht einmal genau definieren kann. Mein Lab hat generell viele Iterationen durch, wobei das auch mehr ein kontinulierlicher Prozess ist. Ich habe hier einmal die bisherigen nennenswerten Iterationen einmal aufgelistet.&lt;/p&gt;
&lt;h2 id="vor-2016"&gt;Vor 2016
&lt;/h2&gt;&lt;p&gt;Ich habe auf einem alten Laptop erst versucht, mit ESXi herumzuspielen, dann aber festgestellt, dass die CPU noch keine Hardwarevirtualisierung kann. Daher habe ich dann Debian und openVZ installiert, um zumindest mit Containern arbeiten zu können. Das lief auch soweit brauchbar.&lt;/p&gt;
&lt;h2 id="2016---erste-richtige-anfänge"&gt;2016 - erste richtige Anfänge
&lt;/h2&gt;&lt;p&gt;&lt;img alt="Lab 2016" class="gallery-image" data-flex-basis="180px" data-flex-grow="75" height="2000" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://secretmine.de/blog/2025/2025-10-22-homelab-historie/images/lab-2016.jpg" srcset="https://secretmine.de/blog/2025/2025-10-22-homelab-historie/images/lab-2016_hu_89893d0861d3135a.jpg 800w, https://secretmine.de/blog/2025/2025-10-22-homelab-historie/images/lab-2016.jpg 1500w" width="1500"&gt;&lt;/p&gt;
&lt;p&gt;2016 habe ich bei meinen Eltern den ersten Server dauerhaft betrieben. Es war ein Server mit einem AMD Sempron 3850
(kleine CPU mit 4 Kernen von AMD, ziemlich leistungsschwach). Der Standort im Haus war nur über Powerline zu erreichen,
das hat mich aber damals nicht nennenswert gestört. Ich habe dort mit Proxmox verschiedene VMs betrieben, welche
Software genau in den VMs und Containern lief weiß ich gar nicht mehr so genau.&lt;/p&gt;
&lt;h2 id="2017"&gt;2017
&lt;/h2&gt;&lt;p&gt;&lt;img alt="Lab 2017" class="gallery-image" data-flex-basis="247px" data-flex-grow="103" height="1500" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://secretmine.de/blog/2025/2025-10-22-homelab-historie/images/lab-2017.jpg" srcset="https://secretmine.de/blog/2025/2025-10-22-homelab-historie/images/lab-2017_hu_6c7ed91d71ffacda.jpg 800w, https://secretmine.de/blog/2025/2025-10-22-homelab-historie/images/lab-2017.jpg 1546w" width="1546"&gt;&lt;/p&gt;
&lt;p&gt;Im Laufe des Jahres kamen dann zwei weitere Server dazu. Einerseits ein alter Dell Poweredge (mit einem Xeon X3220),
andererseits ein alter PC mit einem Core2Duo. Beide Maschinen liefen nicht dauerhaft, diese habe ich nur bei Bedarf mit
hochgefahren. Für den Dauerbetrieb wäre der Stromverbrauch viel zu hoch gewesen. Ich habe auch am Netzwerk Änderungen
vorgenommen, konkret den bisherigen 100M-Switch durch ein Gigabit-Fähiges Modell ausgetauscht.&lt;/p&gt;
&lt;h2 id="2018"&gt;2018
&lt;/h2&gt;&lt;p&gt;Hiervon habe ich leider kein Bild. Ich habe allerdings in meinem Zimmer im Studentenwohnheim hinter einem Regal einen kleinen Server betrieben. Dieser lief erst mit einem Intel Celeron G1820, dann habe ich via Ebay günstig ein Bundle mit einem Supermicro-Mainboard, einem Intel Xeon E3-1230v3 und 32GB ECC-RAM gekauft und in das Gehäuse gesetzt. Auf dem Server lief u.A. pfSense als Router, daneben noch diverse andere Services - auch hier habe ich leider keine Übersicht mehr, was das genau war. Irgendwann in dem Zeitraum habe ich auch eine einfache USV gekauft.&lt;/p&gt;
&lt;h2 id="2019"&gt;2019
&lt;/h2&gt;&lt;p&gt;&lt;img alt="Lab 2019 - Server" class="gallery-image" data-flex-basis="218px" data-flex-grow="91" height="1644" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://secretmine.de/blog/2025/2025-10-22-homelab-historie/images/lab-2019-1.jpg" srcset="https://secretmine.de/blog/2025/2025-10-22-homelab-historie/images/lab-2019-1_hu_d4b3d63412714e79.jpg 800w, https://secretmine.de/blog/2025/2025-10-22-homelab-historie/images/lab-2019-1.jpg 1500w" width="1500"&gt;&lt;/p&gt;
&lt;p&gt;Nachdem ich umgezogen war, hatte ich etwas mehr Möglichkeiten, ab hier habe ich auch für meinen Strom dann vollkommen selbst bezahlt. Der Server ist in ein schickeres Gehäuse gewandert, im Rahmen von dem Umzug habe ich auch das NAS, das bis dahin bei meinen Eltern stand, mit in die Wohnung geholt. Das NAS dürfte zu dem Zeitpunkt noch einen AMD Sempron 3850 als CPU gehabt haben, auch das kann ich leider nicht mehr wirklich rekonstruieren.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Lab 2019 - Netzwerk" class="gallery-image" data-flex-basis="272px" data-flex-grow="113" height="2656" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://secretmine.de/blog/2025/2025-10-22-homelab-historie/images/lab-2019-2.jpg" srcset="https://secretmine.de/blog/2025/2025-10-22-homelab-historie/images/lab-2019-2_hu_fe7d70370f7eafb8.jpg 800w, https://secretmine.de/blog/2025/2025-10-22-homelab-historie/images/lab-2019-2_hu_9ba98716b59c74dc.jpg 1600w, https://secretmine.de/blog/2025/2025-10-22-homelab-historie/images/lab-2019-2_hu_b41e2830068d23a6.jpg 2400w, https://secretmine.de/blog/2025/2025-10-22-homelab-historie/images/lab-2019-2.jpg 3016w" width="3016"&gt;&lt;/p&gt;
&lt;p&gt;Das Netzwerk habe ich beim Umzug auch vollkommen neu gestrickt. Zentrum war ab dann ein Unifi USG mit einem Unifi AP AC Lite (man sieht links den PoE-Injector) als Access Point. Der 8-Port-Switch war vorher schon im Einsatz. Als Modem kam vor dem USG eine ältere Fritzbox zum Einsatz, die ist auch bis heute noch aktiv. Heutzutage ist die allerdings nur noch Basisstation für ein Schnurlostelefon sowie einige Thermostate. Das USG habe ich nach dem nächsten Umzug (2022) verkauft.&lt;/p&gt;
&lt;h2 id="2020"&gt;2020
&lt;/h2&gt;&lt;p&gt;&lt;img alt="Lab 2020" class="gallery-image" data-flex-basis="179px" data-flex-grow="74" height="2005" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://secretmine.de/blog/2025/2025-10-22-homelab-historie/images/lab-2020.jpg" srcset="https://secretmine.de/blog/2025/2025-10-22-homelab-historie/images/lab-2020_hu_59fdc47c056990a5.jpg 800w, https://secretmine.de/blog/2025/2025-10-22-homelab-historie/images/lab-2020.jpg 1500w" width="1500"&gt;&lt;/p&gt;
&lt;p&gt;Ich hatte den Plan, mir irgendwann mal ein Rack zuzulegen. Deswegen habe ich mehr oder weniger &amp;ldquo;einfach so&amp;rdquo; ein Rack-Gehäuse von Inter-Tech gekauft und den Server in dieses Case verschoben. Ich musste auch noch ein passendes Netzteil dazu kaufen, da die meisten ATX-Netzteile unten ansaugen und nach hinten rausblasen - von unten/oben Luft ansaugen geht bei so einem Case allerdings schlecht. Das Case habe ich auch bis heute, ein Rack bislang aber nicht. Vielleicht kommt das irgendwann dann doch noch mal&amp;hellip;&lt;/p&gt;
&lt;p&gt;Die USV ist auf dem Bild außer Betrieb, das habe ich irgendwann aus Stromgründen getan.&lt;/p&gt;
&lt;h2 id="2021"&gt;2021
&lt;/h2&gt;&lt;p&gt;&lt;img alt="Lab 2021" class="gallery-image" data-flex-basis="319px" data-flex-grow="133" height="2000" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://secretmine.de/blog/2025/2025-10-22-homelab-historie/images/lab-2021.jpg" srcset="https://secretmine.de/blog/2025/2025-10-22-homelab-historie/images/lab-2021_hu_3ed924e9a76e5cc5.jpg 800w, https://secretmine.de/blog/2025/2025-10-22-homelab-historie/images/lab-2021_hu_89d3a005fbe795f2.jpg 1600w, https://secretmine.de/blog/2025/2025-10-22-homelab-historie/images/lab-2021_hu_f3edf4a37ece20f6.jpg 2400w, https://secretmine.de/blog/2025/2025-10-22-homelab-historie/images/lab-2021.jpg 2664w" width="2664"&gt;&lt;/p&gt;
&lt;p&gt;Der Unterschied zu vorher ist kaum sichtbar, der Server steht nun allerdings auf Styropor und das NAS darauf. In dem weißen Kasten sind Module von Tinkerforge, der Temperatursensor hängt sichtbar vorne raus.&lt;/p&gt;
&lt;p&gt;Hier kann man auch sehen, dass im NAS irgendeine Intel-CPU arbeitet und den Sempron 3850 abgelöst hat. Welche das ist weiß ich nicht, entweder der Celeron G1820 oder ein Core i3 4130; wahrscheinlicher ist allerdings der Celeron.&lt;/p&gt;
&lt;p&gt;Das USG von Unifi ist hier auch schon nicht mehr in Betrieb, der Router ist nun ein Mikrotik hAP AC². Der Unif-Accesspoint dürfte allerdings zu dem Zeitpunkt noch aktiv gewesen sein, zumindest sehe ich auf dem Bild einen schwarzen Block hinten im Regal, der wahrscheinlich der PoE-Injektor ist. Später habe ich den Switch durch einen 24-Port-Switch von TP-Link getauscht, da ich mit 8 Ports nicht mehr hinkam. Ich habe nämlich immer mal wieder einen zweiten Server mit meiner alten Desktop-CPU (Intel Core i5 4440) betrieben, worauf dann mein Minecraft-Server lief. Zeitweise habe ich auch mit einem reinen SSD-NAS experimentiert - ein weiterer Tower.&lt;/p&gt;
&lt;h2 id="2022"&gt;2022
&lt;/h2&gt;&lt;p&gt;&lt;img alt="Lab 2022" class="gallery-image" data-flex-basis="172px" data-flex-grow="71" height="2784" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://secretmine.de/blog/2025/2025-10-22-homelab-historie/images/lab-2022.jpg" srcset="https://secretmine.de/blog/2025/2025-10-22-homelab-historie/images/lab-2022_hu_816bed61aa65ef84.jpg 800w, https://secretmine.de/blog/2025/2025-10-22-homelab-historie/images/lab-2022_hu_170ee1c6efe26c27.jpg 1600w, https://secretmine.de/blog/2025/2025-10-22-homelab-historie/images/lab-2022.jpg 2000w" width="2000"&gt;&lt;/p&gt;
&lt;p&gt;Ende 2022 bin ich erneut umgezogen, in dem Zuge habe ich das Lab wieder weiter verändert. Der dauerhaft laufende Server ist komplett entfallen und durch zwei Raspberry Pis ersetzt worden. Das Netzwerk hat sich auch stark geändert - Basis ist nun ein Mikrotik hAP AC2. Als Modem ist eine Vodafone Station sowie ein LTE-Router von TP-Link dazugekommen. Auch ein zweiter Switch ist neu.&lt;/p&gt;
&lt;p&gt;Das NAS sowie der Server auf Supermicro-Basis (zurück in einem Tower-Case) haben einen anderen Ort innerhalb vom Arbeitszimmer bekommen - die Bilder von 2023 zeigen das gut.&lt;/p&gt;
&lt;h2 id="2023"&gt;2023
&lt;/h2&gt;&lt;p&gt;&lt;img alt="Lab 2023 - Produktivbereich" class="gallery-image" data-flex-basis="173px" data-flex-grow="72" height="2762" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://secretmine.de/blog/2025/2025-10-22-homelab-historie/images/lab-2023-1.jpg" srcset="https://secretmine.de/blog/2025/2025-10-22-homelab-historie/images/lab-2023-1_hu_6ce12a64336ef002.jpg 800w, https://secretmine.de/blog/2025/2025-10-22-homelab-historie/images/lab-2023-1_hu_efeb8d515ae5bbbe.jpg 1600w, https://secretmine.de/blog/2025/2025-10-22-homelab-historie/images/lab-2023-1.jpg 2000w" width="2000"&gt;&lt;/p&gt;
&lt;p&gt;Die Raspberry Pis waren dann schneller zu klein als gedacht - es musste wieder mehr Hardware her. Deshalb kam hier der erste Futro S740 dazu. Das Regal habe ich in dem Zuge auch gleich getauscht.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Lab 2023 - NAS und Lab-Bereich" class="gallery-image" data-flex-basis="186px" data-flex-grow="77" height="2569" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://secretmine.de/blog/2025/2025-10-22-homelab-historie/images/lab-2023-2.jpg" srcset="https://secretmine.de/blog/2025/2025-10-22-homelab-historie/images/lab-2023-2_hu_84bea9c8ba98c6f6.jpg 800w, https://secretmine.de/blog/2025/2025-10-22-homelab-historie/images/lab-2023-2_hu_f3f4020ecb9f5329.jpg 1600w, https://secretmine.de/blog/2025/2025-10-22-homelab-historie/images/lab-2023-2.jpg 2000w" width="2000"&gt;&lt;/p&gt;
&lt;p&gt;Der Server auf Supermicro-Basis ist wieder in ein normales Tower-Case gewandert und in einer anderen Ecke im Arbeitszimmer hinter einem Regal verschwunden (man sieht es hinten auf dem Bild). Das NAS steht auf dem genannten Regal. Das hing alles hinter einer WLAN-Steckdose, um den Standby-Verbrauch möglichst weit zu reduzieren.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Keller-Lab Ende 2023" class="gallery-image" data-flex-basis="301px" data-flex-grow="125" height="1592" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://secretmine.de/blog/2025/2025-10-22-homelab-historie/images/keller-2023.jpg" srcset="https://secretmine.de/blog/2025/2025-10-22-homelab-historie/images/keller-2023_hu_52e450479d1a5626.jpg 800w, https://secretmine.de/blog/2025/2025-10-22-homelab-historie/images/keller-2023_hu_adaba87cd61f2119.jpg 1600w, https://secretmine.de/blog/2025/2025-10-22-homelab-historie/images/keller-2023.jpg 2000w" width="2000"&gt;&lt;/p&gt;
&lt;p&gt;Später im Jahr habe ich dann den Supermicro-Server doch wieder in das Rack-Case umgebaut und zusammen mit dem großen Switch im Keller platziert. Die Anbindung vom Keller ging leider nur per Powerline, aber das lässt sich auch nicht ändern.&lt;/p&gt;
&lt;h2 id="2024"&gt;2024
&lt;/h2&gt;&lt;p&gt;&lt;img alt="Lab 2024" class="gallery-image" data-flex-basis="179px" data-flex-grow="74" height="2667" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://secretmine.de/blog/2025/2025-10-22-homelab-historie/images/lab-2024.jpg" srcset="https://secretmine.de/blog/2025/2025-10-22-homelab-historie/images/lab-2024_hu_444e428cf1fc0293.jpg 800w, https://secretmine.de/blog/2025/2025-10-22-homelab-historie/images/lab-2024_hu_82cf5874f020a03a.jpg 1600w, https://secretmine.de/blog/2025/2025-10-22-homelab-historie/images/lab-2024.jpg 2000w" width="2000"&gt;&lt;/p&gt;
&lt;p&gt;Herbst 2024 kam der zweite Fujitsu Futro S740 und auch ein Lenovo Tinkcenter M715q Tiny dazu, auch habe ich den 5-Port-Switch durch einen 8-Port-Switch ausgetauscht, der neue Switch ist auch VLAN-fähig. Der Lüfter, der auf den Thin Clients liegt, ist auch neu - der war notwendig, da die SSDs bei beiden Thin Clients mit der Zeit zu warum wurden.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Keller-Lab 2024" class="gallery-image" data-flex-basis="239px" data-flex-grow="99" height="2007" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://secretmine.de/blog/2025/2025-10-22-homelab-historie/images/keller-2024.jpg" srcset="https://secretmine.de/blog/2025/2025-10-22-homelab-historie/images/keller-2024_hu_93bb3fbc02ceeaf2.jpg 800w, https://secretmine.de/blog/2025/2025-10-22-homelab-historie/images/keller-2024_hu_37569da2c1a6d914.jpg 1600w, https://secretmine.de/blog/2025/2025-10-22-homelab-historie/images/keller-2024.jpg 2000w" width="2000"&gt;&lt;/p&gt;
&lt;p&gt;Im Keller ist der HP-Server dazugekommen, auch ein zweiter Thin-Client (Futro S520) ist hier neu. Der Keller hat zwischenzeitlich auch einen eigenen Mikrotik hAP AC2 bekommen, damit ich Routen via BGP austauschen kann, WLAN im Keller habe und die Netze zwecks Reduzierung von Broadcast auch soweit getrennt laufen.&lt;/p&gt;
&lt;h2 id="2025"&gt;2025
&lt;/h2&gt;&lt;p&gt;Anfang des Jahres sind einige Hardware-Upgrades passiert, aber wenig sichtbares. Im Sommer habe ich allerdings beschlossen, mir ein 10-Zoll-Rack zu bauen. Die Rahmen sind mit dem 3D-Drucker gedruckt, die Schienen zum Festschrauben als fertige Teile gekauft.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Lab 2025" class="gallery-image" data-flex-basis="141px" data-flex-grow="59" height="2537" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://secretmine.de/blog/2025/2025-10-22-homelab-historie/images/lab-2025-1.jpg" srcset="https://secretmine.de/blog/2025/2025-10-22-homelab-historie/images/lab-2025-1_hu_9322cae8f371ac25.jpg 800w, https://secretmine.de/blog/2025/2025-10-22-homelab-historie/images/lab-2025-1.jpg 1500w" width="1500"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="Lab 2025" class="gallery-image" data-flex-basis="200px" data-flex-grow="83" height="1799" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://secretmine.de/blog/2025/2025-10-22-homelab-historie/images/lab-2025-2.jpg" srcset="https://secretmine.de/blog/2025/2025-10-22-homelab-historie/images/lab-2025-2_hu_3f5577a7a9bb78e2.jpg 800w, https://secretmine.de/blog/2025/2025-10-22-homelab-historie/images/lab-2025-2.jpg 1500w" width="1500"&gt;&lt;/p&gt;
&lt;h2 id="was-geplant-ist"&gt;Was geplant ist
&lt;/h2&gt;&lt;p&gt;&amp;hellip;das ist eine gute Frage. Gerade wenig konkretes. Ich habe viele Ideen, aber was davon ich wann umsetze, weiß ich tatsächlich nicht. Der Router ist für manches zu schwach (und hat auch wenig Speicher), ein Switch mit PoE wäre schön (damit der Injektor wegfällt), mehr Mini-PCs statt Thin-Clients wären eine Idee, ein NAS für VMs und co wäre cool, ein Server mit GPU fände ich auch nett&amp;hellip;&lt;/p&gt;
&lt;p&gt;Als nächstes wird vielleicht einer der Thin Clients noch gegen einen Mini-PC getauscht. Ich habe mittlerweile teilweise zu wenig RAM, vor allem wenn gerade ein LLM aktiv ist. Welche und wofür ich LLMs nutze, schreibe ich vielleicht irgendwann auch mal auf.&lt;/p&gt;</description></item><item><title>Fritz!Box in HomeAssistant via WAN einbinden</title><link>https://secretmine.de/blog/2025/2025-09-14-fritzbox-homeassistant-via-wan/</link><pubDate>Sun, 14 Sep 2025 00:00:00 +0000</pubDate><guid>https://secretmine.de/blog/2025/2025-09-14-fritzbox-homeassistant-via-wan/</guid><description>&lt;p&gt;Ich habe eine alte Fritz!Box 7360, die als DECT-Basisstation für ein schnurloses Telefon sowie vier Thermostate dient. Die Fritz!Box ist bei mir außerdem nicht als Router im Einsatz, was den Zugriff via HomeAssistant erschwert.&lt;/p&gt;
&lt;h2 id="zugriff-via-wan-erlauben"&gt;Zugriff via WAN erlauben
&lt;/h2&gt;&lt;p&gt;Die Fritzbox hängt normal hinter meinem eigentlichen Router und ist dabei so konfiguriert, dass der Internetzugang über LAN1 erfolgt. Standardmäßig ist allerdings das Interface der Fritz!Box nur vom LAN der Fritz!Box erreichbar, also nicht von meinen normalen Netzwerken aus. Dafür gibt es in den Einstellungen (bei mir unter Internet -&amp;gt; Freigaben im Tab &amp;ldquo;Fritz!Box-Dienste&amp;rdquo;) eine möglichkeit, den Zugang zur Fritz!Box-Overfläche via HTTPS aus dem Internet zu erlauben.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Fritz!Box Einstellungen für Zugriff auf die Oberfläche via WAN" class="gallery-image" data-flex-basis="700px" data-flex-grow="291" height="362" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://secretmine.de/blog/2025/2025-09-14-fritzbox-homeassistant-via-wan/images/fritz-allow-wan.png" srcset="https://secretmine.de/blog/2025/2025-09-14-fritzbox-homeassistant-via-wan/images/fritz-allow-wan_hu_a88e849184102d08.png 800w, https://secretmine.de/blog/2025/2025-09-14-fritzbox-homeassistant-via-wan/images/fritz-allow-wan.png 1057w" width="1057"&gt;&lt;/p&gt;
&lt;h2 id="caddy-als-proxy-zur-umgehung-vom-zertifikatsfehler"&gt;Caddy als Proxy zur Umgehung vom Zertifikatsfehler
&lt;/h2&gt;&lt;p&gt;Die Fritz!Box erlaubt den Zugriff auf die Oberfläche vom Internet aus nur via HTTPS. Das ist ein Problem, weil hierbei natürlich ein selbst signiertes Zertifikat zum Einsatz kommt, was HomeAssistant nicht validieren kann. Um das Problem zum umgehen, habe ich Caddy als Reverse-Proxy eingesetzt, der dann die Fritz!Box via HTTP erreichbar macht und das nicht signierte Zertifikat ignoriert.&lt;/p&gt;
&lt;p&gt;Dazu habe ich einfach das Addon &amp;ldquo;Caddy 2&amp;rdquo; installiert und in der Config (ich nutze für den Zugriff auf die Configs das Addon &amp;ldquo;Samba share&amp;rdquo;, um via Netzlaufwerk auf die Dateien zuzugreifen) dann folgendes eingetragen:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;span class="lnt"&gt;8
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;:8400 {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; reverse_proxy {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; to https://192.168.176.4
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; transport http {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; tls_insecure_skip_verify
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Angepasst werden muss hierbei nur die Ziel-IP und vielleicht noch der Listening-Port. Mit der Einstellung &lt;code&gt;tls_insecure_skip_verify&lt;/code&gt; wird das Zertifikat vom Ziel nicht geprüft - genau das, was wir erreichen wollen.&lt;/p&gt;
&lt;p&gt;Nach einem Neustart von Caddy sollte die Fritz!Box-Oberfläche nun unter &lt;code&gt;http://homeassistant:8400&lt;/code&gt; erreichbar sein.&lt;/p&gt;
&lt;h2 id="konfiguration-homeassistant"&gt;Konfiguration HomeAssistant
&lt;/h2&gt;&lt;p&gt;Nun kann ganz normal die Integration &amp;ldquo;AVM FRITZ!SmartHome&amp;rdquo; genutzt werden, als Host wird jetzt die IP von HomeAssistant mit HTTP und dem Port 8400 eingetragen. Damit greift HomeAssistant via Caddy auf die Fritz!Box zu und sollte keine Fehler werfen.&lt;/p&gt;
&lt;p&gt;Das Setup ist bei mir nun seit 2-3 Jahren genau so im Einsatz und funktioniert absolut problemlos.&lt;/p&gt;</description></item><item><title>Lokaler APT-Cache mit Apt-Cacher NG</title><link>https://secretmine.de/blog/2025/2025-09-08-lokaler-apt-cache-mit-apt-cacher-ng/</link><pubDate>Mon, 08 Sep 2025 00:00:00 +0000</pubDate><guid>https://secretmine.de/blog/2025/2025-09-08-lokaler-apt-cache-mit-apt-cacher-ng/</guid><description>&lt;p&gt;Caching ist ein alter Hut - früher vor allem genutzt, um bei vielen Clients hinter einem Internetanschluss Assets wie Bilder und Videos möglichst nur einmal herunterzuladen und dann bei weiteren Aufrufen das Bild aus dem Cache auszuliefern. Kurz gesagt, um Bandbreite zu sparen bzw. die Auslieferung von Daten an mehrere Clients zu beschleunigen.&lt;/p&gt;
&lt;p&gt;Das Ganze lässt sich auch für APT (den Paketmanager, den bspw. Debian und Ubuntu einsetzen) umsetzen - das ist tatsächlich auch einer der Gründe, warum APT-Repos heutzutage immer noch meistens via &lt;code&gt;http&lt;/code&gt; und nicht &lt;code&gt;https&lt;/code&gt; ausgeliefert werden. Mit &lt;code&gt;https&lt;/code&gt; kommt Verschlüsselung dazu, was Caching ungemein erschwert.&lt;/p&gt;
&lt;h2 id="was-bringt-das"&gt;Was bringt das?
&lt;/h2&gt;&lt;p&gt;Ich habe bekanntlich mehrere physische Server sowie irgendwas um die 30-40 virtuellen Server (sowohl virtuelle Maschinen als auch containerbasiert, z. B. LXC), die regelmäßig mit Updates versorgt werden wollen. Bisher hat sich dann jeder Server seine Pakete direkt aus dem Internet gezogen, was natürlich für eine gute Menge an Traffic gesorgt hat. Mit einem Cache lädt jeweils nur der erste Server ein bestimmtes Paket durch den Cache aus dem Internet herunter, die anderen Server ziehen sich das Paket dann vom Cache. Der Cache funktioniert dabei als Proxy, bis auf die Einstellungen für den Proxy muss bei APT nichts angepasst werden. Der Cache spart bei mir primär ein wenig Zeit, da vor allem bei größeren Paketen dann alle weiteren Server mit Geschwindigkeiten nahe an 1 GBit/s die Pakete herunterladen können.&lt;/p&gt;
&lt;h2 id="automatische-nutzung-mittels-auto-apt-proxy"&gt;Automatische Nutzung mittels auto-apt-proxy
&lt;/h2&gt;&lt;p&gt;Es gibt für Debian und Ubuntu (und diverse weitere Distros) das Tool &lt;code&gt;auto-apt-proxy&lt;/code&gt; (Paketname ist identisch). Damit lässt sich ein Apt-Proxy (was der Cache ja auch ist) im Netzwerk automatisch erkennen und nutzen. Ich habe die dafür notwendigen DNS-Einträge lokal hinzugefügt und via Ansible das Paket auf allen Servern installiert, damit nutzt jeder Server direkt den Proxy, ohne weitere manuelle Einstellungen vornehmen zu müssen. Neben DNS gibt es allerdings auch andere Methoden, um &lt;code&gt;auto-apt-proxy&lt;/code&gt; den korrenten Proxy zu signalisieren.&lt;/p&gt;
&lt;h2 id="wie-viel-bringt-das"&gt;Wie viel bringt das?
&lt;/h2&gt;&lt;p&gt;Apt-Cacher NG hat eine Statistikseite (&lt;code&gt;http://ip-vom-cache:3142/acng-report.html&lt;/code&gt;), die einige Einblicke in den Cache erlauben. Ich erreiche insgesamt eine Bandbreitenersparnis von über 70%, das kann sich schon sehen lassen. Hier einmal die Details:&lt;/p&gt;
&lt;p&gt;&lt;img alt="Apt-Cacher NG Statistiken" class="gallery-image" data-flex-basis="525px" data-flex-grow="218" height="311" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://secretmine.de/blog/2025/2025-09-08-lokaler-apt-cache-mit-apt-cacher-ng/images/stats.png" width="681"&gt;&lt;/p&gt;
&lt;h2 id="meine-config"&gt;Meine Config
&lt;/h2&gt;&lt;p&gt;Die Datei befindet sich unter &lt;code&gt;/etc/apt-cacher-ng/acng.conf&lt;/code&gt;. Relevant ist vor allem das &lt;code&gt;CacheDir&lt;/code&gt;, darin werden die zwischengespeicherten Pakete abgelegt.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-gdscript3" data-lang="gdscript3"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;CacheDir&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;mnt&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;apt&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;cacher&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;ng&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;LogDir&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="k"&gt;var&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nb"&gt;log&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;apt&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;cacher&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;ng&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;SupportDir&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;usr&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;lib&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;apt&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;cacher&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;ng&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;Remap&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;debrep&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;file&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;deb_mirror&lt;/span&gt;&lt;span class="o"&gt;*.&lt;/span&gt;&lt;span class="n"&gt;gz&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;debian&lt;/span&gt; &lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;file&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;backends_debian&lt;/span&gt; &lt;span class="c1"&gt;# Debian Archives&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;Remap&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;uburep&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;file&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;ubuntu_mirrors&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;ubuntu&lt;/span&gt; &lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;file&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;backends_ubuntu&lt;/span&gt; &lt;span class="c1"&gt;# Ubuntu Archives&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;Remap&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;klxrep&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;file&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;kali_mirrors&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;kali&lt;/span&gt; &lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;file&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;backends_kali&lt;/span&gt; &lt;span class="c1"&gt;# Kali Linux Archives&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;Remap&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;cygwin&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;file&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;cygwin_mirrors&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;cygwin&lt;/span&gt; &lt;span class="c1"&gt;# ; file:backends_cygwin # incomplete, please create this file or specify preferred mirrors here&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;Remap&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;sfnet&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;file&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;sfnet_mirrors&lt;/span&gt; &lt;span class="c1"&gt;# ; file:backends_sfnet # incomplete, please create this file or specify preferred mirrors here&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;Remap&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;alxrep&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;file&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;archlx_mirrors&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;archlinux&lt;/span&gt; &lt;span class="c1"&gt;# ; file:backend_archlx # Arch Linux&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;Remap&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;fedora&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;file&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;fedora_mirrors&lt;/span&gt; &lt;span class="c1"&gt;# Fedora Linux&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;Remap&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;epel&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;file&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;epel_mirrors&lt;/span&gt; &lt;span class="c1"&gt;# Fedora EPEL&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;Remap&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;slrep&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;file&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;sl_mirrors&lt;/span&gt; &lt;span class="c1"&gt;# Scientific Linux&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;Remap&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;gentoo&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;file&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;gentoo_mirrors&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;gz&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;gentoo&lt;/span&gt; &lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;file&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;backends_gentoo&lt;/span&gt; &lt;span class="c1"&gt;# Gentoo Archives&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;debian&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;security&lt;/span&gt; &lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;deb&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;debian&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;org&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;debian&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;security&lt;/span&gt; &lt;span class="n"&gt;security&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;debian&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;org&lt;/span&gt; &lt;span class="n"&gt;cdn&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;fastly&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;deb&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;debian&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;org&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;debian&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;security&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;ReportPage&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;acng&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;report&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;html&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;ExThreshold&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;FollowIndexFileRemoval&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;LocalDirs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;acng&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;doc&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;usr&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;share&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;doc&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;apt&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;cacher&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;ng&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;AllowUserPorts&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;80&lt;/span&gt; &lt;span class="mi"&gt;443&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;PassThroughPattern&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;.*&lt;/span&gt; &lt;span class="c1"&gt;# this would allow CONNECT to everything&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Das meiste davon ist Standard, ich habe vor allem PassThroughPattern ergänzt, damit auch Fremd-Repos mit https, die ja nicht ohne weiteres gecached werden können, weiterhin funktionieren. Was die Optionen konkret machen ist in der Default-Config gut erklärt. Wenn man mehrere Apt-Cacher-NG hintereinander schalten möchte (ich habe einen zweiten im Keller) sollte noch folgende Option gesetzt werden:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;VfileUseRangeOps: 0
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;</description></item><item><title>Stromverbrauch im Homelab optimieren</title><link>https://secretmine.de/blog/2025/2025-08-16-stromverbrauch-optimieren/</link><pubDate>Sat, 16 Aug 2025 00:00:00 +0000</pubDate><guid>https://secretmine.de/blog/2025/2025-08-16-stromverbrauch-optimieren/</guid><description>&lt;p&gt;Ich achte bekanntlich stark darauf, den Stromverbrauch meines Homelabs im Idle-Zustand möglichst gering zu halten. Ich möchte hier einmal sammeln, worauf ich dabei achte und wie ich meine Hardware auswähle. Alles sind Tipps und nicht unbedingt allgemeingültig.&lt;/p&gt;
&lt;h2 id="monitoring"&gt;Monitoring
&lt;/h2&gt;&lt;p&gt;Der Stromverbrauch sollte mit z.B. einem Smart Plug überwacht werden, das ermöglicht auch das Erkennen von unerwarteten Erhöhungen
Bisher messe ich den Stromverbrauch für das gesamte Lab, schöner wäre hier der Verbrauch pro Gerät. Dann könnte man z.B. anhand der CPU-Last sogar grob den Stromverbrauch pro Dienst berechnen. Ob ich das umsetze, weiß ich allerdings noch nicht, da jede weitere WLAN-Steckdose den Gesamtverbrauch wieder um ~1 Watt erhöht.&lt;/p&gt;
&lt;h2 id="hardware"&gt;Hardware
&lt;/h2&gt;&lt;p&gt;Bevor zum Energie einsparen zusätzliche Hardware angeschafft werden soll, sollte man immer prüfen, ob sich die Stromersparnis im Vergleich zu den Anschaffungskosten überhaupt rechnet. Es kann sich auch lohnen, nicht ganz topaktuelle Hardware für deutlich weniger Geld zu kaufen. Bei einer Nutzungsdauer von x Jahren kann neuere Hardware durch den höheren Preis schnell mal die Stromersparnisse komplett aufheben bzw. auch übertreffen.&lt;/p&gt;
&lt;h3 id="weniger-ist-mehr"&gt;Weniger ist mehr
&lt;/h3&gt;&lt;p&gt;Jedes zusätzliche Gerät - also sowohl größere Geräte wie Router/Switch/Mini-PC als auch kleinere Geräte wie SSDs/HDDs - verbraucht Strom. Bei einem einzelnen RAM-Riegel oder einer NVMe-SSD ist der Unterschied marginal, bei einer HDD können das aber schnell mehrere Watt werden. Sofern hier z.B. mehrere HDDs zwecks Redundanz oder Kapazität benötigt werden, könnte man entweder möglichst große HDDs verwenden (um die Anzahl zu reduzieren), auf SSDs umsteigen oder z.B. ein externes NAS, das meistens im Standby ist, benutzen.&lt;/p&gt;
&lt;p&gt;Auch ist es häufig besser, einen stärkeren Mini-PC als mehrere schwächere zu nutzen, das reduziert den &amp;ldquo;Overhead-Verbrauch&amp;rdquo; durch z.B. Mainboards, Netzteile, NICs und die weitere zusätzliche Hardware. Zwecks Redundanz können allerdings trotzdem mehrere Geräte sehr sinnvoll sein.&lt;/p&gt;
&lt;p&gt;Generell sollte so wenig Hardware wie möglich verbaut werden, ich deaktiviere z.B. bei den Thin Clients auch den Audiochip. Das macht nicht viel aus, aber ist simpel zu machen.&lt;/p&gt;
&lt;h3 id="auf-severhardware-eher-verzichten"&gt;Auf Severhardware eher verzichten
&lt;/h3&gt;&lt;p&gt;Serverhardware bringt meistens Management-Features wie eine integrierte KVM-Lösung (IPMI, ILO, IDRAC, &amp;hellip;) mit. Das ist letztendlich ein kompletter weiterer Rechner, der im Server läuft, was natürlich wieder mehrere Watt an Strom zusätzlich verbraucht.&lt;/p&gt;
&lt;h3 id="passend-dimensionieren"&gt;Passend dimensionieren
&lt;/h3&gt;&lt;p&gt;Beispielsweise benötigt ein Switch mit 48 Ports deutlich mehr Strom als ein Switch mit 8 Ports Das selbe gilt auch für Router und Server - alles sollte angemessen sein (im Zweifelsfall zum Ausbauen allerdings lieber etwas größer/leistungsstärker als eigentlich notwendig).&lt;/p&gt;
&lt;h3 id="neuer-ist-meistens-besser-oder-zumindest-effizienter"&gt;Neuer ist meistens besser (oder zumindest effizienter)
&lt;/h3&gt;&lt;p&gt;Vor allem bei Computern (und damit auch Servern bzw. Mini-PCs/Thin-Clients) sind modernere Geräte meistens energieeffizienter. Der Fujitsu Futro S740 braucht z.B. grob die Hälfte an Strom wie der Futro S720, obwohl der S740 deutlich mehr Rechenleistung besitzt. Bei Desktop-Hardware sollte man allerdings beachten, dass Mainboards und Netzteile alleine schon mehrere Watt verbrauchen, weshalb Mini-PCs häufig die bessere Wahl sind, wenn man auf den IO verzichten kann.&lt;/p&gt;
&lt;h3 id="effiziente-netzteile-nutzen"&gt;Effiziente Netzteile nutzen
&lt;/h3&gt;&lt;p&gt;Selbsterklärend.&lt;/p&gt;
&lt;h3 id="10g-ethernet-via-rj45-vermeiden"&gt;10G Ethernet via RJ45 vermeiden
&lt;/h3&gt;&lt;p&gt;Für Netzwerkverbindungen mit 10G sollten bevorzugt entweder DACs verwendet werden, alternativ ist auch Glasfaser deutlich effizienter als 10G über RJ45.&lt;/p&gt;
&lt;h3 id="switches-mit-integriertem-poe-nutzen"&gt;Switches mit integriertem POE nutzen
&lt;/h3&gt;&lt;p&gt;&amp;ldquo;Sofern mehrere PoE-Geräte genutzt werden, ist es meistens besser, einen Switch mit PoE zu nutzen, statt jedes Gerät mit einem eigenen Injektor zu versehen.&lt;/p&gt;
&lt;h3 id="geräte-nicht-dauerhaft-betreiben"&gt;Geräte nicht dauerhaft betreiben
&lt;/h3&gt;&lt;p&gt;Wenn ein NAS z.B. nur sporadisch genutzt wird, muss es auch nicht dauerhaft laufen. Automatischer Standby plus Wake on LAN hat sich bei mir als Betriebsmodus bewährt. Ein Rechner im Standby verbraucht natürlich auch einige wenige Watt, aber dafür ist das Gerät nach dem Aufwecken auch innerhalb von Sekunden verfügbar.&lt;/p&gt;
&lt;p&gt;Auch kann man überlegen, ob man im Homelab permanent die komplette Power braucht oder einzelne Hosts nur bei Bedarf einschaltet.&lt;/p&gt;
&lt;h3 id="displays-abstecken"&gt;Displays abstecken
&lt;/h3&gt;&lt;p&gt;Sofern ein Display am Server angeschlossen ist (selbst wenn es hinter einem KVM-Switch o.ä. ist), ist die integrierte GPU aktiv. Das kostet Strom.&lt;/p&gt;
&lt;h2 id="software"&gt;Software
&lt;/h2&gt;&lt;h3 id="cpu-governor"&gt;CPU-Governor
&lt;/h3&gt;&lt;p&gt;Der Govenor gibt an, anhand welcher Parameter und wie schnell der CPU-Takt angepasst wird. Die gängigsten sind:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;powersave&lt;/code&gt;: Nutzt dauerhaft niedrigsten Takt, nicht empfohlen&lt;/li&gt;
&lt;li&gt;&lt;code&gt;performance&lt;/code&gt;: Nutzt dauerhaft höchsten Takt, nicht empfohlen&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ondemand&lt;/code&gt;: Passt den Takt laufend an die aktuelle CPU-Auslastung an&lt;/li&gt;
&lt;li&gt;&lt;code&gt;conservative&lt;/code&gt;: Ähnlich zu &lt;code&gt;ondemand&lt;/code&gt;, allerdings etwas &amp;ldquo;ruhiger&amp;rdquo; im Scaling-Verhalten&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="c-states"&gt;C-States
&lt;/h3&gt;&lt;p&gt;Moderne CPUs können die Leistung und damit auch die Stromaufnahme senken, das sind sogenannte C-States. Höhere States sind dabei effizientere Betriebsmodi. Mit Tools wie &lt;code&gt;powertop&lt;/code&gt; lässt sich prüfen, ob die CPU C-States außerhalb von 0 erreicht. Wenn nicht, sollte einerseits im BIOS geprüft werden, ob C-States (teilweise versteckt sich das hinter Einstellungen bzgl. Energieverwaltung) aktiv sind, andererseits müssen auch die angeschlossenen Geräte auf die Unterstützung geprüft werden. Bei PCIe ist das beispielsweise &lt;code&gt;ASPM&lt;/code&gt;.&lt;/p&gt;
&lt;h3 id="container-statt-vms"&gt;Container statt VMs
&lt;/h3&gt;&lt;p&gt;Container (Docker oder auch LXC in Proxmox) sind leichtgewichtiger als VMs, sorgen dadurch für eine geringere CPU-Auslastung, was wiederum den Stromverbrauch geringer hält.&lt;/p&gt;
&lt;h3 id="proxmox-vms"&gt;Proxmox-VMs
&lt;/h3&gt;&lt;p&gt;Bei VMs in Proxmox ist es sinnvoll, &lt;code&gt;use tablet as pointer&lt;/code&gt; in den Optionen zu deaktivieren. Das erschwert die Bedienung über die Webkonsole deutlich, lässt sich aber auch jederzeit ohne Neustart wieder aktivieren. Das Deaktivieren der Option spart CPU-Last ein.&lt;/p&gt;
&lt;h3 id="generelle-cpu-last"&gt;Generelle CPU-Last
&lt;/h3&gt;&lt;p&gt;Höhere CPU-Last bedeutet mehr Stromverbrauch. Ganz einfach. Je geringer die durchschnittliche Auslastung ist, desto besser. Mehr laufende Dienste bedeuten also eigentlich immer einen höheren Stromverbrauch.&lt;/p&gt;
&lt;h3 id="effiziente-software-auswählen"&gt;Effiziente Software auswählen
&lt;/h3&gt;&lt;p&gt;Ich habe dazu gerade kein konkretes Beispiel. Ich achte aber auch auf den Ressourcenbedarf, wenn ich Software zum Selbsthosten auswähle.&lt;/p&gt;
&lt;h3 id="zram-nutzen"&gt;ZRAM nutzen
&lt;/h3&gt;&lt;p&gt;ZRAM ist im Grunde komprimierter SWAP im RAM, was einerseits performanter ist und andererseits Lese-/Schreiboperationen auf dem Datenträger einspart.&lt;/p&gt;
&lt;h3 id="inkrementelle-backups-statt-vollbackups"&gt;Inkrementelle Backups statt Vollbackups
&lt;/h3&gt;&lt;p&gt;Viele Backuplösungen (z.B. Proxmox Backup Server, restic, …) können inkrementelle Sicherungen erstellen, also nur die seit dem letzten Snapshot geänderten Daten sichern. Das spart Zeit und Rechenleistung ein.&lt;/p&gt;
&lt;h3 id="dienste-im-rechenzentrum-betreiben"&gt;Dienste im Rechenzentrum betreiben
&lt;/h3&gt;&lt;p&gt;Manche Dienste lassen sich auf einem günstigen vServer effizienter betreiben als zuhause dafür Hardware und Strom zu bezahlen. Das ist allerdings immer eine Abwägungssache.&lt;/p&gt;</description></item><item><title>Proxmox VE 9</title><link>https://secretmine.de/blog/2025/2025-08-08-proxmox-ve-9/</link><pubDate>Fri, 08 Aug 2025 00:00:00 +0000</pubDate><guid>https://secretmine.de/blog/2025/2025-08-08-proxmox-ve-9/</guid><description>&lt;h2 id="inhalt-der-neuen-version"&gt;Inhalt der neuen Version
&lt;/h2&gt;&lt;p&gt;Proxmox VE 9 ist vor ein paar Tagen veröffentlicht (Roadmap und Changelog hier: &lt;a class="link" href="https://pve.proxmox.com/wiki/Roadmap%29" target="_blank" rel="noopener"
 &gt;https://pve.proxmox.com/wiki/Roadmap)&lt;/a&gt;. Die wichtigsten Features in Kürze:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Debian 13 (Trixie) als Basis statt Debian 12 (Bookworm)&lt;/li&gt;
&lt;li&gt;VM Snapshots bei tick-provisioned LVM&lt;/li&gt;
&lt;li&gt;HA-Rules&lt;/li&gt;
&lt;li&gt;Mehr Features für SDN&lt;/li&gt;
&lt;li&gt;Neues mobiles Webinterface&lt;/li&gt;
&lt;li&gt;Bei ZFS können neue Devices hinzugefügt werden&lt;/li&gt;
&lt;li&gt;Hotplug von Devices bei LXC&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Das volle Changelog ist auf der verlinkten Seite zu finden.&lt;/p&gt;
&lt;h2 id="das-upgrade"&gt;Das Upgrade
&lt;/h2&gt;&lt;p&gt;Ein Proxmox-Update ist generell kein Hexenwerk. Ich aktualisiere vorerst nur den Cluster im Keller, mit dem Production-Part warte ich noch etwas.&lt;/p&gt;
&lt;p&gt;Da auf dem ersten PVE-Knoten auch Proxmox Backup Server installiert ist, aktualisiere ich diesen parallel. Das ist eigentlich genauso einfach - man ändert einfach den Distro-Eintrag in der entsprechenden Datei unter &lt;code&gt;/etc/apt/sources.list.d/&lt;/code&gt; von &lt;code&gt;bookworm&lt;/code&gt; zu &lt;code&gt;trixie&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Ich halte mich beim Upgrade an die Anleitung von Proxmox: &lt;a class="link" href="https://pve.proxmox.com/wiki/Upgrade_from_8_to_9" target="_blank" rel="noopener"
 &gt;https://pve.proxmox.com/wiki/Upgrade_from_8_to_9&lt;/a&gt;&lt;/p&gt;
&lt;h3 id="voraussetzungen-prüfen"&gt;Voraussetzungen prüfen
&lt;/h3&gt;&lt;p&gt;Es gibt das Script &lt;code&gt;pve8to9&lt;/code&gt;. Damit lässt sich schnell prüfen, ob der Cluster generell bereit für ein Update ist.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;= SUMMARY =
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;TOTAL: 52
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;PASSED: 40
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;SKIPPED: 11
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;WARNINGS: 1
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;FAILURES: 0
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Bei mir kam eine Warnung, die sich darauf bezog, dass noch eine VM auf dem Host lief. Die habe ich auch einfach weiterlaufen lassen - das hat auch bei vorherigen Upgrades problemlos funktioniert. Generell ist es allerdings empfehlenswert, alle VMs und LXCs vollständig herunterzufahren.&lt;/p&gt;
&lt;h3 id="upgrade-durchführen"&gt;Upgrade durchführen
&lt;/h3&gt;&lt;p&gt;Nach einem vollen Update von PVE 8 mittels&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;apt update
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;apt dist-upgrade
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;reboot # optional, wenn neuer Kernel verfügbar
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;apt autoremove # nicht mehr benötigte Pakete entfernen
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;habe ich dann das eigentliche Upgrade gestartet. Dazu werden die APT-Sourcen angepasst. Ich habe den Befehl aus der Anleitung von Proxmox bei mir leicht modifiziert, weil bei mir die Dateien anders heißen und ich parallel auch PBS aktualisieren muss:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sed -i &amp;#39;s/bookworm/trixie/g&amp;#39; /etc/apt/sources.list
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sed -i &amp;#39;s/bookworm/trixie/g&amp;#39; /etc/apt/sources.list.d/pve*.list
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sed -i &amp;#39;s/bookworm/trixie/g&amp;#39; /etc/apt/sources.list.d/pbs*.list
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Theoretisch geht auch&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sed -i &amp;#39;s/bookworm/trixie/g&amp;#39; /etc/apt/sources.list
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sed -i &amp;#39;s/bookworm/trixie/g&amp;#39; /etc/apt/sources.list.d/*.list
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Dabei sollte man allerdings aufpassen, ob alle Einträge korrekt sind.&lt;/p&gt;
&lt;p&gt;Danach die Paketlisten aktualisieren:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;apt update
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Und das eigentliche Update starten, ich empfehle das in z.B. &lt;code&gt;screen&lt;/code&gt; zu machen, falls die SSH-Verbindung abbricht:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;apt dist-upgrade
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Zwischendurch kommen einige Abfragen bezüglich erneuterter Konfigurationsdateien. Auch dazu findet man in der Anleitung von Proxmox einiges, hier einmal die Kurzfassung (bitte aber nachlesen, welche Effekte das hat):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;/etc/issue&lt;/code&gt;: Neue Version übernehmen&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/etc/lvm/lvm.conf&lt;/code&gt;: Neue Version übernehmen&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/etc/ssh/sshd_config&lt;/code&gt;: Habe ich verneint bzw. die bestehende Version belassen&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Sofern alles durch ist, muss nur noch neu gestartet werden:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;reboot
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Danach kann man noch nicht mehr benötigte Pakete entfernen:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;apt autoremove
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Damit sollte das Upgrade schon fertig und das Webinterface wieder verfügbar sein. Bei mir lief das Upgrade auf allen drei Hosts problemlos durch, nach einem Reboot war alles wie immer - nur eben mit der neuen Version.&lt;/p&gt;
&lt;p&gt;Proxmox Backup Server muss ich noch testen, der Storage wurde allerdings in Proxmox VE schon als Verfügbar angezeigt - ich gehe also davon aus, dass auch da alles okay ist.&lt;/p&gt;</description></item><item><title>Lokales Multiroom-Audio mit dem Lyrion Music Server und Squeezelite</title><link>https://secretmine.de/blog/2025/2025-07-29-lyrion-music-server-und-squeezelite/</link><pubDate>Tue, 29 Jul 2025 00:00:00 +0000</pubDate><guid>https://secretmine.de/blog/2025/2025-07-29-lyrion-music-server-und-squeezelite/</guid><description>&lt;p&gt;Ich bin vor einer Weile über Lyrion Music Server (&lt;a class="link" href="https://lyrion.org/" target="_blank" rel="noopener"
 &gt;https://lyrion.org/&lt;/a&gt;) gestolpert und fand das Konzept sehr spannend. Lyrion Music Server ist die Weiterentwicklung von Logitech Media Server, einem lokalen Musikserver für die Verwendung mit dafür gebauten Abspielgeräten (Squeezeboxen). Squeezeboxen gibt es abseits vom Gebrauchtmarkt nicht mehr, einen Softwarenachbau für die Player in Form von beispielsweise Squeezelite jedoch bereits vorhanden.&lt;/p&gt;
&lt;p&gt;Was die Software besonders macht ist das Feature, dass mehrere Player synchron bespielt werden können, wie es mit Multiroom-Setups von anderen Herstellern möglich ist. Primär ist Lyrion dafür gebaut, lokale Mediatheken und auch Radio abzuspielen, es gibt jedoch auch ein Plugin, mit dem das ganze über Spotify Connect direkt via Spotify ansteuerbar ist.&lt;/p&gt;
&lt;h2 id="hardware"&gt;Hardware
&lt;/h2&gt;&lt;p&gt;Ich habe aktuell in vier Räumen Player installiert. In einem weiteren Raum ist geplant, zumindest eine Buchse zum Anschluss von z.B. einer Bluetooth-Box izu installieren.&lt;/p&gt;
&lt;h3 id="arbeitszimmer"&gt;Arbeitszimmer
&lt;/h3&gt;&lt;p&gt;Hier stecken meine PC-Lautsprecher einfach über ein Klinke-Y-Kabel sowohl an meinem PC als auch an dem Thin Client, der LMS beherbergt. Dort läuft Squeezelite als Docker in LXC, das Audiogerät ist vom Host an den LXC und Docker durchgereicht und wird von dort bespielt.&lt;/p&gt;
&lt;h3 id="wohnzimmer"&gt;Wohnzimmer
&lt;/h3&gt;&lt;p&gt;Im Wohnzimmer ist ein Raspberry Pi 1b mit piCorePlayer wie im Arbeitszimmer, ebenfalls mit einem Y-Kabel, an das Soundsystem des Fernsehers angeschlossen. Via Homeassistant wird automatisch das Soundsystem eingeschaltet, sobald Musik abgespielt wird.&lt;/p&gt;
&lt;h3 id="schlafzimmer"&gt;Schlafzimmer
&lt;/h3&gt;&lt;p&gt;Hier befindet sich ein selbstgebauter Player. Dieser besteht aus einem Raspberry Pi 1b mit piCorePlayer, einem Verstärker-Board und Regallautsprechern. Der Verstärker kann über ein Relais vom Pi aus ein- und ausgeschaltet werden, um Grundrauschen oder andere Geräusche auf den Lautsprechern zu vermeiden, wenn keine Musik abgespielt wird. Nebenbei spart das natürlich auch Strom. Angetrieben wird das ganze von einem 19V Laptop-Netzteil.&lt;/p&gt;
&lt;h3 id="küche"&gt;Küche
&lt;/h3&gt;&lt;p&gt;Hier ist ähnlich wie im Schlafzimmer ein selbstgebauerter Player platziert, hier allerdings mit einem Raspberry Pi 3. Auch hier ist es ein günstiges Verstärker-Board, schaltbar über ein Relais. Ich hatte auch für diesen Pi erst einen WLAN-Stick bestellt und erst beim Einrichten von piCorePlayer festgestellt, dass der Pi 3 WLAN integriert hat und ich den Stick gar nicht brauche.&lt;/p&gt;
&lt;h2 id="software"&gt;Software
&lt;/h2&gt;&lt;p&gt;Der Lyrion Music Server läuft als Docker, hier ist einmal meine Compose-Datei inkl. des Squeezelite-Players:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;span class="lnt"&gt;24
&lt;/span&gt;&lt;span class="lnt"&gt;25
&lt;/span&gt;&lt;span class="lnt"&gt;26
&lt;/span&gt;&lt;span class="lnt"&gt;27
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;services&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;lms&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;image&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;lmscommunity/lyrionmusicserver:dev&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;network_mode&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;host&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;volumes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;./config:/config:rw&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;./music:/music:ro&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;./playlist:/playlist:rw&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;/etc/localtime:/etc/localtime:ro&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;/etc/timezone:/etc/timezone:ro&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;environment&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;HTTP_PORT=9000&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;restart&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;unless-stopped&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;squeezelite&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;image&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;giof71/squeezelite:latest-alsa&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;devices&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;/dev/snd:/dev/snd&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;environment&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;USER_MODE=yes&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;PUID=0&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;PGID=0&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;AUDIO_GID=29&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;SQUEEZELITE_NAME=Arbeitszimmer&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;SQUEEZELITE_AUDIO_DEVICE=&amp;#34;hw:CARD=PCH,DEV=0&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;volumes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;./sl-config/:/config/&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;restart&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;unless-stopped&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Bei den Plugins habe ich einerseits Spotty für Spotify Connect installiert, andererseits auch ein Plugin, um Gruppen vordefinieren zu können. Ich habe hierbei hauptsächlich eine Gruppe mit allen Lautsprechern definiert, ansonsten werden die Räume in der Regel nur einzeln genutzt.&lt;/p&gt;
&lt;h2 id="soundqualität-und-generelle-erfahrung"&gt;Soundqualität und generelle Erfahrung
&lt;/h2&gt;&lt;p&gt;Die Player mit eigenem Verstärker haben leider ein gutes Maß an Grundgeräuschen, hauptsächlich dürfte das von Spannungswandlern von 19V auf 5V für die Pis kommen. Bei den Playern, wo Soundsysteme angeschlossen sind, habe ich damit keine Probleme.&lt;/p&gt;
&lt;p&gt;Ich (bzw. wir) nutze das System hauptsächlich mit Spotify Connect. Das funktioniert nicht unbedingt perfekt - die Wiedergabe bleibt leider regelmäßig nach Ende eines Songs hängen und muss dann erstmal händisch wieder gestartet werden. Eine Lösung dafür habe ich bislang noch nicht, das Problem beim Spotty-Plugin ist allerdings bekannt. Playlists über die Integration in LMS und nicht via Spotify Connect zu starten soll das Problem beheben, ist für uns allerdings eher unpraktisch.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Update&lt;/em&gt;: Beim Plugin, was für Spotify zum Einsatz kommt, wurde aufgrund von API-Änderungen bei Spotify der Connect-Modus vorerst entfernt, seit dem nutzen wir die Integration. Das funktioniert auch fehlerfrei, das System spielt stundenlang ohne einen einzigen Fehler Musik ab.&lt;/p&gt;
&lt;p&gt;Ansonsten funktioniert das System gut, die Lautsprecher laufen weitestgehend synchron. Zeitweise gab es mal mit einem Lautsprecher Probleme, weil aus irgendeinem Grund der WLAN-Empfang in der genauen Position des Players schlecht war, das hat dann dazu geführt, dass das gesamte System regelmäßig out of sync war und die Wiedergabe kurz unterbrochen wurde. Verschieben des Players um einige Zentimeter hat das beseitigt.&lt;/p&gt;</description></item><item><title>Webbasierter Remotezugriff mit Guacamole</title><link>https://secretmine.de/blog/2025/2025-06-09-guacamole/</link><pubDate>Mon, 09 Jun 2025 00:00:00 +0000</pubDate><guid>https://secretmine.de/blog/2025/2025-06-09-guacamole/</guid><description>&lt;p&gt;Ich habe schon eine ganze Weile mit verschiedenen Möglichkeiten experimentiert, von unterwegs und ohne dabei einen eigenen Client zu benötigen. Dabei bin ich irgendwann auf &lt;strong&gt;Apache Guacamole&lt;/strong&gt; gestoßen, einem webbasierten Remotedesktop-Tool, das im Browser läuft und RDP, VNC und SSH unterstützt. Und sich mit 2FA sichern lässt. Also alles abdeckt, was ich benötige.&lt;/p&gt;
&lt;p&gt;Guacamole läuft bei mir als Docker-Container im Homelab und bietet mir über einen gesicherten Webzugang die Möglichkeit, sowohl meine Windows- als auch meine Linux-VMs zu nutzen. Ein Browser (und Internet) reicht, und ich habe Zugriff auf eine vollständige Desktop-Umgebung – mit gewohnter Software, Dateiablage und allem Drum und Dran. Das funktioniert in den meisten Fällen auch mit restriktiven Firewalls/Proxies, da alles über HTTPS und Websockets abgewickelt wird. Durch Zwei-Faktor-Authentifizierung und restriktive Firewall-Regeln ist das Ganze auch sicher genug, um es von außen erreichbar zu machen. Und es funktioniert meistens sogar hinter restriktiven Firewalls, solange Websockets funktionieren, und eignet sich damit auch für den Zugriff von z.B. der Arbeit oder der Schule/Uni - vorausgesetzt, die vorliegenden Regelungen lassen es zu.&lt;/p&gt;
&lt;h2 id="schematischer-aufbau"&gt;Schematischer Aufbau
&lt;/h2&gt;&lt;p&gt;Technisch ist das ganze eigentlich recht simpel aufgebaut:&lt;/p&gt;
&lt;p&gt;&lt;img alt="Grober Aufbau" class="gallery-image" data-flex-basis="395px" data-flex-grow="164" height="644" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://secretmine.de/blog/2025/2025-06-09-guacamole/images/guacamole.png" srcset="https://secretmine.de/blog/2025/2025-06-09-guacamole/images/guacamole_hu_2ef0e3a094d815c7.png 800w, https://secretmine.de/blog/2025/2025-06-09-guacamole/images/guacamole.png 1062w" width="1062"&gt;&lt;/p&gt;
&lt;p&gt;Guacamole ist das Herzstück vom ganzen, es stellt das Webinterface bereit, kümmert sich um das Benutzermanagement und verwaltet auch die Verbindungen. Guacamole wiederum steuert Guacd an, das ist ein Dienst, der diverse Protokolle wie RDP und VNC in ein allgemeineres Format übersetzt. Für die Benutzer- und Verbindungsverwaltung wird auch noch eine MySQL-Datenbank benötigt. Davor steht bei mir ein Caddy, aber jeder beliebige andere Reverse-Proxy tut es auch.&lt;/p&gt;
&lt;h2 id="einrichtung"&gt;Einrichtung
&lt;/h2&gt;&lt;h3 id="docker-compose"&gt;Docker-Compose
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;span class="lnt"&gt;24
&lt;/span&gt;&lt;span class="lnt"&gt;25
&lt;/span&gt;&lt;span class="lnt"&gt;26
&lt;/span&gt;&lt;span class="lnt"&gt;27
&lt;/span&gt;&lt;span class="lnt"&gt;28
&lt;/span&gt;&lt;span class="lnt"&gt;29
&lt;/span&gt;&lt;span class="lnt"&gt;30
&lt;/span&gt;&lt;span class="lnt"&gt;31
&lt;/span&gt;&lt;span class="lnt"&gt;32
&lt;/span&gt;&lt;span class="lnt"&gt;33
&lt;/span&gt;&lt;span class="lnt"&gt;34
&lt;/span&gt;&lt;span class="lnt"&gt;35
&lt;/span&gt;&lt;span class="lnt"&gt;36
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;services&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;guacdb&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;container_name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;guacamoledb&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;image&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;mariadb:latest&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;restart&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;unless-stopped&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;environment&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;MYSQL_ROOT_PASSWORD&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;9ngmZtFToD3Ll4ncBA6V&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;MYSQL_DATABASE&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;guacamole_db&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;MYSQL_USER&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;guacamole_user&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;MYSQL_PASSWORD&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;qi1tqoSTRGx5eD4ghCAG&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;volumes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="s1"&gt;&amp;#39;./db-data:/var/lib/mysql&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="s1"&gt;&amp;#39;./initdb.sql:/docker-entrypoint-initdb.d/initdb.sql&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;guacd&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;container_name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;guacd&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;image&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;guacamole/guacd:latest&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;restart&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;unless-stopped&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;guacamole&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;container_name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;guacamole&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;image&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;guacamole/guacamole:latest&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;restart&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;unless-stopped&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;ports&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="m"&gt;8080&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="m"&gt;8080&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;environment&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;GUACD_HOSTNAME&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;guacd&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;MYSQL_HOSTNAME&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;guacdb&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;MYSQL_DATABASE&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;guacamole_db&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;MYSQL_USER&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;guacamole_user&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;MYSQL_PASSWORD&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;qi1tqoSTRGx5eD4ghCAG&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;TOTP_ENABLED&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;true&amp;#34;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# optional, forciert 2FA&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;depends_on&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;guacdb&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;guacd&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Vor dem Start muss allerdings die Datenbank noch befüllt werden. Das Container-Image bringt ein Script mit, um den nötigen Dump zu erzeugen:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker run --rm guacamole/guacamole /opt/guacamole/bin/initdb.sh --mysql &amp;gt; initdb.sql
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Nun kann mit &lt;code&gt;docker compose up -d&lt;/code&gt; der Stack gestartet werden. Der MariaDB-Container importiert beim ersten Start alles, was unter &lt;code&gt;/docker-entrypoint-initdb.d/&lt;/code&gt; liegt in alphabetischer Reihenfolge - und damit auch den Dump, den wir eben angelegt haben.&lt;/p&gt;
&lt;h3 id="reverse-proxy"&gt;Reverse Proxy
&lt;/h3&gt;&lt;p&gt;Guacamole müsste nun unter dem angegebenen Port (hier 8080) erreichbar sein, es muss der Pfad &lt;code&gt;/guacamole&lt;/code&gt; aufgerufen werden. Jetzt kann noch ein beliebiger Reverse-Proxy auf Guacamole verwiesen werden, beispielsweise Caddy:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;guacamole.example.com {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; rewrite / /guacamole
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; reverse_proxy http://192.168.1.2:8080
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Ich habe hierbei auch einen Rewrite von &lt;code&gt;/&lt;/code&gt; zu &lt;code&gt;/guacamole&lt;/code&gt; hinzugefügt, damit man den Pfad nicht händisch angeben muss.&lt;/p&gt;
&lt;h3 id="konfiguration"&gt;Konfiguration
&lt;/h3&gt;&lt;p&gt;Die initialen Logindaten sind &lt;code&gt;guacadmin&lt;/code&gt;/&lt;code&gt;guacadmin&lt;/code&gt;. Sofern TOTP über die Umgebungsvariablen aktiviert wurde, wird nun direkt nach einem zweiten Faktor gefragt. Oben rechts unter Einstellungen lässt sich dann eine Verbindung anlegen. Bei RDP lohnt es sich, den Haken bei &lt;code&gt;Grössenänderungs-Methode: Display Update&lt;/code&gt; zu setzen. Die Haken unten bei Geschwindigkeit kann man setzen, wie man möchte - ich hab hier &lt;code&gt;Desktophintergrund aktivieren&lt;/code&gt; und &lt;code&gt;Schriftartglättung (ClearType) aktivieren&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id="nutzung"&gt;Nutzung
&lt;/h2&gt;&lt;p&gt;Auf der Startseite sollte nun die Verbindung angezeigt werden. Nach einem Klick sollte die Verbindung stehen und sich auch mit Änderung der Fenstergröße automatisch anpassen.&lt;/p&gt;
&lt;h3 id="performance"&gt;Performance
&lt;/h3&gt;&lt;p&gt;Nach meiner Erfahrung ist die Performance primär von der Single-Thread-Performance des Hosts abhängig - auf den Futros läuft Guacamole langsamer als auf dem Mini-PC mit Ryzen-Prozessor. Aber beides ist definitiv nutzbar, auch wenn ich nicht 24/7 darüber arbeiten wollen würde.&lt;/p&gt;</description></item><item><title>Blocky - eine Alternative zu AdGuard Home und Pi-hole</title><link>https://secretmine.de/blog/2025/2025-05-18-blocky-eine-alternative-zu-adguard-home-und-pihhole/</link><pubDate>Sun, 18 May 2025 00:00:00 +0000</pubDate><guid>https://secretmine.de/blog/2025/2025-05-18-blocky-eine-alternative-zu-adguard-home-und-pihhole/</guid><description>&lt;p&gt;Bisher habe ich als internen DNS-Resolver AdGuard Home eingesetzt. Das ist eine Alternative zu Pi-hole, die ebenfalls DNS-Blocking unterstützt. Die Wahl fiel damals auf AdGuard Home, da Pi-hole für eigene lokale Domains (die über einen anderen DNS-Server aufgelöst werden - das ist ein simpler &lt;code&gt;bind9&lt;/code&gt;-Server) eher hakelig war und sich AdGuard Home einfach runder angefühlt hat.&lt;/p&gt;
&lt;p&gt;Mit der Zeit gefiel mir aber die Ressourcenauslastung von AdGuard Home nicht, sowohl CPU als auch RAM waren etwas höher, als ich es mochte. Außerdem fielen mir teilweise längere Antwortzeiten beim DNS auf, wobei ich da nicht hundertprozentig sagen kann, ob es an AdGuard Home lag oder etwas anderes dahinter steckte. Außerdem wollte ich bessere Metriken bekommen, am besten über einen Prometheus-kompatiblen Metrikendpunkt.&lt;/p&gt;
&lt;h1 id="suche-nach-einer-alternative"&gt;Suche nach einer Alternative
&lt;/h1&gt;&lt;p&gt;Bei der Recherche nach einer Alternative zu AdGuard Home habe ich mir Pi-hole noch einmal angesehen, hatte dort aber Probleme, meine beiden lokalen Zonen über einen anderen Server aufzulösen. Den Technitium DNS-Server habe ich mir auch angesehen, aber der gefiel mir von der Konfiguration her nicht und auch hier habe ich nicht sofort herausfinden können, wie ich eine lokale Domain anders auflöse. Ein Setup mit einem Server wie Bind oder dnsmasq wollte ich ebenfalls nicht, da mir das von der Konfiguration her für die Blocklisten (benötigt ja dann Skripte, die die blockierten Einträge importieren) nicht gefallen hat. Bei den meisten Lösungen war auch die Herstellung einer Redundanz über einen zweiten Resolver nicht einfach.&lt;/p&gt;
&lt;h1 id="meine-anforderungen"&gt;Meine Anforderungen
&lt;/h1&gt;&lt;p&gt;Hier einmal meine Anforderungen als Liste:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Normale DNS-Auflösung und Caching&lt;/li&gt;
&lt;li&gt;Unterstützung von Block- und Allowlists, möglichst in einem der gängigen Formate, damit die bekannten Listen funktionieren&lt;/li&gt;
&lt;li&gt;Unterstützung von verschiedenen DNS-Servern für einzelne Domains, um lokale Domains an einen anderen Resolver weiterzuleiten&lt;/li&gt;
&lt;li&gt;Metriken als Prometheus-Endpunkt&lt;/li&gt;
&lt;li&gt;Redundanz über zweite Instanz auf anderem Host&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id="blocky---eine-schlanke-alternative"&gt;Blocky - eine schlanke Alternative
&lt;/h1&gt;&lt;p&gt;Bei der Suche bin ich irgendwann auf Blocky gestoßen - das ist ein schlanker, in Go geschriebener DNS-Resolver, der als Alternative zu Pi-hole, AdGuard Home und co gedacht ist. Es gibt kein Webinterface, die Konfiguration findet über eine simple Yaml-Datei statt. Alle Features, die ich haben wollte, waren auch simpel einzurichten und funktionierten sofort. Die Performance ist ebenfalls super, gefühlt auch etwas flotter als AdGuard Home. Redundanz lässt sich simpel über das Kopieren der Config und Neustart vom Container lösen, das macht ein ganz einfaches Script alle x Stunden. Theoretisch könnte ich über Redis auch den Cache zentral halten, aber dafür müsste ich auch hier einen redundanten Redis-Service aufbauen - was ich hier auch einfach für Overkill halte.&lt;/p&gt;
&lt;h2 id="mein-erfahrung"&gt;Mein Erfahrung
&lt;/h2&gt;&lt;p&gt;Ich wollte Blocky erst einmal nur temporär zum Testen aktiv schalten - habe das dann aber vergessen. Nach ein paar Tagen fiel mir dann wieder ein, dass ich ja auf Blocky umgestellt hatte - bemerkt habe ich es ansonsten nicht. Was in diesem Fall ein wirklich gutes Zeichen ist. Blocky läuft bislang störungsfrei, liefert gute Metriken und benötigt wenig Ressourcen. Wir reden hier über ca 20MB RAM und vielleicht 0,1 % CPU-Auslastung von dem Container. AdGuard Home braucht, ohne aktive Clients seit einigen Tagen (aber auch ohne Neustart seit dem) grob 200MB RAM und hat immer wieder kurze Spikes auf &amp;gt;10 % CPU-Last, etwas was ich bei Blocky so überhaupt nicht wahrnehme.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Update:&lt;/em&gt; Die Ressourcenauslastung im Livebetrieb ist jetzt doch etwas höher, mit ein paar Blocklisten und als primärer DNS-Server ist die Auslastung vom Container bei 50-70MB bei allerdings weiterhin im Schnitt deutlich unter 1 % CPU-Auslastung (mit kurzen Spikes auf einige wenige Prozent).
+&lt;/p&gt;
&lt;h2 id="meine-konfiguration"&gt;Meine Konfiguration
&lt;/h2&gt;&lt;p&gt;Hier einmal die Konfiguration, wie sie bei mir jetzt seit einiger Zeit im Einsatz ist:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;span class="lnt"&gt;24
&lt;/span&gt;&lt;span class="lnt"&gt;25
&lt;/span&gt;&lt;span class="lnt"&gt;26
&lt;/span&gt;&lt;span class="lnt"&gt;27
&lt;/span&gt;&lt;span class="lnt"&gt;28
&lt;/span&gt;&lt;span class="lnt"&gt;29
&lt;/span&gt;&lt;span class="lnt"&gt;30
&lt;/span&gt;&lt;span class="lnt"&gt;31
&lt;/span&gt;&lt;span class="lnt"&gt;32
&lt;/span&gt;&lt;span class="lnt"&gt;33
&lt;/span&gt;&lt;span class="lnt"&gt;34
&lt;/span&gt;&lt;span class="lnt"&gt;35
&lt;/span&gt;&lt;span class="lnt"&gt;36
&lt;/span&gt;&lt;span class="lnt"&gt;37
&lt;/span&gt;&lt;span class="lnt"&gt;38
&lt;/span&gt;&lt;span class="lnt"&gt;39
&lt;/span&gt;&lt;span class="lnt"&gt;40
&lt;/span&gt;&lt;span class="lnt"&gt;41
&lt;/span&gt;&lt;span class="lnt"&gt;42
&lt;/span&gt;&lt;span class="lnt"&gt;43
&lt;/span&gt;&lt;span class="lnt"&gt;44
&lt;/span&gt;&lt;span class="lnt"&gt;45
&lt;/span&gt;&lt;span class="lnt"&gt;46
&lt;/span&gt;&lt;span class="lnt"&gt;47
&lt;/span&gt;&lt;span class="lnt"&gt;48
&lt;/span&gt;&lt;span class="lnt"&gt;49
&lt;/span&gt;&lt;span class="lnt"&gt;50
&lt;/span&gt;&lt;span class="lnt"&gt;51
&lt;/span&gt;&lt;span class="lnt"&gt;52
&lt;/span&gt;&lt;span class="lnt"&gt;53
&lt;/span&gt;&lt;span class="lnt"&gt;54
&lt;/span&gt;&lt;span class="lnt"&gt;55
&lt;/span&gt;&lt;span class="lnt"&gt;56
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# ich habe leider kein ipv6, daher habe ich hier v6 vollständig deaktiviert und weiter unten auch AAAA-Records gefiltert.&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;connectIPVersion&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;v4&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;upstream&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;default&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="m"&gt;1.1.1.1&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="m"&gt;8.8.8.8&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;blocking&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;blockType&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;nxDomain&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;blackLists&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;ads&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;https://raw.githubusercontent.com/RPiList/specials/master/Blocklisten/Win10Telemetry&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;https://raw.githubusercontent.com/RPiList/specials/master/Blocklisten/Phishing-Angriffe&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;https://raw.githubusercontent.com/RPiList/specials/master/Blocklisten/malware&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;https://raw.githubusercontent.com/RPiList/specials/master/Blocklisten/easylist&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;https://raw.githubusercontent.com/RPiList/specials/master/Blocklisten/MS-Office-Telemetry&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;whiteLists&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;ads&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;https://raw.githubusercontent.com/m0zgen/dns-hole/master/whitelist.txt&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;https://raw.githubusercontent.com/m0zgen/dns-hole/master/vendors-wl/microsoft.txt&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;https://raw.githubusercontent.com/m0zgen/dns-hole/master/vendors-wl/google.txt&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;https://raw.githubusercontent.com/m0zgen/dns-hole/master/regex/common-wl.txt&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;clientGroupsBlock&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;default&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;ads&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;caching&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;cacheTimeNegative&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;1m&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;filtering&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;queryTypes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;AAAA&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# Konfiguration der lokalen Domains und Reverse-IP-Lookups zum DNS-Server unter 192.168.1.15&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;conditional&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;fallbackUpstream&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;mapping&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;home.local&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;192.168.1.15&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;homelab.local&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;192.168.1.15&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;179.168.192.in-addr.arpa&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;192.168.1.15&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;178.168.192.in-addr.arpa&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;192.168.1.15&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;ports&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;dns&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;53&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;http&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;4000&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;bootstrapDns&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;1.1.1.1&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;prometheus&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;enable&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;path&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;/metrics&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;queryLog&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;none&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;</description></item><item><title>HP T430 - ein weiterer Thin Client</title><link>https://secretmine.de/blog/2025/2025-05-03-hp-t430/</link><pubDate>Sat, 03 May 2025 00:00:00 +0000</pubDate><guid>https://secretmine.de/blog/2025/2025-05-03-hp-t430/</guid><description>&lt;h2 id="verwendungszweck"&gt;Verwendungszweck
&lt;/h2&gt;&lt;p&gt;Ich habe mittlerweile eine kleine Sammlung an Thin Clients (eine Übersichtsseite mit allen Thin Clients und entsprechenden Beiträgen folgt bei Gelegenheit). Die nutze ich allerdings alle für Zwecke, für die sie nicht gedacht sind. Die meisten (3 von 4) dienen als Server, der letzte ist der Druckserver für meinen 3D-Drucker mit Octoprint. Das ist bei diesem Thin Client nun anders.&lt;/p&gt;
&lt;p&gt;Ich habe seit etwa einem halben Jahr einen Lenovo Thinkcentre M715q Tiny als dritten Server im dauerhaft laufenden Homelab, der deutlich mehr Power als die beiden Futro S740 hat. Damit habe ich auch die notwendige Performance, um VMs als normale Desktop-Maschinen zu nutzen (sowohl Linux als auch Windows). Ich habe schon länger je eine VM mit Debian (KDE) und Windows 11, die ich für den Fernzugriff von außerhalb nutze, hauptsächlich über webbasiertes RDP via Guacamole. Das hat sich so auch schon mehrfach bewährt, da ich von jedem Ort der Welt mit einem Browser und Internet an einen Windows-Arbeitsplatz mit meiner gewohnten Ausstattung und Zugriffsmöglichkeiten komme (und dank 2FA und vernünftigen Zugangsdaten auch sicher). RDP habe ich dabei nicht offen am Internet und das ist auch gut so.&lt;/p&gt;
&lt;p&gt;Zuhause nutze ich morgens vor der Arbeit, in der Mittagspause und auch nach der Arbeit (und natürlich auch an freien Tagen) viel meinen Desktop-PC, der auf Gaming ausgelegt ist, für leichte Aufgaben wie Mails, Surfen und an meinem Blog schrieben. Dafür ist die Rechenleistung aber eigentlich komplett überflüssig bzw. deutlich überdimensioniert. Die GPU brauche ich dabei natürlich auch nicht. Und mein Desktop verbraucht im fast-Leerlauf um die 80 Watt.&lt;/p&gt;
&lt;p&gt;Durch die Arbeit habe ich eine USB-C-Dockingstation, die ich meistens für das Arbeits-Notebook nutze. Die ist über einen KVM-Switch so an meine Monitore und Maus und Tastatur angeschlossen, dass ich mit einem Knopfdruck zwischen Arbeitsrechner und meinem privaten Desktop wechseln kann.&lt;/p&gt;
&lt;p&gt;Und an dieser Stelle kommt jetzt der HP T430 ins Spiel. Dieser Thin Client hat im Vergleich zu vielen anderen Thin Clients nämlich die Besonderheit, dass er einen USB-C-Port hat, der neben USB auch Display-Signale und Strom übertragen kann, sich also mit einem einzigen Kabel an einer Docking-Station betreiben lässt.&lt;/p&gt;
&lt;p&gt;Damit kann ich also, wenn ich nicht auf viel Rechenleistung angewiesen bin, einfach den Thin Client an die Docking-Station anstecken und habe nach kürzester Zeit eine laufende RDP-Verbindung zu meiner Windows- oder Linux-VM und kann meinen Arbeitsplatz normal nutzen, ohne den großen Desktop in Betrieb zu haben. Und ja, natürlich spielt auch die Neugierde bzw. Spielfaktor da mit rein, hundertprozentig sinnvoll ist das Setup so nicht.&lt;/p&gt;
&lt;h2 id="der-hp-t430"&gt;Der HP T430
&lt;/h2&gt;&lt;p&gt;Der Thin Client ist von den Spezifikationen her nichts überragendes bzw. schwächer als z.B. der Futro S740. Verbaut ist ein Intel Celeron N4020 mit 2x 1,1 GHz, also wirklich nicht viel. Dazu sind 2GB RAM und 16GB eMMC-Speicher verlötet. Heißt, an diesem Gerät ist bis auf das WLAN-Modul absolut nichts austauschbar bzw. erweiterbar. Das sieht man auch auf den Bildern gut.&lt;/p&gt;
&lt;p&gt;Die Anschlüsse sind soweit wirklich solide und für so ein Gerät passend, ich hätte mir höchstens noch einen Front-USB gewünscht.&lt;/p&gt;
&lt;h3 id="bilder"&gt;Bilder
&lt;/h3&gt;&lt;p&gt;&lt;img alt="HP T430 - Frontseite" class="gallery-image" data-flex-basis="307px" data-flex-grow="128" height="1169" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://secretmine.de/blog/2025/2025-05-03-hp-t430/images/t430_1.jpg" srcset="https://secretmine.de/blog/2025/2025-05-03-hp-t430/images/t430_1_hu_f14b1f579a544991.jpg 800w, https://secretmine.de/blog/2025/2025-05-03-hp-t430/images/t430_1.jpg 1500w" width="1500"&gt;
&lt;img alt="HP T430 - Seite" class="gallery-image" data-flex-basis="402px" data-flex-grow="167" height="894" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://secretmine.de/blog/2025/2025-05-03-hp-t430/images/t430_2.jpg" srcset="https://secretmine.de/blog/2025/2025-05-03-hp-t430/images/t430_2_hu_6e0df668702faa21.jpg 800w, https://secretmine.de/blog/2025/2025-05-03-hp-t430/images/t430_2.jpg 1500w" width="1500"&gt;
&lt;img alt="HP T430 - Rückseite" class="gallery-image" data-flex-basis="434px" data-flex-grow="181" height="828" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://secretmine.de/blog/2025/2025-05-03-hp-t430/images/t430_3.jpg" srcset="https://secretmine.de/blog/2025/2025-05-03-hp-t430/images/t430_3_hu_f1911edea0993507.jpg 800w, https://secretmine.de/blog/2025/2025-05-03-hp-t430/images/t430_3.jpg 1500w" width="1500"&gt;
&lt;img alt="HP T430 - Unten" class="gallery-image" data-flex-basis="240px" data-flex-grow="100" height="1500" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://secretmine.de/blog/2025/2025-05-03-hp-t430/images/t430_4.jpg" srcset="https://secretmine.de/blog/2025/2025-05-03-hp-t430/images/t430_4_hu_781e594f5bc0f572.jpg 800w, https://secretmine.de/blog/2025/2025-05-03-hp-t430/images/t430_4.jpg 1500w" width="1500"&gt;
&lt;img alt="HP T430 - Innen" class="gallery-image" data-flex-basis="426px" data-flex-grow="177" height="1125" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://secretmine.de/blog/2025/2025-05-03-hp-t430/images/t430_5.jpg" srcset="https://secretmine.de/blog/2025/2025-05-03-hp-t430/images/t430_5_hu_5a126b108ab0f4a2.jpg 800w, https://secretmine.de/blog/2025/2025-05-03-hp-t430/images/t430_5_hu_6d23cb2a504c5b36.jpg 1600w, https://secretmine.de/blog/2025/2025-05-03-hp-t430/images/t430_5.jpg 2000w" width="2000"&gt;&lt;/p&gt;
&lt;h2 id="betriebssystem"&gt;Betriebssystem
&lt;/h2&gt;&lt;h3 id="hp-thinpro-os"&gt;HP ThinPro OS
&lt;/h3&gt;&lt;p&gt;Der Thin Client kam mit HP ThinPro OS ausgeliefert. Das ist ein auf Thin Clients ausgelegtes OS auf Linux-Basis (afaik Debian, aber da bin ich mir nicht sicher). Es ist auf den Einsatz in Unternehmen zugeschnitten und bietet damit natürlich auch Möglichkeiten wie zentralem Management. An Fernzugriff ist Citrix, VMware Horizon, RemoteDesktop und weiteres direkt an Board, RDP basiert hierbei auf FreeRDP. Funktioniert hat das ganze gut, war mir allerdings nicht flexibel genug.&lt;/p&gt;
&lt;h3 id="alpine-mit-xfce-und-remmina"&gt;Alpine mit XFCE und Remmina
&lt;/h3&gt;&lt;p&gt;Als nächstes habe ich mit Alpine experimentiert. Das lief soweit auch, nur hatte ich z.B. Probleme mit der Bildschirmanordnung in Remote-Sessions. Auch war mir das Alpine zu unflexibel bzw. zu minimalistisch.&lt;/p&gt;
&lt;h3 id="debian-mit-xfce-und-remmina"&gt;Debian mit XFCE und Remmina
&lt;/h3&gt;&lt;p&gt;Und so bin ich dann beim guten alten Debian gelandet, auch hier mit XFCE als Desktop und Remmina als Remote-Tool. Das funktioniert soweit gut - und die RDP-Sessions auch flüssiger als mit dem OS von HP. Mit Debian habe ich auch ein OS, womit ich auch außerhalb von Remotezugriff arbeiten kann, auch wenn z.B. Firefox recht langsam ist.&lt;/p&gt;
&lt;h3 id="probleme-mit-alpine-und-debian"&gt;Probleme mit Alpine und Debian
&lt;/h3&gt;&lt;p&gt;Bei Debian und Alpine hatte ich bei beidem Probleme mit Standby bzw. nach ausgeschaltetem Monitor, die Monitore wieder aufzuwecken. Außerdem wurde beim Booten die GUI nicht immer gestartet, teilweise blieben die Monitore nach dem Übergang zum X-Server schwarz. Der Thin Client lief, via Strg+Alt konnte ich auch zu anderen Terminals wechseln und via CLI arbeiten, aber wirklich zuverlässig war das nicht. Deswegen bin ich jetzt erstmal wieder bei dem OS von HP gelandet, worüber ich auch gerade diesen Absatz schreibe. Generell ist ein großer Teil dieses Posts über den Thin Client entstanden, das geht wirklich gut.&lt;/p&gt;
&lt;h2 id="stromverbrauch"&gt;Stromverbrauch
&lt;/h2&gt;&lt;p&gt;Der Stromverbrauch von dem Gerät ist auf dem Desktop ohne Remote-Session bei etwa 6 Watt, was sehr angenehm ist. Ohne angeschlossene Peripherie sinkt der Verbrauch auf 4 Watt.&lt;/p&gt;
&lt;p&gt;Mein kompletter Arbeitsplatz (also Monitore plus Dockingstation plus PC/Thin-Client) verbraucht statt vorher ~170 Watt im leichten Desktop-Betrieb mit Surfen oder leichteren Arbeiten in VSCode jetzt etwas unter 60 Watt, wobei das meiste wahrscheinlich schon auf die Monitore entfällt. Der Heimserver, auf dem die VM läuft, braucht natürlich ein wenig mehr Strom, während ich in der VM arbeite, aber das sind maximal 10 Watt oder so. Insgesamt spart es also gute 100 Watt. Und bei aktuellen Strompreisen von etwa 30 Cent pro kWh müsste ich das Setup 1650 Stunden nutzen, um den Break-Even zu erreichen (fast 70 Tage durchgehend). Realistisch ist das so nicht, wenn wir ehrlich sind. Ich würde sagen, ich nutze das Setup wahrscheinlich maximal 10 Stunden pro Woche, was 165 Wochen bzw. etwas über drei Jahre ergibt. Das geht vom ROI her natürlich noch, aber zeigt trotzdem, dass das Setup so eher mäßig sinnvoll ist.&lt;/p&gt;
&lt;p&gt;Aber nicht alles im Homelab muss ja auch komplett sinnvoll sein. Mir gehts dabei eher darum, Erfahrung mit solchen Setups zu machen und mir die Praxistauglichkeit von so einer Lösung mal selbst anzusehen.&lt;/p&gt;
&lt;h2 id="andere-verwendungszwecke"&gt;Andere Verwendungszwecke
&lt;/h2&gt;&lt;p&gt;Der nicht erweiterbare RAM und Speicher schränkt natürlich die Nutzung des Geräts für andere Zwecke ein. HomeAssistant oder als kleiner Docker-Host für z.B. Pihole dürfte allerdings gut funktionieren, auch wenn ich es nicht getestet habe. Auch als Printserver für einen 3D-Drucker mit Octoprint dürfte das Gerät eine gute Figur machen. Generell geht alles, was nicht viel Rechenleistung, RAM und Speicher braucht, Linux läuft auf dem T430 problemlos. Für Windows (und generell Einsatz als normaler Desktop) ist die Hardware schlicht zu schwach.&lt;/p&gt;
&lt;h2 id="benchmark"&gt;Benchmark
&lt;/h2&gt;&lt;p&gt;YABS darf natürlich hier auch nicht fehlen. Geekbench 6 lief hierbei aus mir nicht bekannten Gründen nicht durch.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;span class="lnt"&gt;24
&lt;/span&gt;&lt;span class="lnt"&gt;25
&lt;/span&gt;&lt;span class="lnt"&gt;26
&lt;/span&gt;&lt;span class="lnt"&gt;27
&lt;/span&gt;&lt;span class="lnt"&gt;28
&lt;/span&gt;&lt;span class="lnt"&gt;29
&lt;/span&gt;&lt;span class="lnt"&gt;30
&lt;/span&gt;&lt;span class="lnt"&gt;31
&lt;/span&gt;&lt;span class="lnt"&gt;32
&lt;/span&gt;&lt;span class="lnt"&gt;33
&lt;/span&gt;&lt;span class="lnt"&gt;34
&lt;/span&gt;&lt;span class="lnt"&gt;35
&lt;/span&gt;&lt;span class="lnt"&gt;36
&lt;/span&gt;&lt;span class="lnt"&gt;37
&lt;/span&gt;&lt;span class="lnt"&gt;38
&lt;/span&gt;&lt;span class="lnt"&gt;39
&lt;/span&gt;&lt;span class="lnt"&gt;40
&lt;/span&gt;&lt;span class="lnt"&gt;41
&lt;/span&gt;&lt;span class="lnt"&gt;42
&lt;/span&gt;&lt;span class="lnt"&gt;43
&lt;/span&gt;&lt;span class="lnt"&gt;44
&lt;/span&gt;&lt;span class="lnt"&gt;45
&lt;/span&gt;&lt;span class="lnt"&gt;46
&lt;/span&gt;&lt;span class="lnt"&gt;47
&lt;/span&gt;&lt;span class="lnt"&gt;48
&lt;/span&gt;&lt;span class="lnt"&gt;49
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;tc@hp-t430:~$ curl -sL https://yabs.sh | bash -s -- -5 -6 -i
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## #
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# Yet-Another-Bench-Script #
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# v2025-04-20 #
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# https://github.com/masonr/yet-another-bench-script #
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## #
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Do 1. Mai 08:59:13 CEST 2025
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Basic System Information:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;---------------------------------
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Uptime : 0 days, 0 hours, 4 minutes
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Processor : Intel(R) Celeron(R) N4020 CPU @ 1.10GHz
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;CPU cores : 2 @ 2186.154 MHz
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;AES-NI : ✔ Enabled
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;VM-x/AMD-V : ❌ Disabled
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;RAM : 1.5 GiB
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Swap : 977.0 MiB
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Disk : 13.4 GiB
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Distro : Debian GNU/Linux 12 (bookworm)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Kernel : 6.1.0-34-amd64
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;VM Type : NONE
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;IPv4/IPv6 : ✔ Online / ❌ Offline
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;fio Disk Speed Tests (Mixed R/W 50/50) (Partition /dev/mmcblk0p2):
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;---------------------------------
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Block Size | 4k (IOPS) | 64k (IOPS)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ------ | --- ---- | ---- ----
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Read | 5.51 MB/s (1.3k) | 8.98 MB/s (140)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Write | 5.53 MB/s (1.3k) | 9.50 MB/s (148)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Total | 11.05 MB/s (2.7k) | 18.49 MB/s (288)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; | |
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Block Size | 512k (IOPS) | 1m (IOPS)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ------ | --- ---- | ---- ----
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Read | 9.08 MB/s (17) | 17.53 MB/s (17)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Write | 10.13 MB/s (19) | 18.86 MB/s (18)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Total | 19.22 MB/s (36) | 36.39 MB/s (35)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Geekbench 5 Benchmark Test:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;---------------------------------
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Test | Value
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; |
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Single Core | 516
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Multi Core | 779
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Full Test | https://browser.geekbench.com/v5/cpu/23509544
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Geekbench 6 test failed. Run manually to determine cause.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;YABS completed in 27 min 5 sec
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;</description></item><item><title>Backup-Server für das NAS</title><link>https://secretmine.de/blog/2025/2025-04-27-backup-server-fuer-das-nas/</link><pubDate>Sun, 27 Apr 2025 00:00:00 +0000</pubDate><guid>https://secretmine.de/blog/2025/2025-04-27-backup-server-fuer-das-nas/</guid><description>&lt;p&gt;Irgendwie bin ich in letzter Zeit im Backup-Fieber&amp;hellip; Ich weiß auch nicht.&lt;/p&gt;
&lt;p&gt;Bisher wurden die Daten von meinem NAS (etwa 8TB belegt) nicht gesichert, ich habe nur die wichtigsten paar hundert GB ab und an in meine Storagebox bei Hetzner gesynct. Damit bin ich aber nicht so zufrieden, da der Datenverlust im Zweifelsfall doch deutlich wäre.&lt;/p&gt;
&lt;h2 id="festplatten"&gt;Festplatten
&lt;/h2&gt;&lt;p&gt;Irgendwo müssen solche Datenmengen hin, so viel hat man auch nicht einfach an Festplatten herumliegen. Cloud-Speicher ist in den Größenordnungen auch eher teuer, selbst wenn man Archivspeicher (z.B. S3 Glacier bei Scaleway) nutzt. Daher habe ich hierfür Festplatten gekauft. Weil es nur um Backups geht, waren refurbished Platten für mich okay, solange die in einem RAID oder ZFS laufen. Konkret wurde es eine Seagate Enterprise Capacity mit 12TB und eine Seagate Ironwolf mit 12TB. Ich habe verschiedene Modellreihen genommen, um einem gleichzeitigen Ausfall etwas vorzubeugen.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Die Festplatten" class="gallery-image" data-flex-basis="356px" data-flex-grow="148" height="1010" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://secretmine.de/blog/2025/2025-04-27-backup-server-fuer-das-nas/images/hdds.jpg" srcset="https://secretmine.de/blog/2025/2025-04-27-backup-server-fuer-das-nas/images/hdds_hu_6e2bb4cdee595106.jpg 800w, https://secretmine.de/blog/2025/2025-04-27-backup-server-fuer-das-nas/images/hdds.jpg 1500w" width="1500"&gt;&lt;/p&gt;
&lt;h3 id="benchmarks"&gt;Benchmarks
&lt;/h3&gt;&lt;p&gt;Bevor ich die Festplatten tatsächlich nutze, habe ich kurz mit CrystalDiskBench mit meinem Windows-Rechner Tests gemacht.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Benchmark Seagate Enterprise Capacity 12TB (refurbished)" class="gallery-image" data-flex-basis="328px" data-flex-grow="136" height="352" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://secretmine.de/blog/2025/2025-04-27-backup-server-fuer-das-nas/images/bench_12tb_enterprise_capacity.png" width="482"&gt;
&lt;img alt="Benchmark Seagate Ironwolf 12TB (refurbished)" class="gallery-image" data-flex-basis="328px" data-flex-grow="136" height="352" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://secretmine.de/blog/2025/2025-04-27-backup-server-fuer-das-nas/images/bench_12tb_ironwolf.png" width="482"&gt;&lt;/p&gt;
&lt;h2 id="server"&gt;Server
&lt;/h2&gt;&lt;p&gt;Ich habe aus vorhandener Hardware einen kleinen Server gebaut, der dann in den Keller kommt und bei Bedarf eingeschaltet werden kann. Die Hardware ist absolut nicht herausragend, reicht für den Zweck allerdings problemlos:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;CPU: Intel Pentium G3258&lt;/li&gt;
&lt;li&gt;RAM: 4GB &lt;em&gt;(zweiter Slot vom Mainboard leider defekt)&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;Datenträger:
&lt;ul&gt;
&lt;li&gt;120GB SSD (TrueNAS)&lt;/li&gt;
&lt;li&gt;2x 12TB HDD&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ich habe dann das aktuelle TrueNAS Scale installiert und ein RAIDZ1 erstellt. Ich habe mich hier explizit für RAIDZ1 statt einem Mirror entschieden, damit ich später simpel die Kapazität mit z.B. einer weiteren 12TB-Platte erweitern kann. Das RAIDZ1 verhält sich mit zwei Festplatten eigentlich wie ein Mirror. Schade ist hierbei, dass sich so ein zdev nicht über die UI erstellen lässt, das muss per CLI passieren.&lt;/p&gt;
&lt;h2 id="datensicherung"&gt;Datensicherung
&lt;/h2&gt;&lt;p&gt;Anfangs hatte ich die Sicherungen mit &lt;code&gt;rsync&lt;/code&gt; gemacht, das funktioniert auch soweit gut. Es hat jedoch einen gravierenden Nachteil: Das Verschieben von Dateien wird nicht erkannt. Deswegen habe ich nun auf &lt;code&gt;rclone&lt;/code&gt; umgestellt, weiterhin per SFTP. Dort gibt es das Argument &lt;code&gt;--track-renames&lt;/code&gt;, was bei Dateien, die entweder nur in der Quelle oder nur im Ziel sind, versucht, ein Matching zu möglichen anderen Dateien zu machen und entsprechend umzubenennen. Das scheint auch gut zu funktionieren.&lt;/p&gt;
&lt;p&gt;Nach einem Sync lege ich händisch einen ZFS Snapshot an, um den alten Stand einzufrieren. Mein Plan ist, dass ich den kompletten Prozess automatisiere, also dann folgende Schritte in ein Script gieße:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;NAS hochfahren&lt;/li&gt;
&lt;li&gt;Backup-NAS hochfahren&lt;/li&gt;
&lt;li&gt;Sync ausführen und abwarten&lt;/li&gt;
&lt;li&gt;ZFS-SNapshot auf Backup-NAS erstellen&lt;/li&gt;
&lt;li&gt;Backup-NAS herunterfahren&lt;/li&gt;
&lt;li&gt;NAS in Standby schicken&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Das soll dann etwa 1x pro Woche erfolgen. Ich habe mich bisher mit der TrueNAS-API noch nicht auseinandergesetzt, aber ansonsten kann ich die ZFS-Snapshots auch einfach direkt per CLI erstellen.&lt;/p&gt;</description></item><item><title>Proxmox Backup Server für den Hauptcluster</title><link>https://secretmine.de/blog/2025/2025-03-30-proxmox-backup-server-fuer-den-hauptcluster/</link><pubDate>Sun, 30 Mar 2025 00:00:00 +0000</pubDate><guid>https://secretmine.de/blog/2025/2025-03-30-proxmox-backup-server-fuer-den-hauptcluster/</guid><description>&lt;p&gt;Ich habe schon länger darüber nachgedacht, wie ich gut und günstig meine VMs und Container sichern kann. Ich hatte in dem Zuge erst &lt;a class="link" href="https://secretmine.de/blog/2024/2024-10-22-proxmox-backup-server-via-s3/" &gt;PBS über S3&lt;/a&gt; getestet, was lief, aber nicht optimal war - und dann lange einen externen Anbieter (&lt;a class="link" href="https://secretmine.de/blog/2025/2025-03-12-proxmox-backup-server-kostenlos/" &gt;Tuxis&lt;/a&gt;) für PBS genutzt. Da bin ich mit 150GB allerdings beim Speicherplatz stark eingeschränkt.&lt;/p&gt;
&lt;h2 id="bisherige-backup-strategie"&gt;Bisherige Backup-Strategie
&lt;/h2&gt;&lt;p&gt;Bisher landen die wichtigsten VMs und Container auf einem externen PBS-Server bei Tuxis, die Dateien der Nextcloud werden mittels &lt;code&gt;restic&lt;/code&gt; auf eine Storage-Box bei Hetzner gesichert. Das deckt aber nur einen Teil der VMs und Container ab, und vor allem ist die Wiederherstellung teilweise aufwändiger. Daher habe ich schon länger den Wunsch, das ganze zu vereinfachen&lt;/p&gt;
&lt;h2 id="der-plan"&gt;Der Plan
&lt;/h2&gt;&lt;p&gt;Ich habe eine billige 1TB Sata-SSD gekauft (genauer gesagt eine Lexar NQ100 im Angebot). Diese soll in den dritten Host (der Mini-PC, Lenovo Tinkcentre M715q Tiny) kommen, damit dort dann Proxmox Backup Server laufen kann. Damit habe ich dann genügend Kapazität, um wirklich alle VMs und Container zu sichern und bei Bedarf schnell wiederherstellen zu können.&lt;/p&gt;
&lt;h2 id="die-umsetzung"&gt;Die Umsetzung
&lt;/h2&gt;&lt;p&gt;Ich habe also die SSD verbaut (nebenbei auch noch die NVMe von 240GB auf 480GB getauscht und mittels &lt;code&gt;gparted&lt;/code&gt; die bisherigen Partitionen kopiert und vergrößert).&lt;/p&gt;
&lt;p&gt;&lt;img alt="Lenovo M715q Tiny von innen" class="gallery-image" data-flex-basis="240px" data-flex-grow="100" height="1500" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://secretmine.de/blog/2025/2025-03-30-proxmox-backup-server-fuer-den-hauptcluster/images/m715q-1.jpg" srcset="https://secretmine.de/blog/2025/2025-03-30-proxmox-backup-server-fuer-den-hauptcluster/images/m715q-1_hu_9ee801ddc65896df.jpg 800w, https://secretmine.de/blog/2025/2025-03-30-proxmox-backup-server-fuer-den-hauptcluster/images/m715q-1.jpg 1500w" width="1500"&gt;
&lt;img alt="Lenovo M715q Tiny von innen - mit Sata-SSD" class="gallery-image" data-flex-basis="240px" data-flex-grow="100" height="1500" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://secretmine.de/blog/2025/2025-03-30-proxmox-backup-server-fuer-den-hauptcluster/images/m715q-2.jpg" srcset="https://secretmine.de/blog/2025/2025-03-30-proxmox-backup-server-fuer-den-hauptcluster/images/m715q-2_hu_f3984b448eda7c01.jpg 800w, https://secretmine.de/blog/2025/2025-03-30-proxmox-backup-server-fuer-den-hauptcluster/images/m715q-2.jpg 1500w" width="1500"&gt;&lt;/p&gt;
&lt;h2 id="installation-von-pbs"&gt;Installation von PBS
&lt;/h2&gt;&lt;p&gt;Ich habe PBS direkt mit auf dem Host installiert. Da das ein Proxmox ist, war das auch nicht weiter schwierig (wäre es allerdings auf jedem Debian nicht). In der Doku befindet sich dazu auch eine Anleitung, die man recht gut befolgen kann (&lt;a class="link" href="https://pbs.proxmox.com/docs/installation.html#install-proxmox-backup-server-on-proxmox-ve%29" target="_blank" rel="noopener"
 &gt;https://pbs.proxmox.com/docs/installation.html#install-proxmox-backup-server-on-proxmox-ve)&lt;/a&gt;. Vor dem &lt;code&gt;apt&lt;/code&gt;-Befehl muss man aber noch manuell das APT-Repo hinzufügen. Die ganze Installation sieht also etwa so aus:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;wget https://enterprise.proxmox.com/debian/proxmox-release-bookworm.gpg -O /etc/apt/trusted.gpg.d/proxmox-release-bookworm.gpg
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;deb http://download.proxmox.com/debian/pbs bookworm pbs-no-subscription&amp;#34;&lt;/span&gt; &amp;gt; /etc/apt/sources.list.d/pbs.list
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;apt update
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;apt install proxmox-backup-server
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;em&gt;Die Befehle habe ich vor dem Posten nicht getestet, das habe ich jetzt im Nachhinein noch kurz zusammengesammelt.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Danach ist Proxmox Backup Server unter &lt;code&gt;https://[host]:8007&lt;/code&gt; erreichbar.&lt;/p&gt;
&lt;h2 id="lexar-nq100-für-diesen-zweck"&gt;Lexar NQ100 für diesen Zweck
&lt;/h2&gt;&lt;p&gt;Die SSD scheint soweit gut geeignet als Backup-Ziel zu sein, auch wenn ich leichte Zweifel an der Langlebigkeit dieser SSD habe. Das liegt aber eigentlich nur am Preis, mir sind generell bisher eigentlich fast keine SSDs kaputt gegangen (eine noname 32GB SSD aus Chinau und eine 240GB Billig-SSD von Toshiba).&lt;/p&gt;
&lt;h2 id="spiegel-vom-pbs-datastore"&gt;Spiegel vom PBS Datastore
&lt;/h2&gt;&lt;p&gt;Proxmox Backup Server kann Backups auf einen externen Server replizieren. Ich habe im Keller im zweiten Part vom Homelab einen Thin-Client (Fujitsu Futro S720) mit einer Sata-HDD, der als Backup-Server und Storage für die Server im Keller dient. Dorthin will ich einen (unregelmäßigen und manuellen) Sync einrichten, damit ich zumindest halb-offsite auch noch einen schnell verfügbaren Spiegel habe.&lt;/p&gt;</description></item><item><title>Proxmox Backup Server kostenlos (bei Tuxis)</title><link>https://secretmine.de/blog/2025/2025-03-12-proxmox-backup-server-kostenlos/</link><pubDate>Fri, 14 Mar 2025 00:00:00 +0000</pubDate><guid>https://secretmine.de/blog/2025/2025-03-12-proxmox-backup-server-kostenlos/</guid><description>&lt;h2 id="was-ist-proxmox-backup-server-überhaupt"&gt;Was ist Proxmox Backup Server überhaupt?
&lt;/h2&gt;&lt;p&gt;Der Proxmox Backup Server (PBS) ist eine Open-Source-Lösung zum Sichern von virtuellen Maschinen (VMs), Containern und physikalischen Hosts. Besonders in Kombination mit Proxmox VE ist PBS ideal, um effiziente und sichere Backups zu erstellen. PBS ist in Proxmox VE direkt integriert.&lt;/p&gt;
&lt;p&gt;PBS unterstützt deduplizierte und inkrementelle Backups, was bedeutet, dass nur geänderte Daten gesichert werden, um Speicherplatz zu sparen. Backups können zudem komprimiert und verschlüsselt werden, was die Sicherheit und Effizienz erhöht.&lt;/p&gt;
&lt;h2 id="der-kostenlose-anbieter"&gt;Der kostenlose Anbieter
&lt;/h2&gt;&lt;p&gt;Durch Zufall bin ich bei Reddit in einem Kommentar darauf gestoßen, dass es einen Anbieter gibt, der Proxmox Backup Server mit 150 GB Speicherplatz komplett kostenfrei anbietet. Tuxis ist ein IT-Service-Provider mit Sitz in den Niederlanden.&lt;/p&gt;
&lt;p&gt;Der Link zum Angebot: &lt;a class="link" href="https://www.tuxis.nl/de/proxmox-backup-server/" target="_blank" rel="noopener"
 &gt;https://www.tuxis.nl/de/proxmox-backup-server/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Beim Schreiben dieses Posts muss ich leider feststellen, dass es die kostenlosen Pakete zumindest Stand heute nicht verfügbar sind. Vielleicht kommen die noch wieder, vielleicht aber auch nicht.&lt;/em&gt;&lt;/p&gt;
&lt;h2 id="meine-erfahrung"&gt;Meine Erfahrung
&lt;/h2&gt;&lt;p&gt;Ich habe den kostenlosen PBS also bestellt und innerhalb weniger Minuten die Zugangsdaten bekommen. Das ganze habe ich dann auch direkt in meinem Homeserver eingerichtet, hierbei mit Verschlüsselung, da die Daten nicht in meiner Hoheit liegen. Der Backup Space funktioniert, hat bisher keinerlei Fehler geworfen und scheint auch zuverlässig zu sein. Ich nutze das ganze allerdings auch erst seit ein paar Tagen, von daher kann ich zur langfristigen Stabilität noch nichts sagen. Bei kostenlosen Angeboten wie diesen muss man natürlich auch immer damit rechnen, dass das Angebot ohne große Ankündigung eingestellt wird, daher nutze ich es auch nur als zusätzliches Offsite-Backup. Ich gebe mir dabei auch Mühe, dass ich nicht zu viel Platz belege, immerhin ist es ein kostenloses Angebot, von dem ich hoffe, dass es so schnell nicht eingestellt wird.&lt;/p&gt;
&lt;h2 id="alternativen"&gt;Alternativen
&lt;/h2&gt;&lt;p&gt;Mir sind sonst auf dem Markt nicht wirklich viele Alternativen (also bezahlt) bekannt, die PBS anbieten. Es gibt sie aber. Ansonsten geht natürlich auch ein vServer mit genügend Storage - dafür findet man auch problemlos Anbieter (teilweise auch mit kleinem SSD-Boot-Speicher und dickem HDD-Speicher dazu). Und PBS statt reinem Storage (z.B. Hetzner Storage Box oder so) hat den großen Vorteil, dass die Deduplizierung bzw. inkrementelle Sicherung greift (und damit nicht nur Speicherplatz, sondern auch Bandbreite spart). Bei mir ist das aktuell (insgesamt knapp 300 Snapshots) ein Deduplizierungsfaktor von etwa 17.&lt;/p&gt;</description></item><item><title>Upgrades für den zweiten Fujitsu Futro S740</title><link>https://secretmine.de/blog/2025/2025-03-07-upgrades-fuer-den-zweiten-fujitsu-futro-s740/</link><pubDate>Fri, 07 Mar 2025 00:00:00 +0000</pubDate><guid>https://secretmine.de/blog/2025/2025-03-07-upgrades-fuer-den-zweiten-fujitsu-futro-s740/</guid><description>&lt;p&gt;&amp;hellip; oder auch: Wie man zwei M.2 2280-SSDs in einem Thin Client verbaut.&lt;/p&gt;
&lt;p&gt;Ich habe ja Ende letzten Jahres für meine Nextcloud einen &lt;a class="link" href="https://secretmine.de/blog/2024/2024-10-19-zweiter-futro-s740/" &gt;zweiten Fujitsu Futro S740&lt;/a&gt; gekauft. Bislang war dort eine 240GB SSD verbaut, der Speicher wurde allerdings jetzt langsam knapp.&lt;/p&gt;
&lt;p&gt;Ich hatte beim ersten S740 ja mit einem Adapter schon den für das Wifi-Modul gedachte Slot für eine NVMe-SSD &lt;a class="link" href="https://secretmine.de/blog/2024/2024-04-06-futro-s740-upgrades/" &gt;zweckentfremdet&lt;/a&gt;, das funktioniert auch bis heute stabil.&lt;/p&gt;
&lt;p&gt;Jetzt steht ein ähnliches Upgrade für den zweiten Futro S740 an.&lt;/p&gt;
&lt;h2 id="die-ssd"&gt;Die SSD
&lt;/h2&gt;&lt;p&gt;Ich habe (im Angebot) eine Kingston NV3 mit 1TB gekauft. Eine SSD aus dem unteren Preissegment mit keinen besonderen Leistungswerten, einfach nur brauchbarer Massenspeicher. Durch die Anbindung von dem Port (laut Internet PCIe 2.0 x1, also etwa 500 MB/s) würde eine schnellere SSD hier eh nicht viel bringen und ich habe nicht vor, nennenswert VMs oder ähnliches auf der SSD zu betreiben. Primär werden dort die eigentlichen Daten der Nextcloud liegen.&lt;/p&gt;
&lt;h2 id="das-upgrade"&gt;Das Upgrade
&lt;/h2&gt;&lt;p&gt;Zuerst habe ich den Futro also heruntergefahren und aufgeschraubt.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Fujitsu Futro S740 von innen" class="gallery-image" data-flex-basis="296px" data-flex-grow="123" height="1214" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://secretmine.de/blog/2025/2025-03-07-upgrades-fuer-den-zweiten-fujitsu-futro-s740/images/step1.jpg" srcset="https://secretmine.de/blog/2025/2025-03-07-upgrades-fuer-den-zweiten-fujitsu-futro-s740/images/step1_hu_143ad72e8813732a.jpg 800w, https://secretmine.de/blog/2025/2025-03-07-upgrades-fuer-den-zweiten-fujitsu-futro-s740/images/step1.jpg 1500w" width="1500"&gt;&lt;/p&gt;
&lt;p&gt;Danach habe ich den M.2-Adapter von A/E-Key zu M-Key zugeschnitten und verbaut&lt;/p&gt;
&lt;p&gt;&lt;img alt="Verbauter M.2-Adapter" class="gallery-image" data-flex-basis="307px" data-flex-grow="127" height="1172" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://secretmine.de/blog/2025/2025-03-07-upgrades-fuer-den-zweiten-fujitsu-futro-s740/images/step2.jpg" srcset="https://secretmine.de/blog/2025/2025-03-07-upgrades-fuer-den-zweiten-fujitsu-futro-s740/images/step2_hu_a7fec995d931131.jpg 800w, https://secretmine.de/blog/2025/2025-03-07-upgrades-fuer-den-zweiten-fujitsu-futro-s740/images/step2.jpg 1500w" width="1500"&gt;&lt;/p&gt;
&lt;p&gt;Nun war auch schon der Einbau der SSD dran. Dadurch, dass das eigentlich so nicht gedacht ist, gibt es natürlich keine Möglichkeit, die SSD festzuschrauben. Daher habe ich einfach temperaturbeständiges Klebeband verwendet - im anderen Futro S740 funktioniert das seit fast einem Jahr problemlos.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Futro mit zwei M.2 2280 SSDs" class="gallery-image" data-flex-basis="319px" data-flex-grow="133" height="1126" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://secretmine.de/blog/2025/2025-03-07-upgrades-fuer-den-zweiten-fujitsu-futro-s740/images/step3.jpg" srcset="https://secretmine.de/blog/2025/2025-03-07-upgrades-fuer-den-zweiten-fujitsu-futro-s740/images/step3_hu_1096ce308a5bde09.jpg 800w, https://secretmine.de/blog/2025/2025-03-07-upgrades-fuer-den-zweiten-fujitsu-futro-s740/images/step3.jpg 1500w" width="1500"&gt;&lt;/p&gt;
&lt;p&gt;Damit das ganze auch nicht zu warm wird, habe ich noch ein kleines Reststück Kunststoff dazwischen gesetzt, um etwas Abstand zwischen die SSDs zu bringen.&lt;/p&gt;
&lt;p&gt;&lt;img alt="SSDs von der Seite" class="gallery-image" data-flex-basis="1281px" data-flex-grow="533" height="281" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://secretmine.de/blog/2025/2025-03-07-upgrades-fuer-den-zweiten-fujitsu-futro-s740/images/mainboard.jpg" srcset="https://secretmine.de/blog/2025/2025-03-07-upgrades-fuer-den-zweiten-fujitsu-futro-s740/images/mainboard_hu_23c51452e17ca9ae.jpg 800w, https://secretmine.de/blog/2025/2025-03-07-upgrades-fuer-den-zweiten-fujitsu-futro-s740/images/mainboard.jpg 1500w" width="1500"&gt;&lt;/p&gt;
&lt;p&gt;Und ja, das ganze sieht ziemlich nach Bastelei aus und gefällt mir auch nicht zu hundert Prozent - aber es funktioniert wirklich gut.&lt;/p&gt;
&lt;h2 id="der-start-danach"&gt;Der Start danach
&lt;/h2&gt;&lt;p&gt;Die SSD wurde nach dem Starten nach dem Einbau nicht sofort erkannt. Ich hatte erst den Kontakt selbst im Auge, aber dann ist mir eingefallen, dass ich das Wifi/Bluetooth-Modul im BIOS deaktiviert hatte. Und die SSD sitzt natürlich genau in dem Slot. Nach dem Aktivieren wurde die SSD dann exakt wie erwartet erkannt und hat genau so funktioniert wie sie soll. Die Nextcloud-Daten sind auch schon umgezogen - das war letztendlich nur ein Verschieben der entsprechenden Disk.&lt;/p&gt;
&lt;h2 id="ausblick"&gt;Ausblick
&lt;/h2&gt;&lt;p&gt;Bald müsste auch noch eine weitere SSD ankommen, diesmal eine Sata-SSD für den Mini-PC. Dann gibts auch nen flotten Proxmox Backup Server direkt im Haupt-Lab. Beitrag folgt dann.&lt;/p&gt;</description></item><item><title>Lokale SSL-Zertifikate mit Caddy und Step-CA</title><link>https://secretmine.de/blog/2025/2025-02-28-lokale-ssl-zertifikate-mit-caddy-und-step-ca/</link><pubDate>Fri, 28 Feb 2025 00:00:00 +0000</pubDate><guid>https://secretmine.de/blog/2025/2025-02-28-lokale-ssl-zertifikate-mit-caddy-und-step-ca/</guid><description>&lt;p&gt;Ich habe zuhause zwei Caddy-Instanzen als Reverse-Proxy laufen - einer als Proxy für Traffic von außen (via RZ), einer als Proxy für Traffic innerhalb vom Netzwerk.&lt;/p&gt;
&lt;p&gt;Ich nutze eine interne Domain (&lt;code&gt;home.local&lt;/code&gt; - ja, ich weiß, &lt;code&gt;.internal&lt;/code&gt; wäre besser) für die Dienste, die nicht über das Internet aufrufbar sind. Dafür habe ich auch einen lokalen DNS-Server, der diese Zone bereitstellt.&lt;/p&gt;
&lt;p&gt;Was noch fehlte war HTTPS für die internen Dienste, Lets Encrypt oder ähnliches ist dort nicht nutzbar.&lt;/p&gt;
&lt;h2 id="step-ca"&gt;Step-CA
&lt;/h2&gt;&lt;p&gt;Step-CA ist eine selbst betreibbare Zertifizierungsstelle, die u.a. ACME kann. ACME ist das selbe &amp;ldquo;Protokoll&amp;rdquo;, was auch Lets Encrypt zur Verifizierung von Hosts und der Ausstellung von Zertifikaten benutzt. Das ganze ist ziemlich flott eingerichtet und lässt sich dann simpel an Clients wie Certbot oder auch Caddy anbinden und damit automatisch Zertifikate ausstellen. Das einzige manuelle ist, dass man auf allen Computern (und Smartphones und co), die diese lokalen Dienste nutzen sollen, natürlich das Root-Zertifikat der Step-CA installieren muss, damit die Zertifikate auch akzeptiert werden.&lt;/p&gt;
&lt;p&gt;Meine Docker-Compose dafür sieht sehr simpel aus:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;span class="lnt"&gt;8
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;services&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;step-ca&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;image&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;smallstep/step-ca&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;restart&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;always&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;ports&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="m"&gt;9443&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="m"&gt;9443&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;volumes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;./data:/home/step&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Vor dem ersten Start muss die CA noch initialisiert werden. Dazu muss das Datenverzeichnis erstellt und die Berechtigungen angepasst werden:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;mkdir data
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;chown -R 1000:1000 data/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker run --rm -it -v &lt;span class="s2"&gt;&amp;#34;./data/:/home/step/&amp;#34;&lt;/span&gt; smallstep/step-ca step ca init
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Der Assistent führt einen nun durch die notwendigen Schritte. Dann muss noch ein Secret angelegt werden:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; blub &lt;span class="p"&gt;|&lt;/span&gt; tee &lt;span class="s2"&gt;&amp;#34;data/secrets/password&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;chown 1000:1000 data/secrets/password
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Jetzt kann die CA schon gestartet werden und danach ACME aktiviert werden:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker compose up -d
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# kurz warten&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker compose &lt;span class="nb"&gt;exec&lt;/span&gt; step-ca step ca provisioner add acme --type ACME
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker compose restart
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Das Root-CA, was auf den Clients verteilt werden muss, befindet sich unter &lt;code&gt;data/certs/root_ca.crt&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id="caddy"&gt;Caddy
&lt;/h2&gt;&lt;p&gt;Die CA kann nun also Zertifikate ausstellen und muss nur noch an Caddy angebunden werden. Eine globale CA in der Caddyfile lässt sich dafür leider nicht nutzen, dieser Mechanismus ist laut Dokumentation von Caddy nicht für interne Domains freigegeben bzw. funktioniert damit nicht. Daher habe ich die für die lokale CA notwendige Konfiguration als Snippet angelegt:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;(local-ca) {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; tls me@example.com {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ca https://stepca.home.local:9443/acme/acme/directory
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ca_root /etc/caddy/root_ca.crt
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Das Root-CA habe ich, wie in der Config sichtbar, unter &lt;code&gt;/etc/caddy/root_ca.crt&lt;/code&gt; abgelegt.&lt;/p&gt;
&lt;p&gt;Nun lassen sich Reverse-Proxy-Hosts anlegen, die dieses Snippet verwenden und damit automatisch Zertifikate einrichten:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# Stirling-PDF
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;pdf.apps.home.local {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; import local-ca
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; reverse_proxy http://192.168.104.46:8081
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Oder im Falle von Proxmox vorerst mit Ignorieren der Korrektheit des vom PVE-Hosts genutzten Zertifikates (solange, bis ich bei PVE ACME mit der lokalen CA noch nicht eingerichtet habe):&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# Proxmox
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;pve.apps.home.local {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; import local-ca
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; reverse_proxy https://192.168.103.2:8006 {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; transport http {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; tls
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; tls_insecure_skip_verify
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Das sieht in Fertig im Browser dann so aus:
&lt;img alt="Proxmox via lokalem Caddy mit internem Zertifikat" class="gallery-image" data-flex-basis="351px" data-flex-grow="146" height="281" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://secretmine.de/blog/2025/2025-02-28-lokale-ssl-zertifikate-mit-caddy-und-step-ca/images/pve.png" width="411"&gt;&lt;/p&gt;
&lt;h2 id="windows"&gt;Windows
&lt;/h2&gt;&lt;p&gt;Damit Windows diesem Zertifikat vertraut, muss das CA noch installiert werden. Dazu reicht es, die &lt;code&gt;.ca&lt;/code&gt;-Datei mit Doppelklick zu öffnen und zu installieren. Danach muss das Zertifikat noch als Vertrauenswürdig eingestuft werden. Dazu kann man im Startmenü nach &amp;ldquo;Zertifikat&amp;rdquo; suchen und - je nachdem, wie man es installiert hat - die Verwaltung für Benutzer- oder Computerzertifikate öffnen. Das neue Zertifikat liegt dann wahrscheinlich unter &lt;code&gt;Zwischenzertifizierungsstellen/Zertifikat&lt;/code&gt; und muss nur noch zu &lt;code&gt;Vertrauenswürdige Stammzertifizierungsstellen/Zertifikate&lt;/code&gt; verschoben werden. Nach einem Neustart vom Browser sollte der Aufruf lokaler Subdomains mit SSL nun fehlerfrei funktionieren.&lt;/p&gt;</description></item><item><title>Lenovo ThinkCentre M715q Tiny - Upgrades</title><link>https://secretmine.de/blog/2025/2025-02-25-lenovo-thinkcentre-m715q-tiny-upgrades/</link><pubDate>Tue, 25 Feb 2025 00:00:00 +0000</pubDate><guid>https://secretmine.de/blog/2025/2025-02-25-lenovo-thinkcentre-m715q-tiny-upgrades/</guid><description>&lt;p&gt;Mein ThinkCentre M715q hatte bisher 12 GB RAM, bestehend aus 4 GB + 8 GB – also ohne Dual-Channel und insgesamt recht wenig Speicher. Daher habe ich mir neuen RAM zugelegt: ein 32 GB-Kit von Timetec (2×16 GB, 2666 MHz, CL19). Die Wahl fiel auf 2666 MHz, da dies das Maximum ist, das der Mini-PC unterstützt.&lt;/p&gt;
&lt;p&gt;Neben dem RAM wurde auch die 1 TB-HDD durch eine 500 GB SATA-SSD (Crucial MX500, die zuvor in einem anderen Gerät verbaut war) ersetzt. Dadurch erhalte ich auch dort bessere Performance, den zusätzlichen Speicherplatz benötige ich nicht&lt;/p&gt;
&lt;h2 id="benchmarks"&gt;Benchmarks
&lt;/h2&gt;&lt;p&gt;Ich war davon ausgegangen, dass ich durch den Umstieg auf Dual-Channel Performance gewinne, der Unterschied ist jedoch deutlicher als gedacht.&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th style="text-align: center"&gt;&lt;/th&gt;
					&lt;th style="text-align: center"&gt;Vorher&lt;/th&gt;
					&lt;th&gt;Nachher&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td style="text-align: center"&gt;Geekbench 5 (Single-Core)&lt;/td&gt;
					&lt;td style="text-align: center"&gt;890&lt;/td&gt;
					&lt;td&gt;946 (+6%)&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: center"&gt;Geekbench 5 (Multi-Core)&lt;/td&gt;
					&lt;td style="text-align: center"&gt;2380&lt;/td&gt;
					&lt;td&gt;3075 (+29%)&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: center"&gt;Geekbench 6 (Single-Core)&lt;/td&gt;
					&lt;td style="text-align: center"&gt;1000&lt;/td&gt;
					&lt;td&gt;1074 (+7%)&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: center"&gt;Geekbench 6 (Multi-Core)&lt;/td&gt;
					&lt;td style="text-align: center"&gt;2494&lt;/td&gt;
					&lt;td&gt;3066 (+23%)&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Die Single-Core-Werte sind etwa wie erwartet, ich hatte mit ~5-10% generellen Performanceverbesserungen gerechnet. Die Multi-Core-Werte mit +29% bzw. +23% wiederum haben mich erstaunt. Ich habe spaßeshalber noch einen Durchlauf mit dem Kernelparameter &lt;code&gt;mitigations=off&lt;/code&gt; gemacht (deaktiviert Mitigations für Dinge wie Spectre oder Meltdown), das hat allerdings keinen nennenswerten Unterschied gemacht. Was auch daran liegt, dass es eine AMD-CPU und keine Intel-CPU ist.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Hinweis&lt;/em&gt;: Bei den Benchmarks wurde jeweils nur ein einzelner Durchlauf durchgeführt, es wurde also nicht über mehrere Messungen gemittelt.&lt;/p&gt;
&lt;h2 id="was-ich-mit-den-ressourcen-mache"&gt;Was ich mit den Ressourcen mache
&lt;/h2&gt;&lt;p&gt;Vor allem kann ich dank des zusätzlichen RAMs jetzt Ollama mit Modellen bis ca 15 Milliarden Parametern ausführen, wenn auch langsam. Modelle mit 7 Milliarden Parametern sind tatsächlich halbwegs nutzbar, allerdings weiterhin nicht sonderlich schnell.&lt;/p&gt;
&lt;p&gt;Natürlich passen so auch allgemein mehr VMs und Container auf den Mini-PC, ich habe beispielsweise jetzt eine Windows-VM, die ich über HomeAssistant starten und stoppen kann. Das ermöglicht mir in Verbindung mit Guacamole (webbasierter RDP-Client) Zugang zu einer (bzw. meiner) Windows-VM von jedem beliebigen Computer mit Internet und einem Webbrowser, was sich als durchaus praktisch erweisen könnte.&lt;/p&gt;</description></item><item><title>Lenovo ThinkCentre M715q Tiny - mein neuer MC-Server</title><link>https://secretmine.de/blog/2024/2024-12-16-lenovo-thinkcentre-m715q-tiny/</link><pubDate>Mon, 16 Dec 2024 00:00:00 +0000</pubDate><guid>https://secretmine.de/blog/2024/2024-12-16-lenovo-thinkcentre-m715q-tiny/</guid><description>&lt;p&gt;Ich habe mir vor ein paar Wochen einen Mini-PC, genauer gesagt einen Lenovo ThinkCentre M715q Tiny gekauft.&lt;/p&gt;
&lt;h2 id="wofür"&gt;Wofür?
&lt;/h2&gt;&lt;p&gt;Mein Minecraft-Server läuft nun seit bald 5 Jahre durchgängig. Ursprünglich auf freien Ressourcen eines Dedicated Servers, zwischenzeitlich an verschiedenen anderen Orten und seit fast einem Jahr auf einem 1€-Angebots-vServer von 1blu. Dieses Angebot gibt es so aber anscheinend nicht mehr (und der vServer ist mit 8GB RAM ehrlich gesagt eigentlich auch zu klein dimensioniert), wodurch ich eine neue Lösung brauchte.&lt;/p&gt;
&lt;p&gt;Hauptsächlich war tatsächlich der Preis ausschlaggebend für den Umzug des MC-Servers zu mir nach Hause - neben den einmaligen Anschaffungskosten sind hier eigentlich nur die Stromkosten zu nennen. Ein ausreichend starker vServer hätte mich vermutlich um die 10€ pro Monat gekostet, der Mini-PC kostet mich jetzt grob 3€ pro Monat an Strom.&lt;/p&gt;
&lt;p&gt;Wenn man die Differenz zu einem vServer mit den Anschaffungskosten (im Angebot jetzt gut 90€ plus ~20€ für eine 240GB NVMe-SSD) vergleicht, ist der Mini-PC ab etwa 1,5 Jahren Betrieb insgesamt günstiger gewesen. Und das ist ausreichend kurz.&lt;/p&gt;
&lt;h2 id="die-hardware"&gt;Die Hardware
&lt;/h2&gt;&lt;p&gt;Der M715q hat bei mir nun folgende Ausstattung:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;AMD Ryzen 5 2400GE (4 Cores, 8 Threads)&lt;/li&gt;
&lt;li&gt;12GB RAM (ausgeliefert mit 2x 4GB, ich hatte noch 8GB liegen)&lt;/li&gt;
&lt;li&gt;240GB NVMe-SSD&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img alt="Lenovo ThinkCentre M715q Tiny" class="gallery-image" data-flex-basis="326px" data-flex-grow="135" height="2556" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://secretmine.de/blog/2024/2024-12-16-lenovo-thinkcentre-m715q-tiny/images/m715q.jpg" srcset="https://secretmine.de/blog/2024/2024-12-16-lenovo-thinkcentre-m715q-tiny/images/m715q_hu_c08ddc7a806dc89.jpg 800w, https://secretmine.de/blog/2024/2024-12-16-lenovo-thinkcentre-m715q-tiny/images/m715q_hu_70aa62f4fba12732.jpg 1600w, https://secretmine.de/blog/2024/2024-12-16-lenovo-thinkcentre-m715q-tiny/images/m715q_hu_3df7ef62c27e277e.jpg 2400w, https://secretmine.de/blog/2024/2024-12-16-lenovo-thinkcentre-m715q-tiny/images/m715q.jpg 3472w" width="3472"&gt;&lt;/p&gt;
&lt;p&gt;Die SSD ist eine Patriot P310 mit 240GB, das war das günstigste brauchbare Modell, was ich so finden konnte. Die Performance macht einen guten Eindruck bislang, wobei hochwertigere SSDs mit Sicherheit deutlich besser sind.&lt;/p&gt;
&lt;p&gt;Neben dem M.2-Slot hat der Mini-PC auch die Möglichkeit, ein 2,5-Zoll SATA-Gerät aufzunehmen, aktuell habe ich da eine 1TB HDD verbaut, die ich noch herumliegen hatte. Ich habe vor, die HDD durch eine 1-2TB SATA SSD zu ersetzen und den RAM irgendwann auf 32GB aufzurüsten.&lt;/p&gt;
&lt;h2 id="die-software"&gt;Die Software
&lt;/h2&gt;&lt;p&gt;Wie alles andere auch läuft der Mini-PC bei mir mit Proxmox. Das ließ sich problemlos installieren und funktioniert einwandfrei. Viel mehr gibt es dazu eigentlich nicht zu sagen.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Proxmox" class="gallery-image" data-flex-basis="499px" data-flex-grow="208" height="351" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://secretmine.de/blog/2024/2024-12-16-lenovo-thinkcentre-m715q-tiny/images/pve.png" width="731"&gt;&lt;/p&gt;
&lt;h2 id="stromverbrauch"&gt;Stromverbrauch
&lt;/h2&gt;&lt;p&gt;Im Idle habe ich teilweise schon Werte unter 10W gesehen. Mit dem Minecraft-Server im Leerlauf und einigen weiteren Anwendungen liegt der M715q bei mir die meiste Zeit zwischen 10 und 15 Watt. Mit aktiven Spielern oder generell unter Last geht der Verbrauch teilweise auch auf 40-50 Watt hoch.&lt;/p&gt;
&lt;p&gt;Das sind vermutlich ein paar Watt mehr als Geräte mit vergleichbaren Intel-CPUs aus dem Zeitraum verbrauchen würden, aber trotzdem ein guter Wert. Dieses Gerät ist vor allem deutlich günstiger als Mini-PCs mit Intel i5 8. oder 9. Generation und dabei von der Single-Core-Performance her sogar noch etwas stärker.&lt;/p&gt;
&lt;p&gt;Der Lüfter ist im Leerlauf nur bei absoluter Stille ein wenig zu hören, unter Last klingt der Rechner ähnlich wie ein Notebook unter Last und ist deutlich hörbar.&lt;/p&gt;
&lt;h2 id="benchmark"&gt;Benchmark
&lt;/h2&gt;&lt;p&gt;Zum Abschluss hier noch das Ergebnis von YABS:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;span class="lnt"&gt;24
&lt;/span&gt;&lt;span class="lnt"&gt;25
&lt;/span&gt;&lt;span class="lnt"&gt;26
&lt;/span&gt;&lt;span class="lnt"&gt;27
&lt;/span&gt;&lt;span class="lnt"&gt;28
&lt;/span&gt;&lt;span class="lnt"&gt;29
&lt;/span&gt;&lt;span class="lnt"&gt;30
&lt;/span&gt;&lt;span class="lnt"&gt;31
&lt;/span&gt;&lt;span class="lnt"&gt;32
&lt;/span&gt;&lt;span class="lnt"&gt;33
&lt;/span&gt;&lt;span class="lnt"&gt;34
&lt;/span&gt;&lt;span class="lnt"&gt;35
&lt;/span&gt;&lt;span class="lnt"&gt;36
&lt;/span&gt;&lt;span class="lnt"&gt;37
&lt;/span&gt;&lt;span class="lnt"&gt;38
&lt;/span&gt;&lt;span class="lnt"&gt;39
&lt;/span&gt;&lt;span class="lnt"&gt;40
&lt;/span&gt;&lt;span class="lnt"&gt;41
&lt;/span&gt;&lt;span class="lnt"&gt;42
&lt;/span&gt;&lt;span class="lnt"&gt;43
&lt;/span&gt;&lt;span class="lnt"&gt;44
&lt;/span&gt;&lt;span class="lnt"&gt;45
&lt;/span&gt;&lt;span class="lnt"&gt;46
&lt;/span&gt;&lt;span class="lnt"&gt;47
&lt;/span&gt;&lt;span class="lnt"&gt;48
&lt;/span&gt;&lt;span class="lnt"&gt;49
&lt;/span&gt;&lt;span class="lnt"&gt;50
&lt;/span&gt;&lt;span class="lnt"&gt;51
&lt;/span&gt;&lt;span class="lnt"&gt;52
&lt;/span&gt;&lt;span class="lnt"&gt;53
&lt;/span&gt;&lt;span class="lnt"&gt;54
&lt;/span&gt;&lt;span class="lnt"&gt;55
&lt;/span&gt;&lt;span class="lnt"&gt;56
&lt;/span&gt;&lt;span class="lnt"&gt;57
&lt;/span&gt;&lt;span class="lnt"&gt;58
&lt;/span&gt;&lt;span class="lnt"&gt;59
&lt;/span&gt;&lt;span class="lnt"&gt;60
&lt;/span&gt;&lt;span class="lnt"&gt;61
&lt;/span&gt;&lt;span class="lnt"&gt;62
&lt;/span&gt;&lt;span class="lnt"&gt;63
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;root@host3:~# curl -sL yabs.sh | bash -s -- -5 -6 -r
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## #
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# Yet-Another-Bench-Script #
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# v2024-06-09 #
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# https://github.com/masonr/yet-another-bench-script #
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## #
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Thu Nov 28 02:53:32 PM CET 2024
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Basic System Information:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;---------------------------------
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Uptime : 0 days, 0 hours, 6 minutes
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Processor : AMD Ryzen 5 2400GE with Radeon Vega Graphics
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;CPU cores : 8 @ 1600.000 MHz
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;AES-NI : ✔ Enabled
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;VM-x/AMD-V : ✔ Enabled
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;RAM : 10.6 GiB
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Swap : 3.7 GiB
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Disk : 19.1 GiB
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Distro : Debian GNU/Linux 12 (bookworm)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Kernel : 6.8.12-4-pve
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;VM Type : NONE
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;IPv4/IPv6 : ✔ Online / ❌ Offline
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;fio Disk Speed Tests (Mixed R/W 50/50) (Partition /dev/mapper/vg1-root):
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;---------------------------------
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Block Size | 4k (IOPS) | 64k (IOPS)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ------ | --- ---- | ---- ----
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Read | 199.16 MB/s (49.7k) | 552.76 MB/s (8.6k)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Write | 199.68 MB/s (49.9k) | 555.67 MB/s (8.6k)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Total | 398.84 MB/s (99.7k) | 1.10 GB/s (17.3k)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; | |
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Block Size | 512k (IOPS) | 1m (IOPS)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ------ | --- ---- | ---- ----
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Read | 761.70 MB/s (1.4k) | 810.20 MB/s (791)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Write | 802.17 MB/s (1.5k) | 864.16 MB/s (843)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Total | 1.56 GB/s (3.0k) | 1.67 GB/s (1.6k)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;iperf3 Network Speed Tests (IPv4):
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;---------------------------------
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Provider | Location (Link) | Send Speed | Recv Speed | Ping
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;----- | ----- | ---- | ---- | ----
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Clouvider | London, UK (10G) | 53.6 Mbits/sec | 107 Mbits/sec | 45.1 ms
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Leaseweb | Singapore, SG (10G) | 45.1 Mbits/sec | busy | 183 ms
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Leaseweb | NYC, NY, US (10G) | 51.5 Mbits/sec | 98.5 Mbits/sec | 117 ms
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Geekbench 5 Benchmark Test:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;---------------------------------
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Test | Value
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; |
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Single Core | 938
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Multi Core | 2862
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Full Test | https://browser.geekbench.com/v5/cpu/23105065
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Geekbench 6 Benchmark Test:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;---------------------------------
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Test | Value
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; |
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Single Core | 1069
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Multi Core | 2833
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Full Test | https://browser.geekbench.com/v6/cpu/9120078
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;YABS completed in 13 min 3 sec
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="minecraft---mein-setup"&gt;Minecraft - mein Setup
&lt;/h2&gt;&lt;p&gt;Ich habe in einem LXC-Container (ja, das C ist eigentlich doppelt gemoppelt) Docker und Pterodactyl installiert. Damit kann ich die Gameserver bequem per Webinterface verwalten. Ich habe keine direkte Portfreigabe für den Minecraft-Server gemacht. Der Traffic geht erstmal ins Rechenzentrum und erreicht dort einen Velocity-Proxy. Von dort führt ein Wireguard-Tunnel zu meinem Router nach Hause, der dann die Spieldaten entsprechend zum Container auf dem Mini-PC leitet. Das Setup hat den Vorteil, dass ich einerseits meine Heim-IP nicht preisgebe, andererseits möglichen Peering-Problemen aus dem Weg gehe und den MC-Server auch problemlos und schnell (und ohne DNS-Änderungen) umziehen kann. Ich muss nach einem Umzug nur im Proxy eine neue IP hinterlegen und bin fertig. Die Dynmap hängt auch hinter einem Reverse-Proxy im Rechenzentrum und funktioniert auf dem selben Weg.&lt;/p&gt;
&lt;h2 id="fazit"&gt;Fazit
&lt;/h2&gt;&lt;p&gt;Mir gefällt der kleine Rechner ziemlich gut, vor allem bei dem Preis. Vermutlich hätte ich mir den Kauf vom zweiten Futro S740 sparen können, das hätte problemlos mit auf diesen M715q gepasst. Aber egal, jetzt ist es so.&lt;/p&gt;
&lt;p&gt;Die Performance ist wirklich gut, vor allem für den geringen Preis (auch im Vergleich zu den Intel-Modellen). Für einen (oder auch mehrere) Minecraft-Server ist die Kiste eine klare Empfehlung und erlaubt günstigen Betrieb von einem Minecraft-Server zuhause.&lt;/p&gt;</description></item><item><title>Der zweite Fujitsu Futro S740</title><link>https://secretmine.de/blog/2024/2024-10-19-zweiter-futro-s740/</link><pubDate>Sat, 19 Oct 2024 00:00:00 +0000</pubDate><guid>https://secretmine.de/blog/2024/2024-10-19-zweiter-futro-s740/</guid><description>&lt;h2 id="warum-ein-zweiter-thin-client"&gt;Warum ein zweiter Thin Client?
&lt;/h2&gt;&lt;p&gt;Ich bin bekanntlich von meinem bisherigen Homeserver, einem Fujitsu Futro S740 &lt;a class="link" href="https://secretmine.de/blog/2023/2023-02-20-neuer-homeserver-futro-s740/" &gt;ziemlich überzeugt&lt;/a&gt;, vor allem wenn es um Dinge wie Effizienz geht.&lt;/p&gt;
&lt;p&gt;Warum ein zweiter Futro S740 und kein anderer Mini-PC? Ganz einfach: Der erste hat mich bereits überzeugt. Der kleine Thin Client lässt sich super als Homeserver nutzen. Der Prozessor (Intel Celeron J4105, 4 Kerne, bis zu 2,5 GHz), 4 GB RAM (aufrüstbar auf 16 GB) und mehrere Möglichkeiten für SSDs bieten genug Leistung für diverse Selfhosting-Projekte. Dazu kommt ein extrem niedriger Stromverbrauch – im Normalbetrieb gerade mal ein paar Watt. Und selbst zwei von den Futros zusammen verbrauchen weniger als die meisten anderen Mini-PCs alleine.&lt;/p&gt;
&lt;p&gt;Da ich nun überlege, meine &lt;a class="link" href="https://secretmine.de/blog/2024/2024-10-12-nextcloud-umzug-ziel/" &gt;Nextcloud zuhause zu betreiben&lt;/a&gt; brauche ich etwas mehr Power als der eine Thin Client liefern kann. Aktuell laufen - inkl. Nextcloud - 1 VM und 19 LXC-Container. Das meiste davon ist normalerweise im Idle, aber z.B. der LXC für ADS-B braucht dauerhaft 10-20% CPU. Auch andere Software braucht immer mal wieder Rechenleistung, weshalb die durchschnittliche Auslastung vom Server mittlerweile bei 30-40% liegt (RAM bei 10,5 von 16 GB, Load Average meistens bei um die 2). Ich habe also zu wenig Rechenleistung. Das Problem lässt sich jetzt entweder durch Upgraden der bisherigen Hardware (was ein Austausch wäre, bei den Thin Clients lassen sich die CPUs natürlich nicht tauschen) oder durch Hinzufügen eines zweiten Servers lösen.&lt;/p&gt;
&lt;h2 id="der-kauf"&gt;Der Kauf
&lt;/h2&gt;&lt;p&gt;Ich habe mich hierbei für die zweite Option entschieden und einen zweiten S740 gekauft. Wie letztes Mal habe ich wieder bei Piospartslab (&lt;a class="link" href="https://www.piospartslap.de/" target="_blank" rel="noopener"
 &gt;piospartslap.de&lt;/a&gt;) gekauft, hier war der Preis durch einen Preisvorschlag meinerseits bei etwa 50 €.&lt;/p&gt;
&lt;h2 id="bilder"&gt;Bilder
&lt;/h2&gt;&lt;p&gt;Ich habe letztes Mal wenig Bilder vom Futro gemacht, daher hole ich das hier mal nach.&lt;/p&gt;







	







































&lt;style&gt;
	

	
&lt;/style&gt;





&lt;div id="gallery-f13c32d6049a07cd95b989319338e9ab-2-wrapper" class="gallery-wrapper"&gt;
&lt;div id="gallery-f13c32d6049a07cd95b989319338e9ab-2" class="justified-gallery"&gt;
	
		

			
			

			
			
				
			

			
				
			

			
			
				
					
				
			


			
			

			&lt;div&gt;
				
				
					
					
				

				
				
					
					
				

				&lt;a href="https://secretmine.de/blog/2024/2024-10-19-zweiter-futro-s740/images/futro_3.jpg"
					class="galleryImg"
					
					&gt;
					&lt;img
						width="210" height="600"

						
							
							style="filter: blur(25px);"
							
								src="data:image/jpeg;base64,/9j/2wCEAAoHBwgHBgoICAgLCgoLDhgQDg0NDh0VFhEYIx8lJCIfIiEmKzcvJik0KSEiMEExNDk7Pj4&amp;#43;JS5ESUM8SDc9PjsBCgsLDg0OHBAQHDsoIig7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O//AABEIACAACwMBIgACEQEDEQH/xAGiAAABBQEBAQEBAQAAAAAAAAAAAQIDBAUGBwgJCgsQAAIBAwMCBAMFBQQEAAABfQECAwAEEQUSITFBBhNRYQcicRQygZGhCCNCscEVUtHwJDNicoIJChYXGBkaJSYnKCkqNDU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6g4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2drh4uPk5ebn6Onq8fLz9PX29/j5&amp;#43;gEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoLEQACAQIEBAMEBwUEBAABAncAAQIDEQQFITEGEkFRB2FxEyIygQgUQpGhscEJIzNS8BVictEKFiQ04SXxFxgZGiYnKCkqNTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqCg4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2dri4&amp;#43;Tl5ufo6ery8/T19vf4&amp;#43;fr/2gAMAwEAAhEDEQA/ALM2rTXnieaxk1CS1g3uDIs5QpheMZ4610FrN5tnBIzZZo1JJ78CvKPE93/xPtRQNn95nAHTgEnP516dpTq2kWTHqbdD0/2RTqvRBBas8j19lXxFfPglhJ0I4PAr1PRZj/YVh/17R/8AoIrzvVNC1DUdbvJLW3Z1YqVO8ANwB3rv9Kie30izglAEkUCIwznBCgH&amp;#43;VZyknFFpWbP/2Q=="
							
							class="lazy"
							data-src="https://secretmine.de/blog/2024/2024-10-19-zweiter-futro-s740/images/futro_3_hu_9d64e38c9b16f0b1.jpg"
						

						
					&gt;
				&lt;/a&gt;
			&lt;/div&gt;
		
	
		

			
			

			
			
				
			

			
				
			

			
			
				
					
				
			


			
			

			&lt;div&gt;
				
				
					
					
				

				
				
					
					
				

				&lt;a href="https://secretmine.de/blog/2024/2024-10-19-zweiter-futro-s740/images/futro_2.jpg"
					class="galleryImg"
					
					&gt;
					&lt;img
						width="600" height="488"

						
							
							style="filter: blur(25px);"
							
								src="data:image/jpeg;base64,/9j/2wCEAAoHBwgHBgoICAgLCgoLDhgQDg0NDh0VFhEYIx8lJCIfIiEmKzcvJik0KSEiMEExNDk7Pj4&amp;#43;JS5ESUM8SDc9PjsBCgsLDg0OHBAQHDsoIig7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O//AABEIABoAIAMBIgACEQEDEQH/xAGiAAABBQEBAQEBAQAAAAAAAAAAAQIDBAUGBwgJCgsQAAIBAwMCBAMFBQQEAAABfQECAwAEEQUSITFBBhNRYQcicRQygZGhCCNCscEVUtHwJDNicoIJChYXGBkaJSYnKCkqNDU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6g4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2drh4uPk5ebn6Onq8fLz9PX29/j5&amp;#43;gEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoLEQACAQIEBAMEBwUEBAABAncAAQIDEQQFITEGEkFRB2FxEyIygQgUQpGhscEJIzNS8BVictEKFiQ04SXxFxgZGiYnKCkqNTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqCg4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2dri4&amp;#43;Tl5ufo6ery8/T19vf4&amp;#43;fr/2gAMAwEAAhEDEQA/AOikeGFQcZ&amp;#43;grmfGl1cRaNDLbTz2u64ALqSpxtbjjntXbPp3y9f0rkviHbo3hyMEn5LlCOcdiP60Qjqht6DfDFwbvw5bzXE7ySZZSSck4YjPNaiop6Ff5mvN7C9uLe2WGOV1UE/KDx1rotI1KQrteTJ/Ospq0maJ31PUrpSAcjA964b4h&amp;#43;afDm2OPcTOnX8a7u4P7rPfPWsW4JyeT1rpejuYbnlmi6HdarC8w/dIj7SGBBPet200lrJyACTXTyklwMnHpVG54ZgOABXPN3dzaOx//9k="
							
							class="lazy"
							data-src="https://secretmine.de/blog/2024/2024-10-19-zweiter-futro-s740/images/futro_2_hu_b2341421f80023b4.jpg"
						

						
					&gt;
				&lt;/a&gt;
			&lt;/div&gt;
		
	
		

			
			

			
			
				
			

			
				
			

			
			
				
					
				
			


			
			

			&lt;div&gt;
				
				
					
					
				

				
				
					
					
				

				&lt;a href="https://secretmine.de/blog/2024/2024-10-19-zweiter-futro-s740/images/futro_1.jpg"
					class="galleryImg"
					
					&gt;
					&lt;img
						width="600" height="504"

						
							
							style="filter: blur(25px);"
							
								src="data:image/jpeg;base64,/9j/2wCEAAoHBwgHBgoICAgLCgoLDhgQDg0NDh0VFhEYIx8lJCIfIiEmKzcvJik0KSEiMEExNDk7Pj4&amp;#43;JS5ESUM8SDc9PjsBCgsLDg0OHBAQHDsoIig7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O//AABEIABsAIAMBIgACEQEDEQH/xAGiAAABBQEBAQEBAQAAAAAAAAAAAQIDBAUGBwgJCgsQAAIBAwMCBAMFBQQEAAABfQECAwAEEQUSITFBBhNRYQcicRQygZGhCCNCscEVUtHwJDNicoIJChYXGBkaJSYnKCkqNDU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6g4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2drh4uPk5ebn6Onq8fLz9PX29/j5&amp;#43;gEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoLEQACAQIEBAMEBwUEBAABAncAAQIDEQQFITEGEkFRB2FxEyIygQgUQpGhscEJIzNS8BVictEKFiQ04SXxFxgZGiYnKCkqNTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqCg4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2dri4&amp;#43;Tl5ufo6ery8/T19vf4&amp;#43;fr/2gAMAwEAAhEDEQA/AM/xjqup6VNapBdMgdSzKADnn3rmz4t1ZQD9vlyeflA4/Suh&amp;#43;I0JF3bkHIWMDn6tXFtZNtB&amp;#43;QDHJyaqMFyrQUp67mqPE&amp;#43;tSKxXUZ8KcZyK6LwbrV3eTzQXsrXPQqZDyOtcXDEIopN5XkggDPvWr4RuTHqZAPUf5/nSqRSix05NyOn&amp;#43;IEZe9j&amp;#43;UkbecAn/PWsrRrrw7bX&amp;#43;NU/49zEQfNiLDdlegHfrXpk1vDKu&amp;#43;SJHb1ZQazZLW2yf9Hi/wC&amp;#43;BVupZbEezuc/LdfDi6yEu44lbGVVJU/mK5EfYI/GE0OjvvtCQIipJz8oJ689Qa9Glt4EBKwxg&amp;#43;yiqzgKvygDPXFZ1K3MrWLpw5Xe5//Z"
							
							class="lazy"
							data-src="https://secretmine.de/blog/2024/2024-10-19-zweiter-futro-s740/images/futro_1_hu_3a64cce173c59233.jpg"
						

						
					&gt;
				&lt;/a&gt;
			&lt;/div&gt;
		
	
&lt;/div&gt;
&lt;/div&gt;

&lt;script&gt;
	if (!("HSCGjQuery" in window)) {
		if (!window.jQuery) {
			throw new Error("jQuery is not loaded, hugo-shortcode-gallery wont work without it!");
		}
		window.HSCGjQuery = window.jQuery.noConflict(true);
	}

	
	
	
	
	
	;(function($) {

		$( document ).ready(() =&gt; {
			const gallery = $("#gallery-f13c32d6049a07cd95b989319338e9ab-2");
			

			
			let swipeboxInstance = null;

			
			
			gallery.on('jg.complete', () =&gt; {
				
					
					
					$(() =&gt; {
						$('.lazy').Lazy({
							visibleOnly: true,
							afterLoad: element =&gt; element.css({filter: "none", transition: "filter 1.0s ease-in-out"})
						});
					});
				

				swipeboxInstance = $('.galleryImg').swipebox(
					$.extend({},
						{ }
					)
				);
			});

			
			gallery.justifiedGallery($.extend(
				{
					rowHeight : "150",
					margins : "5",
					border : 0,
					randomize : false ,
					waitThumbnailsLoad : false,
					lastRow : "justify",
					captions : false,
					
					
				},
				{ }
			));

			
			
		});

	
	
	
	})(window.HSCGjQuery)
&lt;/script&gt;

&lt;!--
![Futro S740 von oben](images/futro_1.jpg)
![Futro S740 von vorne](images/futro_2.jpg)
![Futro S740 von hinten (Anschlüsse)](images/futro_3.jpg)
--&gt;
&lt;h2 id="setup"&gt;Setup
&lt;/h2&gt;&lt;p&gt;Bevor ich mit der OS-Installation begonnen habe, habe ich erstmal das BIOS aktualisiert. Details dazu finden sich in einem Doku-Github-Repo zum S740 hier: &lt;a class="link" href="https://github.com/R3NE07/Futro-S740/blob/main/README.md#2---firmware" target="_blank" rel="noopener"
 &gt;https://github.com/R3NE07/Futro-S740&lt;/a&gt;. Die SSD habe ich gegen eine 240 GB M.2 SATA-SSD getauscht. Leider hatte ich keine M.2 2242 SSD mehr, deswegen wurde es erstmal eine 2280. Auf Dauer werde ich auch für den zweiten Futro einen M.2 Adapter kaufen, mit dem man eine normale NVMe-SSD in den Slot für eine WLAN-Karte stecken kann.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Verbaute M.2 SSD" class="gallery-image" data-flex-basis="319px" data-flex-grow="133" height="1389" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://secretmine.de/blog/2024/2024-10-19-zweiter-futro-s740/images/futro-ssd.jpg" srcset="https://secretmine.de/blog/2024/2024-10-19-zweiter-futro-s740/images/futro-ssd_hu_f8a3a0fea310c998.jpg 800w, https://secretmine.de/blog/2024/2024-10-19-zweiter-futro-s740/images/futro-ssd_hu_ef6e025a71e3c363.jpg 1600w, https://secretmine.de/blog/2024/2024-10-19-zweiter-futro-s740/images/futro-ssd.jpg 1850w" width="1850"&gt;&lt;/p&gt;
&lt;p&gt;Auf dem ersten Futro läuft schon Proxmox, deswegen habe ich das auf dem zweiten auch installiert und beide zu einem Cluster zusammengefügt. Ich gewinne damit zwar keine Vorteile was Verfügbarkeit bzw. Redundanz angeht, aber ich kann beide Server über eine Oberfläche verwalten und auch VMs bzw. Container simpel zwischen beiden Servern migrieren. Dementsprechend habe ich nach der Installation auch direkt Nextcloud und einige weitere Dinge auf den zweiten Futro übertragen, um die Last zu verteilen.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Proxmox Clusterübersicht" class="gallery-image" data-flex-basis="511px" data-flex-grow="213" height="375" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://secretmine.de/blog/2024/2024-10-19-zweiter-futro-s740/images/pve_cluster.png" width="799"&gt;&lt;/p&gt;
&lt;h2 id="fazit"&gt;Fazit
&lt;/h2&gt;&lt;p&gt;Für alle, die sich einen günstigen und leistungsstarken Homeserver zulegen möchten, kann ich den Futro S740 weiterhin nur empfehlen. Zusammen mit Proxmox hast du eine extrem vielseitige Virtualisierungsumgebung, die mit wenig Strom und Platzbedarf eine Menge Power unter der Haube hat.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Die beiden Thin Clients" class="gallery-image" data-flex-basis="174px" data-flex-grow="72" height="1565" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://secretmine.de/blog/2024/2024-10-19-zweiter-futro-s740/images/futros.jpg" srcset="https://secretmine.de/blog/2024/2024-10-19-zweiter-futro-s740/images/futros_hu_afd2bf8e027fe5eb.jpg 800w, https://secretmine.de/blog/2024/2024-10-19-zweiter-futro-s740/images/futros.jpg 1140w" width="1140"&gt;&lt;/p&gt;
&lt;h2 id="yabs"&gt;YABS
&lt;/h2&gt;&lt;p&gt;Zum Abschluss habe ich hier noch einmal ein Ergebnis von YABS angefügt. Die SSD ist allerdings das mitgelieferte 8GB-SATA-SSD-Modul gewesen, weshalb die Storage-Ergebnisse eher schlecht ausgefallen sind.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;span class="lnt"&gt;24
&lt;/span&gt;&lt;span class="lnt"&gt;25
&lt;/span&gt;&lt;span class="lnt"&gt;26
&lt;/span&gt;&lt;span class="lnt"&gt;27
&lt;/span&gt;&lt;span class="lnt"&gt;28
&lt;/span&gt;&lt;span class="lnt"&gt;29
&lt;/span&gt;&lt;span class="lnt"&gt;30
&lt;/span&gt;&lt;span class="lnt"&gt;31
&lt;/span&gt;&lt;span class="lnt"&gt;32
&lt;/span&gt;&lt;span class="lnt"&gt;33
&lt;/span&gt;&lt;span class="lnt"&gt;34
&lt;/span&gt;&lt;span class="lnt"&gt;35
&lt;/span&gt;&lt;span class="lnt"&gt;36
&lt;/span&gt;&lt;span class="lnt"&gt;37
&lt;/span&gt;&lt;span class="lnt"&gt;38
&lt;/span&gt;&lt;span class="lnt"&gt;39
&lt;/span&gt;&lt;span class="lnt"&gt;40
&lt;/span&gt;&lt;span class="lnt"&gt;41
&lt;/span&gt;&lt;span class="lnt"&gt;42
&lt;/span&gt;&lt;span class="lnt"&gt;43
&lt;/span&gt;&lt;span class="lnt"&gt;44
&lt;/span&gt;&lt;span class="lnt"&gt;45
&lt;/span&gt;&lt;span class="lnt"&gt;46
&lt;/span&gt;&lt;span class="lnt"&gt;47
&lt;/span&gt;&lt;span class="lnt"&gt;48
&lt;/span&gt;&lt;span class="lnt"&gt;49
&lt;/span&gt;&lt;span class="lnt"&gt;50
&lt;/span&gt;&lt;span class="lnt"&gt;51
&lt;/span&gt;&lt;span class="lnt"&gt;52
&lt;/span&gt;&lt;span class="lnt"&gt;53
&lt;/span&gt;&lt;span class="lnt"&gt;54
&lt;/span&gt;&lt;span class="lnt"&gt;55
&lt;/span&gt;&lt;span class="lnt"&gt;56
&lt;/span&gt;&lt;span class="lnt"&gt;57
&lt;/span&gt;&lt;span class="lnt"&gt;58
&lt;/span&gt;&lt;span class="lnt"&gt;59
&lt;/span&gt;&lt;span class="lnt"&gt;60
&lt;/span&gt;&lt;span class="lnt"&gt;61
&lt;/span&gt;&lt;span class="lnt"&gt;62
&lt;/span&gt;&lt;span class="lnt"&gt;63
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;root@debian:~# curl -sL yabs.sh | bash -s -- -r -5 -6
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## #
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# Yet-Another-Bench-Script #
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# v2024-06-09 #
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# https://github.com/masonr/yet-another-bench-script #
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## #
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Wed Oct 16 02:34:15 PM CEST 2024
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Basic System Information:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;---------------------------------
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Uptime : 0 days, 0 hours, 22 minutes
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Processor : Intel(R) Celeron(R) J4105 CPU @ 1.50GHz
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;CPU cores : 4 @ 1996.811 MHz
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;AES-NI : ✔ Enabled
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;VM-x/AMD-V : ✔ Enabled
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;RAM : 3.6 GiB
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Swap : 980.0 MiB
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Disk : 6.3 GiB
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Distro : Debian GNU/Linux 12 (bookworm)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Kernel : 6.1.0-26-amd64
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;VM Type : NONE
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;IPv4/IPv6 : ✔ Online / ❌ Offline
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;fio Disk Speed Tests (Mixed R/W 50/50) (Partition /dev/mapper/debian--vg-root):
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;---------------------------------
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Block Size | 4k (IOPS) | 64k (IOPS)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ------ | --- ---- | ---- ----
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Read | 13.13 MB/s (3.2k) | 19.48 MB/s (304)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Write | 13.12 MB/s (3.2k) | 20.04 MB/s (313)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Total | 26.25 MB/s (6.5k) | 39.52 MB/s (617)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; | |
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Block Size | 512k (IOPS) | 1m (IOPS)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ------ | --- ---- | ---- ----
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Read | 20.78 MB/s (40) | 20.82 MB/s (20)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Write | 22.35 MB/s (43) | 23.01 MB/s (22)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Total | 43.14 MB/s (83) | 43.84 MB/s (42)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;iperf3 Network Speed Tests (IPv4):
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;---------------------------------
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Provider | Location (Link) | Send Speed | Recv Speed | Ping
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;----- | ----- | ---- | ---- | ----
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Clouvider | London, UK (10G) | 53.7 Mbits/sec | 92.1 Mbits/sec | 35.7 ms
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Leaseweb | Singapore, SG (10G) | 44.8 Mbits/sec | 69.8 Mbits/sec | 197 ms
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Leaseweb | NYC, NY, US (10G) | 50.3 Mbits/sec | 58.9 Mbits/sec | 97.2 ms
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Geekbench 5 Benchmark Test:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;---------------------------------
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Test | Value
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; |
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Single Core | 463
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Multi Core | 1485
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Full Test | https://browser.geekbench.com/v5/cpu/22967867
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Geekbench 6 Benchmark Test:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;---------------------------------
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Test | Value
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; |
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Single Core | 384
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Multi Core | 1139
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Full Test | https://browser.geekbench.com/v6/cpu/8337911
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;YABS completed in 25 min 40 sec
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;</description></item><item><title>Umzugsziel für meine Nextcloud</title><link>https://secretmine.de/blog/2024/2024-10-12-nextcloud-umzug-ziel/</link><pubDate>Sat, 12 Oct 2024 00:00:00 +0000</pubDate><guid>https://secretmine.de/blog/2024/2024-10-12-nextcloud-umzug-ziel/</guid><description>&lt;h2 id="warum-das-ganze"&gt;Warum das ganze?
&lt;/h2&gt;&lt;p&gt;Meine Nextcloud läuft bisher auf einem Storage-Server bei Contabo. Das ist ein älterer Server der vorherigen Generation bei Contabo und ich habe kürzlich eine E-Mail bzgl. einer Preiserhöhung deshalb bekommen. Und knapp 20€ für 1.4 TB (gut, inkl. 6 Cores und 20GB RAM) ist mir dann doch etwas viel (vor allem, weil der Server vorher ~12€ oder so gekostet hat).&lt;/p&gt;
&lt;p&gt;Dementsprechend muss eine Alternative her.&lt;/p&gt;
&lt;h2 id="die-möglichkeiten"&gt;Die Möglichkeiten
&lt;/h2&gt;&lt;h3 id="1-anderen-vserver-mit-genug-lokalem-storage-mieten"&gt;1. Anderen vServer mit genug lokalem Storage mieten
&lt;/h3&gt;&lt;p&gt;Es gibt bei verschiedenen Anbieter vServer mit genügend Speicher. Ich brauche 300-400GB, das gibt es ab 6-7€ pro Monat, je nach Anbieter.&lt;/p&gt;
&lt;h3 id="2-anderen-vserver-mit-externem-storage-mieten"&gt;2. Anderen vServer mit externem Storage mieten
&lt;/h3&gt;&lt;p&gt;Das größte Problem auf der Suche nach einem vServer ist der Storage. Also wäre es sicherlich eine Überlegung wert, ob man nicht einfach einen externen Storage anbinden kann.&lt;/p&gt;
&lt;p&gt;Nextcloud selbst bietet mit der External Storage App eine Möglichkeit, diverse externe Speicher anzubinden. Das hat allerdings einige Nachteile. Beispielsweise werden Vorschaubilder, Versionen und auch der Papierkorb weiterhin im lokalen Storage abgelegt. Auch an anderen Stellen ist bemerkbar, dass es externer Speicher ist.&lt;/p&gt;
&lt;p&gt;Diverse Anbieter bieten lokalen Blockstorage für vServer an, das ist allerdings eher weniger für sowas gedacht und als Massenspeicher schlicht zu teuer.&lt;/p&gt;
&lt;p&gt;S3 lässt sich als primärer Storage nutzen, dann legt Nextcloud die Dateien als Blobs im Bucket ab. Das funktioniert soweit, hat aber den Nachteil, dass man im Storage keine Dateien oder Ordner mehr erkennen kann und somit im Worst-Case vollkommen von der Zuordnung innerhalb der Datenbank abhängig ist. Bei Nutzung von lokalem Speicher hat man auf der Platte immer einen normalen Ordner-/Dateibaum, den man auch so nutzen kann.&lt;/p&gt;
&lt;p&gt;Bleibt noch die Option, S3 mittels &lt;a class="link" href="https://github.com/s3fs-fuse/s3fs-fuse" target="_blank" rel="noopener"
 &gt;s3fs&lt;/a&gt; oder &lt;a class="link" href="https://rclone.org/" target="_blank" rel="noopener"
 &gt;Rclone&lt;/a&gt; lokal zu mounten. Das funktioniert, aber S3 hat Probleme mit leeren Ordnern. Das Prinzip von Ordnern existiert bei S3 nicht so wirklich, das sind dann mehr oder weniger nur Dateiprefixe. Das wirkt auf den ersten Blick nicht wie ein Problem, da Tools wie rclone solche leeren (und eigentlich nicht existierenden) Ordner einfach cachen. Je nachdem, was für einen Anbieter man für S3 nutzt, gibt es auch andere Optionen, um leere Ordner abzubilden, beispielsweise existiert die Möglichkeit, Markerdateien zu nutzen. Das klappt allerdings mit dem Anbieter, den ich nutzen wollte (Backblaze B2) nicht.&lt;/p&gt;
&lt;p&gt;Es gibt &lt;a class="link" href="https://juicefs.com/" target="_blank" rel="noopener"
 &gt;JuiceFS&lt;/a&gt;. Das kanne ich vorher nicht und bin ich bei meiner Recherche mehr oder weniger zufällig drüber gestolpert. Das ist ein Dateisystem, was Metadaten (Dateinamen, Verzeichnisbaum, (erweiterte) Attribute) in einer relationalen Datenbank wie MariaDB oder PostgreSQL oder alternativ z.B. in Redis speichert, die eigentlichen Daten dann in S3 (oder anderen Object Storages) lagert. Das hat den großen Vorteil, dass es POSIX-Kompatibel ist und auch mit leeren Verzeichnissen problemlos umgehen kann. Mir ist jedoch diese Aufteilung in Dateninhalte und Attribute nicht geheuer, es fügt auch mehrere zusätzliche Fehlerpunkte hinzu. Auch war in meinen kurzen Tests die Performance nicht da, wo ich sie gerne hätte. An sich könnte JuiceFS für solche Anwendungen aber echt eine Möglichkeit sein.&lt;/p&gt;
&lt;h3 id="3-managed-nextcloud-mieten"&gt;3. Managed Nextcloud mieten
&lt;/h3&gt;&lt;p&gt;Mehrere Anbieter (mir bekannt sind Hetzner und IONOS) bieten Managed Nextclouds für wenig Geld an, in beiden Fällen fangen die Preise irgendwo bei 5€ pro Monat an. Das ist für mich allerdings keine Option, da ich die Nextcloud vollständig selbst unter Kontrolle haben möchte und beliebig Einstellungen setzen können möchte. Diese Möglichkeit ist allerdings sehr interessant, wenn man wenig Aufwand mit der Pflege haben möchte oder nicht so viel Erfahrung mit dem selbst hosten hat.&lt;/p&gt;
&lt;h3 id="4-zuhause-hosten"&gt;4. Zuhause hosten
&lt;/h3&gt;&lt;p&gt;Ich habe zuhause bekanntlich einen &lt;a class="link" href="https://secretmine.de/blog/2023/2023-02-20-neuer-homeserver-futro-s740/" &gt;Futro S740&lt;/a&gt; als Homeserver, das Gerät hat einerseits genug Rechenleistung und andererseits genug Möglichkeiten für SSDs und co. Ich überlege aktuell, die Nextcloud einfach zuhause zu hosten. Die meisten Zugriffe passieren eh innerhalb des Heimnetzwerks, von außerhalb sind es eher nur kleine Änderungen oder hier und da mal ein Bild vom Handy. Die Cloud wird hauptsächlich von meiner Partnerin und mir genutzt, lokal könnte man dann auch den Weg zur Cloud komplett im lokalen Netzwerk halten und nur den Zugriff von außen über Proxies im Rechenzentrum laufen lassen.&lt;/p&gt;
&lt;p&gt;Da auf dem bisherigen Thin Client jedoch schon einiges läuft, würde ich hierfür einen zweiten anschaffen wollen. Aber schauen wir uns mal kurz die Kosten an.&lt;/p&gt;
&lt;p&gt;Ein Futro S740 inkl. passend großer SSD würde mich grob 100€ kosten. Das ganze hängt natürlich stark von der aktuellen Preislage ab, aber die grobe Richtung müsste passen. Stromkosten liegen bei angenommenen 10 Watt (real sind es weniger) bei grob 1,50€ pro Monat. Das ist eher pessimistisch gerechnet, real ist es wahrscheinlich eher 1€ pro Monat. Wenn man die Anschaffungskosten für die Hardware auf einen Zeitraum von 2 Jahren verteilt, sind das knapp über 4€. Macht also insgesamt im Worst-Case etwa 5,50€ pro Monat für eine Laufzeit von zwei Jahren, wobei hier eigentlich deutlich mehr realistisch ist. Die monatlichen Kosten hängen dabei auch nicht davon ab, wie viel Storage das Teil bekommt, das beeinflusst nur die Anschaffungskosten.&lt;/p&gt;
&lt;p&gt;Nachteile sind hauptsächlich, dass ein Futro nicht wirklich redundant ist, ich kann kaum die SSDs in einem RAID betreiben. Abstriche bei der Verfügbarkeit gibt es natürlich auch hinsichtlich Strom und Internet, wobei der Strom hier in den vergangenen Jahren noch nie ausgefallen ist. Aber vielleicht wird es wieder Zeit, eine USV einzusetzen - das ist aber ein anderes Thema.&lt;/p&gt;
&lt;p&gt;Diese Nachteile sind für mich jedoch verkraftbar. Eigentlich ist es nur im Urlaub der Fall, dass die Cloud dann längerfristig ausfallen könnte, ohne dass ich was tun kann. Normalerweise lässt sich Ersatzhardware schnell beschaffen, mit entsprechenden Backups lässt sich eine &amp;ldquo;Notfall-Cloud&amp;rdquo; dann auch schnell auf die Beine stellen. Genügend Hardware habe ich für sowas im Homelab.&lt;/p&gt;
&lt;h2 id="entscheidung"&gt;Entscheidung
&lt;/h2&gt;&lt;p&gt;Bisher bin ich mir noch nicht sicher, wohin die Reise geht. Aktuell tendiere ich sehr stark dazu, die Cloud einfach zuhause zu hosten, dafür würde ich dann auch noch einen zweiten S740 anschaffen - der bisherige ist einfach zu stark ausgelastet dafür. Ich werde die Cloud testhalber zu mir nach Hause auf den bisherigen Homeeserver holen und mir die Performance dann einfach mal ansehen. Das ist ja mehr oder weniger der Worst-Case dann.&lt;/p&gt;</description></item><item><title>Sipeed NanoKVM - meine Meinung</title><link>https://secretmine.de/blog/2024/2024-09-05-nanokvm/</link><pubDate>Thu, 05 Sep 2024 00:00:00 +0000</pubDate><guid>https://secretmine.de/blog/2024/2024-09-05-nanokvm/</guid><description>&lt;p&gt;Vor etwa einem halben Jahr wurde von Sipeed ein neues Produkt angekündigt - ein IP-KVM auf Basis einer kleinen RISC-V-CPU (siehe &lt;a class="link" href="https://sipeed.com/nanokvm" target="_blank" rel="noopener"
 &gt;https://sipeed.com/nanokvm&lt;/a&gt;). Was dieses Gerät so besonders machen sollte ist primär der Preis. Ich habe (bestellt Mitte Juli, geliefert Ende August) etwa 45€ bezahlt, der Preis ist seit dem allerdings gestiegen (Stand 05.09.2024 ~68€ + ~6,50€ via Aliexpress).&lt;/p&gt;
&lt;p&gt;&lt;img alt="Paket von außen" class="gallery-image" data-flex-basis="319px" data-flex-grow="133" height="3472" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://secretmine.de/blog/2024/2024-09-05-nanokvm/images/1.jpg" srcset="https://secretmine.de/blog/2024/2024-09-05-nanokvm/images/1_hu_bf43fb6c696cd7d5.jpg 800w, https://secretmine.de/blog/2024/2024-09-05-nanokvm/images/1_hu_b81a0854b15d8423.jpg 1600w, https://secretmine.de/blog/2024/2024-09-05-nanokvm/images/1_hu_234e978f5b93b307.jpg 2400w, https://secretmine.de/blog/2024/2024-09-05-nanokvm/images/1.jpg 4624w" width="4624"&gt;&lt;/p&gt;
&lt;p&gt;Aber fangen wir vorne an. Die Hardware basiert auf dem LicheeRV Nano von Sipeed, einem kleinen Dev-Board mit einer Risc-V-CPU, 256MB RAM, Ethernet/Wifi (allerdings optional), einem MicroSD-Slot und einem Kamera-Interface. Für das NanoKVM wird das Kamerainterface mit einem kleinen Konverter-Board als HDMI-Input benutzt. Der USB-Port vom Board kann als Host dienen, aber auch ein Client-Gerät sein. Das wird beim NanoKVM zur Emulation von Maus/Tastatur sowie auch von Storage benutzt. Es gibt zwei Versionen vom NanoKVM - eine Lite-Version, die nur HDMI-In, LAN und den USB-Port zum Anschluss an den Zielrechner hat, daneben gibt es auch eine Full-Version, die zusätzlich ein Gehäuse mit OLED-Display, einen zweiten USB-Anschluss zur Stromversorgung (wenn der Zielrechner ausgeschaltet ist) sowie einen USB-Port zum Anschluss eines kleinen Breakout-Boards für die Verbindung zu Power- und Reset-Knopf und -LED.&lt;/p&gt;
&lt;h1 id="das-paket"&gt;Das Paket
&lt;/h1&gt;&lt;p&gt;&lt;img alt="Paket geöffnet" class="gallery-image" data-flex-basis="319px" data-flex-grow="133" height="3472" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://secretmine.de/blog/2024/2024-09-05-nanokvm/images/2.jpg" srcset="https://secretmine.de/blog/2024/2024-09-05-nanokvm/images/2_hu_1d3abcfb5ae02878.jpg 800w, https://secretmine.de/blog/2024/2024-09-05-nanokvm/images/2_hu_84cd30786e658af4.jpg 1600w, https://secretmine.de/blog/2024/2024-09-05-nanokvm/images/2_hu_1cc049dfbd23cbaf.jpg 2400w, https://secretmine.de/blog/2024/2024-09-05-nanokvm/images/2.jpg 4624w" width="4624"&gt;
&lt;img alt="Das Zubehör" class="gallery-image" data-flex-basis="319px" data-flex-grow="133" height="3472" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://secretmine.de/blog/2024/2024-09-05-nanokvm/images/3.jpg" srcset="https://secretmine.de/blog/2024/2024-09-05-nanokvm/images/3_hu_e9c19fe1773225be.jpg 800w, https://secretmine.de/blog/2024/2024-09-05-nanokvm/images/3_hu_bcbea9cd5bde0fcd.jpg 1600w, https://secretmine.de/blog/2024/2024-09-05-nanokvm/images/3_hu_f45549ceee5f6c92.jpg 2400w, https://secretmine.de/blog/2024/2024-09-05-nanokvm/images/3.jpg 4624w" width="4624"&gt;&lt;/p&gt;
&lt;p&gt;Ich habe mir die Full-Edition gekauft, dementsprechend habe ich auch das volle Zubehör und das NanoKVM im Gehäuse. Zwei USB-Kabel waren dabei, aber leider kein HDMI-Kabel.&lt;/p&gt;
&lt;h1 id="der-erste-verbindungsversuch"&gt;Der erste Verbindungsversuch
&lt;/h1&gt;&lt;p&gt;&lt;img alt="Bitte den Kabelsalat ignorieren, die Kabel sind für diesen Zweck viel zu lang" class="gallery-image" data-flex-basis="319px" data-flex-grow="133" height="961" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://secretmine.de/blog/2024/2024-09-05-nanokvm/images/connected.png" srcset="https://secretmine.de/blog/2024/2024-09-05-nanokvm/images/connected_hu_4beb4b24b14c4349.png 800w, https://secretmine.de/blog/2024/2024-09-05-nanokvm/images/connected.png 1280w" width="1280"&gt;&lt;/p&gt;
&lt;p&gt;Ich habe das NanoKVM also an einen Laptop (mit einem Debian ohne GUI) zum Testen angeschlossen. Nach kurzer Bootzeit (nur ein paar Sekunden) wurde mir die IP vom Gerät auf dem Display angezeigt.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Das Display zeigt neben der IP vom Gerät diverse weitere hilfreiche Informationen an" class="gallery-image" data-flex-basis="218px" data-flex-grow="90" height="750" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://secretmine.de/blog/2024/2024-09-05-nanokvm/images/display.png" width="682"&gt;&lt;/p&gt;
&lt;p&gt;Jetzt kam natürlich der spannende Moment - ich habe also die IP im Browser eingegeben und wurde (nach Login) von einer simplen, aber funktionalen UI begrüßt.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Übertragung in 720p, auch wenn der Host eigentlich mit 1080p läuft" class="gallery-image" data-flex-basis="424px" data-flex-grow="176" height="763" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://secretmine.de/blog/2024/2024-09-05-nanokvm/images/pc1.png" srcset="https://secretmine.de/blog/2024/2024-09-05-nanokvm/images/pc1_hu_ec147772dbe5c7e7.png 800w, https://secretmine.de/blog/2024/2024-09-05-nanokvm/images/pc1.png 1350w" width="1350"&gt;&lt;/p&gt;
&lt;h1 id="weitere-funktionen"&gt;Weitere Funktionen
&lt;/h1&gt;&lt;p&gt;Neben dem reinen Anzeigen vom Monitor sowie Übertragen von Maus und Tastatur kann das Gerät noch ein paar weitere Dinge. Auf dem internen Speicher lassen sich ISOs ablegen (z.B. via SFTP übertragbar), diese lassen sich dann einfach auf dem Zielgerät mounten. Das funktioniert auch soweit, scheint aber nach meinen ersten Tests insgesamt eher langsam zu funktionieren. Ich habe sowohl Debian 12 als auch Windows 10 getestet und konnte beide Systeme problemlos über das emulierte Laufwerk booten.&lt;/p&gt;
&lt;p&gt;Man kann sich auf dem Gerät auch via SSH einloggen und sich auf dem System umsehen. Es läuft Kernel 5.10.4, also ein über 3,5 Jahre alter Kernel von Ende 2020. Laut &lt;code&gt;/etc/os-release&lt;/code&gt; wird das Image mit Buildroot gebaut, ist also eine auf diesen Einsatzzweck und dieses Gerät zugeschnittenes Image und basiert nicht auf Debian oder einer anderen größeren Distro. Ansonsten ist mir bei einem ersten Überblick nur aufgefallen, dass Verzeichnisse wie &lt;code&gt;/var/log&lt;/code&gt; auf &lt;code&gt;/tmp&lt;/code&gt; umgebogen sind, was wiederum eine Ramdisk ist. Das ist für die Haltbarkeit der verbauten MicroSD-Karte natürlich gut.&lt;/p&gt;
&lt;p&gt;Ich habe auf einem alten Netbook Windows 10 neu installiert - und das vollständig per NanoKVM (also ISO-Mount plus Fernbedienung). Ich hatte keine nennenswerten Probleme dabei und konnte soweit gut arbeiten. Für derartige Zwecke (also &amp;ldquo;mal eben&amp;rdquo; an irgendwelchen Rechnern Dinge tun) habe ich mir das Gerät auch angeschafft, damit ich nicht immer Maus/Tastatur/Monitor aufwändig umstecken muss sondern einfach nur das NanoKVM anschließe und loslegen kann.&lt;/p&gt;
&lt;p&gt;Auch lässt sich das NanoKVM mit der mitgelieferten Platine auch an die Power-/Reset-Buttons bzw. Power/HDD-LEDs anschließen und damit auch ein Druck des Power- bzw. Reset-Buttons auslösen lässt. Das funktionierte in meinen Tests soweit.&lt;/p&gt;
&lt;p&gt;Anfangs gab es Probleme, wenn der Host die Auflösung gewechselt hat, das ist mittlerweile allerdings behoben worden. Das war vor allem problematisch, wenn das BIOS/UEFI und das spätere OS verschiedene Bildschirmauflösungen genutzt haben.&lt;/p&gt;
&lt;h1 id="meine-ideen"&gt;Meine Ideen
&lt;/h1&gt;&lt;p&gt;Die MicroSD-Karte ist mit 8GB eher klein, vor allem wenn mehrere ISOs gespeichert werden sollen.&lt;/p&gt;
&lt;h1 id="fazit"&gt;Fazit
&lt;/h1&gt;&lt;p&gt;Die Grundfunktionen laufen soweit gut - aber wie ich auch bei der Bestellung erwartet habe, macht die Software noch keinen wirklich vollständigen Eindruck. Das Übertragen von ISOs per SFTP ist mit ~2,5 MB/s auch eher langsam, das wird allerdings wahrscheinlich durch die sehr schwache CPU limitiert. Mounten von ISOs funktioniert soweit auch, das Laden von Dateien geht allerdings eher langsam von Statten. Ich kann das Gerät nur mit den IPMIs von Supermicro und einem älteren HP ILO vergleichen, beide Lösungen sind dabei natürlich deutlich tiefer in die Hardware integriert. Bei den reinen KVM-Features fühlen sich Supermicro und HP etwas polierter an, hier finde ich bei Supermicro z.B. auch praktisch, dass ich eine ISO direkt von meinem PC aus benutzen kann, ohne diese irgendwohin übertragen zu müssen. Auch scheinen verschiedene Auflösungen besser zu funktionieren. Ich würde gerne zum Vergleich ein PiKVM testen, da das preislich am ehesten in der Nähe ist, sowas besitze ich aber leider nicht.&lt;/p&gt;
&lt;p&gt;Grundsätzlich funktioniert das Gerät allerdings so, wie es soll - und ist vor allem unter Berücksichtigung des Preises soweit solide.&lt;/p&gt;</description></item><item><title>Upgrades für den Futro S740</title><link>https://secretmine.de/blog/2024/2024-04-06-futro-s740-upgrades/</link><pubDate>Fri, 26 Apr 2024 00:00:00 +0000</pubDate><guid>https://secretmine.de/blog/2024/2024-04-06-futro-s740-upgrades/</guid><description>&lt;p&gt;Der Fujitsu Futro S740 verrichtet nun seit über einem Jahr brav seine Dienste &lt;a class="link" href="https://secretmine.de/blog/2023/2023-02-20-neuer-homeserver-futro-s740/" &gt;als mein Heimserver&lt;/a&gt;, mittlerweile sind mir die 4GB RAM allerdings deutlich zu wenig (ach was, wer hätte es gedacht). Auch die 240GB Speicherplatz stören mich mittlerweile.&lt;/p&gt;
&lt;p&gt;Daher war nun Zeit für ein Upgrade. Das Maximum, was an RAM funktionieren soll, sind 16GB. Bei so großen Modulen muss man sehr genau aufpassen - laut den &amp;ldquo;Community-Dokus&amp;rdquo; bei Github ( &lt;a class="link" href="https://github.com/R3NE07/Futro-S740" target="_blank" rel="noopener"
 &gt;https://github.com/R3NE07/Futro-S740&lt;/a&gt; ) muss es zwingend Dual Rank sein. Ich habe hierbei einen Stick von Integral (IN4V16GNDLRI) gekauft, da es einer der wenigen Sticks war, wo ich konkret herausfinden konnte, dass es sich um Dual Rank handelt. Wenn man beispielsweise 16GB-Module von Crucial bei Amazon kauft, ist nicht klar, welches exakte Modell man bekommt und ob es Dual oder Single Rank RAM ist. Mit Single Rank Modulen startet der Thin Client laut meinen Recherchen überhaupt nicht.&lt;/p&gt;
&lt;p&gt;Zusätzlich habe ich auch noch eine weitere SSD verbaut, dafür habe ich einen M.2-Adapter von A/E-Key zu M-Key günstig gekauft. Ich hatte noch eine Kioxia Exceria G2 mit 500GB liegen, die ist zwar nicht die beste, aber für die Zwecke definitiv ausreichend. Da die SSD eine 2280 SSD ist, musste ich beim Befestigen etwas kreativ werden, vielleicht füge ich irgendwann noch mal ein Bild davon an.&lt;/p&gt;
&lt;p&gt;Nachdem alles verbaut war, habe ich den S740 wieder eingeschaltet und nach dem Hochfahren habe ich das gewünschte Ergebnis gesehen:&lt;/p&gt;
&lt;p&gt;&lt;img alt="Proxmox Übersicht" class="gallery-image" data-flex-basis="485px" data-flex-grow="202" height="349" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://secretmine.de/blog/2024/2024-04-06-futro-s740-upgrades/images/upgrade_1.png" width="706"&gt;
&lt;img alt="Proxmox Storage" class="gallery-image" data-flex-basis="1121px" data-flex-grow="467" height="165" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://secretmine.de/blog/2024/2024-04-06-futro-s740-upgrades/images/upgrade_2.png" width="771"&gt;&lt;/p&gt;
&lt;p&gt;Sowohl RAM als auch SSD wurden problemlos erkannt und funktionieren wie erwartet. Die SSD kann ihre volle Geschwindigkeit durch die Bandbreite von dem Port (laut Internet PCIe 2.0 x1, also etwa 500 MB/s) zwar längst nicht voll ausnutzen, aber die niedrigeren Latenzen im Vergleich zu SATA merkt man dennoch ein wenig. Aber alleine für den zusätzlichen Storage (insgesamt jetzt immerhin ~750 GB) hat es sich gelohnt.&lt;/p&gt;
&lt;p&gt;Ich habe vor, auf dem Thin Client nun mehr zu betreiben, unter anderem liegt hier Hardware für den ADS-B-Empfang. Mal gucken, wann ich dazu komme, dazu etwas zu schreiben.&lt;/p&gt;</description></item><item><title>Mein neuer Server (HP DL360p G8)</title><link>https://secretmine.de/blog/2023/2023-12-18-mein-neuer-server/</link><pubDate>Mon, 18 Dec 2023 00:00:00 +0000</pubDate><guid>https://secretmine.de/blog/2023/2023-12-18-mein-neuer-server/</guid><description>&lt;p&gt;Dank eines freundlichen Arbeitskollegen habe ich nun einen neuen Server im Keller stehen, einen HP DL360p G8.
Die Specs:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;2x Xeon E5 2670 v2 (je 10 Kerne/20 Threads mit 2,5GHz)&lt;/li&gt;
&lt;li&gt;96 GB RAM&lt;/li&gt;
&lt;li&gt;2x 146 GB SAS Festplatte (Proxmox)&lt;/li&gt;
&lt;li&gt;1x 500 GB NVME-SSD (VMs)&lt;/li&gt;
&lt;li&gt;Dual 10 GBit/s Netzwerkkarte&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Der Server läuft, wie üblich, mir Proxmox und wird primär Aufgaben wie Encoding, Betrieb von diversen VMs parallel oder
Experimente mit Deep-Learning
übernehmen. Dauerhaft laufen wird das Teil aufgrund des Stromverbrauchs natürlich nicht. Die Single-Core-Performance ist
aufgrund des Alters nicht ganz auf Höhe der Zeit, aber durch die 20 Kerne bzw. 40 Threads wird das für die meisten
Aufgaben gut ausgeglichen. Generell ist der Server eine gute Spielwiese, da auch mehrere VMs parallel sich nicht in die
Quere kommen und genug Leistung abrufen können.&lt;/p&gt;
&lt;p&gt;&lt;img alt="HP-Server" class="gallery-image" data-flex-basis="233px" data-flex-grow="97" height="3273" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://secretmine.de/blog/2023/2023-12-18-mein-neuer-server/images/hp.jpg" srcset="https://secretmine.de/blog/2023/2023-12-18-mein-neuer-server/images/hp_hu_9ac312ea143a691f.jpg 800w, https://secretmine.de/blog/2023/2023-12-18-mein-neuer-server/images/hp_hu_1561ffa24adf606e.jpg 1600w, https://secretmine.de/blog/2023/2023-12-18-mein-neuer-server/images/hp_hu_d67c2bc7a73b7ecf.jpg 2400w, https://secretmine.de/blog/2023/2023-12-18-mein-neuer-server/images/hp.jpg 3179w" width="3179"&gt;&lt;/p&gt;</description></item><item><title>TS3-Server günstig zuhause hosten</title><link>https://secretmine.de/blog/2023/2023-10-18-ts3-server-guenstig-zuhause-hosten/</link><pubDate>Wed, 18 Oct 2023 00:00:00 +0000</pubDate><guid>https://secretmine.de/blog/2023/2023-10-18-ts3-server-guenstig-zuhause-hosten/</guid><description>&lt;p&gt;Mittlerweile sind verschiedene Thin-Client-Modelle (beispielsweise Fujitsu Futro S740, S720, S520, &amp;hellip;) zu günstigen
Preisen erhältlich, teilweise für unter 20 € - manchmal sogar für 15 € und weniger. Die Prozessoren (z.B. im S720 und
S520) sind allerdings schwach, was den Einsatzzweck einschränkt. Netterweise braucht TeamSpeak3 wenig Ressourcen und
ist im Vergleich zu anderen Services auch nicht direkt kompatibel mit ARM-Prozessoren.&lt;/p&gt;
&lt;p&gt;Der Stromverbrauch von den Thin Clients ist ziemlich gering, je nach Modell nur wenige Watt. Damit ist das ganze auch zu
sehr günstigen Konditionen (bei 5 Watt und 30 Cent pro kWh entspräche das Stormkosten von etwas über einem Euro pro
Monat) zu betreiben. Teamspeak erlaubt den Betrieb eines Servers ohne Lizenz mit bis zu 32 Slots, was für viele Zwecke
genügt. Klar ist die Internetanbindung zu Hause für den Serverbetrieb nicht optimal, aber für einen kleinen Server mit
Freunden genügt so etwas. Dafür sind selbstverständlich Portfreigaben notwendig, welche Ports das sind steht weiter
unten. Konkrete Anleitungen werde ich hier generell in diesem Post nicht nennen, da das meiste davon nicht weiter schwer
ist.&lt;/p&gt;
&lt;p&gt;Für ein kleines Beispiel nutze ich einen Futro S520, das schwächste der genannten Modelle.
Als OS nutze ich hier Debian 12 ohne GUI, darauf habe ich dann mit &lt;a class="link" href="https://secretmine.de/blog/2018/11/03/debian-ubuntu-ts3-server-inkl-autostart-installieren/" &gt;meinem eigenen Script&lt;/a&gt; den TS3-Server installiert. Nach
der Installation habe ich mich mit dem TS3-Server verbunden und mit einer einfachen WLAN-Steckdose den Verbrauch gemessen.
Ohne weitere angeschlossene Geräte (nur LAN und Strom verbunden) liegt der Verbrauch bei angenehm niedrigen 5 Watt. Ein
Futro S740 liegt hier noch etwas niedriger, aber kostet auch ein mehrfaches vom S520.&lt;/p&gt;
&lt;p&gt;An Ports müssen für TS3 folgende freigebene werden:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Port 9987 UDP, Standard-Voice-Port&lt;/li&gt;
&lt;li&gt;Port 30033 TCP, Filetransfer (optional)&lt;/li&gt;
&lt;li&gt;Port 10011 TCP, Server-Query (optional)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Für den &amp;ldquo;Produktivbetrieb&amp;rdquo; sollte natürlich noch DynDNS eingesetzt werden, da sich zuhause die IP in gewissen Abständen ändern kann.
Hierzu gibt es viele Anbieter am Markt, wer DNS über Cloudflare und co
verwaltet, findet auch dafür passende DynDNS-Scripte.&lt;/p&gt;
&lt;p&gt;Aber ergibt das ganze überhaupt Sinn?&lt;/p&gt;
&lt;p&gt;Das kommt natürlich immer darauf an. Für das Geld, was der Thin Client durch den Stromverbrauch kostet, bekommt man bei einigen Anbietern schon kleine vServer, die dann im Rechenzentrum mit entsprechender Anbindung und Hardware betrieben werden, was natürlich für eine höhere Stabilität sorgt.
Ich finde hier aber den Lern- und Spaßfaktor wichtig. Ein Homelab bzw. genereller Betrieb von Services zuhause muss nicht immer (wirtschaftlich) sinnvoll sein. Dieses kleine Beispiel enthält schon viele wichtige grundlegende Elemente wie die Installation vom Betriebsssystem, Installation von Software und auch die Bereitstellung der Services von Außen mit Dyndns und Portfreigaben.&lt;/p&gt;</description></item><item><title>Homelab im Keller</title><link>https://secretmine.de/blog/2023/2023-10-03-homelab-keller/</link><pubDate>Tue, 03 Oct 2023 00:00:00 +0000</pubDate><guid>https://secretmine.de/blog/2023/2023-10-03-homelab-keller/</guid><description>&lt;p&gt;Mein Homelab hat mittlerweile viele Revisionen in verschiedenen Wohnungen hinter sich. Angefangen in einem Abstellraum
bei meinen Eltern, über einen Server im Studentenwohnheim hinter einem Regal, mehrere Jahre eine Ecke in einer anderen Wohnung,
dann die Minimierung bei bzw. vor dem Umzug in die jetzige Wohnung und nun die erneute Erweiterung in Richtung Keller.&lt;/p&gt;
&lt;p&gt;Hintergrund für den Umzug in den Keller ist, dass im Arbeitszimmer bzw. generell in der Wohnung einfach der Platz fehlt
und auch der Wärme-Output und die Geräuschkulisse durchaus nerven kann. Um dem entgegenzuwirken habe ich vor kurzem
beschlossen, mein Lab in den Keller zu verlegen.&lt;/p&gt;
&lt;h2 id="internetnetzwerkverbindung"&gt;Internet/Netzwerkverbindung
&lt;/h2&gt;&lt;p&gt;Die einzige Möglichkeit, um Internet bzw. generell eine Netzwerkverbindung in den Keller zu bekommen, ist Powerline. Die
Betonwände verhindern jegliche Funkverbindungen und andere Leitungen außer Strom gibt es leider nicht. Bisher hatte ich alte
Adapter benutzt, Internet im Keller war nur für einen kleinen AP für eine WLAN-Steckdose notwendig. Die Bandbreite lag
bei etwa 10 MBit/s - für den bisherigen Zweck mehr als genug. Für die Nutzung als Homelab allerdings deutlich zu wenig.
Mit moderneren Powerline-Adaptern habe ich das nun auf ca. 70 MBit/s anheben können. Immer noch nicht überragend, aber
ausreichend. Am liebsten wäre mir ein Leerrohr von der Wohnung in den Keller gewesen, damit hätte ich dort dann ein
Glasfaserkabel verlegt, um 1G oder 10G zum Keller zu haben. Dann hätte auch das NAS mit in den Keller ziehen können,
das ist aufgrund der geringen Bandbreite jetzt so nicht möglich.&lt;/p&gt;
&lt;p&gt;Mit der nun brauchbaren Netzwerkanbindung war die Voraussetzung für den Betrieb im Keller erfüllt.&lt;/p&gt;
&lt;h2 id="hardware"&gt;Hardware
&lt;/h2&gt;&lt;p&gt;Vorläufig bleibt es weitestgehend bei schon vorhandener Hardware. Dazu gehört:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;TP-Link 24 Port Gigabit Switch (mit VLAN-Support)&lt;/li&gt;
&lt;li&gt;Futro S720 (Storage), siehe &lt;a class="link" href="https://secretmine.de/blog/2023/2023-09-23-futro-s720/" &gt;hier&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;pve2 (Supermicro-Board, i5, 32GB RAM)&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Notebook (Ryzen 3, 8GB RAM) - aktuell ungenutzt&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Das ist erstmal nicht viel, aber ein Anfang. Geplant ist, dass eine weitere Maschine mit mehr Rechenleistung noch dazu
kommt. Möglicherweise schaffe ich mir auch noch einen Server mit höherer Taktrate auf Ryzen-Basis an, aber dazu gibt es
keinerlei konkrete Zeitpläne.&lt;/p&gt;
&lt;p&gt;Kommen wir zum relevanten Part - ein Bild vom aktuellen Stand.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Keller-Lab v1" class="gallery-image" data-flex-basis="319px" data-flex-grow="133" height="3472" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://secretmine.de/blog/2023/2023-10-03-homelab-keller/images/keller-lab-v1.jpg" srcset="https://secretmine.de/blog/2023/2023-10-03-homelab-keller/images/keller-lab-v1_hu_d1a45c5b94a27a89.jpg 800w, https://secretmine.de/blog/2023/2023-10-03-homelab-keller/images/keller-lab-v1_hu_b37f5b2dbed1d603.jpg 1600w, https://secretmine.de/blog/2023/2023-10-03-homelab-keller/images/keller-lab-v1_hu_82f9b9c299383555.jpg 2400w, https://secretmine.de/blog/2023/2023-10-03-homelab-keller/images/keller-lab-v1.jpg 4624w" width="4624"&gt;&lt;/p&gt;
&lt;h2 id="weitere-pläne"&gt;Weitere Pläne
&lt;/h2&gt;&lt;p&gt;Neben dem zusätzlichen Server habe ich erst einmal wenig Pläne für das Lab. Ich möchte hauptsächlich alles etwas
ordentlicher gestalten und VMs einrichten. Möglicherweise folgt noch ein Router (Mikrotik), um Routing zwischen Netzen
im Homelab machen zu können, ohne dass der Traffic zweimal durch die Powerline-Strecke muss. Außerdem habe ich noch
einen Temperatursensor bestellt, der in Verbindung mit einem ESP dann die Raumtemperatur und Luftfeuchte überwachen
soll. Vielleicht folgt auch noch eine Kamera, damit ich jederzeit sehen kann, ob alles korrekt arbeitet (und nichts
raucht).&lt;/p&gt;
&lt;p&gt;Das Netzwerk auf mehr als 1G zu upgraden lohnt sich aktuell nicht bzw. dafür fehlt bislang die Notwendigkeit. Solange
bleibt es bei 1G.&lt;/p&gt;</description></item><item><title>Futro S720</title><link>https://secretmine.de/blog/2023/2023-09-23-futro-s720/</link><pubDate>Sat, 23 Sep 2023 00:00:00 +0000</pubDate><guid>https://secretmine.de/blog/2023/2023-09-23-futro-s720/</guid><description>&lt;p&gt;Seit nun etwas über einem halben Jahr ist ein
&lt;a class="link" href="https://secretmine.de/blog/2023/2023-02-20-neuer-homeserver-futro-s740/" &gt;Fujitsu Futro S740 der Hauptserver&lt;/a&gt; in meiner Wohnung und
verrichtet zuverlässig seinen Dienst. Zurzeit
arbeite ich daran, mein Homelab aus dem Arbeitszimmer in den Keller zu verlegen. Dazu wollte ich gerne einen kleinen
Server als Shared Storage für Dinge wie OS-ISOs, VM-Templates, Backups und generelle Datenablage haben. Das ganze auch
als getrenntes Gerät mit geringem Stromverbrauch, damit ich diesen Storage-Server unabhängig von anderen Servern im Lab
benutzen kann.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Fujitsu Futro S720" class="gallery-image" data-flex-basis="192px" data-flex-grow="80" height="2635" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://secretmine.de/blog/2023/2023-09-23-futro-s720/images/s720.jpg" srcset="https://secretmine.de/blog/2023/2023-09-23-futro-s720/images/s720_hu_ce4f7ad5480faeb1.jpg 800w, https://secretmine.de/blog/2023/2023-09-23-futro-s720/images/s720_hu_8b54cd5e849bba66.jpg 1600w, https://secretmine.de/blog/2023/2023-09-23-futro-s720/images/s720.jpg 2111w" width="2111"&gt;&lt;/p&gt;
&lt;p&gt;Nach kurzer Recherche fiel meine Wahl auf den Futro S720. Im Vergleich zum S740 ist hier ein AMD GX-217GA drin - ein
Dual-Core mit 1,65 GHz. Die CPU hat grob ein Viertel der Leistung vom Intel Celeron J4105 aus dem S740, als
Storage-Server ohne nennenswerte weitere Aufgaben genügt das aber. Das für mich relevante Argument war der (halb unter
dem Kühlkörper versteckte) SATA-Anschluss für eine HDD/SSD.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Fujitsu Futro S720 Mainboard" class="gallery-image" data-flex-basis="319px" data-flex-grow="133" height="1041" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://secretmine.de/blog/2023/2023-09-23-futro-s720/images/s720-inside.jpg" srcset="https://secretmine.de/blog/2023/2023-09-23-futro-s720/images/s720-inside_hu_6bbe6298e22884c5.jpg 800w, https://secretmine.de/blog/2023/2023-09-23-futro-s720/images/s720-inside.jpg 1387w" width="1387"&gt;&lt;/p&gt;
&lt;p&gt;Mein Gerät kam mit 8 GB SSD-Speicher sowie 2 GB RAM (DDR3). Nicht viel, aber reicht. Mit einem passenden
Adapterkabel, um aus einem USB-Header ein Stromkabel für SATA zu machen, passt damit ein 2,5-Zoll Laufwerk gut mit in
das Gehäuse. In meinem Fall eine Festplatte mit 640 GB, die ich noch liegen hatte. Der Stromverbrauch vom S720 (inkl.
der HDD) liegt bei mir im Idle bei etwa 6 Watt, unter Last inkl. HDD-Aktivität etwas über 10 Watt. Dafür, dass das Teil
nicht dauerhaft laufen wird, ist das mehr als in Ordnung. Mit Samba schaffe ich zur Festplatte konstant etwa 80 MB/s
ohne weitere Optimierungen, auch das ist genug.&lt;/p&gt;
&lt;p&gt;Dieser Post ist mehr oder weniger der Anfang vom &amp;ldquo;Neuaufbau&amp;rdquo; meines Homelabs im Keller. Sicherlich werden in naher
Zukunft noch weitere Posts folgen, irgendwann werde ich dann auch die Übersichtsseite über mein Lab plus
Netzwerkdiagramm entsprechend aktualisieren.&lt;/p&gt;</description></item><item><title>NAS-Upgrade</title><link>https://secretmine.de/blog/2023/2023-05-25-nas-upgrade/</link><pubDate>Tue, 23 May 2023 00:00:00 +0000</pubDate><guid>https://secretmine.de/blog/2023/2023-05-25-nas-upgrade/</guid><description>&lt;p&gt;Mein NAS hat seine Kapazitätsgrenze von aktuell 9 TB (4x 3 TB, davon 1x 3 TB Parity) mittlerweile fast erreicht.
Daher habe ich mich dazu entschieden, eine weitere Festplatte hinzuzufügen. Um später größere Datenplatten nachschieben
zu können, fiel die Wahl hierbei auf eine 4 TB Seagate Ironwolf. Ich habe damit die bisherige Parity-Festplatte ersetzt
und die bisherige Parity-Festplatte dem Array als Datenplatte hinzugefügt. Damit komme ich nun auf 12 TB nutzbare
Kapazität. 1 TB habe ich damit jetzt mehr oder weniger verschwendet bzw. nutze ihn nicht, aber ich kann jederzeit
weitere Festplatten mit bis zu 4 TB dem Array hinzufügen.&lt;/p&gt;</description></item><item><title>Mein neuer Homeserver (Fujitsu Futro S740)</title><link>https://secretmine.de/blog/2023/2023-02-20-neuer-homeserver-futro-s740/</link><pubDate>Mon, 20 Feb 2023 00:00:00 +0000</pubDate><guid>https://secretmine.de/blog/2023/2023-02-20-neuer-homeserver-futro-s740/</guid><description>&lt;p&gt;Im letzten &lt;a class="link" href="https://secretmine.de/blog/2023/2023-01-24-netzwerk-und-homelab-stand-januar-2023/" &gt;Update zu meinem Homelab&lt;/a&gt;
sprach ich davon, den Raspberry Pi gegen etwas Leistungsstärkeres zu ersetzen, genauer gesagt durch einen Thin Client.
Viele im Internet empfehlen hierbei den Fujitsu Futro S740 Thin Client, also habe ich mich darüber genauer informiert.
Ein Intel Celeron J4105 (4 Kerne mit je max. 1,5 GHz), 4 GB RAM (aufrüstbar auf 16 GB) und 16 GB eMMC-Storage
(eine normale 2242 M.2 SATA-SSD) in einem kleinen Gehäuse, passiv gekühlt und mit geringem Stromverbrauch klang wirklich
interessant. Also habe ich mir so ein Teil mal bestellt. SSD (240GB M.2 SATA von Transcend, eine TS240GMTS420S) hatte ich noch liegen, das passte gut.
Bezahlt habe ich inkl. Versand 55 €, was in einem ähnlichen Bereich wie ein Raspberry liegt. Wer hier nach Angeboten sucht, sollte MyDealz gut im Auge behalten. Die Dinger sind immer sehr schnell ausverkauft, sobald sie verfügbar sind.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Fujitsu Futro S740" class="gallery-image" data-flex-basis="258px" data-flex-grow="107" height="661" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://secretmine.de/blog/2023/2023-02-20-neuer-homeserver-futro-s740/images/s740.jpg" width="712"&gt;&lt;/p&gt;
&lt;p&gt;Als ich den Thin Client ausgepackt habe, war ich erst einmal von der Größe etwas überrascht. Ich hatte ein größeres
Gerät erwartet, aber der sehr kleine Formfaktor passt eigentlich gut. Nach einem kurzen Test-Boot ins BIOS habe ich
dann RAM und SSD ausgetauscht, nur um festzustellen, dass das Gerät nicht mehr startete und das ganze mit Piepen
quittierte. Wie sich herausstellt ist der RAM, den ich noch hatte, nicht kompatibel. Ich werde noch mal ein anderes
Modul kaufen (eine gute Kompatibilitätsliste und haufenweise weitere Informationen finden sich hier: &lt;a class="link" href="https://github.com/R3NE07/Futro-S740" target="_blank" rel="noopener"
 &gt;https://github.com/R3NE07/Futro-S740&lt;/a&gt; ), sobald ich Bedarf
für mehr RAM habe.&lt;/p&gt;
&lt;p&gt;Ich habe also Debian installiert und dort Proxmox eingerichtet. Innerhalb von kürzester Zeit lief ein ganz normales
Proxmox, mit 2,9 Watt im Idle. Wenn 2-3 VMs/Container mit insgesamt wenigen Prozent Last laufen, bin ich immer noch
bei unter 5 Watt. Zur Optimierung habe ich den Govenor auf Conservative eingestellt. Damit bleibt der Takt meistens sehr
niedrig, höher takten tut die CPU nur, wenn länger höhere Last anliegt. Bei VMs lohnt es sich auch, in den VM-Optionen
in Proxmox &amp;ldquo;Use tablet for pointer&amp;rdquo; zu deaktivieren. Das senkt die CPU-Last von VMs um wenige Prozent und spart vor allem
bei mehreren VMs durchaus Ressourcen. Man verliert hierbei die absolute Mausposition in der VM, was aber bei einer
VM, die eh nur über die Konsole oder per Remote bedient wird, keinen Unterschied macht.&lt;/p&gt;
&lt;p&gt;Seit der Umstellung fühlt sich Homeassistant flotter an, vor allem beim Aufruf von längerer Historie. Ich kann außerdem
nun beispielsweise Smokeping und Adguard problemlos auf derselben Hardware laufen lassen. Zurzeit schränkt mich der RAM
mit 4 GB etwas ein, belegt sind meistens etwa 2,7 GB. Der Prozessor ist im Schnitt bei etwas über 5 %, da ist also noch
viel Luft nach oben. Ich bin allgemein super happy mit dem Gerät, da ich für wenig Geld und geringem Strombedarf wieder
eine volle Virtualisierungsumgebung nutzen kann und wieder mehr &amp;ldquo;Spielwiese&amp;rdquo; habe.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Netzwerk-Kallax v2" class="gallery-image" data-flex-basis="135px" data-flex-grow="56" height="1200" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://secretmine.de/blog/2023/2023-02-20-neuer-homeserver-futro-s740/images/netzwerk-kallax-2.jpg" width="679"&gt;&lt;/p&gt;
&lt;p&gt;Das Netzwerk-Kallax hat auch noch ein Updat bekommen - aus dem 1x1-Kallax wurde nun ein 2x1-Kallax. Ich habe dabei
auch die Verkabelung noch neu gemacht, das ganze sieht jetzt etwas ordentlicher aus. Und ich komme an den Arbeits-Laptop,
der obendrauf liegt, zum Einloggen besser ran.&lt;/p&gt;</description></item><item><title>Netzwerk und Homelab – Stand Januar 2023</title><link>https://secretmine.de/blog/2023/2023-01-24-netzwerk-und-homelab-stand-januar-2023/</link><pubDate>Tue, 24 Jan 2023 00:00:00 +0000</pubDate><guid>https://secretmine.de/blog/2023/2023-01-24-netzwerk-und-homelab-stand-januar-2023/</guid><description>&lt;p&gt;Das letzte Update zu den Plänen mit meinem Homelab ist jetzt wieder einige Monate her, die dort gezeigte Lösung war auch
nur bis etwa August aktiv. Ich bin seitdem umgezogen, wobei ich auch mein Netzwerk neu aufgebaut habe. Ich habe hierbei
einiges vereinfacht und für einen geringen Stromverbrauch optimiert. Ich habe unten auch eine konkrete Hardware-Liste
angefügt.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Bild vom Netzwerk-Kallax" class="gallery-image" data-flex-basis="165px" data-flex-grow="68" height="1017" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://secretmine.de/blog/2023/2023-01-24-netzwerk-und-homelab-stand-januar-2023/images/netzwerk-kallax.jpg" width="700"&gt;&lt;/p&gt;
&lt;p&gt;Fangen wir mit dem grundlegenden an. Bisher hatte ich einen 100-MBit/s-DSL-Vertrag bei der Telekom. Da an der neuen
Adresse jedoch via DSL maximal 50MBit/s verfügbar sind, habe ich zu Vodafone Kabel gewechselt - damit bekomme
ich nun 250 MBit/s. Verfügbar wären an sich bis zu 1 GBit/s, aber das benötige ich absolut nicht. Internet-Fallback
ist ein LTE-Router mit günstigem Prepaid-Tarif, bei dem ich unkompliziert viel Datenvolumen nachbuchen kann -
dazu später mehr.&lt;/p&gt;
&lt;h2 id="das-netzwerk-im-kern"&gt;Das Netzwerk im Kern
&lt;/h2&gt;&lt;p&gt;Wie in der vorherigen Wohnung ist ein hAP AC² von Mikrotik Kern des ganzen. Der Router übernimmt sowohl das Routing
als auch Aufgaben wie VPN-Tunnel und dient parallel als WLAN-Access-Point. Klar, ich würde mit einem externen AP mehr
Bandbreite bekommen - aber das, was jetzt durchkommt, genügt definitiv. Im selben Raum kriege ich über 200 MBit/s,
in anderen Räumen meistens zwischen 50 und 100 MBit/s. Das reicht eigentlich für alles, nur bei Spiele-Downloads mit
dem Steam Deck wäre mehr Bandbreite wünschenswert.&lt;/p&gt;
&lt;p&gt;Am hAP hängen zwei Switches. Einer ist ein kleiner 5-Port-Switch für Smart-Home, der andere ist der Hauptswich für das
Heimnetz. Bei den Switches haben sich die kleinen Geräte von TP-Link für mich seit über 10 Jahren bewährt -
bislang ohne einen Ausfall.&lt;/p&gt;
&lt;p&gt;Ich habe auch eine Powerline-Strecke in den Keller, dort hängt ein Mikrotik mAP Lite als Access Point für eine
WLAN-Steckdose. Der Durchsatz liegt im Keller bei 20-30 MBit/s. Die Bandbreite war mir dort aber relativ egal,
hauptsache es kommen stabil mindestens 1-2 MBit/s durch. Netter Nebeneffekt dadurch ist, dass wenn die Waschmaschine
mal wieder 15min für die letzte Minute braucht, man sich die Zeit auf Reddit und co vertreiben kann. Ansonsten ist der
Keller ein komplettes Funkloch, außer meinem eigenen Netz sehe ich gar nichts. Mobilfunk kommt auch nicht an.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Netzwerkdiagramm mit allen kabelgebundenen Geräten" class="gallery-image" data-flex-basis="230px" data-flex-grow="96" height="521" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://secretmine.de/blog/2023/2023-01-24-netzwerk-und-homelab-stand-januar-2023/images/heimnetzwerk.png" width="501"&gt;&lt;/p&gt;
&lt;h2 id="internetzugang"&gt;Internetzugang
&lt;/h2&gt;&lt;p&gt;Für den Internetzugang nutze ich das Modem von Vodafone, allerdings im Bridge-Mode, um doppeltes NAT (bzw. mit CGNAT
dann dreifaches) zu vermeiden. Im
Vergleich zu einem eigenen Modem habe ich so den Vorteil, dass ich Hardware von Vodafone benutze, kein eigenes Modem
anschaffen muss und auch Telefonie soweit gut funktioniert. Der große Nachteil ist allerdings, dass ich kein IPv6
bekomme. Dafür ist die IPv4-Adresse nicht geteilt, also kein CGNAT. Ich habe mir Tunnel-Provider wie Route48
angesehen, aber dort hatte ich dann Probleme mit der Verortung der IP-Adressen. Bei Google Shopping wurden
beispielsweise auf einmal Ergebnisse bei Walmart und generell in Dollar angezeigt - das Ganze war nicht so richtig
alltagstauglich und dementsprechend wieder deaktiviert. Ich werde das Thema irgendwann noch einmal untersuchen, da
ich eigentlich schon gerne Dualstack hätte.&lt;/p&gt;
&lt;p&gt;Als Internet-Fallback habe ich einen TP-Link MR100 LTE-Router gekauft, diesen gabs im Dezember für etwa 40 € im Angebot.
Darin ist nun eine SIM-Karte von Edeka-Smart. Ich habe länger überlegt, was für ein Tarif geeignet ist und mich
schlussendlich für einen Prepaid-Tarif entschieden, der bei nicht- bzw. geringer Nutzung günstig ist, wo ich aber
tagesweise für einen brauchbaren Preis viel Datenvolumen nachbuchen kann. Normalerweise wird dann der
1GB-Tarif für knapp 5 €/Monat gebucht, sollte es tatsächlich zu Ausfällen kommen, lässt sich für etwa 6 € pro 24h unlimitiertes
Datenvolumen nachbuchen. Da ich nicht davon ausgehe, das oft zu benötigen und der Tarif Prepaid und auch im
Telekom-Netz ist, ist für mich alles erfüllt. Das Vodafone-Mobilnetz ist hier nicht brauchbar mit etwa 1-2 MBit/s, bei
der Telekom kriege ich durchaus 70-80 MBit/s (Upload etwa 30 MBit/s). Das reicht mehr als aus, um von zu Hause zu arbeiten und auch Netflix in
guter Qualität nutzen zu können.&lt;/p&gt;
&lt;h2 id="smart-home"&gt;Smart-Home
&lt;/h2&gt;&lt;p&gt;Vielleicht hat sich schon jemand gefragt, warum überhaupt eine FritzBox mit im Netzwerk hängt, wenn ich doch das Modem
von Vodafone nutze und einen zusätzlichen Hauptrouter habe. Die dient nur als DECT-Basisstation,
woran neben einem FritzFon auch drei smarte Thermostate angeschlossen sind.&lt;/p&gt;
&lt;p&gt;Alles im Smart-Home wird von einem Raspberry Pi 3 mit HomeAssistant gesteuert. Der Pi 3 ist natürlich nicht mehr der
neuste, aber den hatte ich noch, wodurch ich keine neue Hardware anschaffen musste. Hier sind aber Änderungen geplant,
mehr dazu unten.&lt;/p&gt;
&lt;p&gt;Neben den Thermostaten sind diverse WLAN-Steckdosen, Zigbee-Temperatursensoren und -Schalter, ein Strommessgerät sowie
einige weitere Geräte eingebunden. Ich habe einen Post zum aktuellen Stand vom Smart-Home geplant, aber mal schauen,
wann ich da tatsächlich zu komme und Lust darauf habe.&lt;/p&gt;
&lt;h2 id="stromverbrauch"&gt;Stromverbrauch
&lt;/h2&gt;&lt;p&gt;Die komplette Hardware zusammen (also Router, Switches, Raspi, &amp;hellip;) braucht im Leerlauf etwa 24 Watt, bei starker
Nutzung der Internetleitung geht der Verbrauch auf knapp 30 Watt hoch. Das ist im Vergleich zu meinem vorherigen Setup
(also das mit laufendem Server) recht wenig - ein einzelner Router würde aber natürlich weniger verbrauchen. Dennoch -
unter 10 € Stromkosten pro Monat bei den aktuell hohen Preisen ist für mich vertretbar.&lt;/p&gt;
&lt;p&gt;Ich suche generell Komponenten mittlerweile auch stark nach Stromverbauch aus. Einerseits natürlich um Kosten zu sparen,
andererseits auch mit Blick auf die Umwelt.&lt;/p&gt;
&lt;h2 id="zukunftspläne"&gt;Zukunftspläne
&lt;/h2&gt;&lt;p&gt;Mein Homelab ist, wie schon immer, im stetigen Wandel. Auch jetzt habe ich schon wieder einige Verbesserungen bzw.
Änderungen im Kopf, die ich in den nächsten Wochen und Monaten umsetzen möchte.&lt;/p&gt;
&lt;h3 id="netzwerk"&gt;Netzwerk
&lt;/h3&gt;&lt;p&gt;Der frühere Hauptswitch (TP-Link SG1024DE, also 24 Ports mit VLANs) ist aktuell ohne Verwendung. Ich habe vor, zur
Serverecke im Arbeitszimmer nur noch ein Kabel statt bisher drei (wenn man das normal nicht steckende Kabel für das
IPMI mitzählt) liegen zu haben und dort dann den Switch zu verwenden. Das ist natürlich deutlich übertrieben,
aber damit kann ich die Kabel im Netzwerkbereich etwas reduzieren. Ich habe damit auch die Möglichkeit, einfacher
einen weiteren Server (für temporäre Nutzung) hinzuzufügen.&lt;/p&gt;
&lt;h3 id="heimserver"&gt;Heimserver
&lt;/h3&gt;&lt;p&gt;Bekanntlich habe ich mehrfach versucht, den alten Heimserver gegen etwas Energieeffizientes auszutauschen. Das hat
ja nicht so gut geklappt. Ich warte zurzeit darauf, dass beispielsweise Thin-Clients (wie ein Futro S740) oder vergleichbare
Mini-PCs günstig im
Angebot sind, da ich so etwas für eine gute Lösung für mich halte. Ich kann Proxmox einsetzen, Homeassistant als VM
nutzen und Dinge wie PiHole/AdGuard oder mein altes Smokeping-Setup wieder problemlos verwenden. Generell erlaubt mir
eine kleine Maschine mit Proxmox mehr Flexibilität und einfach Spielraum. Mir geht es hierbei aber auch stark darum,
so wenig Strom wie nur möglich zu verwenden. Ich benötige zu Hause auch nicht viel Rechenleistung, das macht die Auswahl
etwas leichter bzw. ich kann auf maximale Energieeffizienz setzen, ohne groß auf die Performance schauen zu müssen.&lt;/p&gt;
&lt;h2 id="hardware-liste"&gt;Hardware-Liste
&lt;/h2&gt;&lt;p&gt;Diese Liste werde ich eines Tages mal auf eine eigene Seite auslagern. Heute ist aber nicht dieser Tag.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Hauptrouter: Mikrotik hAP AC²&lt;/li&gt;
&lt;li&gt;Access-Point im Keller: Mikrotik mAP Lite&lt;/li&gt;
&lt;li&gt;LTE-Router: TP-Link MR100&lt;/li&gt;
&lt;li&gt;Kabelmodem: Vodafone Station&lt;/li&gt;
&lt;li&gt;Switches
&lt;ul&gt;
&lt;li&gt;5-Port: TP-Link SG105&lt;/li&gt;
&lt;li&gt;8-Port: TP-Link SG108&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Powerline-Adapter: TP-Link TL-PA4010&lt;/li&gt;
&lt;li&gt;Smart-Home-Server: Raspberry Pi 3&lt;/li&gt;
&lt;li&gt;Zigbee-Stick: Irgendein random Stick mit einem CC2531-Chip&lt;/li&gt;
&lt;li&gt;DECT-Basis: FritzBox 7360&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Warum ein Synology-NAS für mich nicht geeignet ist</title><link>https://secretmine.de/blog/2022/2022-09-02_synology_nas/</link><pubDate>Fri, 02 Sep 2022 00:00:00 +0000</pubDate><guid>https://secretmine.de/blog/2022/2022-09-02_synology_nas/</guid><description>&lt;p&gt;Ich überlege ja schon länger, mein Heimserver-Setup komplett neu aufzubauen. Neben Mini-PCs habe ich hierfür auch ausgiebig in Richtung NAS-Geräte recherchiert. Aufgrund der Software und dem generellen Ruf bin ich dann bei Synology gelandet, durch die 4 Bays konkret bei der Diskstation DS920+.&lt;/p&gt;
&lt;p&gt;Hardwaremäßig kann die Konkurrenz mittlerweile 2,5G-Ethernet bieten, Synology hat weiterhin (bis auf bei den High-End-Geräten) überall nur 1G-Schnittstellen verbaut. Bei dem Preis von den Geräten erwarte ich da eigentlich mehr, vor allem da entsprechende Chips nicht viel kosten. Die CPU ist ein Celeron J4125 – für so ein Gerät angemessen.&lt;/p&gt;
&lt;p&gt;Der Plan war, hier 2x SSD und 2x HDD zu verbauen. Die SSDs sollten den normalen Alltag machen, damit die HDDs meistens abgeschaltet sein können und weniger Strom verbrauchen. Es stellt sich jedoch heraus, dass die Systempartition und der Swap über alle Datenträger gespiegelt wird, die HDDs gehen also ungefähr nie in den Ruhezustand über. Damit wäre der Vorteil schon mal weg. Synology Hybrid Raid hingegen finde ich absolut super. Damit lassen sich Festplatten mit unterschiedlichen Größen in einem RAID kombinieren, was sonst eher nicht so üblich ist.&lt;/p&gt;
&lt;p&gt;Homeassistant via VM schien zu laufen – eingerichtet habe ich es jedoch nicht komplett. Da es eine VM ist, mache ich mir da aber auch wenig Sorgen.&lt;/p&gt;
&lt;p&gt;Docker lief auch soweit gut, meine Tests mit Paperless-ngx funktionierten ebenfalls problemlos.&lt;/p&gt;
&lt;p&gt;Die Software lässt sich generell gut bedienen, da sehe ich wenig Probleme. Die Grundfunktionen für Freigaben via Samba und co funktionieren ebenfalls gut. Die mitgelieferte Software für PC-Backups ist allerdings… nicht ganz zu Ende gedacht. An sich funktioniert diese gut (wobei ich einen Restore nicht getestet habe), es lassen sich allerdings keine Ordner ausschließen. Das heißt, dass meine ganzen Spiele und andere Daten, die sich leicht wiederherstellen lassen, mit gesichert wurden. Meine Spiele neu herunterzuladen ist für mich kein Thema, wenn ich dabei beim Backup einige hundert GB an Speicherplatz sparen kann. Mit Acronis führe ich dies auch genau so durch und fahre gut damit – mit dem Synology-Tool lässt es sich aber so nicht umsetzen und ich verbrenne unnötig Speicher.&lt;/p&gt;
&lt;p&gt;Der Stromverbrauch lag bei mir im Idle (2x HDD, 2x SSD) mit abgeschalteten Platten bei 15-20 Watt, unter etwas Last bei eher 30-40 Watt. Ein kleiner Mini-PC benötigt durchaus weniger und bei den aktuellen Strompreisen ist es mir eigentlich zu viel. Vor allem, wenn man hier wieder den Aspekt berücksichtigt, dass die Festplatten ungefähr nie in den Ruhezustand gehen und damit immer Strom verbrauchen.&lt;/p&gt;
&lt;p&gt;Ich habe das Gerät am Ende wieder zurückgeschickt. Über 500€ sind mir zu viel dafür, dass das Gerät nicht die Eierlegende Wollmilchsau ist, die ich mir gewünscht habe. Im groben und ganzen ist es ein solides Gerät, aber leider erfüllt es an mehreren Stellen die Ansprüche, die ich habe, nicht. Vorerst werde ich ohne Homeserver leben und einen Raspberry Pi für Homeassistant nutzen, wahrscheinlich lande ich am Ende aber doch wieder bei irgend einem Mini-PC mit Proxmox.&lt;/p&gt;</description></item><item><title>Änderungen am Homelab Part 3 – Meine Lösung</title><link>https://secretmine.de/blog/2022/04/13/aenderungen-am-homelab-part-3-meine-loesung/</link><pubDate>Wed, 13 Apr 2022 00:00:00 +0000</pubDate><guid>https://secretmine.de/blog/2022/04/13/aenderungen-am-homelab-part-3-meine-loesung/</guid><description>&lt;p&gt;&lt;a class="link" href="https://secretmine.de/blog/2022/02/25/homelab-stromkosten/" &gt;Ursprünglich hatte ich ja vor&lt;/a&gt;, meinen jetzigen Heimserver (
der so 30-40 Watt im Leerlauf verbraucht) durch einen Mini-PC zu ersetzen, der dann den Verbrauch auf 10 Watt oder so
reduziert. &lt;a class="link" href="https://secretmine.de/blog/2022/04/10/aenderungen-am-homelab-part-2-fail/" &gt;Das lief bekanntlich nicht so wie geplant&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Daher nun ein neuer Plan. In meiner Wohnung laufen eh zwei Raspberry Pis (Model 1B, also nicht ganz frisch), die ein
paar Sensoren ans Netz bringen. Ich habe auch einen primär privat genutzten Server in einem Rechenzentrum stehen (dazu
bei Gelegenheit mehr). Und ich wollte meinen Router (aktuell ein Unifi USG von Ubiquiti) eh durch ein Gerät von Mikrotik
austauschen. Kern meines Heimnetzes ist nun ein Mikrotik hAP AC2.&lt;/p&gt;
&lt;p&gt;Also.&lt;/p&gt;
&lt;p&gt;Die Idee ist, die Homeassistant-VM ins Rechenzentrum zu schieben und irgendwie das entsprechende Netz zu diesem Server
zu bridgen (also kein Routing dazwischen). Mir ist klar, dass das definitiv nicht best-practise ist, das ist auch keine
Dauerlösung. Ich habe nun also ein VLAN, was mittels EoIP (Ethernet over IP, Protokoll von Mikrotik) an ein VLAN auf dem
Server im Rechenzentrum angeschlossen ist. Der EoIP-Tunnel läuft dabei innerhalb eines Wireguard-Tunnels. Nachdem ich
ein paar Probleme, die alle auf die MTU zurückzuführen waren, behoben hatte, läuft das ganze nun erstaunlich gut. Zigbee
wird mittels Zigbee2MQTT auf einem der Pis in MQTT übersetzt und an den Broker geschickt. Man merkt auch absolut keinen
Unterschied dadurch, dass Homeassistant nun woanders läuft.&lt;/p&gt;
&lt;p&gt;Parallel habe ich die Unifi USG und auch meinen Unifi AP AC Lite vom Netz genommen. Den AP erst einmal testhalber, da
ich mir vom integrierten WLAN ein Bild machen möchte. Und bislang schafft der hAP AC2 es, von einer Ecke der Wohnung
alles abzudecken. Geschwindigkeiten sind nicht auf dem Level vom Unifi AP (der hat problemlos 200MBit/s und mehr
durchgehauen, jetzt sind es eher 60MBit/s), aber ich bin mehr als zufrieden damit. Das WLAN ist eh ungefähr nur für
einige WLAN-Steckdosen und zwei Smartphones im Einsatz, alles andere hat ein Kabel dran. Die Konfiguration vom
Mikrotik-Gerät war zwar alles andere als einfach, aber die Dinger können dafür auch sehr viel.&lt;/p&gt;
&lt;p&gt;&amp;hellip;und das relevante: Der Stromverbrauch. Vorher war ich mit dem Server im Idle bei grob 60 Watt mit allem. Also
Switch, Router, AP und Server. Jetzt stehen da 17 Watt. Bei den aktuellen Strompreisen macht sich das sehr schnell
bezahlt und ich fühle mich insgesamt besser dabei. Der Server kommt auch nicht weg, der steht weiterhin hier. Nur jetzt
eben nicht mehr dauerhaft an, sondern nur bei Bedarf.&lt;/p&gt;
&lt;p&gt;Eine Dauerlösung ist das so nicht. Auch, da der Server im RZ nicht mehr der Jüngste ist und die SSDs auch schon einige
Jahre in Betrieb sind. Mein Ziel ist, Homeassistant dann irgendwann auf einen weiteren, aktuelleren Pi zu schieben. Was
ich mit dem Atlassian-Stack dann mache weiß ich jetzt noch nicht, der ist im RZ soweit aber erstmal gut aufgehoben.&lt;/p&gt;
&lt;p&gt;Vielleicht schaue ich beim Thema Mini-PC ja doch noch mal vorbei. Aber in absehbarer Zukunft steht eh ein Umzug an, wo
ich mein Vorgehen neu betrachten muss.&lt;/p&gt;</description></item><item><title>Änderungen am Homelab Part 2 – Fail.</title><link>https://secretmine.de/blog/2022/04/10/aenderungen-am-homelab-part-2-fail/</link><pubDate>Sun, 10 Apr 2022 00:00:00 +0000</pubDate><guid>https://secretmine.de/blog/2022/04/10/aenderungen-am-homelab-part-2-fail/</guid><description>&lt;p&gt;Der letzte Beitrag zu dem Thema endete damit, dass ich
den JB95 von MinisForum getestet habe.
Von der Leistung her war der in Ordnung, Stromverbrauch mit etwas unter 10 Watt im Idle auch gut. Was mich nur gestört
hat, war, dass es keine Möglichkeit gab, den Mini-PC bei einem Stromausfall automatisch wieder zu booten. Auto-Start bei
Stromzufuhr unterstützt er nicht, Wake on Lan geht leider auch nicht. Es gibt zwar ein BIOS-Update, was angeblich WOL
aktivieren soll, aber das tut es nicht. Auch ethtool zeigt WOL als Deaktiviert an. Der Support war keine Hilfe bzw.
hat - denke ich - mein Problem nicht verstanden. Das war leider dann ein KO-Kriterium für mich.&lt;/p&gt;
&lt;p&gt;Aber es gibt ja auch andere Mini-PCs mit der selben CPU. Also habe ich einen Mini-PC von BMAX mit dem N5095 bestellt.
Auto-Start bei Stromzufuhr klappt problemlos. Es ist auch ein Platz für ein 2,5-Zoll-Laufwerk vorhanden, aber
es liegt kein passendes Kabel bei. Man bekommt so ein Kabel auch ungefähr nicht. Zudem war die SSD eine sehr kleine
(wenn ich mich recht erinnere M.2 2242), und der Markt an solchen SSDs ist klein und dementsprechend teurer als z.B. M.2
2280. Also war dieses Gerät auch raus.&lt;/p&gt;
&lt;p&gt;Also weiter. Der U59 von Beelink hat auch diese CPU. Auto-Power-On klappt, WOL geht und das Kabel für ein
2,5-Zoll-Laufwerk ist schon verbaut. Super. Ich habe also Proxmox installiert und meine VMs übertragen. Nur um dann
festzustellen, dass VMs zufällig einfach crashen. Die Meldungen im Kernel-Panic der VMs sind leider wenig aussagekräftig,
das Ganze passiert auch unregelmäßig. Teilweise direkt 1-2min nach dem Start, manchmal erst nach 1-2 Tagen. Aber mehrere
VMs sind mehrfach immer wieder gecrasht, sowohl auf der internen als auch der zusätzlich verbauten SSD (die zusätzlich
verbaute ist eine MX500, die bis dahin in meine Heimserver aktiv wawr und unproblematisch ist). Damit war der dritte
Mini-PC auch nicht geeignet.&lt;/p&gt;
&lt;p&gt;Jetzt bin ich an einem Punkt angelangt, wo ich keine Lust mehr habe, Mini-PCs zu bestellen nur um sie dann wieder
zurückzuschicken. Ob Amazon das auf Dauer so cool findet, bezweifle ich auch. Ich habe nun aber einen komplett anderen
Plan entwickelt, um meinen Stromverbrauch zu reduzieren. Mehr dazu dann im nächsten Beitrag - vorab sage ich nur,
dass es kompliziert wird.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Hinweis am Rande: Das Problem mit den crasheden VMs habe ich auch auf dem Minisforum-Gerät feststellen können&amp;hellip;
Vielleicht ein generelles Problem mit der Plattform.&lt;/em&gt;&lt;/p&gt;</description></item><item><title>Änderungen am Homelab – Stromkosten.</title><link>https://secretmine.de/blog/2022/02/25/homelab-stromkosten/</link><pubDate>Fri, 25 Feb 2022 00:00:00 +0000</pubDate><guid>https://secretmine.de/blog/2022/02/25/homelab-stromkosten/</guid><description>&lt;p&gt;Die Strompreise steigen aktuell immer weiter an, was den Betrieb von einem Heimserver zunehmend teurer macht. Deswegen
habe ich mir einen Mini-PC angesehen, um zu schauen, ob dieser geeignet ist, meinen bisherigen Server zumindest für den
24/7-Betrieb abzulösen.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Ursprünglich sollte dieser Post direkt ein Review vom potenziellen neuen Heimserver werden - der Hintergrund-Part
bzw. Überblick über die aktuelle Situation hat aber dermaßen den Rahmen gesprengt, dass ich das jetzt als eigenen Post
vorher veröffentliche.&lt;/em&gt;&lt;/p&gt;
&lt;h2 id="der-aktuelle-stand"&gt;Der aktuelle Stand
&lt;/h2&gt;&lt;p&gt;Ich habe auch Raspberry Pis in Betracht gezogen - nachfolgende Auflistung an Hardware und vor allem der laufenden
Dinge sollte aber gut zeigen, warum das nicht so wirklich eine Alternative ist.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Rack-Server auf Fußboden" class="gallery-image" data-flex-basis="307px" data-flex-grow="128" height="2356" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://secretmine.de/blog/2022/02/25/homelab-stromkosten/images/aktuell.jpg" srcset="https://secretmine.de/blog/2022/02/25/homelab-stromkosten/images/aktuell_hu_561ad94e4161f96c.jpg 800w, https://secretmine.de/blog/2022/02/25/homelab-stromkosten/images/aktuell_hu_39d045b768917032.jpg 1600w, https://secretmine.de/blog/2022/02/25/homelab-stromkosten/images/aktuell_hu_499613129111c561.jpg 2400w, https://secretmine.de/blog/2022/02/25/homelab-stromkosten/images/aktuell.jpg 3016w" width="3016"&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;Bisher läuft als Hauptserver folgende Hardware:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;CPU: Intel Xeon E3-1230v3 (4C/8T @ 3,3GHZ)&lt;/li&gt;
&lt;li&gt;Mainboard: Supermicro X10SLL-F (mit IPMI)&lt;/li&gt;
&lt;li&gt;RAM: 32GB DDR3 ECC&lt;/li&gt;
&lt;li&gt;OS: Proxmox&lt;/li&gt;
&lt;li&gt;Datenträger:
&lt;ul&gt;
&lt;li&gt;240GB Sata-SSD (ohne Cache) für Proxmox&lt;/li&gt;
&lt;li&gt;500GB NVMe-SSD für VMs&lt;/li&gt;
&lt;li&gt;500GB Sata-SSD (mit Cache) für VMs&lt;/li&gt;
&lt;li&gt;1TB HDD für Backups&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Normale CPU-Last liegt bei grob 10%, RAM brauche ich meistens um die 20-24GB. An Anwendungen läuft folgendes:&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th style="text-align: center"&gt;&lt;strong&gt;Container (LXC)&lt;/strong&gt;&lt;/th&gt;
					&lt;th style="text-align: center"&gt;&lt;strong&gt;VMs (KVM)&lt;/strong&gt;&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td style="text-align: center"&gt;PiHole&lt;/td&gt;
					&lt;td style="text-align: center"&gt;Router/VPNs (z.B. zum RZ)&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: center"&gt;Reverse Proxy (Nginx Proxy Manager)&lt;/td&gt;
					&lt;td style="text-align: center"&gt;Unifi-Controller&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: center"&gt;Smokeping&lt;/td&gt;
					&lt;td style="text-align: center"&gt;Mikrotik CHR zum Rumspielen&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: center"&gt;Traceroute-Change-Detection&lt;/td&gt;
					&lt;td style="text-align: center"&gt;2x Windows-VM&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: center"&gt;Wordpress-Testumgebung&lt;/td&gt;
					&lt;td style="text-align: center"&gt;Confluence&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: center"&gt;Container mit random Scripts für Notifications o.ä.&lt;/td&gt;
					&lt;td style="text-align: center"&gt;Jira&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: center"&gt;Mosquitto für MQTT&lt;/td&gt;
					&lt;td style="text-align: center"&gt;Bitbucket&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: center"&gt;Paperless-NG&lt;/td&gt;
					&lt;td style="text-align: center"&gt;Jenkins&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: center"&gt;&lt;/td&gt;
					&lt;td style="text-align: center"&gt;Bitwarden-RS&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: center"&gt;&lt;/td&gt;
					&lt;td style="text-align: center"&gt;Backup-VM&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: center"&gt;&lt;/td&gt;
					&lt;td style="text-align: center"&gt;Homeassistant&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Einige der VMs (z.B. den Unifi-Controller) kann man sicherlich noch auf Container umstellen und damit schlanker
bekommen. Auch der komplette Atlassian-Stack (Jira, Confluence, Bitbucket) hat nichts, was die Verwendung von VMs
benötigt. Damit dürfte vor allem der RAM-Verbrauch auch noch mal um ein paar GB sinken - das ist aber eher eine
Sache für die nächsten Monate und nicht für Jetzt. Eilt nicht.&lt;/p&gt;
&lt;p&gt;Die meisten der VMs bieten also irgendwelche Services im Heimnetz (oder auch extern) an. Und auf diese Services
verzichten möchte ich auch nicht.&lt;/p&gt;
&lt;figure class="wp-block-image size-full is-resized"&gt;
&lt;p&gt;&lt;img alt="Proxmox-Dashboard" class="gallery-image" data-flex-basis="573px" data-flex-grow="238" height="293" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://secretmine.de/blog/2022/02/25/homelab-stromkosten/images/grafik.png" width="700"&gt;
&lt;img alt="Laufende VMs und Container" class="gallery-image" data-flex-basis="1085px" data-flex-grow="452" height="130" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://secretmine.de/blog/2022/02/25/homelab-stromkosten/images/grafik-1.png" width="588"&gt;&lt;/p&gt;
&lt;h2 id="wie-also-weniger-strom-verbrauchen"&gt;Wie also weniger Strom verbrauchen?
&lt;/h2&gt;&lt;p&gt;Der Server braucht aktuell im Idle um die 40-45 Watt, unter Last 60-80 Watt. Die meiste Zeit läuft das Teil eher im
Idle, ich rechne also mit im Schnitt 45-50 Watt. Das sind bei den aktuellen Strompreisen also grob 150€ pro Jahr -
und mir eindeutig zu viel Geld dafür, dass der die meiste Zeit kaum was zu tun hat. Un die Umwelt hat auch noch was
davon, wenn ich weniger Strom verbrauche.&lt;/p&gt;
&lt;p&gt;Dadurch, dass ich für ein paar Programme VMs mit Windows benötige, sind Raspberry Pis leider raus, der RAM ist da auch
ein Argument. Ich weiß auch nicht, wie gut Jira oder Confluence auf einem Pi laufen würde - durch den hohen
RAM-Verbrauch würde ich auch mehrere Pis benötigen. Und bei den aktuellen Preisen von 100€ und mehr für die Version mit
8GB wird mir das einfach zu teuer. Ein kleiner selbst gebauter Rechner würde zwar weniger verbrauchen, aber
wahrscheinlich immernoch 20-30 Watt. Und die Boards mit kleinen Celerons/Pentiums sind teuer. Beim bisherigen Server die
CPU mit was kleinerem zu ersetzen ginge zwar, aber würde vermutlich nur wenige Watt sparen. Mainboards mit IPMI sind vom
Stromverbrauch her nicht die besten.&lt;/p&gt;
&lt;p&gt;Bleiben eigentlich nur noch Mini-PCs. Und davon gibt es viele, wie ich gemerkt habe. Kriterien, die mir wichtig waren:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;min. 4 CPU-Kerne&lt;/li&gt;
&lt;li&gt;gesockelter RAM, min 16GB möglich&lt;/li&gt;
&lt;li&gt;min. zwei Datenträger (am besten 1x M.2 und 1x 2,5-Zoll Sata)&lt;/li&gt;
&lt;li&gt;Gigabit-LAN&lt;/li&gt;
&lt;li&gt;geringer Stromverbrauch&lt;/li&gt;
&lt;li&gt;max 300-350€&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Klar, ein IPMI ist cool. Aber beim bisherigen Server bin ich da dermaßen selten drin, dass ich da auch drauf verzichten
kann. Formfaktor ist mir auch nicht so wichtig.&lt;/p&gt;
&lt;p&gt;&lt;img alt="MinisForum UM350" class="gallery-image" data-flex-basis="209px" data-flex-grow="87" height="3289" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://secretmine.de/blog/2022/02/25/homelab-stromkosten/images/um350.jpg" srcset="https://secretmine.de/blog/2022/02/25/homelab-stromkosten/images/um350_hu_f4dfd6c99fbd8435.jpg 800w, https://secretmine.de/blog/2022/02/25/homelab-stromkosten/images/um350_hu_b0d0083f22cc00e3.jpg 1600w, https://secretmine.de/blog/2022/02/25/homelab-stromkosten/images/um350_hu_e78fa19d7b22b0c7.jpg 2400w, https://secretmine.de/blog/2022/02/25/homelab-stromkosten/images/um350.jpg 2869w" width="2869"&gt;&lt;/p&gt;
&lt;p&gt;Ich bin bei der Suche dann schnell auf den Hersteller MinisForum gestoßen. Ich hatte an anderer Stelle mit dem UM350 (
Ryzen 5 3550H, 16GB RAM und 256GB SSD) von denen zu tun und war zufrieden mit der Hardware. Der LAN-Port mit 2,5GBit/s
ist zwar nett, aber fast 450€ rentieren sich dann doch nicht in akzeptabler Zeit.&lt;/p&gt;
&lt;p&gt;Dann habe ich dieses Gerät hier, den JB95 (Intel Celeron N5095, 8GB RAM, 256GB SSD) gefunden. Preislich unter 300€ und
sollte alle meine Anforderungen erfüllen. Klar, der Celeron wird deutlich schwächer sein als der Xeon, den ich gerade
habe - aber die normale Last sollte der Rechner schaffen. Und ich werde den bisherigen Server ja nicht wegwerfen;
der wird, wenn ich kurzzeitig mehr Power brauche, weiterhin bereitstehen.&lt;/p&gt;
&lt;p&gt;Der Mini-PC steht gerade vor mir und läuft auch schon mit Proxmox. Ich habe noch nicht alles ausprobiert, was ich
ausprobieren möchte, aber es sieht soweit ziemlich gut aus. Dementsprechend wird es in den nächsten Tagen einen
ausführlicheren Post zu dem JB95 geben.&lt;/p&gt;</description></item></channel></rss>