<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>teqqy</title><link>https://www.teqqy.de/</link><description>Ein Blog über Technik und mehr</description><language>de</language><managingEditor>teqqy</managingEditor><lastBuildDate>Thu, 16 Jul 2026 10:53:16 +0000</lastBuildDate><generator>Hugo 0.164.0</generator><atom:link href="https://www.teqqy.de/index.xml" rel="self" type="application/rss+xml"/><item><title>GitOps ohne Komodo: Webhook-basiertes Auto-Deployment für Docker Compose</title><link>https://www.teqqy.de/gitops-ohne-komodo/</link><pubDate>Wed, 03 Jun 2026 00:00:00 +0200</pubDate><lastBuildDate>Wed, 03 Jun 2026 00:00:00 +0200</lastBuildDate><guid isPermaLink="true">https://www.teqqy.de/gitops-ohne-komodo/</guid><description>Wer meinen letzten Beitrag zum Homelab Setup 2025 gelesen hat, weiß dass ich dort Komodo (externer Link) als GitOps-Werkzeug für meine Docker Compose Stacks einsetze. Das Prinzip dahinter ist gut: Git als Single Source of Truth, Renovate für automatische Version-Updates, und bei einem neuen Commit deployed Komodo die Änderungen auf das Zielsystem. Funktioniert im Grunde auch – aber Komodo hat mich mit einer Sache regelmäßig zur Weißglut gebracht: File Permissions. Das funktioniert einfach nicht konsistent. Entweder stimmen die Berechtigungen auf dem Host nicht, oder Komodo meckert beim Deployment, oder irgendwas dazwischen. Nach dem x-ten Mal hatte ich genug und wollte eine schlankere Lösung.</description><content:encoded>&lt;![CDATA[<p>Wer meinen<a href="/selfhosted-setup-2025-mein-neuer-workflow-mit-proxmox-komodo-und-gitops/">letzten Beitrag zum Homelab Setup 2025</a>
gelesen hat, weiß dass ich dort<a href="https://komo.do/" target="_blank" rel="noopener noreferrer">Komodo<svg class="link-external-icon" aria-hidden="true" focusable="false" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"/><polyline points="15 3 21 3 21 9"/><line x1="10" y1="14" x2="21" y2="3"/></svg><span class="visually-hidden"> (externer Link)</span></a>
als GitOps-Werkzeug für meine Docker Compose Stacks einsetze. Das Prinzip dahinter ist gut: Git als Single Source of Truth, Renovate für automatische Version-Updates, und bei einem neuen Commit deployed Komodo die Änderungen auf das Zielsystem. Funktioniert im Grunde auch – aber Komodo hat mich mit einer Sache regelmäßig zur Weißglut gebracht: File Permissions. Das funktioniert einfach nicht konsistent. Entweder stimmen die Berechtigungen auf dem Host nicht, oder Komodo meckert beim Deployment, oder irgendwas dazwischen. Nach dem x-ten Mal hatte ich genug und wollte eine schlankere Lösung.</p><p>Die Anforderung ist dabei überschaubar: Wenn Renovate einen neuen Commit in das Repo pusht (nach meinem Merge des Pull Requests), soll die compose-Datei auf dem Server aktualisiert und die betroffenen Container neu gestartet werden. Kein Kubernetes, kein weiteres Framework. Einfach git pull und docker compose up.</p><h2 id="das-grundprinzip">Das Grundprinzip<a href="#das-grundprinzip" class="heading-anchor" aria-label="Diesen Abschnitt verlinken"><svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a></h2><p>Das Setup basiert auf drei Komponenten die zusammenspielen:</p><ol><li><strong><a href="https://about.gitea.com/" target="_blank" rel="noopener noreferrer">Gitea<svg class="link-external-icon" aria-hidden="true" focusable="false" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"/><polyline points="15 3 21 3 21 9"/><line x1="10" y1="14" x2="21" y2="3"/></svg><span class="visually-hidden"> (externer Link)</span></a></strong> – mein selbst gehosteter Git-Server, auf dem die Compose-Dateien liegen</li><li><strong><a href="https://docs.renovatebot.com/" target="_blank" rel="noopener noreferrer">Renovate<svg class="link-external-icon" aria-hidden="true" focusable="false" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"/><polyline points="15 3 21 3 21 9"/><line x1="10" y1="14" x2="21" y2="3"/></svg><span class="visually-hidden"> (externer Link)</span></a></strong> – überprüft alle vier Stunden per Cronjob die verwendeten Image-Tags gegen die jeweiligen Container-Registries und öffnet bei neuen Versionen automatisch Pull Requests. Ich merge den PR, der Commit landet auf<code>main</code>.</li><li><strong><a href="https://github.com/adnanh/webhook" target="_blank" rel="noopener noreferrer">webhook<svg class="link-external-icon" aria-hidden="true" focusable="false" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"/><polyline points="15 3 21 3 21 9"/><line x1="10" y1="14" x2="21" y2="3"/></svg><span class="visually-hidden"> (externer Link)</span></a></strong> – ein einzelnes Go-Binary, das auf dem Zielserver einen HTTP-Endpunkt bereitstellt. Gitea feuert bei jedem Push einen Webhook dorthin, woraufhin das Deploy-Script ausgeführt wird.</li></ol><p>Der Datenfluss sieht so aus:</p><div class="code-block"><div class="code-block-header"><span class="code-lang-label"/><button class="code-copy-btn" type="button" aria-label="Code kopieren" data-umami-event="Code Copy" data-umami-event-lang=""><svg class="icon-copy" xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"/><path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"/></svg><svg class="icon-check" xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><polyline points="20 6 9 17 4 12"/></svg></button></div><pre tabindex="0"><code>Renovate erkennt neues Image-Tag
→ PR in Gitea
→ Merge
→ Gitea feuert Webhook
→ webhook-Binary ruft deploy.sh auf
→ git pull + docker compose up -d</code></pre></div><p>Kein Polling, kein Daemon der irgendwelche Container-Registries beobachtet, kein Framework das eigene Meinungen zu File Permissions hat.</p><h2 id="warum-nicht-einfach-watchtower-oder-ein-cron-script">Warum nicht einfach Watchtower oder ein Cron-Script?<a href="#warum-nicht-einfach-watchtower-oder-ein-cron-script" class="heading-anchor" aria-label="Diesen Abschnitt verlinken"><svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a></h2><p>Bevor ich zu webhook gegriffen habe, hatte ich kurz zwei andere Ansätze im Kopf.</p><p><strong><a href="https://containrrr.dev/watchtower/" target="_blank" rel="noopener noreferrer">Watchtower<svg class="link-external-icon" aria-hidden="true" focusable="false" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"/><polyline points="15 3 21 3 21 9"/><line x1="10" y1="14" x2="21" y2="3"/></svg><span class="visually-hidden"> (externer Link)</span></a></strong> überwacht laufende Container und zieht neue Images automatisch. Das Problem: Watchtower reagiert auf neue Images in der Registry, nicht auf Git-Commits. Wenn Renovate einen PR öffnet und ich den merge, hat Watchtower davon keine Ahnung – der zieht einfach irgendwann wenn er selbst nachschaut. Das passt nicht zu einem Setup bei dem Git die einzige Quelle der Wahrheit sein soll. Außerdem will ich den Merge-Zeitpunkt kontrollieren, nicht Watchtower.</p><p><strong>Cron-Script mit<code>git fetch</code></strong> wäre die andere Möglichkeit – alle paar Minuten nachschauen ob es Änderungen gibt und dann deployen. Funktioniert, hat aber einen konzeptionellen Nachteil: Es ist Polling. Ich baue mit Gitea bereits eine Infrastruktur auf die Push-Events liefern kann, die sollte ich auch nutzen. Ein Webhook reagiert innerhalb von Sekunden, ein Cron-Job mit 5-Minuten-Intervall verzögert unnötig.</p><p>webhook ist der sauberste Weg: Event-getrieben, kein Extra-Daemon, ein einzelnes Binary ohne Abhängigkeiten.</p><h2 id="repo-struktur">Repo-Struktur<a href="#repo-struktur" class="heading-anchor" aria-label="Diesen Abschnitt verlinken"><svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a></h2><p>Ich habe pro Server ein eigenes Repository:</p><ul><li><code>apps-stack</code> für den<code>docker01</code> – dort laufen Tools wie<a href="https://docs.paperless-ngx.com/" target="_blank" rel="noopener noreferrer">Paperless-ngx<svg class="link-external-icon" aria-hidden="true" focusable="false" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"/><polyline points="15 3 21 3 21 9"/><line x1="10" y1="14" x2="21" y2="3"/></svg><span class="visually-hidden"> (externer Link)</span></a>
,<a href="https://immich.app/" target="_blank" rel="noopener noreferrer">Immich<svg class="link-external-icon" aria-hidden="true" focusable="false" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"/><polyline points="15 3 21 3 21 9"/><line x1="10" y1="14" x2="21" y2="3"/></svg><span class="visually-hidden"> (externer Link)</span></a>
,<a href="https://github.com/dani-garcia/vaultwarden" target="_blank" rel="noopener noreferrer">Vaultwarden<svg class="link-external-icon" aria-hidden="true" focusable="false" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"/><polyline points="15 3 21 3 21 9"/><line x1="10" y1="14" x2="21" y2="3"/></svg><span class="visually-hidden"> (externer Link)</span></a>
und ähnliches</li><li><code>media-stack</code> für den<code>media01</code> – dort leben alle<code>*arr</code>-Container und was sonst noch zum Medien-Stack gehört</li></ul><p>Jedes Repo enthält einfach die<code>compose.yaml</code> sowie ggf. weitere Konfigurationsdateien die einzelne Anwendungen benötigen. Nichts Besonderes.</p><h3 id="renovate-in-den-repos">Renovate in den Repos<a href="#renovate-in-den-repos" class="heading-anchor" aria-label="Diesen Abschnitt verlinken"><svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a></h3><p>Renovate läuft selfhosted und überprüft per Cronjob alle vier Stunden die Image-Tags in den Compose-Dateien. Dafür reicht eine minimale<code>renovate.json</code> im Repo-Root:</p><div class="code-block"><div class="code-block-header"><span class="code-lang-label">json</span><button class="code-copy-btn" type="button" aria-label="Code kopieren" data-umami-event="Code Copy" data-umami-event-lang="json"><svg class="icon-copy" xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"/><path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"/></svg><svg class="icon-check" xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><polyline points="20 6 9 17 4 12"/></svg></button></div><div class="highlight"><pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"><code class="language-json" data-lang="json"><span style="display:flex;"><span>{</span></span><span style="display:flex;"><span><span style="color:#7ee787">"$schema"</span>:<span style="color:#a5d6ff">"https://docs.renovatebot.com/renovate-schema.json"</span>,</span></span><span style="display:flex;"><span><span style="color:#7ee787">"extends"</span>: [<span style="color:#a5d6ff">"config:base"</span>],</span></span><span style="display:flex;"><span><span style="color:#7ee787">"docker-compose"</span>: {</span></span><span style="display:flex;"><span><span style="color:#7ee787">"enabled"</span>:<span style="color:#79c0ff">true</span></span></span><span style="display:flex;"><span> }</span></span><span style="display:flex;"><span>}</span></span></code></pre></div></div><p>Renovate erkennt dann automatisch die Image-Tags in der Compose-Datei und öffnet PRs wenn eine neuere Version verfügbar ist. Bei Software die semantische Versionierung verwendet (also<code>major.minor.patch</code>) lässt sich das besonders fein steuern – z. B. nur Patch-Updates automatisch mergen, bei Minor-Updates erst schauen was sich geändert hat.</p><p>Für Postgres-Container würde ich Renovate übrigens ausschließen. Major-Upgrades zwischen Postgres-Versionen erfordern einen manuellen Datenbankdump und -import, das soll mir kein Bot automatisch reinschießen.</p><h2 id="webhook-installieren-und-konfigurieren">webhook installieren und konfigurieren<a href="#webhook-installieren-und-konfigurieren" class="heading-anchor" aria-label="Diesen Abschnitt verlinken"><svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a></h2><p><code>webhook</code> gibt es als einzelnes Binary, alternativ auch als Paket:</p><div class="code-block"><div class="code-block-header"><span class="code-lang-label">bash</span><button class="code-copy-btn" type="button" aria-label="Code kopieren" data-umami-event="Code Copy" data-umami-event-lang="bash"><svg class="icon-copy" xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"/><path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"/></svg><svg class="icon-check" xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><polyline points="20 6 9 17 4 12"/></svg></button></div><div class="highlight"><pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>apt install webhook</span></span></code></pre></div></div><p>Die Konfiguration liegt unter<code>/etc/webhook/webhook.conf</code>:</p><div class="code-block"><div class="code-block-header"><span class="code-lang-label">yaml</span><button class="code-copy-btn" type="button" aria-label="Code kopieren" data-umami-event="Code Copy" data-umami-event-lang="yaml"><svg class="icon-copy" xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"/><path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"/></svg><svg class="icon-check" xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><polyline points="20 6 9 17 4 12"/></svg></button></div><div class="highlight"><pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"><code class="language-yaml" data-lang="yaml"><span style="display:flex;"><span>-<span style="color:#7ee787">id</span>:<span style="color:#6e7681"/><span style="color:#a5d6ff">deploy</span><span style="color:#6e7681"/></span></span><span style="display:flex;"><span><span style="color:#6e7681"/><span style="color:#7ee787">execute-command</span>:<span style="color:#6e7681"/><span style="color:#a5d6ff">/opt/scripts/deploy.sh</span><span style="color:#6e7681"/></span></span><span style="display:flex;"><span><span style="color:#6e7681"/><span style="color:#7ee787">command-working-directory</span>:<span style="color:#6e7681"/><span style="color:#a5d6ff">/opt/media-stack</span><span style="color:#6e7681"/></span></span><span style="display:flex;"><span><span style="color:#6e7681"/><span style="color:#7ee787">trigger-rule</span>:<span style="color:#6e7681"/></span></span><span style="display:flex;"><span><span style="color:#6e7681"/><span style="color:#7ee787">match</span>:<span style="color:#6e7681"/></span></span><span style="display:flex;"><span><span style="color:#6e7681"/><span style="color:#7ee787">type</span>:<span style="color:#6e7681"/><span style="color:#a5d6ff">payload-hmac-sha256</span><span style="color:#6e7681"/></span></span><span style="display:flex;"><span><span style="color:#6e7681"/><span style="color:#7ee787">secret</span>:<span style="color:#6e7681"/><span style="color:#a5d6ff">"{{getenv \"WEBHOOK_SECRET\"}}"</span><span style="color:#6e7681"/></span></span><span style="display:flex;"><span><span style="color:#6e7681"/><span style="color:#7ee787">parameter</span>:<span style="color:#6e7681"/></span></span><span style="display:flex;"><span><span style="color:#6e7681"/><span style="color:#7ee787">source</span>:<span style="color:#6e7681"/><span style="color:#a5d6ff">header</span><span style="color:#6e7681"/></span></span><span style="display:flex;"><span><span style="color:#6e7681"/><span style="color:#7ee787">name</span>:<span style="color:#6e7681"/><span style="color:#a5d6ff">X-Gitea-Signature</span></span></span></code></pre></div></div><p>Ein paar Anmerkungen dazu:</p><p><strong>Header-Name:</strong> Gitea schickt die Signatur als<code>X-Gitea-Signature</code> – ohne<code>-256</code>-Suffix und ohne<code>sha256=</code>-Präfix im Wert. Das klingt trivial, hat mich aber beim ersten Versuch einen Debugging-Durchgang gekostet.</p><p><strong>Secret als Umgebungsvariable:</strong> Das HMAC-Secret gehört nicht im Klartext in die Konfigurationsdatei, erst recht nicht wenn die Datei im Repo versioniert ist. Deshalb wird es per<code>getenv</code> aus der Umgebung gelesen.</p><p>Das Secret generieren:</p><div class="code-block"><div class="code-block-header"><span class="code-lang-label">bash</span><button class="code-copy-btn" type="button" aria-label="Code kopieren" data-umami-event="Code Copy" data-umami-event-lang="bash"><svg class="icon-copy" xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"/><path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"/></svg><svg class="icon-check" xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><polyline points="20 6 9 17 4 12"/></svg></button></div><div class="highlight"><pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>openssl rand -hex<span style="color:#a5d6ff">32</span></span></span></code></pre></div></div><p>Und in eine Secrets-Datei schreiben die nur root lesen kann:</p><div class="code-block"><div class="code-block-header"><span class="code-lang-label">bash</span><button class="code-copy-btn" type="button" aria-label="Code kopieren" data-umami-event="Code Copy" data-umami-event-lang="bash"><svg class="icon-copy" xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"/><path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"/></svg><svg class="icon-check" xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><polyline points="20 6 9 17 4 12"/></svg></button></div><div class="highlight"><pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span><span style="color:#8b949e;font-style:italic"># /etc/webhook/secrets.env</span></span></span><span style="display:flex;"><span><span style="color:#79c0ff">WEBHOOK_SECRET</span><span style="color:#ff7b72;font-weight:bold">=</span>dein-generierter-string</span></span></code></pre></div></div><div class="code-block"><div class="code-block-header"><span class="code-lang-label">bash</span><button class="code-copy-btn" type="button" aria-label="Code kopieren" data-umami-event="Code Copy" data-umami-event-lang="bash"><svg class="icon-copy" xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"/><path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"/></svg><svg class="icon-check" xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><polyline points="20 6 9 17 4 12"/></svg></button></div><div class="highlight"><pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>chmod<span style="color:#a5d6ff">600</span> /etc/webhook/secrets.env</span></span></code></pre></div></div><h3 id="systemd-unit">Systemd-Unit<a href="#systemd-unit" class="heading-anchor" aria-label="Diesen Abschnitt verlinken"><svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a></h3><div class="code-block"><div class="code-block-header"><span class="code-lang-label">ini</span><button class="code-copy-btn" type="button" aria-label="Code kopieren" data-umami-event="Code Copy" data-umami-event-lang="ini"><svg class="icon-copy" xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"/><path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"/></svg><svg class="icon-check" xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><polyline points="20 6 9 17 4 12"/></svg></button></div><div class="highlight"><pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"><code class="language-ini" data-lang="ini"><span style="display:flex;"><span><span style="color:#8b949e;font-style:italic"># /etc/systemd/system/webhook.service</span></span></span><span style="display:flex;"><span><span style="color:#ff7b72">[Unit]</span></span></span><span style="display:flex;"><span>Description<span style="color:#ff7b72;font-weight:bold">=</span><span style="color:#a5d6ff">Webhook Receiver</span></span></span><span style="display:flex;"><span>After<span style="color:#ff7b72;font-weight:bold">=</span><span style="color:#a5d6ff">network.target</span></span></span><span style="display:flex;"><span/></span><span style="display:flex;"><span><span style="color:#ff7b72">[Service]</span></span></span><span style="display:flex;"><span>User<span style="color:#ff7b72;font-weight:bold">=</span><span style="color:#a5d6ff">teqqy # Hier den eigenen Usernamen eintragen</span></span></span><span style="display:flex;"><span>EnvironmentFile<span style="color:#ff7b72;font-weight:bold">=</span><span style="color:#a5d6ff">/etc/webhook/secrets.env</span></span></span><span style="display:flex;"><span>ExecStart<span style="color:#ff7b72;font-weight:bold">=</span><span style="color:#a5d6ff">/usr/bin/webhook -hooks /etc/webhook/webhook.conf -port 9000</span></span></span><span style="display:flex;"><span>Restart<span style="color:#ff7b72;font-weight:bold">=</span><span style="color:#a5d6ff">on-failure</span></span></span><span style="display:flex;"><span/></span><span style="display:flex;"><span><span style="color:#ff7b72">[Install]</span></span></span><span style="display:flex;"><span>WantedBy<span style="color:#ff7b72;font-weight:bold">=</span><span style="color:#a5d6ff">multi-user.target</span></span></span></code></pre></div></div><p><code>User=teqqy</code> sorgt dafür dass der webhook-Daemon und damit auch das Deploy-Script nicht als root laufen. Das ist mir wichtig – Prozesse die nur git pull und docker compose up ausführen müssen haben nichts als root verloren. Den Usernamen natürlich durch den eigenen ersetzen; der User braucht Zugriff auf das Repo-Verzeichnis und muss Mitglied der<code>docker</code>-Gruppe sein.</p><p><code>EnvironmentFile</code> lädt die<code>secrets.env</code> und stellt<code>WEBHOOK_SECRET</code> als Umgebungsvariable bereit, bevor der Prozess startet – so kommt das Secret sauber in den<code>getenv</code>-Aufruf der Konfiguration.<code>Restart=on-failure</code> sorgt dafür dass der Daemon bei einem unerwarteten Absturz automatisch neu startet, ohne dass man manuell eingreifen muss.</p><div class="code-block"><div class="code-block-header"><span class="code-lang-label">bash</span><button class="code-copy-btn" type="button" aria-label="Code kopieren" data-umami-event="Code Copy" data-umami-event-lang="bash"><svg class="icon-copy" xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"/><path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"/></svg><svg class="icon-check" xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><polyline points="20 6 9 17 4 12"/></svg></button></div><div class="highlight"><pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>systemctl enable --now webhook</span></span></code></pre></div></div><h2 id="gitea-webhook-einrichten">Gitea Webhook einrichten<a href="#gitea-webhook-einrichten" class="heading-anchor" aria-label="Diesen Abschnitt verlinken"><svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a></h2><p>In Gitea unter<code>Repository → Einstellungen → Webhooks → Webhook hinzufügen → Gitea</code>:</p><ul><li><strong>Ziel-URL:</strong><code>http://media01.example.com:9000/hooks/deploy</code></li><li><strong>Secret:</strong> denselben String den du oben generiert hast</li><li><strong>Trigger:</strong> Nur<code>Push</code>-Events reichen aus</li></ul><p>Gitea berechnet bei jedem Push automatisch eine HMAC-SHA256-Signatur über den Request-Body und schickt sie als<code>X-Gitea-Signature</code>-Header mit. Das webhook-Binary verifiziert die Signatur bevor es das Script ausführt – ein simpler Authorization-Header wäre hier deutlich unsicherer, weil man den Payload damit nicht gegen Manipulation absichert.</p><p>Port 9000 sollte nicht direkt ins Internet exponiert sein. In meinem Setup sind Gitea und der webhook-Daemon im selben internen Netz, der Port ist von außen nicht erreichbar. Wer den Endpunkt für eine externe Gitea-Instanz oder GitHub erreichbar machen muss, sollte das zumindest hinter einem Reverse Proxy mit IP-Beschränkung tun.</p><h2 id="das-deploy-script">Das Deploy-Script<a href="#das-deploy-script" class="heading-anchor" aria-label="Diesen Abschnitt verlinken"><svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a></h2><div class="code-block"><div class="code-block-header"><span class="code-lang-label">bash</span><button class="code-copy-btn" type="button" aria-label="Code kopieren" data-umami-event="Code Copy" data-umami-event-lang="bash"><svg class="icon-copy" xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"/><path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"/></svg><svg class="icon-check" xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><polyline points="20 6 9 17 4 12"/></svg></button></div><div class="highlight"><pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span><span style="color:#8b949e;font-weight:bold;font-style:italic">#!/bin/bash</span></span></span><span style="display:flex;"><span>set -euo pipefail</span></span><span style="display:flex;"><span/></span><span style="display:flex;"><span><span style="color:#79c0ff">REPO</span><span style="color:#ff7b72;font-weight:bold">=</span>/opt/media-stack</span></span><span style="display:flex;"><span><span style="color:#79c0ff">LOG</span><span style="color:#ff7b72;font-weight:bold">=</span>/opt/deploy-logs/deploy-<span style="color:#ff7b72">$(</span>date +%Y%m%d-%H%M%S<span style="color:#ff7b72">)</span>.log</span></span><span style="display:flex;"><span/></span><span style="display:flex;"><span>exec &gt;&gt;<span style="color:#a5d6ff">"</span><span style="color:#79c0ff">$LOG</span><span style="color:#a5d6ff">"</span> 2&gt;&amp;<span style="color:#a5d6ff">1</span></span></span><span style="display:flex;"><span/></span><span style="display:flex;"><span>echo<span style="color:#a5d6ff">"=== Deploy</span><span style="color:#ff7b72">$(</span>date<span style="color:#ff7b72">)</span><span style="color:#a5d6ff"> ==="</span></span></span><span style="display:flex;"><span/></span><span style="display:flex;"><span>cd<span style="color:#a5d6ff">"</span><span style="color:#79c0ff">$REPO</span><span style="color:#a5d6ff">"</span></span></span><span style="display:flex;"><span>git pull origin main</span></span><span style="display:flex;"><span>docker compose up -d --remove-orphans</span></span><span style="display:flex;"><span>docker compose ps</span></span><span style="display:flex;"><span/></span><span style="display:flex;"><span>echo<span style="color:#a5d6ff">"=== Done ==="</span></span></span></code></pre></div></div><p><code>set -euo pipefail</code> sorgt dafür dass das Script bei jedem Fehler sofort abbricht und einen Exit-Code ≠ 0 zurückgibt. Den loggt webhook dann ebenfalls, sodass<code>journalctl -u webhook</code> bei Problemen der erste Anlaufpunkt ist.</p><p>Das Log-Verzeichnis muss dem ausführenden User gehören:</p><div class="code-block"><div class="code-block-header"><span class="code-lang-label">bash</span><button class="code-copy-btn" type="button" aria-label="Code kopieren" data-umami-event="Code Copy" data-umami-event-lang="bash"><svg class="icon-copy" xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"/><path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"/></svg><svg class="icon-check" xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><polyline points="20 6 9 17 4 12"/></svg></button></div><div class="highlight"><pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>mkdir -p /opt/deploy-logs</span></span><span style="display:flex;"><span>chown teqqy:teqqy /opt/deploy-logs</span></span></code></pre></div></div><h2 id="stolpersteine-die-ich-unterwegs-getroffen-habe">Stolpersteine die ich unterwegs getroffen habe<a href="#stolpersteine-die-ich-unterwegs-getroffen-habe" class="heading-anchor" aria-label="Diesen Abschnitt verlinken"><svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a></h2><p><strong><code>.git</code>-Verzeichnis Ownership:</strong> Wenn das Repo irgendwann mal als anderer User geklont oder gepullt wurde, verweigert Git den Zugriff mit einer Warnung zu &ldquo;dubiosen Besitzverhältnissen&rdquo;. Fix:</p><div class="code-block"><div class="code-block-header"><span class="code-lang-label">bash</span><button class="code-copy-btn" type="button" aria-label="Code kopieren" data-umami-event="Code Copy" data-umami-event-lang="bash"><svg class="icon-copy" xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"/><path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"/></svg><svg class="icon-check" xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><polyline points="20 6 9 17 4 12"/></svg></button></div><div class="highlight"><pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>chown -R teqqy:teqqy /opt/media-stack/.git</span></span></code></pre></div></div><p><strong><code>safe.directory</code>:</strong> In manchen Setups hilft zusätzlich:</p><div class="code-block"><div class="code-block-header"><span class="code-lang-label">bash</span><button class="code-copy-btn" type="button" aria-label="Code kopieren" data-umami-event="Code Copy" data-umami-event-lang="bash"><svg class="icon-copy" xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"/><path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"/></svg><svg class="icon-check" xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><polyline points="20 6 9 17 4 12"/></svg></button></div><div class="highlight"><pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>git config --global --add safe.directory /opt/media-stack</span></span></code></pre></div></div><p><strong><code>/var/log</code> Permissions:</strong> Der ausführende User hat dort keine Schreibrechte. Deshalb das Log-Verzeichnis in einen Pfad legen der dem User gehört – ich nutze<code>/opt/deploy-logs</code>.</p><p><strong><code>*arr</code>-Container und UID/GID:</strong> Meine<code>*arr</code>-Container laufen mit<code>99:100</code> (Unraid-kompatibel wegen NFS). Beim allerersten Deployment legt Docker die Bind-Mount-Verzeichnisse mit<code>1000:1000</code> an wenn sie noch nicht existieren. Einmalig vor dem ersten Start:</p><div class="code-block"><div class="code-block-header"><span class="code-lang-label">bash</span><button class="code-copy-btn" type="button" aria-label="Code kopieren" data-umami-event="Code Copy" data-umami-event-lang="bash"><svg class="icon-copy" xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"/><path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"/></svg><svg class="icon-check" xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><polyline points="20 6 9 17 4 12"/></svg></button></div><div class="highlight"><pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>chown -R 99:100 /mnt/data/arr/</span></span></code></pre></div></div><p>Danach ist das kein Thema mehr da die Verzeichnisse bereits existieren.</p><h2 id="monitoring">Monitoring<a href="#monitoring" class="heading-anchor" aria-label="Diesen Abschnitt verlinken"><svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a></h2><p>Ich setze<a href="https://uptime.kuma.pet/" target="_blank" rel="noopener noreferrer">Uptime Kuma<svg class="link-external-icon" aria-hidden="true" focusable="false" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"/><polyline points="15 3 21 3 21 9"/><line x1="10" y1="14" x2="21" y2="3"/></svg><span class="visually-hidden"> (externer Link)</span></a>
ein und beobachte dort ob die Container nach einem Deployment noch sauber laufen. Das reicht für meinen Use Case: Wenn ein Container nach einem fehlgeschlagenen Update nicht mehr antwortet, schlägt Uptime Kuma an. Das deploy.log und<code>journalctl -u webhook</code> liefern dann die Details warum es schiefgelaufen ist.</p><p>Ein Dead-Man&rsquo;s-Switch (z. B. über Healthchecks.io) wäre der nächste sinnvolle Schritt wenn man auch merken will wenn ein Deploy einfach<em>ausbleibt</em> – aber für einen Media-Stack ist das für mich nicht kritisch genug um extra Aufwand zu treiben.</p><h2 id="fazit">Fazit<a href="#fazit" class="heading-anchor" aria-label="Diesen Abschnitt verlinken"><svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a></h2><p>Das Setup ist jetzt seit kurzem in Betrieb und macht genau was es soll – ohne dass ich irgendwas an Komodo debuggen muss. Das webhook-Binary ist stabil, der Deployment-Flow ist deterministisch, und der Gesamtoverhead beschränkt sich auf ein paar Konfigurationsdateien und ein Shell-Script.</p><p>Wer ähnliche Anforderungen hat und kein Kubernetes betreiben möchte: Das ist meiner Meinung nach der pragmatischste Weg. Keine Magie, keine Frameworks, kein Overengineering. Nur git pull und docker compose up.</p><p>Bei Fragen oder Anmerkungen erreichst du mich über die Links in der Menüleiste.</p>
]]></content:encoded><category>gitops</category><category>docker</category><category>gitea</category><category>renovate</category><category>homelab</category></item><item><title>Selfhosted Setup 2025: Mein neuer Workflow mit Proxmox, Komodo und GitOps</title><link>https://www.teqqy.de/selfhosted-setup-2025-mein-neuer-workflow-mit-proxmox-komodo-und-gitops/</link><pubDate>Sun, 30 Nov 2025 12:20:00 +0100</pubDate><lastBuildDate>Sun, 30 Nov 2025 12:20:00 +0100</lastBuildDate><guid isPermaLink="true">https://www.teqqy.de/selfhosted-setup-2025-mein-neuer-workflow-mit-proxmox-komodo-und-gitops/</guid><description>Diejenigen die ein Homelab auch zum experimentieren und lernen nutzen, kennen das Problem: Nichts ist richtig und irgendwie machen alle anderen alles immer besser, schöner, toller. Naja, zumindest mir gehts häufig so wenn ich Blogbeiträge oder Posts in r/homelab (externer Link) lese. Eine längere Zeit nutzte ich Kubernetes für mein Homelab und habe damit einige Dinge gelernt. Die Umgebung hat auch Spaß gemacht, wurde mir aber irgendwann zu anstrengend zu administrieren. Ich setze Kubernetes nicht in meinem normalen Berufsleben ein, sodass mir häufig die Übung fehlt. Und daheim: Nunja, ist ja eher ein Homeprod als ein Homelab. Was ich in der ganzen Zeit aber super fand ist das GitOps Prinzip. Es machte die Pflege von Versionen einfach ohne mal wieder in einen riesen breaking change gelaufen zu sein der &amp;ldquo;alles kaputt macht&amp;rdquo;.</description><content:encoded>&lt;![CDATA[<p>Diejenigen die ein Homelab auch zum experimentieren und lernen nutzen, kennen das Problem: Nichts ist richtig und irgendwie machen alle anderen alles immer besser, schöner, toller. Naja, zumindest mir gehts häufig so wenn ich Blogbeiträge oder Posts in<a href="https://www.reddit.com/r/homelab/" target="_blank" rel="noopener noreferrer">r/homelab<svg class="link-external-icon" aria-hidden="true" focusable="false" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"/><polyline points="15 3 21 3 21 9"/><line x1="10" y1="14" x2="21" y2="3"/></svg><span class="visually-hidden"> (externer Link)</span></a>
lese. Eine längere Zeit nutzte ich Kubernetes für mein Homelab und habe damit einige Dinge gelernt. Die Umgebung hat auch Spaß gemacht, wurde mir aber irgendwann zu anstrengend zu administrieren. Ich setze Kubernetes nicht in meinem normalen Berufsleben ein, sodass mir häufig die Übung fehlt. Und daheim: Nunja, ist ja eher ein Homeprod als ein Homelab. Was ich in der ganzen Zeit aber super fand ist das GitOps Prinzip. Es machte die Pflege von Versionen einfach ohne mal wieder in einen riesen breaking change gelaufen zu sein der &ldquo;alles kaputt macht&rdquo;.</p><aside class="callout callout-info" role="note" aria-label="Hinweis"><svg class="callout-icon" aria-hidden="true" focusable="false" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="10"/><line x1="12" y1="8" x2="12" y2="12"/><line x1="12" y1="16" x2="12.01" y2="16"/></svg><div class="callout-content"><p class="callout-title">Hinweis</p><div class="callout-body"><strong>GitOps</strong> ist ein Ansatz, bei dem Git als Single Source of Truth für die gesamte Infrastruktur- und Anwendungs­konfiguration dient. Änderungen werden über Pull Requests versioniert und automatisiert von CI/CD-Pipelines oder Deploy-Operatoren (z. B. Argo CD, Flux) in die Zielumgebungen übernommen. Dadurch werden Deployments reproduzierbarer, auditierbarer und leichter automatisierbar. GitOps fördert zudem konsistente Workflows, die sowohl für Entwickler als auch für Operations-Teams gut nachvollziehbar sind.</div></div></aside><p>Mein Homelab sah also nach dem Weggang von Kubernetes so aus, dass ich diverse VMs für Docker Container hatte und divere LXC für einzelne Anwendungen. Ich hatte die meisten Container mittels<em>:latest</em> Tag versehen um mich so nicht mehr um die Updates großartig kümmern zu müssen. Watchtower hat sich dann um die Updates entsprechend gekümmert. Bei größeren Tools, oder denen häufiger ein breaking change enthalten ist, wie z. B. bei Immich, habe ich die Version gepinnt. Bekomme so aber nicht mehr mit wann ein neues Update erschienen ist. Zumindest nicht, wenn die Software nicht in ihrer Weboberfläche einen erinnert.</p><p>Als ich dann vor einiger Zeit auf Komodo aufmerksam gemacht wurde, haben sich meine Gedanken über mehrere Tage hinweg damit beschäftigt wie ich die Software gut in mein Homelab einbauen kann. Komodo ermöglicht nämlich das GitOps Prinzip bei Docker bzw. Docker Compose Umgebungen.</p><h2 id="das-grundprinzip-meines-homelabs">Das Grundprinzip meines Homelabs<a href="#das-grundprinzip-meines-homelabs" class="heading-anchor" aria-label="Diesen Abschnitt verlinken"><svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a></h2><p>Nachdem ich mir ein paar Blog Beiträge (z. B.<a href="https://nickcunningh.am/blog/how-to-automate-version-updates-for-your-self-hosted-docker-containers-with-gitea-renovate-and-komodo" target="_blank" rel="noopener noreferrer">den<svg class="link-external-icon" aria-hidden="true" focusable="false" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"/><polyline points="15 3 21 3 21 9"/><line x1="10" y1="14" x2="21" y2="3"/></svg><span class="visually-hidden"> (externer Link)</span></a>
hier) und YouTube Videos (z. B.<a href="https://www.youtube.com/watch?v=O22C8Q1u4fA" target="_blank" rel="noopener noreferrer">das<svg class="link-external-icon" aria-hidden="true" focusable="false" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"/><polyline points="15 3 21 3 21 9"/><line x1="10" y1="14" x2="21" y2="3"/></svg><span class="visually-hidden"> (externer Link)</span></a>
hier) zu Komodo angeguckt habe, war mir klar, dass ich meine Docker Installationen damit verwalten werde. Gerade der Blog Post von Nick hat mich auch dazu gebracht wie das ganze im &ldquo;Backend&rdquo; ggf. aussehen könnte.</p><p>Der Stromverbrauch meines Homelabs hatte sich die ganzen Monate immer so zwischen 120 W und 150 W bewegt. Nichts tragisches für mich, aber ggf wäre auch eine Reduzierung möglich. Zudem hatte ich die ganze Zeit sämtliche Dinge immer auf meinen Unraid Server gesichert. Das wollte ich auch ändern. Ziel war es also alles auf einen Proxmox Host, anstatt vorher drei Kubernetes Nodes, zu bringen. Dazu sollte der Proxmox Backup Server als dedizierte Maschine mit eigenem Stroage bereit stehen. Die NFS implementierung von Unraid ist einfach extrem nervig.</p><p>Des weiteren wollte ich nicht mehr duzende virtuelle Maschinen oder LXC auf dem System am laufen haben, es soll alles etwas verschlankt werden. Allerdings bin und war ich nie ein Fan davon alles in eine VM zu quetschen. Aber das muss jeder für sich selbst entscheiden.</p><h2 id="wie-sieht-mein-homelab-jetzt-aus">Wie sieht mein Homelab jetzt aus?<a href="#wie-sieht-mein-homelab-jetzt-aus" class="heading-anchor" aria-label="Diesen Abschnitt verlinken"><svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a></h2><p>Mittlerweile habe ich nur zwei Thin Clients am laufen: Einen als Proxmox Host und einen als Proxmox Backup Server. Natürlich mein Unraid NAS noch zusätzlich. Aber auf dem Proxmox Server läuft jetzt alles. Der ist zwar sehr gut ausgelastet, wird aber in der nächsten Zeit noch durch einen Minisforum MS-01 ersetzt. Das hat den Vorteil, dass ich den PVE dann auch via 10 GBit anschließen kann. Perspektivisch würde ich nämlich gerne das Netzwerk etwas aufrüsten.</p><p>Die Fragmentierung meiner virtuellen Systeme hat auch stark nachgelassen. Auch wenn es noch etwas mehr sind als geplant. Manche Systeme lassen sich einfach schwer containerisieren bzw. möchte ich auf Grund von Hardwareressourcennutzung separieren. Im Grundlegenden habe ich vier wichtige virtuelle Maschinen:</p><ol><li>infra01 - Für Infrastruktur relevante Systeme</li><li>docker01 - Für meine ganzen &ldquo;normalen&rdquo; Anwendungen</li><li>media01 - Für alle Anwendungen rund um Bewegbild</li><li>ha01 - Home Assistant</li></ol><p><img src="/selfhosted-setup-2025-mein-neuer-workflow-mit-proxmox-komodo-und-gitops/images/proxmox-uebersicht_hu_ebc2d9bafe5ad3fa.webp" srcset="/selfhosted-setup-2025-mein-neuer-workflow-mit-proxmox-komodo-und-gitops/images/proxmox-uebersicht_hu_c0c0440d57e8c052.webp 384w, /selfhosted-setup-2025-mein-neuer-workflow-mit-proxmox-komodo-und-gitops/images/proxmox-uebersicht_hu_ebc2d9bafe5ad3fa.webp 768w" sizes="(max-width: 768px) 100vw, 768px" alt="Screenshot meines Proxmox Servers" loading="eager" fetchpriority="high" decoding="async" width="768" height="216"/><p>Dazu gesellen sich noch zwei AdguardHome LXC, meine LXC für die Wetterstation und Wetter Webseite sowie Nextcloud (zieht aber auch bald um). Gehen wir mal auf die einzelnen Systeme ein.</p><h3 id="infra01---das-backend-meine-homelabs">infra01 - Das Backend meine Homelabs<a href="#infra01---das-backend-meine-homelabs" class="heading-anchor" aria-label="Diesen Abschnitt verlinken"><svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a></h3><p>Als so ziemlich wichtigste virtuelle Maschine der neuen Infastruktur ist diese VM quasi das Herzstück des ganzen. Hier werden alle relevanten Anwendungen gehostet. Diese Maschine ist aber leider auch gewisser single point of failure. Dadurch das ich kein Cluster mehr betreibe, würde sich der Punkt sonst einfach nur verschieben. Da wir später noch auf den genauen Workflow eingehen werden liste ich euch nur die dortigen Anwendunge einmal auf:</p><ul><li>Traefik: Mein GoTo Reverse Proxy den ich eigentlich überall einsetze (Webseite:<a href="https://traefik.io" target="_blank" rel="noopener noreferrer">https://traefik.io<svg class="link-external-icon" aria-hidden="true" focusable="false" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"/><polyline points="15 3 21 3 21 9"/><line x1="10" y1="14" x2="21" y2="3"/></svg><span class="visually-hidden"> (externer Link)</span></a>
)</li><li>Gitea: Interner GIT Server für sämtliche Konfigurationsdateien (Webseite:<a href="https://about.gitea.com/" target="_blank" rel="noopener noreferrer">https://about.gitea.com/<svg class="link-external-icon" aria-hidden="true" focusable="false" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"/><polyline points="15 3 21 3 21 9"/><line x1="10" y1="14" x2="21" y2="3"/></svg><span class="visually-hidden"> (externer Link)</span></a>
)</li><li>Komodo: Deployment der Container (Webseite:<a href="https://komo.do/" target="_blank" rel="noopener noreferrer">https://komo.do/<svg class="link-external-icon" aria-hidden="true" focusable="false" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"/><polyline points="15 3 21 3 21 9"/><line x1="10" y1="14" x2="21" y2="3"/></svg><span class="visually-hidden"> (externer Link)</span></a>
)</li><li>Uptime-Kuma: Verfügbarkeitsmonitoring der Anwendungen (Webseite:<a href="https://uptimekuma.org/" target="_blank" rel="noopener noreferrer">https://uptimekuma.org/<svg class="link-external-icon" aria-hidden="true" focusable="false" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"/><polyline points="15 3 21 3 21 9"/><line x1="10" y1="14" x2="21" y2="3"/></svg><span class="visually-hidden"> (externer Link)</span></a>
)</li><li>Authentik: Single Sign On für fast alle Anwendungen (Webseite:<a href="https://goauthentik.io/" target="_blank" rel="noopener noreferrer">https://goauthentik.io/<svg class="link-external-icon" aria-hidden="true" focusable="false" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"/><polyline points="15 3 21 3 21 9"/><line x1="10" y1="14" x2="21" y2="3"/></svg><span class="visually-hidden"> (externer Link)</span></a>
)</li><li>Beszel: Lastmonitoring der Systeme (Webseite:<a href="https://beszel.dev/" target="_blank" rel="noopener noreferrer">https://beszel.dev/<svg class="link-external-icon" aria-hidden="true" focusable="false" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"/><polyline points="15 3 21 3 21 9"/><line x1="10" y1="14" x2="21" y2="3"/></svg><span class="visually-hidden"> (externer Link)</span></a>
)</li></ul><h3 id="docker01---anwendungen-des-täglichen-bedarfs">docker01 - Anwendungen des täglichen Bedarfs<a href="#docker01---anwendungen-des-t%c3%a4glichen-bedarfs" class="heading-anchor" aria-label="Diesen Abschnitt verlinken"><svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a></h3><p>Auf dieser VM lasse ich so ziemlich alle Anwendungen laufen die nicht auf die beiden anderen Systeme gehören. Gegebenenfalls wird hier zu einem späteren Zeitpunkt noch mal eine zweite VM hinzu kommen um die Apps ein wenig zu verteilen. Schlussendlich laufen hier die Apps die ich in<a href="/meine-top-10-selfhosted-und-homelab-software-2025-lieblings-tools-fuers-neue-jahr/">meiner Top 10 schon verbloggt habe</a>
. Zusätlich aber auch Dinge wie</p><ul><li>Treafik</li><li>AdGuardHome Sync: Synct meine beiden AdGuardHome LXC (Webseite:<a href="https://github.com/bakito/adguardhome-sync" target="_blank" rel="noopener noreferrer">https://github.com/bakito/adguardhome-sync<svg class="link-external-icon" aria-hidden="true" focusable="false" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"/><polyline points="15 3 21 3 21 9"/><line x1="10" y1="14" x2="21" y2="3"/></svg><span class="visually-hidden"> (externer Link)</span></a>
)</li><li>autokuma: Halbautomatisches hinzufügen der Anwendungen zu Uptime Kuma (Webseite:<a href="https://github.com/BigBoot/AutoKuma" target="_blank" rel="noopener noreferrer">https://github.com/BigBoot/AutoKuma<svg class="link-external-icon" aria-hidden="true" focusable="false" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"/><polyline points="15 3 21 3 21 9"/><line x1="10" y1="14" x2="21" y2="3"/></svg><span class="visually-hidden"> (externer Link)</span></a>
)</li><li>beszel-agent: Monitoring Agent für Beszel</li></ul><h3 id="media01---für-das-bewegbild">media01 - Für das Bewegbild<a href="#media01---f%c3%bcr-das-bewegbild" class="heading-anchor" aria-label="Diesen Abschnitt verlinken"><svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a></h3><p>Alle Anwendungen rund um Filme und Serien, bis auf Jellyfin finden sich hier. Jellyfin hat seinen eigenen LXC bekommen um besser auf die iGPU des Hostsystems zugreifen zu können. Zwar sind 99 % aller Medienwiedergaben DirectPlay, aber man weiß ja nie.</p><h2 id="mein-workflow">Mein Workflow<a href="#mein-workflow" class="heading-anchor" aria-label="Diesen Abschnitt verlinken"><svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a></h2><p>Schlussendlich ist es bis hier hier nicht so wirklich spannend. Einfach nur wie ich die diversen Anwendungen auf diverse virtuelle System aufteile. Spannender wird es aber mit dem eigentlichen Workflow, denn der nutzt wieder das GitOps Prinzip. Da Komodo leider keine verschlüsselten Secrets kann, wollte ich meine compose Dateien nicht mehr auf GitHub hosten, sondern auf meinem eigenen GIT Server. Für diese Zwecke nutze ich schon immer gitea, auch wenn es da mittlerweile diverse Alternativen gibt.</p><p>Ich habe also zwei Repositories auf meinem Git Server erstellt, einen für den docker01 als &ldquo;apps-stack&rdquo; sowie für den media01 als &ldquo;media-stack&rdquo;. Das sind 08-15 compose Dateien ohne weiteren besonderen Konfigurationen. Sobald ich Änderungen pushe wird ein Webhook zu Komodo gesendet. Dieser triggert dort einen Workflow um das Repo zu aktuallisieren und die Änderungen entsprechend auf dem Zielsystem zu deployen. Ich kann über diesen Weg auch dedizierte Konfigurationsdateien mitgeben die einzelne Anwendungen benötigen. So habe ich alles immer zusammen in einem Repo. Dieses Vorgehen gilt, wie geschrieben, für die den docker01 sowie für den media01.
Die Anwendungen auf dem infra01 werden so nicht deployed. Gitea installieren zu können ohne ihn zu haben funktioniert nunmal nicht. Sobald Komodo verschlüsselte Secrets beherrscht würde ich die Dateien sicherlich wieder auf GitHub auslagern um direkt mit dem Deployment starten zu können.</p><h2 id="update-management-der-container">Update Management der Container<a href="#update-management-der-container" class="heading-anchor" aria-label="Diesen Abschnitt verlinken"><svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a></h2><p>In meinen Compose Dateien versuche ich Container zu verwenden deren Entwickler semver verwendet. Damit habe ich es einfacher die Container leichter zu updaten. Okay, eigentlich habe ICH es nicht einfacher, sondern Renovate. Renovate habe ich auch bereits in meinem Kubernetes Cluster verwendet, damals als SaaS jetzt auch selfhosted. Renovate läuft alle vier Stunden per cronjob und überprüft ob es in den angebenen Container Registry eine neuere Version gibt. Sobald das der Fall ist, erstellt mir der Service einen Pull Request in dem jeweilgen Repository. Diesen kann ich dann entsprechend aktzeptieren und der o. a. Workflow wird getriggert.</p><p><img src="/selfhosted-setup-2025-mein-neuer-workflow-mit-proxmox-komodo-und-gitops/images/renovate-pull-request-beispiel_hu_ec0696737f1b0236.webp" srcset="/selfhosted-setup-2025-mein-neuer-workflow-mit-proxmox-komodo-und-gitops/images/renovate-pull-request-beispiel_hu_245ad6a9db0fd2b7.webp 384w, /selfhosted-setup-2025-mein-neuer-workflow-mit-proxmox-komodo-und-gitops/images/renovate-pull-request-beispiel_hu_ec0696737f1b0236.webp 768w" sizes="(max-width: 768px) 100vw, 768px" alt="gitea pull request beispiel" loading="lazy" fetchpriority="auto" decoding="async" width="768" height="467"/><p>Sollte eine Anwendung extrem häufig eine neue Version veröffentlichen, kann ich natürlich auch ein automatisches commit erstellen, dann muss ich nicht mehr händisch eingreifen. Auf der anderen Seite kann z. B. Postgres bei Upgrades auf neue Versionen unschön werden. Derzeit wird es noch nicht unterstützt, dass die Datenbank einfach auf die neue Version gehoben wird, wie das bei MySQL oder MariaDB der Fall ist. Entsprechend schließe ich die Postgres Container von Renovate aus und belasse sie derzeit auf Version 17.</p><h2 id="backup-und-restore">Backup und Restore<a href="#backup-und-restore" class="heading-anchor" aria-label="Diesen Abschnitt verlinken"><svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a></h2><p>Im vorherigen Proxmox Cluster habe ich Unraid als NFS Storage eingebunden und darauf meine Backups gespeichert. Auch mit dem Proxmox Backup Server als virtuelle Maschine hatte ich eine Zeit lang dieses Vorgehen. Wie du Unraid NFS Shares als Ziel im Proxmox Backup Server einbindest, kannst du in<a href="/proxmox-backup-server-auf-unraid-via-nfs-sichern/">diesem</a>
Beitrag lesen.</p><p>Weiter oben habe ich bereits erwähnt, dass ich nun einen dedizierten PBS einsetze. Dieser ist mit einer 1 TB großen SSD ausgestattet auf dem ich meine Backups speichere. Zuküftig möchte ich noch ein Backupsatz außer Haus speichern, weil ich sonst das 3-2-1-Prinzip nicht einhalten kann und mir das schon wichtig ist.</p><aside class="callout callout-info" role="note" aria-label="Hinweis"><svg class="callout-icon" aria-hidden="true" focusable="false" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="10"/><line x1="12" y1="8" x2="12" y2="12"/><line x1="12" y1="16" x2="12.01" y2="16"/></svg><div class="callout-content"><p class="callout-title">Hinweis</p><div class="callout-body">Das<strong>3-2-1</strong>-Backup-Prinzip beschreibt eine einfache Strategie, um Daten zuverlässig zu schützen. Dabei existieren<strong>3</strong> Kopien der Daten, gespeichert auf<strong>2</strong> unterschiedlichen Medien, wobei<strong>1</strong> Kopie extern (z. B. Offsite oder in der Cloud) aufbewahrt wird. Dieses Vorgehen reduziert das Risiko von Datenverlust durch Hardwarefehler, menschliche Fehler oder Katastrophen erheblich. Es gilt als bewährter Standard für sichere und robuste Backup-Konzepte.</div></div></aside><h2 id="fazit">Fazit<a href="#fazit" class="heading-anchor" aria-label="Diesen Abschnitt verlinken"><svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a></h2><p>Das Setup läuft jetzt noch nicht so lange, fühlt sich für mich aber stabiler und kompletter an. Zudem habe ich die Updates der Anwendungen wieder besser im Griff. Allerdings muss ich mich noch um die Updates für die Betriebssysteme kümmern. Dazu werde ich mir sicherlich ein Ansible Playbook schreiben dass das für mich vereinfachen wird. Solltest du Fragen oder Anregungen zu irgendwelchen Punkten haben, kontaktiere mich einfach über die Wege oben in der Menüleiste.</p>
]]></content:encoded><category>proxmox</category><category>komodo</category><category>gitops</category><category>gitea</category></item><item><title>Meine Top 10 Selfhosted &amp; Homelab Software 2025 – Lieblings-Tools fürs neue Jahr</title><link>https://www.teqqy.de/meine-top-10-selfhosted-und-homelab-software-2025-lieblings-tools-fuers-neue-jahr/</link><pubDate>Mon, 13 Oct 2025 17:20:00 +0100</pubDate><lastBuildDate>Mon, 13 Oct 2025 17:20:00 +0100</lastBuildDate><guid isPermaLink="true">https://www.teqqy.de/meine-top-10-selfhosted-und-homelab-software-2025-lieblings-tools-fuers-neue-jahr/</guid><description>Wie in den Jahren 2021 und 2024 möchte ich auch dieses Jahr wieder eine Liste mit meinen Lieblingssoftwareprodukten verbloggen. Ich finde solche Beiträge immer sehr interessant, weil man dort oft kleine Schätze entdeckt. Zumeist – so ehrlich muss man wohl sein – finden sich aber häufig die altbekannten Produkte in solchen Listen. Nichtsdestotrotz werden dieses Jahr sicherlich drei selfhosted Produkte dabei sein, die nicht jeder von euch kennen wird.
Platz 10: Wanderer Beginnen möchte ich die Liste mit der App Wanderer (externer Link) . Hier kannst du deine Wanderrouten sammeln – quasi ein Komoot fürs Selfhosting. Leider kann die App selbst keine Routen aufzeichnen, aber mittels GPX, Strava oder Komoot lassen sich deine Touren importieren und dort verwalten. Außerdem kannst du sie mit weiteren Informationen anreichern.</description><content:encoded>&lt;![CDATA[<p>Wie in den Jahren<a href="/2021-11-meine-top-10-homelab-services/">2021</a>
und<a href="/meine-top-10-homelab-services-2024/">2024</a>
möchte ich auch dieses Jahr wieder eine Liste mit meinen Lieblingssoftwareprodukten verbloggen. Ich finde solche Beiträge immer sehr interessant, weil man dort oft kleine Schätze entdeckt. Zumeist – so ehrlich muss man wohl sein – finden sich aber häufig die altbekannten Produkte in solchen Listen. Nichtsdestotrotz werden dieses Jahr sicherlich drei selfhosted Produkte dabei sein, die nicht jeder von euch kennen wird.</p><h2 id="platz-10-wanderer">Platz 10: Wanderer<a href="#platz-10-wanderer" class="heading-anchor" aria-label="Diesen Abschnitt verlinken"><svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a></h2><p>Beginnen möchte ich die Liste mit der App<a href="https://wanderer.to" target="_blank" rel="noopener noreferrer">Wanderer<svg class="link-external-icon" aria-hidden="true" focusable="false" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"/><polyline points="15 3 21 3 21 9"/><line x1="10" y1="14" x2="21" y2="3"/></svg><span class="visually-hidden"> (externer Link)</span></a>
. Hier kannst du deine Wanderrouten sammeln – quasi ein<em>Komoot fürs Selfhosting</em>. Leider kann die App selbst keine Routen aufzeichnen, aber mittels GPX, Strava oder Komoot lassen sich deine Touren importieren und dort verwalten. Außerdem kannst du sie mit weiteren Informationen anreichern.</p><p>Seit einem der letzten Updates kannst du deine neuen Aktivitäten im Fediverse mit anderen teilen. So lassen sich schnell neue Routen von Menschen auf der ganzen Welt entdecken.</p><p>Ich mag die Software, weil ich nach der Übernahme und der Preiserhöhung bei Komoot keine Lust mehr auf die App hatte und nach Alternativen gesucht habe. Wenn ich wandern gehe, logge ich die Route mit Strava und importiere sie anschließend in Wanderer.</p><h2 id="platz-9-nextcloud">Platz 9: Nextcloud<a href="#platz-9-nextcloud" class="heading-anchor" aria-label="Diesen Abschnitt verlinken"><svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a></h2><p><a href="https://nextcloud.com" target="_blank" rel="noopener noreferrer">Nextcloud<svg class="link-external-icon" aria-hidden="true" focusable="false" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"/><polyline points="15 3 21 3 21 9"/><line x1="10" y1="14" x2="21" y2="3"/></svg><span class="visually-hidden"> (externer Link)</span></a>
ist eigentlich eine Software, zu der man kaum noch etwas sagen muss. Es ist bei mir eine Art Hassliebe: Zum einen ist Nextcloud für ein bisschen Dateiablage völlig überdimensioniert, auf der anderen Seite lassen sich hier schnell und einfach viele kleine Apps einbinden. Es gibt zahlreiche Alternativen, aber am Ende bin ich doch immer wieder bei Nextcloud gelandet.</p><p>In meinem<a href="https://teqqy.de/tags/homelab/" target="_blank" rel="noopener noreferrer">Homelab<svg class="link-external-icon" aria-hidden="true" focusable="false" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"/><polyline points="15 3 21 3 21 9"/><line x1="10" y1="14" x2="21" y2="3"/></svg><span class="visually-hidden"> (externer Link)</span></a>
läuft mittlerweile die All-in-one-Installation. Diese ist bei mir stabiler als eine normale Docker-Compose-Variante oder gar eine manuelle Installation. Zugegeben: Ich nutze Nextcloud aktuell nur für Kalender und Dateiablage – andere Apps habe ich derzeit nicht dauerhaft im Einsatz.</p><h2 id="platz-8-jellyfin">Platz 8: Jellyfin<a href="#platz-8-jellyfin" class="heading-anchor" aria-label="Diesen Abschnitt verlinken"><svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a></h2><p><a href="https://jellyfin.org" target="_blank" rel="noopener noreferrer">Jellyfin<svg class="link-external-icon" aria-hidden="true" focusable="false" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"/><polyline points="15 3 21 3 21 9"/><line x1="10" y1="14" x2="21" y2="3"/></svg><span class="visually-hidden"> (externer Link)</span></a>
, der allseits bekannte Mediaplayer. Was für mich der Unterschied zum Platzhirsch Plex ist, habe ich schon in einem älteren<a href="/plex-vs-jellyfin-ein-persoenlicher-vergleich/">Blogartikel</a>
beschrieben. Ich bin mit Jellyfin sehr zufrieden – es macht, was es soll. Und dank fehlender Cloud-Anbindung muss man sich keine Gedanken über Hacks oder Datenlecks machen.</p><p>Jellyfin läuft bei mir als LXC auf meinem Proxmox-Host. Dadurch kann ich einfach auf die iGPU meines Thin Clients zugreifen und spare mir eine dedizierte Grafikkarte für mögliches Transcoding. Allerdings versuche ich ohnehin, meine Medien so vorzuhalten, dass kein Transkodieren notwendig ist.</p><h2 id="platz-7-freshrss">Platz 7: FreshRSS<a href="#platz-7-freshrss" class="heading-anchor" aria-label="Diesen Abschnitt verlinken"><svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a></h2><p>Zu<a href="https://freshrss.org" target="_blank" rel="noopener noreferrer">FreshRSS<svg class="link-external-icon" aria-hidden="true" focusable="false" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"/><polyline points="15 3 21 3 21 9"/><line x1="10" y1="14" x2="21" y2="3"/></svg><span class="visually-hidden"> (externer Link)</span></a>
habe ich schon ein paar Mal etwas veröffentlicht. Für mich ist es weiterhin<em>die</em> Software, wenn es um selbst gehostete RSS-Reader geht. FreshRSS aggregiert meine Feeds (die derzeit etwas leer sind), ich lese sie aber nicht direkt dort. Auf meinen Apple-Geräten greife ich mit der App<em>Reeder</em> auf meine Instanz zu – diese Verbindung funktioniert seit jeher absolut zuverlässig.</p><h2 id="platz-6-mealie">Platz 6: Mealie<a href="#platz-6-mealie" class="heading-anchor" aria-label="Diesen Abschnitt verlinken"><svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a></h2><p>Wer gerne kocht, kennt das Problem: Rezepte sind überall verteilt, und viele Rezeptseiten sind inzwischen reine Tracking- und Werbeschleudern. Deshalb setze ich auf<a href="https://mealie.io" target="_blank" rel="noopener noreferrer">Mealie<svg class="link-external-icon" aria-hidden="true" focusable="false" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"/><polyline points="15 3 21 3 21 9"/><line x1="10" y1="14" x2="21" y2="3"/></svg><span class="visually-hidden"> (externer Link)</span></a>
und trage dort alle Rezepte ein, die sich lohnen.</p><p><img src="/meine-top-10-selfhosted-und-homelab-software-2025-lieblings-tools-fuers-neue-jahr/images/homelab-top-10-mealie_hu_95c28c223c8908f0.webp" srcset="/meine-top-10-selfhosted-und-homelab-software-2025-lieblings-tools-fuers-neue-jahr/images/homelab-top-10-mealie_hu_3d62fa16efc667bf.webp 384w, /meine-top-10-selfhosted-und-homelab-software-2025-lieblings-tools-fuers-neue-jahr/images/homelab-top-10-mealie_hu_95c28c223c8908f0.webp 768w" sizes="(max-width: 768px) 100vw, 768px" alt="Top 5 Mealie meiner selfhosted Apps 2025" loading="eager" fetchpriority="high" decoding="async" width="768" height="406"/><p>Mealie erkennt sehr zuverlässig die relevanten Informationen auf Rezeptseiten und stellt sie super dar. Teilschritte und Zutaten passe ich häufig manuell an. Inzwischen werden es immer mehr Rezepte – also habe ich angefangen, alles ordentlich zu sortieren, sonst findet man irgendwann nichts mehr.</p><p>Mealie läuft bei mir klassisch als Docker-Container, ohne zusätzliche Datenbank, einfach mit SQLite. Ich habe in den letzten Jahren festgestellt, dass kleine Softwareprodukte oft keine vollwertige Datenbank brauchen. Wichtig ist nur: SQLite-Datenbanken niemals auf ein NFS-Share legen!</p><h2 id="platz-5-immich">Platz 5: Immich<a href="#platz-5-immich" class="heading-anchor" aria-label="Diesen Abschnitt verlinken"><svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a></h2><p><a href="https://immich.app" target="_blank" rel="noopener noreferrer">Immich<svg class="link-external-icon" aria-hidden="true" focusable="false" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"/><polyline points="15 3 21 3 21 9"/><line x1="10" y1="14" x2="21" y2="3"/></svg><span class="visually-hidden"> (externer Link)</span></a>
ist wohl einer der aufstrebenden Sterne am Selfhosted-Himmel. Die Fotoverwaltung läuft einfach extrem gut. Natürlich gibt’s hier und da kleine Problemchen, aber das Entwicklerteam reagiert schnell. Ich habe mich für Immich entschieden, weil viele andere Tools mittlerweile Integrationen dafür anbieten – so lassen sich Fotos oder Alben direkt in anderen Apps anzeigen.</p><p>Eines meiner Highlights ist die<em>Erinnerungen</em>-Funktion. Ähnlich wie bei Facebook (wer noch dort ist, weiß, was ich meine) zeigt Immich Fotos vom selben Datum an. So kann man schön in Erinnerungen schwelgen – zum Beispiel beim 1000. Katzenfoto vor zwei Jahren.</p><p>Die Software ist mir recht wichtig, deshalb läuft sie in einer eigenen VM – allerdings trotzdem als Docker-Container. So habe ich alle Fotos und Daten zentral in einer VM, und Backup sowie Restore sind über Snapshots und Backups deutlich einfacher.</p><h2 id="platz-4-adventure-log">Platz 4: Adventure Log<a href="#platz-4-adventure-log" class="heading-anchor" aria-label="Diesen Abschnitt verlinken"><svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a></h2><p><a href="https://adventurelog.app" target="_blank" rel="noopener noreferrer">Adventure Log<svg class="link-external-icon" aria-hidden="true" focusable="false" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"/><polyline points="15 3 21 3 21 9"/><line x1="10" y1="14" x2="21" y2="3"/></svg><span class="visually-hidden"> (externer Link)</span></a>
war ein Zufallsfund im Subreddit r/selfhosted. Der Entwickler hat die Software dort kurz vorgestellt, und seitdem bin ich Fan.</p><p><img src="/meine-top-10-selfhosted-und-homelab-software-2025-lieblings-tools-fuers-neue-jahr/images/homelab-top-10-adventure-log_hu_5480eb4279c6f7e2.webp" srcset="/meine-top-10-selfhosted-und-homelab-software-2025-lieblings-tools-fuers-neue-jahr/images/homelab-top-10-adventure-log_hu_e7f4c7adfa94273a.webp 384w, /meine-top-10-selfhosted-und-homelab-software-2025-lieblings-tools-fuers-neue-jahr/images/homelab-top-10-adventure-log_hu_5480eb4279c6f7e2.webp 768w" sizes="(max-width: 768px) 100vw, 768px" alt="Top 5 Adventure Log meiner selfhosted Apps 2025" loading="lazy" fetchpriority="auto" decoding="async" width="768" height="406"/><p>Mit Adventure Log kannst du deine Abenteuer (Reisen, Urlaube etc.) planen und tracken. Ein Import aus Wanderer ist inzwischen möglich, andere Quellen leider noch nicht. Für alle, die gerne reisen, aber ein super Tool.</p><p>Hier spielt auch wieder die Immich-Integration eine Rolle: Man kann auf Alben aus Immich verweisen und sie direkt in den jeweiligen Reisen anzeigen.</p><p>Adventure Log ist aktuell die einzige Software, die bei mir über die Proxmox Helper Scripts läuft. Aufgrund des etwas komplexeren Aufbaus wollte ich sie nicht normal installieren – eventuell wechsle ich aber auf die Docker-Version.</p><h2 id="platz-3-statistics-for-strava">Platz 3: Statistics for Strava<a href="#platz-3-statistics-for-strava" class="heading-anchor" aria-label="Diesen Abschnitt verlinken"><svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a></h2><p>Seit einigen Monaten gehe ich wieder regelmäßig laufen.<strong>Strava</strong> begleitet mich dabei schon seit Jahren.<a href="https://github.com/robiningelbrecht/statistics-for-strava" target="_blank" rel="noopener noreferrer">Statistics for Strava<svg class="link-external-icon" aria-hidden="true" focusable="false" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"/><polyline points="15 3 21 3 21 9"/><line x1="10" y1="14" x2="21" y2="3"/></svg><span class="visually-hidden"> (externer Link)</span></a>
erweitert die Funktionen des Standardaccounts um zusätzliche Auswertungen. Wichtig: Der Entwickler darf laut API-Richtlinien keine Features anbieten, die mit Strava Premium konkurrieren.</p><p><img src="/meine-top-10-selfhosted-und-homelab-software-2025-lieblings-tools-fuers-neue-jahr/images/homelab-top-10-statistics-for-strava_hu_5e91518df0bbb186.webp" srcset="/meine-top-10-selfhosted-und-homelab-software-2025-lieblings-tools-fuers-neue-jahr/images/homelab-top-10-statistics-for-strava_hu_c99237b20127fada.webp 384w, /meine-top-10-selfhosted-und-homelab-software-2025-lieblings-tools-fuers-neue-jahr/images/homelab-top-10-statistics-for-strava_hu_5e91518df0bbb186.webp 768w" sizes="(max-width: 768px) 100vw, 768px" alt="Top 5 Statistics for Strava meiner selfhosted Apps 2025" loading="lazy" fetchpriority="auto" decoding="async" width="768" height="408"/><p>Trotzdem bekomme ich hier viele spannende Informationen – etwa zu Bestzeiten, Herzfrequenzen und anderen Statistiken. Anfangs lag der Fokus nur auf Radfahren, mittlerweile werden aber viele Ausdauersportarten unterstützt.</p><p>Statistics for Strava läuft ebenfalls als Docker-Container. Etwas schade: Für den Import der Daten und die Generierung der HTML-Dateien ist ein separater Cronjob nötig.</p><p>Wenn du möchtest, kannst du mir gern auf<a href="https://www.strava.com/athletes/4091921" target="_blank" rel="noopener noreferrer">Strava<svg class="link-external-icon" aria-hidden="true" focusable="false" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"/><polyline points="15 3 21 3 21 9"/><line x1="10" y1="14" x2="21" y2="3"/></svg><span class="visually-hidden"> (externer Link)</span></a>
folgen.</p><h2 id="platz-2-mastodon">Platz 2: Mastodon<a href="#platz-2-mastodon" class="heading-anchor" aria-label="Diesen Abschnitt verlinken"><svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a></h2><p><a href="https://joinmastodon.org" target="_blank" rel="noopener noreferrer">Mastodon<svg class="link-external-icon" aria-hidden="true" focusable="false" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"/><polyline points="15 3 21 3 21 9"/><line x1="10" y1="14" x2="21" y2="3"/></svg><span class="visually-hidden"> (externer Link)</span></a>
begleitet mich seit der Übernahme von Twitter durch Musk. Inzwischen haben sich viele weitere Softwareprodukte rund um ActivityPub und das Fediverse entwickelt, die wunderbar mit Mastodon interagieren können. Manchmal gibt’s noch kleine technische Stolpersteine – wie ich in einem meiner letzten<a href="/gotosocial-als-activitypub-server-meine-erfahrungen/">Beiträge</a>
beschrieben habe.</p><p>Trotzdem ist Mastodon mein soziales Netzwerk der Wahl. Ich bin zwar auch auf Bluesky, aber dort kaum aktiv. Der Nachteil (oder vielleicht Vorteil) von Mastodon: Es gibt keine Algorithmen. Man bekommt also keine Account-Vorschläge und findet interessante Menschen etwas schwerer.</p><p>Bei mir läuft Mastodon als Docker-Container auf meinem VPS, auf dem auch dieser Blog gehostet ist. Die Container-Installation macht Updates deutlich einfacher.</p><h2 id="platz-1-proxmox">Platz 1: Proxmox<a href="#platz-1-proxmox" class="heading-anchor" aria-label="Diesen Abschnitt verlinken"><svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a></h2><p>Die wohl wichtigste Software in meinem Homelab ist definitiv<a href="https://www.proxmox.com" target="_blank" rel="noopener noreferrer">Proxmox<svg class="link-external-icon" aria-hidden="true" focusable="false" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"/><polyline points="15 3 21 3 21 9"/><line x1="10" y1="14" x2="21" y2="3"/></svg><span class="visually-hidden"> (externer Link)</span></a>
. Die Virtualisierungsplattform hält all meine virtuellen Maschinen zusammen und funktioniert seit Jahren ohne nennenswerte Probleme. Mit der integrierten Backup-Software lassen sich granular Dateien wiederherstellen – oder im Zweifel einfach mal eine kaputte Konfiguration aus dem Backup ziehen.</p><p>Damit wäre meine diesjährige Top 10 also komplett. Wie immer war es gar nicht so einfach, die Plätze zu vergeben, denn eigentlich laufen bei mir noch etliche weitere kleine Tools und Dienste, die ebenfalls einen Platz verdient hätten. Aber irgendwo muss man ja eine Grenze ziehen. 😊</p><p>Spannend finde ich jedenfalls, wie sich mein Homelab über die Jahre verändert hat – und das bringt mich direkt zum Fazit.</p><h2 id="fazit--was-sich-seit-2024-verändert-hat">Fazit – was sich seit 2024 verändert hat<a href="#fazit--was-sich-seit-2024-ver%c3%a4ndert-hat" class="heading-anchor" aria-label="Diesen Abschnitt verlinken"><svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a></h2><p>Wenn ich den Beitrag vom letzten Jahr mit diesem hier vergleiche, zeigt sich ganz gut, wie sich mein Homelab und auch meine Prioritäten verändert haben. 2024 standen noch viele „klassische“ Infrastruktur-Services ganz oben: Home Assistant, Paperless, Minio oder EVCC – also Tools, die man fast schon als Rückgrat eines smarten Zuhauses oder Labors bezeichnen könnte. Dieses Jahr hat sich der Fokus etwas verschoben: weg von reiner Hausautomatisierung und mehr hin zu Dingen, die mir persönlich Freude bereiten.</p><p>Das zeigt sich besonders daran, dass mit Wanderer, Adventure Log oder Statistics for Strava gleich mehrere Selfhosted-Projekte vertreten sind, die sich um Hobbys und Aktivitäten drehen. Ich merke, dass mein Homelab inzwischen nicht mehr nur „funktionieren“ soll, sondern mich auch im Alltag begleiten darf – beim Wandern, Kochen oder Sport.</p><p>Ein paar Klassiker sind geblieben: Nextcloud, Immich und Mastodon haben sich bewährt und laufen zuverlässig weiter. Andere wie Home Assistant oder Paperless-NGX fehlen diesmal, was aber eher daran liegt, dass sie bei mir inzwischen so selbstverständlich geworden sind, dass ich kaum noch darüber nachdenke. Man könnte sagen: Sie sind vom Highlight zum Fundament geworden.</p><p>Spannend finde ich auch, dass viele meiner diesjährigen Favoriten deutlich sozialer geworden sind – sei es durch das Fediverse, gemeinsame Fotoalben oder das Teilen von Aktivitäten. Das Homelab ist also nicht mehr nur mein technisches Spielzeug, sondern verbindet mich auf gewisse Weise mit anderen Menschen, die ähnliche Interessen haben.</p><p>Mal schauen, was 2026 bringt – vielleicht geht’s dann wieder etwas technischer zu, vielleicht auch nicht. Aber eines steht fest: Langweilig wird’s im Homelab garantiert nie.</p>
]]></content:encoded><category>proxmox</category><category>mastodon</category><category>nextcloud</category><category>jellyfin</category></item><item><title>GoToSocial als ActivityPub Server - Meine Erfahrungen</title><link>https://www.teqqy.de/gotosocial-als-activitypub-server-meine-erfahrungen/</link><pubDate>Sun, 05 Oct 2025 11:20:00 +0100</pubDate><lastBuildDate>Sun, 05 Oct 2025 11:20:00 +0100</lastBuildDate><guid isPermaLink="true">https://www.teqqy.de/gotosocial-als-activitypub-server-meine-erfahrungen/</guid><description>Ich bin seit der Übernahme von Twitter durch Elon Musk auch auf Mastodon (externer Link) bzw. im ActivityPub-Universum unterwegs. Das Konzept, dass es viele verteilte Server im sozialen Netzwerk gibt finde ich total spannend. Das ist, wenn man so will, das soziale Netzwerk neu gedacht – dezentral, offen und communitygetrieben. Vor allem haben wir damit nicht die allgemeinen Probleme welche die derzeit großen Netzwerke so mit sich bringen. Egal in welche politische Richtung man jetzt denken möge.</description><content:encoded>&lt;![CDATA[<p>Ich bin seit der Übernahme von Twitter durch Elon Musk auch auf<a href="https://joinmastodon.org/de" target="_blank" rel="noopener noreferrer">Mastodon<svg class="link-external-icon" aria-hidden="true" focusable="false" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"/><polyline points="15 3 21 3 21 9"/><line x1="10" y1="14" x2="21" y2="3"/></svg><span class="visually-hidden"> (externer Link)</span></a>
bzw. im ActivityPub-Universum unterwegs. Das Konzept, dass es viele verteilte Server im sozialen Netzwerk gibt finde ich total spannend. Das ist, wenn man so will, das soziale Netzwerk neu gedacht – dezentral, offen und communitygetrieben. Vor allem haben wir damit nicht die allgemeinen Probleme welche die derzeit großen Netzwerke so mit sich bringen. Egal in welche politische Richtung man jetzt denken möge.</p><p><img src="/gotosocial-als-activitypub-server-meine-erfahrungen/images/mastodon-smartphone_hu_57a3ddecab904225.webp" srcset="/gotosocial-als-activitypub-server-meine-erfahrungen/images/mastodon-smartphone_hu_7dba020ca88732fc.webp 384w, /gotosocial-als-activitypub-server-meine-erfahrungen/images/mastodon-smartphone_hu_57a3ddecab904225.webp 768w, /gotosocial-als-activitypub-server-meine-erfahrungen/images/mastodon-smartphone_hu_5df0c9595807358a.webp 1536w" sizes="(max-width: 768px) 100vw, 768px" alt="Foto von einem Smartphone mit der Mastodon Webseite" loading="eager" fetchpriority="high" decoding="async" width="768" height="512"/><h2 id="mein-werdegang-im-fediverse">Mein Werdegang im Fediverse<a href="#mein-werdegang-im-fediverse" class="heading-anchor" aria-label="Diesen Abschnitt verlinken"><svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a></h2><p>Seit dem ersten Tag war für mich klar: Wenn ich irgendwo im Internet aktiv bin, dann selfhosted. Ich wollte also meine eigene Instanz betreiben – nicht einfach einen Account auf<a href="https://mastodon.social/explore" target="_blank" rel="noopener noreferrer">mastodon.social<svg class="link-external-icon" aria-hidden="true" focusable="false" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"/><polyline points="15 3 21 3 21 9"/><line x1="10" y1="14" x2="21" y2="3"/></svg><span class="visually-hidden"> (externer Link)</span></a>
oder<a href="https://chaos.social/explore" target="_blank" rel="noopener noreferrer">chaos.social<svg class="link-external-icon" aria-hidden="true" focusable="false" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"/><polyline points="15 3 21 3 21 9"/><line x1="10" y1="14" x2="21" y2="3"/></svg><span class="visually-hidden"> (externer Link)</span></a>
haben, sondern wirklich alles selbst in der Hand. Angefangen habe ich mit einem Mastodon Server der auf einem Netcup VPS installiert wurde, in der klassischen Installation, also ohne Container. Einige Zeit später habe ich meine Installation dann zu den Docker Containern umgezogen. Beide Installationsvarianten liefen ohne Probleme. Lediglich das Updaten ist mittels Container einfacherer.</p><h2 id="umzug-ins-homelab">Umzug ins Homelab<a href="#umzug-ins-homelab" class="heading-anchor" aria-label="Diesen Abschnitt verlinken"><svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a></h2><p>Ein paar Monate später lief mein Kubernetes-<a href="https://teqqy.de/tags/homelab/" target="_blank" rel="noopener noreferrer">Homelab<svg class="link-external-icon" aria-hidden="true" focusable="false" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"/><polyline points="15 3 21 3 21 9"/><line x1="10" y1="14" x2="21" y2="3"/></svg><span class="visually-hidden"> (externer Link)</span></a>
endlich stabil – und was liegt näher, als den Mastodon-Server auch dorthin umzuziehen? Mit Cloudflare Tunnel war das Routing kein Problem. Auch diese Installation lief reibungslos. Ich habe irgendwann von den offiziellen Mastodon-Containern auf die Images von Linuxserver.io gewechselt. Funktional gab’s aber keinen Unterschied.</p><h2 id="der-umstieg-auf-gotosocial">Der Umstieg auf GoToSocial<a href="#der-umstieg-auf-gotosocial" class="heading-anchor" aria-label="Diesen Abschnitt verlinken"><svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a></h2><p>Vor einigen Wochen schrieb<a href="https://me.klein.ruhr/@matthias" target="_blank" rel="noopener noreferrer">Matthias<svg class="link-external-icon" aria-hidden="true" focusable="false" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"/><polyline points="15 3 21 3 21 9"/><line x1="10" y1="14" x2="21" y2="3"/></svg><span class="visually-hidden"> (externer Link)</span></a>
dann über sein Experiment mit<a href="https://gotosocial.org/" target="_blank" rel="noopener noreferrer">GoToSocial<svg class="link-external-icon" aria-hidden="true" focusable="false" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"/><polyline points="15 3 21 3 21 9"/><line x1="10" y1="14" x2="21" y2="3"/></svg><span class="visually-hidden"> (externer Link)</span></a>
– kurz GTS. Diese Software ist im Prinzip eine leichtgewichtige Alternative zu Mastodon, geschrieben in Go, und läuft als Single Binary. Kein Ruby, keine externe Datenbank nötig, kein Overhead. Also perfekt für kleine Instanzen mit nur wenigen aktiven Konten. GTS bringt leider kein eigenes Frontend mit, sodass man hier auf externe oder auf die gängigen Smartphone Apps ausweichen muss.</p><p>Matthias hat hier ein paar Beobachtungen<a href="https://blog.klein.ruhr/gotosocial-ready-for-prime-time" target="_blank" rel="noopener noreferrer">auf seinem Blog<svg class="link-external-icon" aria-hidden="true" focusable="false" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"/><polyline points="15 3 21 3 21 9"/><line x1="10" y1="14" x2="21" y2="3"/></svg><span class="visually-hidden"> (externer Link)</span></a>
dazu geschrieben was die Unterschiede der Performance sowie des Resourcenverbrauches angeht. Sehr spannend zu lesen.</p><p>Also habe ich mir ebenfalls eine kleine GoToSocial-Instanz eingerichtet. Die Einrichtung war wirklich simpel: Binary herunterladen, Konfigurationsdatei anlegen, starten – fertig. Und ja, es lief erstaunlich stabil. Nur merkt man schnell, dass GTS zwar das ActivityPub-Protokoll unterstützt, aber bei der Interoperabilität noch nicht auf dem gleichen Level wie Mastodon ist.</p><h2 id="problem-nummer-1---wanderer-und-das-schweigen-im-feed">Problem Nummer 1 - Wanderer und das schweigen im Feed<a href="#problem-nummer-1---wanderer-und-das-schweigen-im-feed" class="heading-anchor" aria-label="Diesen Abschnitt verlinken"><svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a></h2><p>Das Thema ActivityPub, also quasi das Protokoll das hinter vielen verschiedenen Föderierenden in sozialen Netzwerken steckt, findet in den letzten Monaten bei diversen Apps der selfhosting-Szene auch immer mehr anklang. Ich war also erfreut, dass die App<a href="https://wanderer.to/" target="_blank" rel="noopener noreferrer">Wanderer<svg class="link-external-icon" aria-hidden="true" focusable="false" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"/><polyline points="15 3 21 3 21 9"/><line x1="10" y1="14" x2="21" y2="3"/></svg><span class="visually-hidden"> (externer Link)</span></a>
ebendies nun anbietet. Die Idee dahinter ist großartig: Man kann eigene Wanderrouten teilen, GPS-Tracks hochladen und diese als Beiträge ins Fediverse posten. Und das Ganze natürlich föderiert über ActivityPub.</p><p>Nach kurzer Zeit musste ich dies einmal ausprobieren wie das so funktioniert. Das folgen meines Accountes aus der GoToSocial Instanz war kein Problem. Also eine neue Wanderroute per GPX importiert und gewartet was ich nun als Beitrag in meinem Feed sehen werde&hellip; Nix&hellip;
Nach ein wenig hin und her habe ich es von einem normalen Mastodon Account probiert und siehe da: Die Wanderung wird mir als Beitrag in die Timeline gespült.</p><p>Ich habe den Fehler natürlich dem Entwickler gemeldet, aber bisher (Stand heute) hat sich da noch nichts getan. Das zeigt recht deutlich: ActivityPub ist mächtig, aber eben auch komplex. Nicht jede Implementierung spricht dieselbe „Sprache“, und schon kleine Abweichungen führen zu Inkompatibilitäten.</p><h2 id="problem-nummer-2---peertube-und-seine-follower">Problem Nummer 2 - PeerTube und seine Follower<a href="#problem-nummer-2---peertube-und-seine-follower" class="heading-anchor" aria-label="Diesen Abschnitt verlinken"><svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a></h2><p>Das zweite Thema, das mich beschäftigt hat, war mein alter YouTube-Kanal. Ich hatte Lust, mal wieder ein paar Videos zu machen – aber eben nicht nur auf YouTube. Wenn man schon im Fediverse ist, bietet sich<a href="https://joinpeertube.org/de" target="_blank" rel="noopener noreferrer">PeerTube<svg class="link-external-icon" aria-hidden="true" focusable="false" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"/><polyline points="15 3 21 3 21 9"/><line x1="10" y1="14" x2="21" y2="3"/></svg><span class="visually-hidden"> (externer Link)</span></a>
an: eine dezentrale Videoplattform, die nach dem gleichen Prinzip funktioniert wie Mastodon, nur eben für Videos.</p><p>Die Installation war schnell erledigt, aber die Einrichtung hat es in sich. PeerTube hat ein komplexes Rollen- und Berechtigungssystem, dazu die Föderationseinstellungen und eine ganze Menge an Tuning-Parametern. Aber: Es läuft stabil, und die Community ist sehr aktiv.</p><p>Auch hier habe ich ein paar Testvideos hoch geladen und geschaut was so passiert. Leider steckt das Thema Interoperabilität zwischen PeerTube und GoToSocial sogar noch weiter vorne fest. Ich kann Accounts oder Kanälen folgen, die Anfrage wird aber nicht sauber von PeerTube verarbeitet. Das Problem war sogar bekannt: Auf GitHub gab es bereits ein Issue, und angeblich sollte der Bug mit Version 7.2 behoben sein. Ich hatte allerdings schon Version 7.3 – und trotzdem trat der Fehler auf. Auch hier wieder das gleiche Muster: Mit einem Mastodon-Account lief alles tadellos.</p><p>Ich könnte noch ein paar Kleinigkeiten auflisten die mir im Laufe des Tests aufgefallen sind, aber du erkennst sicherlich den Punkt worauf ich hinaus möchte. Wer keine größeren Ansprüche hat ist mit einer GoToSocial Instanz super zufrieden, allerdings hapert es häufig an Kleinigkeiten.</p><h2 id="zwischenfazit--kleine-tools-große-hürden">Zwischenfazit – Kleine Tools, große Hürden<a href="#zwischenfazit--kleine-tools-gro%c3%9fe-h%c3%bcrden" class="heading-anchor" aria-label="Diesen Abschnitt verlinken"><svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a></h2><p>Ich könnte jetzt noch viele Kleinigkeiten aufzählen, die mir im Laufe der Tests aufgefallen sind: kleinere Inkompatibilitäten, Eigenheiten in den HTTP-Headern, Timeouts bei der Föderation und so weiter. Aber das wäre Haarspalterei.</p><p>Der Punkt ist: Wer keine großen Ansprüche hat und einfach nur einen minimalistischen Account im Fediverse betreiben möchte, ist mit GoToSocial super beraten. Die Software ist schlank, ressourcenschonend und wirklich stabil. Aber sobald man versucht, etwas weiter über den Tellerrand zu schauen – also PeerTube, Bookwyrm, Pixelfed oder eben Wanderer zu integrieren – merkt man, dass viele Projekte noch nicht vollständig aufeinander abgestimmt sind.</p><p>Und das ist völlig verständlich. Jedes dieser Tools wird von kleinen Teams oder sogar Einzelpersonen entwickelt, meist in der Freizeit. Es gibt keinen großen Konzern im Hintergrund, der alles zentral steuert. Das ist einerseits der Charme des Fediverse, andererseits aber auch die Quelle vieler kleiner Frustrationen.</p><h2 id="fazit">Fazit<a href="#fazit" class="heading-anchor" aria-label="Diesen Abschnitt verlinken"><svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a></h2><p>Wer jetzt der Schuldige des ganzen ist, kann ich nicht beurteilen. Sicherlich gibt Mastodon die Entwicklung des ganzen vor und schlussendlich werden die ganzen kleinen Tools von Menschen programmiert und gepflegt die das lediglich in ihrer Freizeit tun. Ich hoffe nur, dass perspektivisch sich das ganze angleicht und alle möglichen Plattformen sauber miteinander kommunizieren können..</p>
]]></content:encoded><category>fediverse</category><category>mastodon</category></item><item><title>iVentoy PXE Server unter Debian LXC installieren</title><link>https://www.teqqy.de/iventoy-pxe-server-unter-debian-lxc-installieren/</link><pubDate>Wed, 26 Mar 2025 12:00:00 +0100</pubDate><lastBuildDate>Wed, 26 Mar 2025 12:00:00 +0100</lastBuildDate><guid isPermaLink="true">https://www.teqqy.de/iventoy-pxe-server-unter-debian-lxc-installieren/</guid><description>In meinem Homelab verwende ich einen Kubernetes Cluster der auf Talos als Betriebssystem aufsetzt. Bei einer kompletten Neuinstallation ist es für mich aufwendig immer drei USB Sticks vorzubereiten um dann alle drei Nodes parallel installieren zu können. Also entschied ich mich einen PXE Server bereit zu stellen um die ISO Images aus dem Netzwerk booten zu können.
Es gibt für das Endergebnis verschiedene Wege. Ich habe mich dazu entschlossen iVentoy als PXE Server zu verwenden. Ventoy an sich ist ja sicherlich vielen von euch schon ein Begriff. Damit kann man nämlich USB Sticks erstellen mit mehreren ISO Dateien. iVentoy ist vom gleichen Entwickler und bietet dann die Möglichkeit diese ISO Images aus dem Netzwerk zu booten.</description><content:encoded>&lt;![CDATA[<p>In meinem Homelab verwende ich einen Kubernetes Cluster der auf Talos als Betriebssystem aufsetzt. Bei einer kompletten Neuinstallation ist es für mich aufwendig immer drei USB Sticks vorzubereiten um dann alle drei Nodes parallel installieren zu können. Also entschied ich mich einen PXE Server bereit zu stellen um die ISO Images aus dem Netzwerk booten zu können.</p><p>Es gibt für das Endergebnis verschiedene Wege. Ich habe mich dazu entschlossen iVentoy als PXE Server zu verwenden. Ventoy an sich ist ja sicherlich vielen von euch schon ein Begriff. Damit kann man nämlich USB Sticks erstellen mit mehreren ISO Dateien. iVentoy ist vom gleichen Entwickler und bietet dann die Möglichkeit diese ISO Images aus dem Netzwerk zu booten.</p><p>Ich verwende wo ich nur kann Container, sei es Docker oder, wie in diesem Fall, LXC. Ich benötige hier nicht eine voll aufgeblähte virtuelle Maschine, wenn ein kleiner LXC auf meinem Proxmox Host dafür ausreichend ist.</p><h2 id="was-ist-ein-pxe-server">Was ist ein PXE Server?<a href="#was-ist-ein-pxe-server" class="heading-anchor" aria-label="Diesen Abschnitt verlinken"><svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a></h2><p>Ein PXE-Server (Preboot Execution Environment) erlaubt es Computern, ein Betriebssystem über das Netzwerk zu starten, ohne dass eine Festplatte oder ein USB-Stick nötig ist. Beim Start fragt der Computer per Netzwerk nach einem Boot-Server. Der PXE-Server antwortet und liefert die nötigen Daten, damit der Computer ein Betriebssystem laden und installieren kann. Das ist nützlich für die automatische Einrichtung vieler Computer.</p><h2 id="lxc-anlegen">LXC anlegen<a href="#lxc-anlegen" class="heading-anchor" aria-label="Diesen Abschnitt verlinken"><svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a></h2><p>Unter Proxmox könnt ihr ganz normal einen LXC anlegen. Ich verwende in meinem Fall einen priviligierten Container, weil es mir die Sache etwas einfach macht. Wer sehr stark auf Sicherheit wert legt, müsste für einen unpriviligierten Container entsprechend noch Dinge anpassen.
Zudem verwende ich, wie in der Überschrift angegeben, Debian als Betriebssystem. Zum Zeitpunkt der Erstellung dieses Beitrages in Version 11 alias Bookworm. Ggf. sind Anpassungen bei Ubuntu notwendig.
Wenn du den Container also angelegt hast, müsstest du ihn einmal wieder beenden bzw. noch nicht starten. Wir müssen nämlich die Konfiguration noch anpassen, weil wir sonst später auf ein APPARMOR Problem stoßen werden. Also bitte per SSH auf den Proxmox Server verbinden (oder die interne Shell nutzen) und die LXC Datei editieren</p><div class="code-block"><div class="code-block-header"><span class="code-lang-label">bash</span><button class="code-copy-btn" type="button" aria-label="Code kopieren" data-umami-event="Code Copy" data-umami-event-lang="bash"><svg class="icon-copy" xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"/><path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"/></svg><svg class="icon-check" xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><polyline points="20 6 9 17 4 12"/></svg></button></div><div class="highlight"><pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>nano /etc/pve/lxc/&lt;LXC ID&gt;.conf</span></span></code></pre></div></div><p>Die LXC ID siehst du im Proxmox Frontend.
Hier fügen wir am Ende folgendes ein</p><div class="code-block"><div class="code-block-header"><span class="code-lang-label"/><button class="code-copy-btn" type="button" aria-label="Code kopieren" data-umami-event="Code Copy" data-umami-event-lang=""><svg class="icon-copy" xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"/><path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"/></svg><svg class="icon-check" xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><polyline points="20 6 9 17 4 12"/></svg></button></div><pre tabindex="0"><code>lxc.apparmor.profile: unconfined
lxc.cap.drop:</code></pre></div><p>Nun können wir den Container starten.</p><h2 id="iventoy-installieren">iVentoy installieren<a href="#iventoy-installieren" class="heading-anchor" aria-label="Diesen Abschnitt verlinken"><svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a></h2><p>Als erstes sollten wir natürlich das System aktualliseren</p><div class="code-block"><div class="code-block-header"><span class="code-lang-label">bash</span><button class="code-copy-btn" type="button" aria-label="Code kopieren" data-umami-event="Code Copy" data-umami-event-lang="bash"><svg class="icon-copy" xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"/><path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"/></svg><svg class="icon-check" xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><polyline points="20 6 9 17 4 12"/></svg></button></div><div class="highlight"><pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>apt update<span style="color:#ff7b72;font-weight:bold">&amp;&amp;</span> apt upgrade -y</span></span></code></pre></div></div><p>Jetzt benötigen wir bei einem LXC noch diverse Pakete. Bei einer VM könnten diese nicht notwendig sein.</p><div class="code-block"><div class="code-block-header"><span class="code-lang-label">bash</span><button class="code-copy-btn" type="button" aria-label="Code kopieren" data-umami-event="Code Copy" data-umami-event-lang="bash"><svg class="icon-copy" xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"/><path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"/></svg><svg class="icon-check" xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><polyline points="20 6 9 17 4 12"/></svg></button></div><div class="highlight"><pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>apt install libevent-2.1-7 libevent-pthreads-2.1-7 glibc libwim15 libhivex0 wget</span></span></code></pre></div></div><p>Jetzt laden wir uns noch das aktuelle Paket bei<a href="https://github.com/ventoy/PXE/releases" target="_blank" rel="noopener noreferrer">GitHub<svg class="link-external-icon" aria-hidden="true" focusable="false" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"/><polyline points="15 3 21 3 21 9"/><line x1="10" y1="14" x2="21" y2="3"/></svg><span class="visually-hidden"> (externer Link)</span></a>
herunter. Am besten vorher die aktuelle Version kontrollieren.</p><div class="code-block"><div class="code-block-header"><span class="code-lang-label">bash</span><button class="code-copy-btn" type="button" aria-label="Code kopieren" data-umami-event="Code Copy" data-umami-event-lang="bash"><svg class="icon-copy" xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"/><path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"/></svg><svg class="icon-check" xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><polyline points="20 6 9 17 4 12"/></svg></button></div><div class="highlight"><pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>wget https://github.com/ventoy/PXE/releases/download/v1.0.20/iventoy-1.0.20-linux-free.tar.gz</span></span></code></pre></div></div><p>Anschließend können wir das Paket entpacken</p><div class="code-block"><div class="code-block-header"><span class="code-lang-label">bash</span><button class="code-copy-btn" type="button" aria-label="Code kopieren" data-umami-event="Code Copy" data-umami-event-lang="bash"><svg class="icon-copy" xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"/><path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"/></svg><svg class="icon-check" xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><polyline points="20 6 9 17 4 12"/></svg></button></div><div class="highlight"><pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>tar xvfz iventoy-1.0.20-linux-free.tar.gz</span></span></code></pre></div></div><p>Ich für meinen Teil packe solche Installationen immer nach<code>/opt</code>, aber das kannst du gerne anpassen. Ich verschiebe also die iVentoy Installation und benenne gleichzeitig den Ordner um</p><div class="code-block"><div class="code-block-header"><span class="code-lang-label">bash</span><button class="code-copy-btn" type="button" aria-label="Code kopieren" data-umami-event="Code Copy" data-umami-event-lang="bash"><svg class="icon-copy" xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"/><path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"/></svg><svg class="icon-check" xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><polyline points="20 6 9 17 4 12"/></svg></button></div><div class="highlight"><pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>mv iventoy-1.0.20-linux-free /opt/pxe</span></span></code></pre></div></div><p>Es sollte bei dir dann ungefähr so aussehen.<img src="/iventoy-pxe-server-unter-debian-lxc-installieren/images/iventoy-pxe-verzeichnis_hu_4ded0c825b7cbb63.webp" srcset="/iventoy-pxe-server-unter-debian-lxc-installieren/images/iventoy-pxe-verzeichnis_hu_dc86d0de613e217d.webp 384w, /iventoy-pxe-server-unter-debian-lxc-installieren/images/iventoy-pxe-verzeichnis_hu_4ded0c825b7cbb63.webp 768w" sizes="(max-width: 768px) 100vw, 768px" alt="Verzeichnisausgabe iVentoy" loading="lazy" fetchpriority="auto" decoding="async" width="768" height="128">
Wichtig ist das Verzeichnis<strong>ISO</strong>, weil du dort alle ISO Dateien ablegen muss welche du im Netzwerk verfügbar haben möchtest.</p><h2 id="iventoy-starten-und-einrichten">iVentoy starten und einrichten<a href="#iventoy-starten-und-einrichten" class="heading-anchor" aria-label="Diesen Abschnitt verlinken"><svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a></h2><p>Nun können wir das Programm starten</p><div class="code-block"><div class="code-block-header"><span class="code-lang-label">bash</span><button class="code-copy-btn" type="button" aria-label="Code kopieren" data-umami-event="Code Copy" data-umami-event-lang="bash"><svg class="icon-copy" xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"/><path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"/></svg><svg class="icon-check" xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><polyline points="20 6 9 17 4 12"/></svg></button></div><div class="highlight"><pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>./iventoy.sh start</span></span></code></pre></div></div><p>Du bekommst dann eine Ausgabe unter welcher PID der Prozess läuft und wie du auf die Webseite zugreifen kannst.
Wir rufen also die iVentoy Seite einmal mit der IP deines Containers sowie Port 26000 auf und bekommen dann sowas angezeigt<img src="/iventoy-pxe-server-unter-debian-lxc-installieren/images/iventoy-pxe-webseite_hu_115929964182793b.webp" srcset="/iventoy-pxe-server-unter-debian-lxc-installieren/images/iventoy-pxe-webseite_hu_48d9b48a0899ea46.webp 384w, /iventoy-pxe-server-unter-debian-lxc-installieren/images/iventoy-pxe-webseite_hu_115929964182793b.webp 768w" sizes="(max-width: 768px) 100vw, 768px" alt="iVentoy Seite" loading="lazy" fetchpriority="auto" decoding="async" width="768" height="408">
Nun hängt es wieder ein bisschen von deiner Wunschkonfiguration ab. Ich möchte den DHCP Server von iVentoy nicht verwenden, sondern den meines Unifi Gateways. Wenn du einen (für iVentoy) externen DHCP Server verwenden möchtest, gehst du links auf<strong>Configuration</strong> und stellst bei<strong>Server Mode</strong> auf<strong>External</strong>. Etwas oben drüber dann auf speichern klicken.
Unter<strong>Image Management</strong> kannst du die ISO Dateien sehen welche du ggf. vorher schon abgelegt hast. Andernfalls kannst du auf der rechten Seite auch per drag and drop eine neue hochladen.</p><p>Zu guter letzte müssen wir den Server &ldquo;nochmal&rdquo; starten. Unter<strong>Boot Information</strong> ist rechts ein Play-Button der grün hinterlegt ist. Den musst du unbedingt anklicken, sonst funktioniert es nicht.</p><p>Wenn du jetzt ein System mit der Bootoption Netzwerk am Anfang startest erwartet dich dann solch eine Anzeige<img src="/iventoy-pxe-server-unter-debian-lxc-installieren/images/iventoy-pxe-network-boot_hu_6066bc81f12c2be2.webp" srcset="/iventoy-pxe-server-unter-debian-lxc-installieren/images/iventoy-pxe-network-boot_hu_4368975849f3c1d0.webp 384w, /iventoy-pxe-server-unter-debian-lxc-installieren/images/iventoy-pxe-network-boot_hu_6066bc81f12c2be2.webp 768w" sizes="(max-width: 768px) 100vw, 768px" alt="iventoy Netzwerk boot" loading="lazy" fetchpriority="auto" decoding="async" width="768" height="476"/>
]]></content:encoded><category>pxe</category><category>proxmox</category><category>linux</category></item><item><title>Tesla Model 3: Warum ich nach 5 Jahren &amp; 77.000 km verkaufe</title><link>https://www.teqqy.de/zahlen-daten-fakten-nach-fuenf-jahren-tesla-model-3/</link><pubDate>Sun, 16 Mar 2025 12:00:00 +0100</pubDate><lastBuildDate>Sun, 16 Mar 2025 12:00:00 +0100</lastBuildDate><guid isPermaLink="true">https://www.teqqy.de/zahlen-daten-fakten-nach-fuenf-jahren-tesla-model-3/</guid><description>Tesla Model 3 Langzeittest: 77.000 km nach 5 Jahren - Ehrliche Bilanz zu Kosten, Verbrauch &amp;amp; Akkugesundheit Nach fünf Jahren und 77.000 Kilometern mit unserem Tesla Model 3 ziehen wir Bilanz. Spoiler: Der Akku hat noch 93 % seiner Kapazität, wir haben rund 3.500 Euro fürs Laden ausgegeben und der Durchschnittsverbrauch liegt bei 20,6 kWh/100 km. Trotzdem verkaufen wir das Auto jetzt. Warum? Das erfährst du in diesem ehrlichen Erfahrungsbericht mit allen Zahlen, die du für deine Kaufentscheidung brauchst.</description><content:encoded>&lt;![CDATA[<h1 id="tesla-model-3-langzeittest-77000-km-nach-5-jahren---ehrliche-bilanz-zu-kosten-verbrauch--akkugesundheit">Tesla Model 3 Langzeittest: 77.000 km nach 5 Jahren - Ehrliche Bilanz zu Kosten, Verbrauch &amp; Akkugesundheit<a href="#tesla-model-3-langzeittest-77000-km-nach-5-jahren---ehrliche-bilanz-zu-kosten-verbrauch--akkugesundheit" class="heading-anchor" aria-label="Diesen Abschnitt verlinken"><svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a></h1><p>Nach fünf Jahren und 77.000 Kilometern mit unserem Tesla Model 3 ziehen wir Bilanz. Spoiler: Der Akku hat noch 93 % seiner Kapazität, wir haben rund 3.500 Euro fürs Laden ausgegeben und der Durchschnittsverbrauch liegt bei 20,6 kWh/100 km. Trotzdem verkaufen wir das Auto jetzt. Warum? Das erfährst du in diesem ehrlichen Erfahrungsbericht mit allen Zahlen, die du für deine Kaufentscheidung brauchst.</p><h2 id="der-start-corona-sei-dank-fast-ohne-auto-dastanden">Der Start: Corona sei Dank fast ohne Auto dastanden<a href="#der-start-corona-sei-dank-fast-ohne-auto-dastanden" class="heading-anchor" aria-label="Diesen Abschnitt verlinken"><svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a></h2><p>Vor ziemlich genau fünf Jahren haben wir unser Tesla Model 3 abgeholt. Wir hatten sehr viel Glück, denn es wurden reichlich Überstunden der Mitarbeitenden geschoben damit alle ihr Auto noch rechtzeitig bekommen. Am Folgetag sollte nämlich die erste Corona Ausgangsbeschränkung gelten und wir hätten auf unbestimmte Zeit auf unser neues Auto warten müssen. Dahingehend fing der Start eigentlich schon mal ziemlich gut an.</p><h2 id="verarbeitungsqualität-nach-5-jahren-besser-als-ihr-ruf">Verarbeitungsqualität nach 5 Jahren: Besser als ihr Ruf<a href="#verarbeitungsqualit%c3%a4t-nach-5-jahren-besser-als-ihr-ruf" class="heading-anchor" aria-label="Diesen Abschnitt verlinken"><svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a></h2><p>In den Anfangsjahren haben sich viele Menschen über die Qualität der Autos lustig gemacht. Wir hatten das Glück ein, auf den ersten Blick, mängelfreies Auto zu erhalten. Zugegebenermaßen bin ich nicht wie andere mit einer X-seitigen Checkliste um das Auto herum gelaufen. Als ob die Personen das jemals bei anderen Neufahrzeugen gemacht hätten&hellip;</p><p>Im Laufe der Jahre fiel auf, dass die eine oder andere Fixierung durch Plastikteile nicht vorhanden waren. Es wurde da also ein wenig an den Cent-Artikel gespart. Bei den heutigen Modellen wird das sicherlich nicht mehr der Fall sein.</p><p><strong>Was nach 5 Jahren auffällt:</strong></p><ul><li>Keine größeren Qualitätsprobleme</li><li>Einzelne fehlende Plastikfixierungen im Innenraum</li><li>Lackierung und Verarbeitung insgesamt solide</li><li>Keine Rostprobleme oder Spaltmaße-Dramen</li></ul><h2 id="verbrauch-und-kosten-im-detail-die-nackten-zahlen">Verbrauch und Kosten im Detail: Die nackten Zahlen<a href="#verbrauch-und-kosten-im-detail-die-nackten-zahlen" class="heading-anchor" aria-label="Diesen Abschnitt verlinken"><svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a></h2><p><img src="/zahlen-daten-fakten-nach-fuenf-jahren-tesla-model-3/images/tesla-model-3-fahrten_hu_1b2a2b81fb97a0db.webp" srcset="/zahlen-daten-fakten-nach-fuenf-jahren-tesla-model-3/images/tesla-model-3-fahrten_hu_dc2d5b24886fdc36.webp 384w, /zahlen-daten-fakten-nach-fuenf-jahren-tesla-model-3/images/tesla-model-3-fahrten_hu_1b2a2b81fb97a0db.webp 768w, /zahlen-daten-fakten-nach-fuenf-jahren-tesla-model-3/images/tesla-model-3-fahrten_hu_a5de64b7354789f6.webp 1536w" sizes="(max-width: 768px) 100vw, 768px" alt="Übersicht der Fahrten der letzten fünf Jahre" loading="eager" fetchpriority="high" decoding="async" width="768" height="364"/><p>Ich hatte das Auto fast die ganze Zeit bei Tronity in der Datenerfassung. Es könnte sein, dass zwar einzelne Fahrten fehlen, aber das Gesamtbild wird trotzdem stimmen.</p><p><strong>Die harten Fakten:</strong></p><ul><li><strong>Gesamtkilometer:</strong> 76.922 km (davon 76.310 km getrackt)</li><li><strong>Durchschnittsverbrauch:</strong> 20,6 kWh/100 km</li><li><strong>Gesamte Ladekosten:</strong> ca. 3.500 Euro</li><li><strong>Kosten pro Kilometer:</strong> ca. 4,6 Cent</li><li><strong>AC/DC-Verhältnis:</strong> 80/20</li></ul><h3 id="warum-unser-verbrauch-höher-liegt">Warum unser Verbrauch höher liegt<a href="#warum-unser-verbrauch-h%c3%b6her-liegt" class="heading-anchor" aria-label="Diesen Abschnitt verlinken"><svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a></h3><p>Wir fahren kaum schnell und Langstrecke häufig mit ca. 120 - 140 km/h Tempomat. Allerdings mag ich die sehr zügige Beschleunigung des Elektroautos. Entsprechend geht viel Energie immer hier verloren. Zudem kommt, dass die Heizung fast das ganze Jahr auf ca. 22,5 °C eingestellt ist und wir die Vorklimatisierungsfunktion sehr häufig nutzen. Das fällt alles in den Verbrauch mit rein und ist entsprechend zu bedenken.</p><p><strong>Zum Vergleich:</strong> Ein vergleichbarer Verbrenner (z.B. BMW 320i) hätte bei ähnlichem Fahrprofil etwa 7-8 Liter auf 100 km verbraucht. Bei einem Benzinpreis von durchschnittlich 1,70 Euro wären das Kraftstoffkosten von rund 9.000 Euro gewesen.<strong>Ersparnis: ca. 5.500 Euro</strong> - und das obwohl wir zu 80 % an der heimischen Wallbox laden konnten.</p><h2 id="akkugesundheit-nach-77000-km-das-ist-der-wichtigste-wert">Akkugesundheit nach 77.000 km: Das ist der wichtigste Wert<a href="#akkugesundheit-nach-77000-km-das-ist-der-wichtigste-wert" class="heading-anchor" aria-label="Diesen Abschnitt verlinken"><svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a></h2><p>Das Verhältnis zwischen AC und DC laden beträgt 80/20. Das ergibt einen derzeitigen<strong>State of Health (SoH) von 93 %</strong> laut Tronity. Bedeutet: Der Akku unseres Autos hat noch 93 % der Leistung seines Neuzustandes.</p><p><strong>Was bedeutet das konkret?</strong></p><ul><li>Von ursprünglich ca. 500 km Reichweite (WLTP) bleiben noch ca. 465 km</li><li>Der Verlust von 7 % in 5 Jahren ist völlig im Rahmen</li><li>Hochgerechnet hätte der Akku nach 10 Jahren noch etwa 86 % Kapazität</li><li>Tesla gibt 8 Jahre Garantie auf mindestens 70 % Restkapazität</li></ul><h2 id="6-länder-0-ladeprobleme-langstreckentauglichkeit-im-test">6 Länder, 0 Ladeprobleme: Langstreckentauglichkeit im Test<a href="#6-l%c3%a4nder-0-ladeprobleme-langstreckentauglichkeit-im-test" class="heading-anchor" aria-label="Diesen Abschnitt verlinken"><svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a></h2><p>Wir waren mit dem Auto in sechs Ländern und in keinem hatten wir jemals das Problem eine funktionierende Ladesäule zu finden. Durch Corona sind wir allerdings dann doch nicht so viel im Ausland gewesen als wir eigentlich gedacht hätten.</p><p>Lediglich unser Roadtrip im Jahr 2024 hat uns durch Frankreich, Spanien und Portugal geführt. Damals sind wir knapp<strong>6.200 km in 14 Tagen</strong> gefahren. Ein Urlaub der toll und zugleich ansträngend war.</p><p><strong>Ladeerfahrung auf Langstrecke:</strong></p><ul><li>Tesla Supercharger: Quasi immer verfügbar und zuverlässig</li><li>Andere Anbieter: Mittlerweile deutlich besser als vor 5 Jahren</li><li>Ladeplanung: Mit der Tesla-Navigation eigentlich kein Thema</li></ul><h2 id="warum-wir-nach-5-jahren-verkaufen-die-ehrlichen-gründe">Warum wir nach 5 Jahren verkaufen: Die ehrlichen Gründe<a href="#warum-wir-nach-5-jahren-verkaufen-die-ehrlichen-gr%c3%bcnde" class="heading-anchor" aria-label="Diesen Abschnitt verlinken"><svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a></h2><p>Nach fünf Jahren werden wir das Auto verkaufen. Das hat mehrere Gründe:</p><p><strong>1. Die Marke und ihr Geschäftsführer</strong>
Wir möchten die Marke mit seinem derzeitigen Geschäftsführer nicht mehr repräsentieren. Das ist eine persönliche Entscheidung, die jeder für sich treffen muss.</p><p><strong>2. Zeit für etwas Neues</strong>
Nach fünf Jahren wird es Zeit für etwas neues. Die aktuellen Modelle sind sehr spannend und scheinen weiterhin ein extrem gutes Preis-/Leistungsverhältnis zu haben.</p><p><strong>3. Zu viel Touchscreen, zu wenig Tasten</strong>
Der Weg den Tesla mit der immer voranschreitenden Reduzierung von physischen Knöpfen und Hebeln beschreitet, ist nicht mehr unseres. Wir mögen das reduzierte und aufgeräumte Interieur aber manche Funktionen haben für mich lieber einen Knopf als eine Geste im Infotainmentsystem. Ein gefühltes Flugzeugcockpit wie bei den deutschen Herstellern brauche ich aber auch überhaupt nicht.</p><h2 id="was-kommt-als-nächstes">Was kommt als Nächstes?<a href="#was-kommt-als-n%c3%a4chstes" class="heading-anchor" aria-label="Diesen Abschnitt verlinken"><svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a></h2><p>Wir haben uns jetzt einen<strong>NIO</strong> zugelegt den wir mindestens die nächsten drei Jahre fahren werden. Warum? Das wird ein eigener Erfahrungsbericht - stay tuned!</p><h2 id="fazit-lohnt-sich-ein-tesla-model-3-nach-5-jahren-noch">Fazit: Lohnt sich ein Tesla Model 3 nach 5 Jahren noch?<a href="#fazit-lohnt-sich-ein-tesla-model-3-nach-5-jahren-noch" class="heading-anchor" aria-label="Diesen Abschnitt verlinken"><svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a></h2><p><strong>Die Top 3 Vorteile:</strong></p><ol><li><strong>Niedrige Betriebskosten:</strong> 4,6 Cent/km sind unschlagbar günstig</li><li><strong>Akkugesundheit:</strong> 93 % nach 77.000 km spricht für die Batteriequalität</li><li><strong>Ladeinfrastruktur:</strong> Supercharger-Netz ist und bleibt der Goldstandard</li></ol><p><strong>Die Top 3 Nachteile:</strong></p><ol><li><strong>Bedienkonzept:</strong> Immer mehr Funktionen nur über Touchscreen nervig</li><li><strong>Markenimage:</strong> Das Thema Elon Musk polarisiert stark</li><li><strong>Kleine Qualitätsmängel:</strong> Cent-Artikel wie Plastikclips wurden gespart</li></ol><p><strong>Für wen lohnt sich ein gebrauchter Tesla Model 3?</strong></p><ul><li>Wer primär Kurzstrecke und gelegentlich Langstrecke fährt</li><li>Wer Zugang zu günstigen Lademöglichkeiten hat (Wallbox, Arbeit)</li><li>Wer mit dem Touchscreen-Konzept gut zurechtkommt</li><li>Wer ein Auto mit niedrigen laufenden Kosten sucht</li></ul><p><strong>Wer sollte die Finger davonlassen?</strong></p><ul><li>Wer viele physische Bedienelemente bevorzugt</li><li>Wer ausschließlich öffentlich laden müsste</li><li>Wer mit der Marke Tesla nicht identifizieren möchte</li></ul><hr><h2 id="häufige-fragen-zum-tesla-model-3-langzeittest">Häufige Fragen zum Tesla Model 3 Langzeittest<a href="#h%c3%a4ufige-fragen-zum-tesla-model-3-langzeittest" class="heading-anchor" aria-label="Diesen Abschnitt verlinken"><svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a></h2><p><strong>Wie hoch ist der Wertverlust nach 5 Jahren?</strong><em>[Falls du den Verkaufspreis schon kennst, könntest du das hier ergänzen]</em></p><p><strong>Würdest du das Auto nochmal kaufen?</strong>
Ja, für die damalige Zeit war es die richtige Entscheidung. Heute würde ich mir aber die Konkurrenz genauer anschauen - der Markt hat sich stark entwickelt.</p><p><strong>Wie oft musstest du an die Werkstatt?</strong><em>[Hier könntest du deine Erfahrungen ergänzen]</em></p><p><strong>Lohnt sich ein Tesla Model 3 gebraucht?</strong>
Absolut, wenn du mit dem Bedienkonzept klarkommst und günstig laden kannst. Die Technik ist ausgereift, die Akkus halten gut.</p>
]]></content:encoded><category>tesla</category></item><item><title>Bunte Labels in GitHub (und GitLab, Gitea): Anleitung &amp; Workflow</title><link>https://www.teqqy.de/bunte-labels-beit-github-gitlab-gitea-und-co/</link><pubDate>Mon, 28 Oct 2024 18:45:00 +0100</pubDate><lastBuildDate>Mon, 28 Oct 2024 18:45:00 +0100</lastBuildDate><guid isPermaLink="true">https://www.teqqy.de/bunte-labels-beit-github-gitlab-gitea-und-co/</guid><description>Wie Menschen die mir auf social media folgen wissen, betreibe ich einen kleinen Kubernetes Cluster im GitOps Prinzip. Meine vollständige Konfiguration (externer Link) befindet sich auf der Cloud Plattform GitHub und kann dort von allen eingesehen werden. Dazu setze ich auf eine saubere Versionverwaltung beim Update der Container. Das hilft um schnell auf eine alte Version zurück zu springen. Da ich mich nicht selbst um das heraussuchen der neusten Versionen kümmern möchte, nutze ich Renovate (externer Link) als App bei GitHub. Diese schaut in die verschiedenen Dateien und vergleicht die konfigurierte Version eines Containers mit der zuletzt veröffentlichten und erstellt daraus ein pull request.</description><content:encoded>&lt;![CDATA[<p>Wie Menschen die mir auf social media folgen wissen, betreibe ich einen kleinen<a href="tags/kubernetes/">Kubernetes</a>
Cluster im GitOps Prinzip. Meine<a href="https://github.com/cbirkenbeul/homelab" target="_blank" rel="noopener noreferrer">vollständige Konfiguration<svg class="link-external-icon" aria-hidden="true" focusable="false" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"/><polyline points="15 3 21 3 21 9"/><line x1="10" y1="14" x2="21" y2="3"/></svg><span class="visually-hidden"> (externer Link)</span></a>
befindet sich auf der Cloud Plattform GitHub und kann dort von allen eingesehen werden.
Dazu setze ich auf eine saubere Versionverwaltung beim Update der Container. Das hilft um schnell auf eine alte Version zurück zu springen. Da ich mich nicht selbst um das heraussuchen der neusten Versionen kümmern möchte, nutze ich<a href="https://github.com/renovatebot/renovate" target="_blank" rel="noopener noreferrer">Renovate<svg class="link-external-icon" aria-hidden="true" focusable="false" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"/><polyline points="15 3 21 3 21 9"/><line x1="10" y1="14" x2="21" y2="3"/></svg><span class="visually-hidden"> (externer Link)</span></a>
als App bei GitHub. Diese schaut in die verschiedenen Dateien und vergleicht die konfigurierte Version eines Containers mit der zuletzt veröffentlichten und erstellt daraus ein pull request.</p><p>Im Standard sind alle Labels bei den Plattformen wie GitHub, Gitlab oder<a href="https://www.youtube.com/watch?v=2h-gkICAcbk" target="_blank" rel="noopener noreferrer">gitea<svg class="link-external-icon" aria-hidden="true" focusable="false" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"/><polyline points="15 3 21 3 21 9"/><line x1="10" y1="14" x2="21" y2="3"/></svg><span class="visually-hidden"> (externer Link)</span></a>
in grau gehalten. Hier fehlt also etwas die Übersicht zur schnelleren Einschätzung der Situation. Aus diesem Grund verwende ich ein kleinen Workflow der mir die von Renovate angehäfteten Labels bunt einfärbt. Ich nutze das Vorgehen auf GitHub, sollte aber fast identisch auch bei GitLab oder gitea funktionieren.</p><p>Ich gehe davon aus, dass es bereit ein vorhandenes Repository gibt und sich dies lokal auf deiner Workstation befindet. Entsprechend erstellen wir im Hauptverzeichnis des Repos einen Unterordner mit dem Namen<code>.github</code>. Auf anderen Plattformen sollte er analog zur Plattform heißen.</p><p>In diesem Unterordner erstellen wir einen weiteren Order mit dem Namen<code>workflows</code>. Sämtliche<code>y(a)ml</code>Dateien werden hier als eingenständiger Workflow auf der jeweiligen Plattform aufgeführt.</p><p>Nun können wir auch den Workflow bzw. GitHub Action anlegen. Ich habe sie bei mir<code>label-sync.yaml</code> genannt und folgendes in die Datei kopiert:</p><div class="code-block"><div class="code-block-header"><span class="code-lang-label">yaml</span><button class="code-copy-btn" type="button" aria-label="Code kopieren" data-umami-event="Code Copy" data-umami-event-lang="yaml"><svg class="icon-copy" xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"/><path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"/></svg><svg class="icon-check" xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><polyline points="20 6 9 17 4 12"/></svg></button></div><div class="highlight"><pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"><code class="language-yaml" data-lang="yaml"><span style="display:flex;"><span><span style="color:#ff7b72">---</span><span style="color:#6e7681"/></span></span><span style="display:flex;"><span><span style="color:#8b949e;font-style:italic"># yaml-language-server: $schema=https://json.schemastore.org/github-workflow.json</span><span style="color:#6e7681"/></span></span><span style="display:flex;"><span><span style="color:#7ee787">name</span>:<span style="color:#6e7681"/><span style="color:#a5d6ff">"Label Sync"</span><span style="color:#6e7681"/></span></span><span style="display:flex;"><span><span style="color:#6e7681"/></span></span><span style="display:flex;"><span><span style="color:#7ee787">on</span>:<span style="color:#6e7681"/></span></span><span style="display:flex;"><span><span style="color:#6e7681"/><span style="color:#7ee787">workflow_dispatch</span>:<span style="color:#6e7681"/></span></span><span style="display:flex;"><span><span style="color:#6e7681"/><span style="color:#7ee787">push</span>:<span style="color:#6e7681"/></span></span><span style="display:flex;"><span><span style="color:#6e7681"/><span style="color:#7ee787">branches</span>:<span style="color:#6e7681"/>[<span style="color:#a5d6ff">"main"</span>]<span style="color:#6e7681"/></span></span><span style="display:flex;"><span><span style="color:#6e7681"/><span style="color:#7ee787">paths</span>:<span style="color:#6e7681"/>[<span style="color:#a5d6ff">".github/labels.yaml"</span>]<span style="color:#6e7681"/></span></span><span style="display:flex;"><span><span style="color:#6e7681"/></span></span><span style="display:flex;"><span><span style="color:#7ee787">jobs</span>:<span style="color:#6e7681"/></span></span><span style="display:flex;"><span><span style="color:#6e7681"/><span style="color:#7ee787">label-sync</span>:<span style="color:#6e7681"/></span></span><span style="display:flex;"><span><span style="color:#6e7681"/><span style="color:#7ee787">name</span>:<span style="color:#6e7681"/><span style="color:#a5d6ff">Label Sync</span><span style="color:#6e7681"/></span></span><span style="display:flex;"><span><span style="color:#6e7681"/><span style="color:#7ee787">runs-on</span>:<span style="color:#6e7681"/><span style="color:#a5d6ff">ubuntu-latest</span><span style="color:#6e7681"/></span></span><span style="display:flex;"><span><span style="color:#6e7681"/><span style="color:#7ee787">steps</span>:<span style="color:#6e7681"/></span></span><span style="display:flex;"><span><span style="color:#6e7681"/>-<span style="color:#7ee787">name</span>:<span style="color:#6e7681"/><span style="color:#a5d6ff">Checkout</span><span style="color:#6e7681"/></span></span><span style="display:flex;"><span><span style="color:#6e7681"/><span style="color:#7ee787">uses</span>:<span style="color:#6e7681"/><span style="color:#a5d6ff">actions/checkout@v4</span><span style="color:#6e7681"/></span></span><span style="display:flex;"><span><span style="color:#6e7681"/><span style="color:#7ee787">with</span>:<span style="color:#6e7681"/></span></span><span style="display:flex;"><span><span style="color:#6e7681"/><span style="color:#7ee787">sparse-checkout</span>:<span style="color:#6e7681"/><span style="color:#a5d6ff">.github/labels.yaml</span><span style="color:#6e7681"/></span></span><span style="display:flex;"><span><span style="color:#6e7681"/></span></span><span style="display:flex;"><span><span style="color:#6e7681"/>-<span style="color:#7ee787">name</span>:<span style="color:#6e7681"/><span style="color:#a5d6ff">Sync Labels</span><span style="color:#6e7681"/></span></span><span style="display:flex;"><span><span style="color:#6e7681"/><span style="color:#7ee787">uses</span>:<span style="color:#6e7681"/><span style="color:#a5d6ff">EndBug/label-sync@v2</span><span style="color:#6e7681"/></span></span><span style="display:flex;"><span><span style="color:#6e7681"/><span style="color:#7ee787">with</span>:<span style="color:#6e7681"/></span></span><span style="display:flex;"><span><span style="color:#6e7681"/><span style="color:#7ee787">config-file</span>:<span style="color:#6e7681"/><span style="color:#a5d6ff">.github/labels.yaml</span><span style="color:#6e7681"/></span></span><span style="display:flex;"><span><span style="color:#6e7681"/><span style="color:#7ee787">delete-other-labels</span>:<span style="color:#6e7681"/><span style="color:#79c0ff">true</span></span></span></code></pre></div></div><p>Glücklicherweise brauchen wir hierfür ein Bot oder ähnliches, sondern es funktioniert direkt. Wie du gegebenenfalls in dem workflow siehst, verweisen wir auf eine Datei mit dem Namen<code>labels.yaml</code>. Diese müssen wir noch in dem Ordner<code>.github</code> anlegen und befüllen.</p><p>In diese Datei kommen dann sämtliche Labels mit dem entsprechenden HTML-Farbcode. Bei mir sieht die Datei so aus:</p><div class="code-block"><div class="code-block-header"><span class="code-lang-label">yaml</span><button class="code-copy-btn" type="button" aria-label="Code kopieren" data-umami-event="Code Copy" data-umami-event-lang="yaml"><svg class="icon-copy" xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"/><path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"/></svg><svg class="icon-check" xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><polyline points="20 6 9 17 4 12"/></svg></button></div><div class="highlight"><pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"><code class="language-yaml" data-lang="yaml"><span style="display:flex;"><span><span style="color:#ff7b72">---</span><span style="color:#6e7681"/></span></span><span style="display:flex;"><span><span style="color:#8b949e;font-style:italic"># Areas</span><span style="color:#6e7681"/></span></span><span style="display:flex;"><span>-<span style="color:#7ee787">name</span>:<span style="color:#6e7681"/><span style="color:#a5d6ff">area/ansible</span><span style="color:#6e7681"/></span></span><span style="display:flex;"><span><span style="color:#6e7681"/><span style="color:#7ee787">color</span>:<span style="color:#6e7681"/><span style="color:#a5d6ff">"0e8a16"</span><span style="color:#6e7681"/></span></span><span style="display:flex;"><span>-<span style="color:#7ee787">name</span>:<span style="color:#6e7681"/><span style="color:#a5d6ff">area/docs</span><span style="color:#6e7681"/></span></span><span style="display:flex;"><span><span style="color:#6e7681"/><span style="color:#7ee787">color</span>:<span style="color:#6e7681"/><span style="color:#a5d6ff">"0e8a16"</span><span style="color:#6e7681"/></span></span><span style="display:flex;"><span>-<span style="color:#7ee787">name</span>:<span style="color:#6e7681"/><span style="color:#a5d6ff">area/github</span><span style="color:#6e7681"/></span></span><span style="display:flex;"><span><span style="color:#6e7681"/><span style="color:#7ee787">color</span>:<span style="color:#6e7681"/><span style="color:#a5d6ff">"0e8a16"</span><span style="color:#6e7681"/></span></span><span style="display:flex;"><span>-<span style="color:#7ee787">name</span>:<span style="color:#6e7681"/><span style="color:#a5d6ff">area/kubernetes</span><span style="color:#6e7681"/></span></span><span style="display:flex;"><span><span style="color:#6e7681"/><span style="color:#7ee787">color</span>:<span style="color:#6e7681"/><span style="color:#a5d6ff">"0e8a16"</span><span style="color:#6e7681"/></span></span><span style="display:flex;"><span>-<span style="color:#7ee787">name</span>:<span style="color:#6e7681"/><span style="color:#a5d6ff">area/terraform</span><span style="color:#6e7681"/></span></span><span style="display:flex;"><span><span style="color:#6e7681"/><span style="color:#7ee787">color</span>:<span style="color:#6e7681"/><span style="color:#a5d6ff">"0e8a16"</span><span style="color:#6e7681"/></span></span><span style="display:flex;"><span><span style="color:#8b949e;font-style:italic"># Clusters</span><span style="color:#6e7681"/></span></span><span style="display:flex;"><span>-<span style="color:#7ee787">name</span>:<span style="color:#6e7681"/><span style="color:#a5d6ff">cluster/main</span><span style="color:#6e7681"/></span></span><span style="display:flex;"><span><span style="color:#6e7681"/><span style="color:#7ee787">color</span>:<span style="color:#6e7681"/><span style="color:#a5d6ff">"ffc300"</span><span style="color:#6e7681"/></span></span><span style="display:flex;"><span>-<span style="color:#7ee787">name</span>:<span style="color:#6e7681"/><span style="color:#a5d6ff">cluster/storage</span><span style="color:#6e7681"/></span></span><span style="display:flex;"><span><span style="color:#6e7681"/><span style="color:#7ee787">color</span>:<span style="color:#6e7681"/><span style="color:#a5d6ff">"ffc300"</span><span style="color:#6e7681"/></span></span><span style="display:flex;"><span><span style="color:#8b949e;font-style:italic"># Renovate Types</span><span style="color:#6e7681"/></span></span><span style="display:flex;"><span>-<span style="color:#7ee787">name</span>:<span style="color:#6e7681"/><span style="color:#a5d6ff">renovate/ansible</span><span style="color:#6e7681"/></span></span><span style="display:flex;"><span><span style="color:#6e7681"/><span style="color:#7ee787">color</span>:<span style="color:#6e7681"/><span style="color:#a5d6ff">"027fa0"</span><span style="color:#6e7681"/></span></span><span style="display:flex;"><span>-<span style="color:#7ee787">name</span>:<span style="color:#6e7681"/><span style="color:#a5d6ff">renovate/container</span><span style="color:#6e7681"/></span></span><span style="display:flex;"><span><span style="color:#6e7681"/><span style="color:#7ee787">color</span>:<span style="color:#6e7681"/><span style="color:#a5d6ff">"027fa0"</span><span style="color:#6e7681"/></span></span><span style="display:flex;"><span>-<span style="color:#7ee787">name</span>:<span style="color:#6e7681"/><span style="color:#a5d6ff">renovate/github-action</span><span style="color:#6e7681"/></span></span><span style="display:flex;"><span><span style="color:#6e7681"/><span style="color:#7ee787">color</span>:<span style="color:#6e7681"/><span style="color:#a5d6ff">"027fa0"</span><span style="color:#6e7681"/></span></span><span style="display:flex;"><span>-<span style="color:#7ee787">name</span>:<span style="color:#6e7681"/><span style="color:#a5d6ff">renovate/grafana-dashboard</span><span style="color:#6e7681"/></span></span><span style="display:flex;"><span><span style="color:#6e7681"/><span style="color:#7ee787">color</span>:<span style="color:#6e7681"/><span style="color:#a5d6ff">"027fa0"</span><span style="color:#6e7681"/></span></span><span style="display:flex;"><span>-<span style="color:#7ee787">name</span>:<span style="color:#6e7681"/><span style="color:#a5d6ff">renovate/github-release</span><span style="color:#6e7681"/></span></span><span style="display:flex;"><span><span style="color:#6e7681"/><span style="color:#7ee787">color</span>:<span style="color:#6e7681"/><span style="color:#a5d6ff">"027fa0"</span><span style="color:#6e7681"/></span></span><span style="display:flex;"><span>-<span style="color:#7ee787">name</span>:<span style="color:#6e7681"/><span style="color:#a5d6ff">renovate/helm</span><span style="color:#6e7681"/></span></span><span style="display:flex;"><span><span style="color:#6e7681"/><span style="color:#7ee787">color</span>:<span style="color:#6e7681"/><span style="color:#a5d6ff">"027fa0"</span><span style="color:#6e7681"/></span></span><span style="display:flex;"><span>-<span style="color:#7ee787">name</span>:<span style="color:#6e7681"/><span style="color:#a5d6ff">renovate/terraform</span><span style="color:#6e7681"/></span></span><span style="display:flex;"><span><span style="color:#6e7681"/><span style="color:#7ee787">color</span>:<span style="color:#6e7681"/><span style="color:#a5d6ff">"027fa0"</span><span style="color:#6e7681"/></span></span><span style="display:flex;"><span><span style="color:#8b949e;font-style:italic"># Semantic Types</span><span style="color:#6e7681"/></span></span><span style="display:flex;"><span>-<span style="color:#7ee787">name</span>:<span style="color:#6e7681"/><span style="color:#a5d6ff">type/digest</span><span style="color:#6e7681"/></span></span><span style="display:flex;"><span><span style="color:#6e7681"/><span style="color:#7ee787">color</span>:<span style="color:#6e7681"/><span style="color:#a5d6ff">"ffeC19"</span><span style="color:#6e7681"/></span></span><span style="display:flex;"><span>-<span style="color:#7ee787">name</span>:<span style="color:#6e7681"/><span style="color:#a5d6ff">type/patch</span><span style="color:#6e7681"/></span></span><span style="display:flex;"><span><span style="color:#6e7681"/><span style="color:#7ee787">color</span>:<span style="color:#6e7681"/><span style="color:#a5d6ff">"ffeC19"</span><span style="color:#6e7681"/></span></span><span style="display:flex;"><span>-<span style="color:#7ee787">name</span>:<span style="color:#6e7681"/><span style="color:#a5d6ff">type/minor</span><span style="color:#6e7681"/></span></span><span style="display:flex;"><span><span style="color:#6e7681"/><span style="color:#7ee787">color</span>:<span style="color:#6e7681"/><span style="color:#a5d6ff">"ff9800"</span><span style="color:#6e7681"/></span></span><span style="display:flex;"><span>-<span style="color:#7ee787">name</span>:<span style="color:#6e7681"/><span style="color:#a5d6ff">type/major</span><span style="color:#6e7681"/></span></span><span style="display:flex;"><span><span style="color:#6e7681"/><span style="color:#7ee787">color</span>:<span style="color:#6e7681"/><span style="color:#a5d6ff">"f6412d"</span><span style="color:#6e7681"/></span></span><span style="display:flex;"><span><span style="color:#8b949e;font-style:italic"># Uncategorized</span><span style="color:#6e7681"/></span></span><span style="display:flex;"><span>-<span style="color:#7ee787">name</span>:<span style="color:#6e7681"/><span style="color:#a5d6ff">hold</span><span style="color:#6e7681"/></span></span><span style="display:flex;"><span><span style="color:#6e7681"/><span style="color:#7ee787">color</span>:<span style="color:#6e7681"/><span style="color:#a5d6ff">"ee0701"</span></span></span></code></pre></div></div><p>Wir können jetzt unsere Änderungen commiten und pushen. Beim nächsten push wird dann der Workflow angestoßen und ausgeführt. Nun sollten alle Labels die ihr als Issue oder Pull Request habt in der entsprechenden Farbe dargestellt werden. Bei mir sieht das z. B. so aus:<img src="/bunte-labels-beit-github-gitlab-gitea-und-co/images/bunte-labels-bei-github_hu_f7df1012ba3dde9.webp" srcset="/bunte-labels-beit-github-gitlab-gitea-und-co/images/bunte-labels-bei-github_hu_865c588474f730e9.webp 384w, /bunte-labels-beit-github-gitlab-gitea-und-co/images/bunte-labels-bei-github_hu_f7df1012ba3dde9.webp 768w" sizes="(max-width: 768px) 100vw, 768px" alt="GitHub Screenshot für bunte Labels" loading="eager" fetchpriority="high" decoding="async" width="768" height="206"/>
]]></content:encoded><category>github</category><category>gitlab</category><category>gitea</category><category>renovate</category></item><item><title>Meine Top 10 Homelab Services 2024</title><link>https://www.teqqy.de/meine-top-10-homelab-services-2024/</link><pubDate>Sun, 20 Oct 2024 13:00:00 +0100</pubDate><lastBuildDate>Sun, 20 Oct 2024 13:00:00 +0100</lastBuildDate><guid isPermaLink="true">https://www.teqqy.de/meine-top-10-homelab-services-2024/</guid><description>Nach langer Zeit möchte ich mal wieder ein Beitrag über meine Lieblings-Software in meinem Homelab schreiben. Der letzte Beitrag ist schon fast zwei Jahre alt und in diesem Zeitraum hat sich ein bisschen was getan.
Nummer 10: Ghostfolio Ghostfolio (externer Link) ist eine Software um sein Wertpapierportfolio zu verwalten. Es gibt zwar viele weitere Onlineservices wie parqet oder ähnliche, aber als webbasiertes zum selbst betreiben sieht die Auswahl dann schon sehr eng aus. Ghostfolio nutze ich seit ca. zwei Jahren um mein Aktienportfolio damit zu verwalten und zu tracken. Ich bin keine Person die viel handelt, dennoch möchte man die Performance der einzelnen Werte gern mal ausgewertet haben.</description><content:encoded>&lt;![CDATA[<p>Nach langer Zeit möchte ich mal wieder ein Beitrag über meine Lieblings-Software in meinem Homelab schreiben. Der letzte Beitrag ist schon fast zwei Jahre alt und in diesem Zeitraum hat sich ein bisschen was getan.</p><h2 id="nummer-10-ghostfolio">Nummer 10: Ghostfolio<a href="#nummer-10-ghostfolio" class="heading-anchor" aria-label="Diesen Abschnitt verlinken"><svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a></h2><p><a href="https://ghostfol.io" target="_blank" rel="noopener noreferrer">Ghostfolio<svg class="link-external-icon" aria-hidden="true" focusable="false" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"/><polyline points="15 3 21 3 21 9"/><line x1="10" y1="14" x2="21" y2="3"/></svg><span class="visually-hidden"> (externer Link)</span></a>
ist eine Software um sein Wertpapierportfolio zu verwalten. Es gibt zwar viele weitere Onlineservices wie parqet oder ähnliche, aber als webbasiertes zum selbst betreiben sieht die Auswahl dann schon sehr eng aus. Ghostfolio nutze ich seit ca. zwei Jahren um mein Aktienportfolio damit zu verwalten und zu tracken. Ich bin keine Person die viel handelt, dennoch möchte man die Performance der einzelnen Werte gern mal ausgewertet haben.</p><div class="video-embed" data-src="https://www.youtube-nocookie.com/embed/X_87ZBOlpJQ?autoplay=1&rel=0"><button class="video-embed-trigger" type="button" data-umami-event="Video Load" data-umami-event-provider="YouTube" data-umami-event-id="X_87ZBOlpJQ"><svg class="video-embed-play-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true" width="48" height="48"><circle cx="12" cy="12" r="12" fill="rgba(0,0,0,0.6)"/><path d="M9.5 7.5l7 4.5-7 4.5V7.5z" fill="white"/></svg><span class="video-embed-title">YouTube Video</span><span class="video-embed-note">YouTube &middot; Klicken zum Laden</span></button></div><p>Über die Zeit hinweg sind auch weitere Funktionen wie die Verwaltung von Kryptowährungen oder nicht digitalen Assets hinzugekommen. Ghostfolio könnte man auch als Service einkaufen, finde aber das es dann bessere Lösung gäbe.</p><h2 id="nummer-9-mealie">Nummer 9: Mealie<a href="#nummer-9-mealie" class="heading-anchor" aria-label="Diesen Abschnitt verlinken"><svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a></h2><p><a href="https://mealie.io/" target="_blank" rel="noopener noreferrer">Mealie<svg class="link-external-icon" aria-hidden="true" focusable="false" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"/><polyline points="15 3 21 3 21 9"/><line x1="10" y1="14" x2="21" y2="3"/></svg><span class="visually-hidden"> (externer Link)</span></a>
ist eine Rezeptverwaltung. Klingt vielleicht erst mal nicht so spannend, aber durch den eingbauten scraper (ging schon ohne KI) können Seiten wie Chefkoch einfach ausgelesen und Zutaten oder Zubereitung einfac sauber importiert werden. Zumindest wenn das Rezept anständig hinterlegt ist. Ich nutze die Software zwar nur für wenige Rezepte die ich manuell eingetragen habe, aber auch hier hilft sie mir eine Zettelwirtschaft zu umgehen. Gerade wenn man von befreundeten Menschen ein Rezept des Saltes der letzten Grillparty bekommen hat oder auf Instram einen interessanten Kuchen fand.</p><p>Wer tiefer bei Mealie einsteigen möchte, kann sogar auch einen Wochenplan erstellen und die entsprechende Einklaufsliste sich ausgeben lassen.</p><h2 id="nummer-8-evcc">Nummer 8: EVCC<a href="#nummer-8-evcc" class="heading-anchor" aria-label="Diesen Abschnitt verlinken"><svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a></h2><p>Ich habe lange Zeit das Überschussladen unseres Elektroautos über Home Assistant realisiert. Dann hat allerdings Tesla die API bzw. den API Zugang angepasst und es wurde unzuverlässig. In einem alten Beitrag habe ich dieses vorgehen beschrieben und es kann sicherlich noch für diverse andere Hersteller verwendet werden.
Bei meiner Recherche wie ich mein Unterfangen herstellerunabhängig realisieren kann, bin ich auf<a href="https://evcc.io/" target="_blank" rel="noopener noreferrer">EVCC<svg class="link-external-icon" aria-hidden="true" focusable="false" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"/><polyline points="15 3 21 3 21 9"/><line x1="10" y1="14" x2="21" y2="3"/></svg><span class="visually-hidden"> (externer Link)</span></a>
gestoßen. Die Software verbindet Photovoltaikanlage und Wallbox miteinander - oder auf Wunsch das Auto. Ich hätte auch von Kostal eine Wallbox kaufen können, aber sind wir mal ehrlich: Kostal und Software passen nicht so wirklich zusammen.</p><p>EVCC verbindet sich also mit unserem Kostal Wechselrichter bzw. KSEM und überprüft wie viel Strom produziert und viel viel Strom das Haus derzeit verbraucht. Diese Information wird dann an die Wallbox übermittelt und regelt deren Ausgangsleistung. Am Auto selbst muss also nichts eingestellt werden. So kann selbst der Besuch mit sauberem Strom versorgt werden.</p><p>Die Voraussetzung ist natürlich, dass man eine steuerbare Wallbox hat. Als wir unsere PV-Anlage 2020 installiert bekamen wollte ich noch eine OpenWallbox kaufen. Durch die Lieferengpässe und anschließende Inflation ist mir diese allerdings nicht mehr den aktuellen Kaufpreis wert. Ich habe entsprechend eine Easee Wallbox angeschafft die auch ohne Probleme zwischen 1- und 3-phasigem Laden wechseln kann. Sehr gut um auch kleinere Ladeleistungen mitnehmen zu können.</p><p>Zudem kann EVCC mittlerweile die heimische Batterie der PV-Anlage auch über Netzladen aufladen. Zumindest noch so lange wie es gesetzlich erlaubt ist.</p><h2 id="nummer-7-paperless-ngx">Nummer 7: Paperless-NGX<a href="#nummer-7-paperless-ngx" class="heading-anchor" aria-label="Diesen Abschnitt verlinken"><svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a></h2><p>Ich denke, dass jedem Paperless-NGX bekannt sein wird. Falls nicht:
Paperless-NGX ist ein Dokumenten Management System das man auf dem eigenen Server hosten kann. Die Software bzw. der Quellcode hat in den letzten Jahren immer mal wieder neue Entwickler bekommen und so änderte sich der Name sehr häufig. Mittlerweile gibt es aber eine stabile Entwicklung die die Software immer besser macht.</p><p>Ich versuche mit Paperless den Papierkram in meinem Privatleben so gering als möglich zu halten. Lediglich Dokumente die im Original aufbewahrt werden müssen kommen in einen Ordner. Alles andere wird digitalisiert und danach geschreddert. Der Prozess der Digitalisierung wird bei mir noch nicht mit einem Dokumentenscanner durchgeführt, sondern per Smartphone App. Unter iOS nutze ich dafür die App &ldquo;Paperparrot&rdquo;. Als ehemaliger Beta-Tester bekomme ich diese glücklicherweise immer noch kostenfrei. Aber selbst wenn dem nicht so wäre, kann ich die App jedem Nutzenden ans Herz legen.</p><h2 id="nummer-6-stirling-pdf">Nummer 6: Stirling PDF<a href="#nummer-6-stirling-pdf" class="heading-anchor" aria-label="Diesen Abschnitt verlinken"><svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a></h2><p>Was für ein tolles Werkzeug für PDF Bearbeitung. Ich hatte den Namen immer mal wieder gelesen, hatte aber keine Lust mal nachzugucken was das denn für eine Software ist. Nun weiß ich es und verfluche mich ein wenig die Software noch nicht früher installiert zu haben. Viele kennen sicherlich das Problem PDF Dateien bearbeiten zu müssen. Egal ob zusammenfügen, trennen, Seiten drehen oder ähnliches. Für vieles müsste man sich extra Tools installieren. Nicht mit Stirling PDF. Damit kannst du all diese Funktionen bequem über den Browser erledigen. Bisher hatte ich noch keinen Anwendungsfall bei dem mir diese Software bei PDF-Dateien nicht weiterhelfen konnte.</p><p><img src="/meine-top-10-homelab-services-2024/images/stirling-pdf_hu_152c12a1ec8bae90.webp" srcset="/meine-top-10-homelab-services-2024/images/stirling-pdf_hu_8320054696fcb8df.webp 384w, /meine-top-10-homelab-services-2024/images/stirling-pdf_hu_152c12a1ec8bae90.webp 768w" sizes="(max-width: 768px) 100vw, 768px" alt="Stirling PDF" loading="eager" fetchpriority="high" decoding="async" width="768" height="550"/><h2 id="nummer-5-minio">Nummer 5: Minio<a href="#nummer-5-minio" class="heading-anchor" aria-label="Diesen Abschnitt verlinken"><svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a></h2><p><a href="https://min.io/" target="_blank" rel="noopener noreferrer">Minio<svg class="link-external-icon" aria-hidden="true" focusable="false" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"/><polyline points="15 3 21 3 21 9"/><line x1="10" y1="14" x2="21" y2="3"/></svg><span class="visually-hidden"> (externer Link)</span></a>
kennen sicherlich nur diejenigen die tiefer in der technischen Materie der IT stecken. Mit diesem kleinen Tool kannst du nämlich einen S3 kompatiblen Speicherplatz bereit stellen. Dies braucht man zwar nicht so häufig, aber bei mir ist S3 Speicher sehr häufig das Backend für meine Backups. Gerade in meinem Kubernetes Cluster werden sämtliche Backups auf meinen Minio-Server gespeichert. Sei es die Volumes der Anwendungen oder Datenbank Backups, alles wird in einzelnen sogenannten Buckets gespeichert. Wer möchte könnten sogar hier noch eine gewisse Versionierung mit einbringen.</p><p>Ich wünschte es könnten mehr Softwareprodukte S3 Speicher als Backend für die Dateiablage nutzen. Sicherlich ist das eher etwas für fortgeschrittene, aber die einfachheit überzeugt für mich. Zumal die Dateiablage via Netzwerkprotokolle wie SMB oder NFS immer mal wieder ihre Fallstricke haben.</p><h2 id="nummer-4-gatus">Nummer 4: Gatus<a href="#nummer-4-gatus" class="heading-anchor" aria-label="Diesen Abschnitt verlinken"><svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a></h2><p>Viele werden Uptime Kuma als &ldquo;Monitoring-Tool&rdquo; kennen. Damit kann man hervorragend die Verfügbarkeit seiner Services im Homelab überwachen und sich über eine Statusänderung benachrichtigen lassen. Uptime Kuma würde ich auch jedem empfehlen im Homelab zu installieren. Sobald man allerdings versucht viele Dinge nur mittels einzelnen Konfigurationsdateien zu betreiben wird es schwierig. Das sogenannte Config-as-Code Prinzip hilft mir Dinge sehr einfach und nachhaltig reproduzieren zu können. Damit kann man in nur wenigen Augenblicken den &ldquo;alten&rdquo; Stand wiederherstellen. Häufig sind Backup- und Restoreprozesse in Anwendungen nicht vorhanden oder nur schwerlich umsetzbar. Eine Automatisierung ist nur in seltenen Fällen gegeben.</p><p>Gatus habe ich in meinem Kubernetes Cluster installiert und wird dort über eine einzelne Datei konfiguriert. Sobald die Anwendung bei einer Neuinstallation deployt wurde, habe ich den exakt gleichen Status wie vorher. Es erspart mühselige Arbeit alles neu einrichten zu müssen.</p><h2 id="nummer-3-immich">Nummer 3: Immich<a href="#nummer-3-immich" class="heading-anchor" aria-label="Diesen Abschnitt verlinken"><svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a></h2><p>Immich bezeichnet sich selbst als Google Photos alternative. Entsprechend würde das theoretisch auch für Apple Fotos gelten. Wobei Immich die Funktion zur Bearbeitung von Fotos fehlt. Du kannst mit der Software automatisiert deine Bilder deines Smartphones auf deinen Server laden. Dort können sie mittels Bilderkennung Personen kennzeichnen oder Ort auf einer Karte visualisieren. Letzteres natürlich nur mit entsprechend vorhandenen EXIF Daten. Immich nutze ich mittlerweile als &ldquo;Langzeitbackup&rdquo; meiner Fotos. Auf meinem Smartphone kann ich so schneller die Bilder löschen und aufräumen. Alle paar Wochen sortiere ich die Bilder in Immich dann entsprechenden Alben zu oder lösche gegebenenfalls auch hier.</p><p>Die Software hat leider einen Nachteil: Sie wird sehr aktiv entwickelt. Alle paar Versionen gibts ein Breaking Change der glücklicherweise auch als entsprechender gekennzeichnet wird. Ein einfaches automatisches Updaten z. B. über Docker Container und Watchtower wäre also nicht zu empfehlen.</p><div class="video-embed" data-src="https://www.youtube-nocookie.com/embed/XRsZi7vxVlQ?autoplay=1&rel=0"><button class="video-embed-trigger" type="button" data-umami-event="Video Load" data-umami-event-provider="YouTube" data-umami-event-id="XRsZi7vxVlQ"><svg class="video-embed-play-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true" width="48" height="48"><circle cx="12" cy="12" r="12" fill="rgba(0,0,0,0.6)"/><path d="M9.5 7.5l7 4.5-7 4.5V7.5z" fill="white"/></svg><span class="video-embed-title">YouTube Video</span><span class="video-embed-note">YouTube &middot; Klicken zum Laden</span></button></div><h2 id="nummer-2-mastodon-server">Nummer 2: Mastodon Server<a href="#nummer-2-mastodon-server" class="heading-anchor" aria-label="Diesen Abschnitt verlinken"><svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a></h2><p>Als Herr M. Twitter aufkaufte ging es mit der Plattform leider stark bergab. Am Anfang hoffte ich noch, dass es nicht ganz so tragisch wird, bin mittlerweile allerdings sehr froh die Plattform &ldquo;verlassen&rdquo; zu haben. Mein Account existiert dort noch, wird aber seit langem nicht mehr aktiv genutzt. Ich bin dann sehr schnell zu Mastodon gewechselt. Gerade so als ITler eine sehr interessante Plattform. Zudem BluSky und Threads damals noch nicht wirklich in Europa zugänglich waren.</p><p>Seit vielen Monaten hoste ich also meine eigene Instanz teqqy.social. In dem Netzwerk bin ich derzeit auch was das posten von Beiträgen angeht, am aktivsten. Über die Zeit hinweg habe ich dort auch viele gleichgesinnte getroffen und fühle mich dort sehr wohl. Natürlich hat Mastodon nicht die Nutzeranzahl und für Menschen oder Organisationen die unbedingt Reichweite benötigen ist es derzeit nicht das richtige Netzwerk.</p><h2 id="nummer-1-home-assistant">Nummer 1: Home Assistant<a href="#nummer-1-home-assistant" class="heading-anchor" aria-label="Diesen Abschnitt verlinken"><svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a></h2><p>Auch in meinem alten Beitrag war Home Assistant die beliebteste Software in meinem Homelab. Wobei die Position 1 nicht unbedingt aus dem &ldquo;Lieblings&rdquo;-Faktor heraus entstand sondern weil sie einfach Elementar wichtig geworden ist. Mit<a href="https://www.home-assistant.io/" target="_blank" rel="noopener noreferrer">Home Assistant<svg class="link-external-icon" aria-hidden="true" focusable="false" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"/><polyline points="15 3 21 3 21 9"/><line x1="10" y1="14" x2="21" y2="3"/></svg><span class="visually-hidden"> (externer Link)</span></a>
werden sämtliche aktiven Komponenten des Hauses gesteuert, Alarme generiert, die Energienutzung optimiert sowie Langzeitaufzeichnungen von Strom und Wasser realisiert. Ohne die wohl beste Smart Home Software kämen wir nicht mehr aus. Dabei nutzen wir mittlerweile nur ein Bruchteil der Möglichkeiten die die Software mittlerweile liefern kann. Unser Smart Home besteht aus ca.</p><ul><li>10 Z-Wave</li><li>24 ZigBee</li><li>8 WiFi</li></ul><p>Aktoren, Sensoren und anderen Geräten. Diese möchte ich sauber über ein Frontend managen. Dabei ist Home Assistant nicht immer die zuverlässigste Software aber ich habe hier alle Freiheiten schnell und (meistens) unkompliziert einzelne Komponenten auszutauschen.
Manchmal sind es aber auch einfach Kleinigkeiten die mir Home Assistant ermöglicht, z. B. mittels Knopfdruck auf meinem Elgato Streamdeck die Videobeleuchtung für ein Teams-Meeting einzuschalten. Oder kürzlich via Music Assistant den Radiosender auf den HomePod Mini im Büro abspielen zu lassen. Wer sich noch nicht mit der Software vertraut gemacht hat, sollte auf jeden Fall mal ein Blick darauf werfen.</p>
]]></content:encoded><category>homelab</category><category>mastodon</category><category>home-assistant</category><category>minio</category></item><item><title>Proxmox Backup Server auf UnRaid via NFS sichern</title><link>https://www.teqqy.de/proxmox-backup-server-auf-unraid-via-nfs-sichern/</link><pubDate>Fri, 15 Mar 2024 11:45:00 +0100</pubDate><lastBuildDate>Fri, 15 Mar 2024 11:45:00 +0100</lastBuildDate><guid isPermaLink="true">https://www.teqqy.de/proxmox-backup-server-auf-unraid-via-nfs-sichern/</guid><description>Der Proxmox Backup Server ist eine eigenständige Software mit dem man sein Proxmox Server besser sichern kann. Dieser bietet diverse weitere Features wie Einzeldateiwiederherstellung. Wenn du ein bisschen mehr wissen möchtest, empfehle ich dir mein Video dazu.
YouTube Video YouTube &amp;middot; Klicken zum Laden In dieser Anleitung soll es aber darum gehen wie man beim Proxmox Backup Server eine NFS Freigabe hinzufügen kann. Da ich UnRaid als NAS System derzeit verwende bin ich hier direkt auf weitere Fehler gestoßen. Grund genug alles zusammen in einen Blogbeitrag zu verfassen. Vielleicht stößt jemand anderes auch auf dieses Problem.</description><content:encoded>&lt;![CDATA[<p>Der Proxmox Backup Server ist eine eigenständige Software mit dem man sein Proxmox Server besser sichern kann. Dieser bietet diverse weitere Features wie Einzeldateiwiederherstellung. Wenn du ein bisschen mehr wissen möchtest, empfehle ich dir mein Video dazu.</p><div class="video-embed" data-src="https://www.youtube-nocookie.com/embed/ckq4ux-ZSvU?autoplay=1&rel=0"><button class="video-embed-trigger" type="button" data-umami-event="Video Load" data-umami-event-provider="YouTube" data-umami-event-id="ckq4ux-ZSvU"><svg class="video-embed-play-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true" width="48" height="48"><circle cx="12" cy="12" r="12" fill="rgba(0,0,0,0.6)"/><path d="M9.5 7.5l7 4.5-7 4.5V7.5z" fill="white"/></svg><span class="video-embed-title">YouTube Video</span><span class="video-embed-note">YouTube &middot; Klicken zum Laden</span></button></div><p>In dieser Anleitung soll es aber darum gehen wie man beim Proxmox Backup Server eine NFS Freigabe hinzufügen kann. Da ich UnRaid als NAS System derzeit verwende bin ich hier direkt auf weitere Fehler gestoßen. Grund genug alles zusammen in einen Blogbeitrag zu verfassen. Vielleicht stößt jemand anderes auch auf dieses Problem.</p><h2 id="nfs-freigabe-in-unraid-anlegen">NFS Freigabe in Unraid anlegen<a href="#nfs-freigabe-in-unraid-anlegen" class="heading-anchor" aria-label="Diesen Abschnitt verlinken"><svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a></h2><p>In Unraid legen wir uns zuerst eine Freigabe an. In dieser Anleitung heißt die Freigabe<em>proxmox</em>. Das ist für die weiteren Schritte wichtig zu wissen. Ich empfehle die Backups erst auf dem Cache Array zu speichern und dann per. Mover auf das eigentliche Array verschieben zu lassen. So sind die Backups deutlich schneller erstellt.
Wenn die Freigabe angelegt ist, möchte wir diese natürlich via NFS publizieren. Also stellen wir<strong>Exportieren</strong> auf<strong>ja</strong>. Anschließend müssen wir die<strong>Sicherheit</strong> von<strong>Öffentlich</strong> auf<strong>privat</strong> umstellen. Das ist wichtig, da wir sonst keine besonderen NFS Export Parameter mitgeben können. In dem Feld<strong>Regel</strong> Tragen wir dann folgendes ein:</p><div class="code-block"><div class="code-block-header"><span class="code-lang-label"/><button class="code-copy-btn" type="button" aria-label="Code kopieren" data-umami-event="Code Copy" data-umami-event-lang=""><svg class="icon-copy" xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"/><path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"/></svg><svg class="icon-check" xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><polyline points="20 6 9 17 4 12"/></svg></button></div><pre tabindex="0"><code>192.168.10.19/24(sec=sys,rw,insecure,anongid=100,anonuid=99,no_root_squash)</code></pre></div><p>Die IP-Adresse am Anfang muss auf die IP-Adresse deines Promox Backup Servers angepasst werden. Natürlich könntest du auch das ganze Netz frei geben, ist aber aus Sicherheitsgründen nicht empfohlen.</p><p><img src="/proxmox-backup-server-auf-unraid-via-nfs-sichern/images/pbs-unraid-share-unraid-share_hu_884b46f29ebad30d.webp" srcset="/proxmox-backup-server-auf-unraid-via-nfs-sichern/images/pbs-unraid-share-unraid-share_hu_bd42855b88ffa86f.webp 384w, /proxmox-backup-server-auf-unraid-via-nfs-sichern/images/pbs-unraid-share-unraid-share_hu_884b46f29ebad30d.webp 768w, /proxmox-backup-server-auf-unraid-via-nfs-sichern/images/pbs-unraid-share-unraid-share_hu_294c53ffd3badffb.webp 1536w" sizes="(max-width: 768px) 100vw, 768px" alt="Unraid NFS Share Einstellungen" loading="lazy" fetchpriority="auto" decoding="async" width="768" height="154"/><h2 id="pbs-nfs-freigabe-einrichten">PBS NFS Freigabe einrichten<a href="#pbs-nfs-freigabe-einrichten" class="heading-anchor" aria-label="Diesen Abschnitt verlinken"><svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a></h2><p>Nun können wir uns um den Proxmox Backup Server kümmern. Diesen Part habe ich ebenfalls mal in einem Video fest gehalten. Falls du also lieber das schauen möchtest. Andernfalls lies gerne weiter.</p><div class="video-embed" data-src="https://www.youtube-nocookie.com/embed/fOMzkReoaBI?autoplay=1&rel=0"><button class="video-embed-trigger" type="button" data-umami-event="Video Load" data-umami-event-provider="YouTube" data-umami-event-id="fOMzkReoaBI"><svg class="video-embed-play-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true" width="48" height="48"><circle cx="12" cy="12" r="12" fill="rgba(0,0,0,0.6)"/><path d="M9.5 7.5l7 4.5-7 4.5V7.5z" fill="white"/></svg><span class="video-embed-title">YouTube Video</span><span class="video-embed-note">YouTube &middot; Klicken zum Laden</span></button></div><p>Wir müssen uns per SSH mit dem Server verbinden. Anschließend überprüfen wir ob der NFS Client installiert ist bzw. installieren ihn direkt.</p><div class="code-block"><div class="code-block-header"><span class="code-lang-label">bash</span><button class="code-copy-btn" type="button" aria-label="Code kopieren" data-umami-event="Code Copy" data-umami-event-lang="bash"><svg class="icon-copy" xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"/><path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"/></svg><svg class="icon-check" xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><polyline points="20 6 9 17 4 12"/></svg></button></div><div class="highlight"><pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>apt install nfs-common</span></span></code></pre></div></div><p>Bei mir war er schon installiert, aber sicher ist sicher. Anschließend wollen wir die NFS Freigabe vom Unraid Server mounten. In Linux werden Freigaben normalerweise nach<em>/mnt</em> gelegt. Also erstellen wir uns dort drin ein Verzeichnis in dem wir das NAS mounten.</p><div class="code-block"><div class="code-block-header"><span class="code-lang-label">bash</span><button class="code-copy-btn" type="button" aria-label="Code kopieren" data-umami-event="Code Copy" data-umami-event-lang="bash"><svg class="icon-copy" xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"/><path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"/></svg><svg class="icon-check" xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><polyline points="20 6 9 17 4 12"/></svg></button></div><div class="highlight"><pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>mkdir -p /mnt/nfs-backup</span></span></code></pre></div></div><p>Du kannst natürlich den Part<em>nfs-backup</em> umbenennen. Passe nur den Rest der Anleitung entsprechend an deine Umgebung an.</p><p>Nun mounten wir die Freigabe mit</p><div class="code-block"><div class="code-block-header"><span class="code-lang-label">bash</span><button class="code-copy-btn" type="button" aria-label="Code kopieren" data-umami-event="Code Copy" data-umami-event-lang="bash"><svg class="icon-copy" xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"/><path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"/></svg><svg class="icon-check" xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><polyline points="20 6 9 17 4 12"/></svg></button></div><div class="highlight"><pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>mount -t nfs 192.168.10.21:/mnt/user/proxmox /mnt/nfs-backup</span></span></code></pre></div></div><p>Die IP-Adresse musst du natürlich auf die IP-Adresse deines Unraid Servers anpassen. Hier sollte natürlich kein Fehler auftreten. Wenn das der Fall sein sollte, überprüfe ob die Freigabe und der Ordner korrekt angelegt worden sind.
Damit die Freigabe auch nach dem Neustart vom PBS wieder funktioniert sollten wir das permanent machen. Dazu editieren wir die<strong>/etc/fstab</strong> Datei</p><div class="code-block"><div class="code-block-header"><span class="code-lang-label">bash</span><button class="code-copy-btn" type="button" aria-label="Code kopieren" data-umami-event="Code Copy" data-umami-event-lang="bash"><svg class="icon-copy" xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"/><path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"/></svg><svg class="icon-check" xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><polyline points="20 6 9 17 4 12"/></svg></button></div><div class="highlight"><pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>nano /etc/fstab</span></span></code></pre></div></div><p>Und fügen am Ende folgende Zeile ein:</p><div class="code-block"><div class="code-block-header"><span class="code-lang-label">conf</span><button class="code-copy-btn" type="button" aria-label="Code kopieren" data-umami-event="Code Copy" data-umami-event-lang="conf"><svg class="icon-copy" xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"/><path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"/></svg><svg class="icon-check" xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><polyline points="20 6 9 17 4 12"/></svg></button></div><pre tabindex="0"><code class="language-conf" data-lang="conf">192.168.10.21:/mnt/user/proxmox /mnt/nfs-backup nfs rw 0 0</code></pre></div><h2 id="berechtigungen-der-freigabe-anpassen">Berechtigungen der Freigabe anpassen<a href="#berechtigungen-der-freigabe-anpassen" class="heading-anchor" aria-label="Diesen Abschnitt verlinken"><svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a></h2><p>Der Proxmox Backup Server erstellt die Sicherungen mit dem Nutzer<strong>backup</strong> und der UUID/GUID<strong>34</strong>. Da dies nicht zu der Freigabe von Unraid passt, müssen wir die ändern. Ich habe festgestellt, dass es am einfachsten ist, wenn wir in der Freigabe einen weiteren Ordner anlegen und dem die notwendigen Berechtigungen geben.</p><div class="code-block"><div class="code-block-header"><span class="code-lang-label">bash</span><button class="code-copy-btn" type="button" aria-label="Code kopieren" data-umami-event="Code Copy" data-umami-event-lang="bash"><svg class="icon-copy" xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"/><path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"/></svg><svg class="icon-check" xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><polyline points="20 6 9 17 4 12"/></svg></button></div><div class="highlight"><pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>mkdir -p /mnt/nfs-backup/backups</span></span></code></pre></div></div><p>Auch hier kannst du das gerne an deine Gegebenheiten anpassen. Anschließend ändern wir den Besitzer des Ordners</p><div class="code-block"><div class="code-block-header"><span class="code-lang-label">bash</span><button class="code-copy-btn" type="button" aria-label="Code kopieren" data-umami-event="Code Copy" data-umami-event-lang="bash"><svg class="icon-copy" xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"/><path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"/></svg><svg class="icon-check" xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><polyline points="20 6 9 17 4 12"/></svg></button></div><div class="highlight"><pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>chown backup:backup /mnt/nfs-backup/backups</span></span></code></pre></div></div><p>Sollte hier ein Fehler auftreten mit<em>Operation not permitted</em> hast du ggf. die Anleitung oben zu Unraid vergessen. Die NFS Export Parameter sind nämlich hier entscheidend.</p><h2 id="datastore-im-proxmox-backup-server-hinzufügen">Datastore im Proxmox Backup Server hinzufügen<a href="#datastore-im-proxmox-backup-server-hinzuf%c3%bcgen" class="heading-anchor" aria-label="Diesen Abschnitt verlinken"><svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a></h2><p>Jetzt können wir endlich die Freigabe auch im PBS hinzufügen. Dazu verbinden wir uns zur PBS GUI und wählen links unter<strong>Datastore</strong><strong>Add Datastore</strong> aus.
Den Namen kannst du natürlich frei vergeben. Als<strong>Backing Path</strong> kommt der Pfad der Freigabe rein. In unserem Fall<em>/mnt/nfs-backup/backups</em>
Solltest du den angepasst haben, bitte entsprechend hier auch tun. Die restlichen Parameter kannst du nach belieben einstellen.</p><p><img src="/proxmox-backup-server-auf-unraid-via-nfs-sichern/images/pbs-unraid-share-pbs-datastore_hu_67b0429040f4da0c.webp" srcset="/proxmox-backup-server-auf-unraid-via-nfs-sichern/images/pbs-unraid-share-pbs-datastore_hu_8091a92e986078f7.webp 384w, /proxmox-backup-server-auf-unraid-via-nfs-sichern/images/pbs-unraid-share-pbs-datastore_hu_67b0429040f4da0c.webp 768w" sizes="(max-width: 768px) 100vw, 768px" alt="PBS Datastore Einstellungen" loading="lazy" fetchpriority="auto" decoding="async" width="768" height="297"/><p>Sollte hier ein Fehler auftreten wird der Backup-Nutzer nicht in das Verzeichnis schreiben dürfen. Überprüfe nochmal die Berechtigungen des Pfades.</p><p>Der Proxmox Backup Server legt nach dem Bestätigen die ganzen Chunks an. Dies kann je nach Performance des Netzwerkes oder des Unraid Servers zwischen ein paar Sekunden und ein paar Minuten dauern. Anschließend kannst du den Datastore zu Proxmox hinzufügen und deine Backups erstellen.</p>
]]></content:encoded><category>proxmox</category><category>backup</category><category>unraid</category></item><item><title>Tutorial: S3 Speicher mit Minio &amp; nginx (ohne Docker) selbst hosten</title><link>https://www.teqqy.de/2024-02-s3-speicher-mit-minio-und-nginx-tutorial/</link><pubDate>Sat, 24 Feb 2024 21:18:00 +0100</pubDate><lastBuildDate>Sat, 24 Feb 2024 21:18:00 +0100</lastBuildDate><guid isPermaLink="true">https://www.teqqy.de/2024-02-s3-speicher-mit-minio-und-nginx-tutorial/</guid><description>Ich persönlich finde S3 Speicher sehr angenehm und versuche ihn für verschiedene Anwendungsbereiche zu verwenden. Heute habe ich mir wieder einen extra Server installiert und möchte den Prozess hiermit quasi dokumentieren. Mit dieser Anleitung installieren wir Minio (externer Link) auf einem Debian 12 (Bookworm) System. Dazu verwenden wir direkt nginx als Reverse Proxy und sichern das mittels Let&amp;rsquo;s encrypt Zertifikaten ab, sodass immer eine gesicherte Verbindung aufgebaut werden kann.</description><content:encoded>&lt;![CDATA[<p>Ich persönlich finde S3 Speicher sehr angenehm und versuche ihn für verschiedene Anwendungsbereiche zu verwenden. Heute habe ich mir wieder einen extra Server installiert und möchte den Prozess hiermit quasi dokumentieren. Mit dieser Anleitung installieren wir<a href="https://min.io/" target="_blank" rel="noopener noreferrer">Minio<svg class="link-external-icon" aria-hidden="true" focusable="false" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"/><polyline points="15 3 21 3 21 9"/><line x1="10" y1="14" x2="21" y2="3"/></svg><span class="visually-hidden"> (externer Link)</span></a>
auf einem Debian 12 (Bookworm) System. Dazu verwenden wir direkt nginx als Reverse Proxy und sichern das mittels Let&rsquo;s encrypt Zertifikaten ab, sodass immer eine gesicherte Verbindung aufgebaut werden kann.</p><h2 id="was-ist-s3-speicher">Was ist S3 Speicher?<a href="#was-ist-s3-speicher" class="heading-anchor" aria-label="Diesen Abschnitt verlinken"><svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a></h2><p>S3-Speicher bezieht sich auf Amazon Simple Storage Service, kurz Amazon S3. Es handelt sich dabei um einen skalierbaren Cloud-Speicherdienst von Amazon Web Services (AWS). S3 ermöglicht es Benutzern, große Datenmengen sicher und kostengünstig in der Cloud zu speichern. Ein Objektspeicher ist eine Art von Datenspeicher, der darauf ausgelegt ist, große Mengen unstrukturierter Daten in Form von Objekten zu speichern. Jedes Objekt besteht aus Daten, Metadaten und einem eindeutigen Identifikator. Im Fall von S3 werden diese Objekte in sogenannten &ldquo;Buckets&rdquo; organisiert, die als virtuelle Container dienen, um die Objekte zu gruppieren.</p><h2 id="installation-von-minio">Installation von Minio<a href="#installation-von-minio" class="heading-anchor" aria-label="Diesen Abschnitt verlinken"><svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a></h2><h3 id="anlegen-des-nutzers-und-gruppe">Anlegen des Nutzers und Gruppe<a href="#anlegen-des-nutzers-und-gruppe" class="heading-anchor" aria-label="Diesen Abschnitt verlinken"><svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a></h3><p>Mittlerweile gibt es extra Paket für<a href="https://www.debian.org" target="_blank" rel="noopener noreferrer">Debian<svg class="link-external-icon" aria-hidden="true" focusable="false" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"/><polyline points="15 3 21 3 21 9"/><line x1="10" y1="14" x2="21" y2="3"/></svg><span class="visually-hidden"> (externer Link)</span></a>
und Ubuntu sodass sich die Installation etwas mehr vereinfacht. Minio sollte natürlich nicht im Kontext des root-Nutzers laufen. Best practise ist hier, sich einen eigenen Nutzer anzulegen. Du kannst natürlich auch gerne schon einen vorhanden verwenden.</p><div class="code-block"><div class="code-block-header"><span class="code-lang-label">bash</span><button class="code-copy-btn" type="button" aria-label="Code kopieren" data-umami-event="Code Copy" data-umami-event-lang="bash"><svg class="icon-copy" xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"/><path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"/></svg><svg class="icon-check" xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><polyline points="20 6 9 17 4 12"/></svg></button></div><div class="highlight"><pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>groupadd -r minio-user</span></span><span style="display:flex;"><span>useradd -M -r -g minio-user minio-user</span></span></code></pre></div></div><p>Wie geschrieben kannst du die Parameter auch entsprechend anpassen. Bedenke aber, dass die Anleitung davon ausgeht, dass du die Nutzer und Gruppe genau so genannt wurden.</p><h3 id="datenverzeichnis-vorbereiten">Datenverzeichnis vorbereiten<a href="#datenverzeichnis-vorbereiten" class="heading-anchor" aria-label="Diesen Abschnitt verlinken"><svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a></h3><p>Als nächstes solltest du dir noch Gedanken machen wohin auf deinem System die Daten abgelegt werden sollen. In meinem Fall lege dich diese nach<em>/opt</em> ab.
Zuerst wird das Verzeichnis angelegt und anschließend bekommt unser Minio Nutzer<em>minio-user</em> das Verzeichnis als Besitzer zugeordnet.</p><div class="code-block"><div class="code-block-header"><span class="code-lang-label">bash</span><button class="code-copy-btn" type="button" aria-label="Code kopieren" data-umami-event="Code Copy" data-umami-event-lang="bash"><svg class="icon-copy" xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"/><path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"/></svg><svg class="icon-check" xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><polyline points="20 6 9 17 4 12"/></svg></button></div><div class="highlight"><pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>mkdir -p /opt/minio</span></span><span style="display:flex;"><span>chown minio-user:minio-user /opt/minio</span></span></code></pre></div></div><h3 id="minio-paket-installieren">Minio Paket installieren<a href="#minio-paket-installieren" class="heading-anchor" aria-label="Diesen Abschnitt verlinken"><svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a></h3><p>Glücklicherweise gibt es Minio mittlerweile auch als fertiges Paket, sodass wir uns um diverse Dinge keine Gedanken machen müssen. Dies beinhaltet nämlich mittlerweile auch einen<em>systemd</em> Skript um das Programm sauber darüber starte und stoppen zu können.
Zuerst laden wir uns das Paket erst einmal runter. Sehr wahrscheinlich ist die verlinkte Version schon veraltet wenn du dieses Tutorial liest. Schaue als bitter mal<a href="https://dl.min.io/server/minio/release/linux-amd64/archive" target="_blank" rel="noopener noreferrer">hier<svg class="link-external-icon" aria-hidden="true" focusable="false" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"/><polyline points="15 3 21 3 21 9"/><line x1="10" y1="14" x2="21" y2="3"/></svg><span class="visually-hidden"> (externer Link)</span></a>
welche die aktuelle Version ist und ersetze die Versionnummer.</p><div class="code-block"><div class="code-block-header"><span class="code-lang-label">bash</span><button class="code-copy-btn" type="button" aria-label="Code kopieren" data-umami-event="Code Copy" data-umami-event-lang="bash"><svg class="icon-copy" xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"/><path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"/></svg><svg class="icon-check" xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><polyline points="20 6 9 17 4 12"/></svg></button></div><div class="highlight"><pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>wget https://dl.min.io/server/minio/release/linux-amd64/archive/minio_20240217011557.0.0_amd64.deb -O minio.deb</span></span></code></pre></div></div><p>Sollte dein System aus irgendwelchen Gründen den Befehl<strong>wget</strong> nicht kennen kannst du den mittels</p><div class="code-block"><div class="code-block-header"><span class="code-lang-label">bash</span><button class="code-copy-btn" type="button" aria-label="Code kopieren" data-umami-event="Code Copy" data-umami-event-lang="bash"><svg class="icon-copy" xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"/><path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"/></svg><svg class="icon-check" xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><polyline points="20 6 9 17 4 12"/></svg></button></div><div class="highlight"><pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>apt install wget -y</span></span></code></pre></div></div><p>installieren.</p><p>Nun brauchen wir nur noch Minio zu installieren und haben schon einen großen Teil erledigt.</p><div class="code-block"><div class="code-block-header"><span class="code-lang-label">bash</span><button class="code-copy-btn" type="button" aria-label="Code kopieren" data-umami-event="Code Copy" data-umami-event-lang="bash"><svg class="icon-copy" xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"/><path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"/></svg><svg class="icon-check" xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><polyline points="20 6 9 17 4 12"/></svg></button></div><div class="highlight"><pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>dpkg -i minio.deb</span></span></code></pre></div></div><p>Nach ein paar Sekunden ist das ganze auch schon fertig und wir können anfangen das Programm zu konfigurieren.</p><h2 id="standardkonfiguration-für-minio-anlegen">Standardkonfiguration für Minio anlegen<a href="#standardkonfiguration-f%c3%bcr-minio-anlegen" class="heading-anchor" aria-label="Diesen Abschnitt verlinken"><svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a></h2><p>Wir nutzen in diesem Tutorial eine recht einfache Konfiguration. Diese kannst du natürlich immer noch nach weiterem belieben erweitern wenn du möchtest. Wir legen uns also die Default Konfiguration an</p><div class="code-block"><div class="code-block-header"><span class="code-lang-label">bash</span><button class="code-copy-btn" type="button" aria-label="Code kopieren" data-umami-event="Code Copy" data-umami-event-lang="bash"><svg class="icon-copy" xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"/><path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"/></svg><svg class="icon-check" xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><polyline points="20 6 9 17 4 12"/></svg></button></div><div class="highlight"><pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>touch /etc/default/minio</span></span></code></pre></div></div><p>und bearbeiten diese. Ich verwende immer<em>vim</em> als Editor. Du kannst natürlich auch gerne<em>nano</em> verwenden wenn dir das lieber ist.</p><div class="code-block"><div class="code-block-header"><span class="code-lang-label">bash</span><button class="code-copy-btn" type="button" aria-label="Code kopieren" data-umami-event="Code Copy" data-umami-event-lang="bash"><svg class="icon-copy" xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"/><path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"/></svg><svg class="icon-check" xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><polyline points="20 6 9 17 4 12"/></svg></button></div><div class="highlight"><pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>vim /etc/default/minio</span></span></code></pre></div></div><p>Darin kopieren wir jetzt folgende Zeilen</p><div class="code-block"><div class="code-block-header"><span class="code-lang-label"/><button class="code-copy-btn" type="button" aria-label="Code kopieren" data-umami-event="Code Copy" data-umami-event-lang=""><svg class="icon-copy" xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"/><path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"/></svg><svg class="icon-check" xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><polyline points="20 6 9 17 4 12"/></svg></button></div><pre tabindex="0"><code># Definition des Admin Accounts
MINIO_ROOT_USER=myminioadmin
MINIO_ROOT_PASSWORD=minio-secret-key-change-me
# MINIO_VOLUMES setzt das Verzeichnis in dem unsere Daten gespeichert werden
MINIO_VOLUMES="/opt/minio"
# Damit wir auch die Konsole bzw. Webfrontend verwenden können, müssen wir das natürlich noch setzen
MINIO_OPTS="--console-address :9001"</code></pre></div><p>Bitte pass entsprechend<strong>MINIO_ROOT_USER</strong> und<strong>MINIO_ROOT_PASSWORD</strong> an und lasse die Werte nicht auf default setzen. Auch wenn du das System nicht nach außen hin veröffentlichst, sollten niemals Standardzugangsdaten verwendet werden.</p><h2 id="minio-starten-und-login">Minio starten und Login<a href="#minio-starten-und-login" class="heading-anchor" aria-label="Diesen Abschnitt verlinken"><svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a></h2><p>Nun starten wir Minio erst einmal um zu sehen ob alles funktioniert. Zudem sollten wir uns auch einmal anmelden um auch das gegengetestet zu haben.</p><div class="code-block"><div class="code-block-header"><span class="code-lang-label">bash</span><button class="code-copy-btn" type="button" aria-label="Code kopieren" data-umami-event="Code Copy" data-umami-event-lang="bash"><svg class="icon-copy" xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"/><path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"/></svg><svg class="icon-check" xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><polyline points="20 6 9 17 4 12"/></svg></button></div><div class="highlight"><pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>systemctl enable minio</span></span><span style="display:flex;"><span>systemctl start minio</span></span></code></pre></div></div><p>Nun öffnen wir einen Browser und navigieren zu<strong>{HOSTIP}:9001</strong> und sollten anschließend so ein Bild sehen.<img src="/2024-02-s3-speicher-mit-minio-und-nginx-tutorial/images/minio-tutorial-startseite_hu_24bae8240ed41288.webp" srcset="/2024-02-s3-speicher-mit-minio-und-nginx-tutorial/images/minio-tutorial-startseite_hu_8c9c256c0e6c52bb.webp 384w, /2024-02-s3-speicher-mit-minio-und-nginx-tutorial/images/minio-tutorial-startseite_hu_24bae8240ed41288.webp 768w" sizes="(max-width: 768px) 100vw, 768px" alt="Startseite des S3 Servers Minio" loading="lazy" fetchpriority="auto" decoding="async" width="768" height="443">
Bitte anschließend einmal einloggen um zu sehen, dass auch deine Zugangsdaten korrekt funktionieren.</p><h2 id="nginx-als-rervse-proxy-mit-zertifkat-einrichten">nginx als Rervse Proxy mit Zertifkat einrichten<a href="#nginx-als-rervse-proxy-mit-zertifkat-einrichten" class="heading-anchor" aria-label="Diesen Abschnitt verlinken"><svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a></h2><p>Ich verwende in dem Tutorial<strong>Cerbot</strong> zum generieren des Let&rsquo;s encrypt Zertifikates. Zudem wird mein öffentliches DNS meiner Domain von Cloudflare betrieben. Entsprechend verwende ich hier die<em>dns-challenge</em> mit Cloudflare und API Token.</p><h3 id="cloudflare-api-token-generieren">Cloudflare API Token generieren<a href="#cloudflare-api-token-generieren" class="heading-anchor" aria-label="Diesen Abschnitt verlinken"><svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a></h3><p>Auf der Cloudflare Profilseite gibt es den Punkt<a href="https://dash.cloudflare.com/profile/api-tokens" target="_blank" rel="noopener noreferrer">API Tokens<svg class="link-external-icon" aria-hidden="true" focusable="false" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"/><polyline points="15 3 21 3 21 9"/><line x1="10" y1="14" x2="21" y2="3"/></svg><span class="visually-hidden"> (externer Link)</span></a>
(Generischer Link dorthin). Dort legen wir uns rechts oben ein neuen Token an und verwenden das Template<strong>Edit Zone DNS</strong>. Du solltest nun ungefähr dieses Bild hier sehen.<img src="/2024-02-s3-speicher-mit-minio-und-nginx-tutorial/images/minio-tutorial-cloudflare-token_hu_9ad08d68ab07859f.webp" srcset="/2024-02-s3-speicher-mit-minio-und-nginx-tutorial/images/minio-tutorial-cloudflare-token_hu_269ab9dd8ce4d00a.webp 384w, /2024-02-s3-speicher-mit-minio-und-nginx-tutorial/images/minio-tutorial-cloudflare-token_hu_9ad08d68ab07859f.webp 768w" sizes="(max-width: 768px) 100vw, 768px" alt="Cloudflare API Token Template" loading="lazy" fetchpriority="auto" decoding="async" width="768" height="535">
Den Bereich Permissions lassen wir so wie er ist. Im Bereich<strong>Zone Resources</strong> müssen wir im letzten drop down Feld in der Reihe nur noch die entsprechende Domain auswählen. Den Rest können wir mit<strong>Continue to summary</strong> ebenfalls auslassen. Auf der nächsten Seite bestätigen wir mit<strong>Create Token</strong> und nun wird uns unser Token angezeigt. Ich empfehle diesen sicher abzuspeichern falls du den später noch mal für andere Dinge verwenden möchtest.</p><h3 id="pakete-installieren">Pakete installieren<a href="#pakete-installieren" class="heading-anchor" aria-label="Diesen Abschnitt verlinken"><svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a></h3><p>Nun zurück zu unserer Linux Maschine. Wir können hier nun endlich alle benötigten Pakete installieren die wir brauchen.</p><div class="code-block"><div class="code-block-header"><span class="code-lang-label">bash</span><button class="code-copy-btn" type="button" aria-label="Code kopieren" data-umami-event="Code Copy" data-umami-event-lang="bash"><svg class="icon-copy" xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"/><path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"/></svg><svg class="icon-check" xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><polyline points="20 6 9 17 4 12"/></svg></button></div><div class="highlight"><pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>apt install nginx certbot python3-certbot-dns-cloudflare</span></span></code></pre></div></div><p>Dies benötigt ein paar Sekunden und wir können weiter machen uns unser Zertifikat zu besorgen.</p><h3 id="lets-encrypt-zertifikat-mit-certbot-beantragen">Let&rsquo;s encrypt Zertifikat mit Certbot beantragen<a href="#lets-encrypt-zertifikat-mit-certbot-beantragen" class="heading-anchor" aria-label="Diesen Abschnitt verlinken"><svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a></h3><p>Zuerst richten wir noch die Punkte für die DNS Challenge zu Cloudflare ein. Dazu erstellen wir uns ein Verzeichnis</p><div class="code-block"><div class="code-block-header"><span class="code-lang-label">bash</span><button class="code-copy-btn" type="button" aria-label="Code kopieren" data-umami-event="Code Copy" data-umami-event-lang="bash"><svg class="icon-copy" xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"/><path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"/></svg><svg class="icon-check" xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><polyline points="20 6 9 17 4 12"/></svg></button></div><div class="highlight"><pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>mkdir -p /etc/certbot</span></span></code></pre></div></div><p>und legen uns dort eine Datei an</p><div class="code-block"><div class="code-block-header"><span class="code-lang-label">bash</span><button class="code-copy-btn" type="button" aria-label="Code kopieren" data-umami-event="Code Copy" data-umami-event-lang="bash"><svg class="icon-copy" xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"/><path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"/></svg><svg class="icon-check" xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><polyline points="20 6 9 17 4 12"/></svg></button></div><div class="highlight"><pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>touch /etc/certbot/credentials</span></span></code></pre></div></div><p>in diese kommt nun unser Cloudflare Token. Also editieren wir die Datei</p><div class="code-block"><div class="code-block-header"><span class="code-lang-label">bash</span><button class="code-copy-btn" type="button" aria-label="Code kopieren" data-umami-event="Code Copy" data-umami-event-lang="bash"><svg class="icon-copy" xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"/><path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"/></svg><svg class="icon-check" xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><polyline points="20 6 9 17 4 12"/></svg></button></div><div class="highlight"><pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>vim /etc/certbot/credentials</span></span></code></pre></div></div><p>und kopieren folgendes dort rein</p><div class="code-block"><div class="code-block-header"><span class="code-lang-label"/><button class="code-copy-btn" type="button" aria-label="Code kopieren" data-umami-event="Code Copy" data-umami-event-lang=""><svg class="icon-copy" xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"/><path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"/></svg><svg class="icon-check" xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><polyline points="20 6 9 17 4 12"/></svg></button></div><pre tabindex="0"><code>dns_cloudflare_api_token={DEIN_CLOUDFLARE_API_TOKEN}</code></pre></div><p>Damit die Datei nicht von jedem Nutzer auf dem System gelesen werden kann, passen wir noch die Berechtigungen mittels</p><div class="code-block"><div class="code-block-header"><span class="code-lang-label">bash</span><button class="code-copy-btn" type="button" aria-label="Code kopieren" data-umami-event="Code Copy" data-umami-event-lang="bash"><svg class="icon-copy" xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"/><path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"/></svg><svg class="icon-check" xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><polyline points="20 6 9 17 4 12"/></svg></button></div><div class="highlight"><pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>chmod<span style="color:#a5d6ff">600</span> /etc/certbot/credentials</span></span></code></pre></div></div><p>an. Nun haben wir den Grundstock gelegt um das Zertifikat beantragen zu können. Beachte jetzt, dass du die Domain entsprechend an deine Domain anpassen musst.</p><div class="code-block"><div class="code-block-header"><span class="code-lang-label">bash</span><button class="code-copy-btn" type="button" aria-label="Code kopieren" data-umami-event="Code Copy" data-umami-event-lang="bash"><svg class="icon-copy" xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"/><path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"/></svg><svg class="icon-check" xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><polyline points="20 6 9 17 4 12"/></svg></button></div><div class="highlight"><pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>certbot certonly --dns-cloudflare --dns-cloudflare-credentials /etc/certbot/credentials -d minio.example.com -d s3.example.com</span></span></code></pre></div></div><aside class="callout callout-info" role="note" aria-label="Hinweis"><svg class="callout-icon" aria-hidden="true" focusable="false" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="10"/><line x1="12" y1="8" x2="12" y2="12"/><line x1="12" y1="16" x2="12.01" y2="16"/></svg><div class="callout-content"><p class="callout-title">Hinweis</p><div class="callout-body">Aus irgendwelchen Gründen funktioniert das bei mir beim ersten mal nicht immer zuverlässig. Solltest du auf den Fehler stoßen, dass man überprüfen soll, ob der DNS Eintrag gesetzt ist, warte noch kurz und führe den Befehl erneut aus.</div></div></aside><h3 id="nginx-einrichten">nginx einrichten<a href="#nginx-einrichten" class="heading-anchor" aria-label="Diesen Abschnitt verlinken"><svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a></h3><p>Nun können wir uns mit dem Thema nginx als reverse proxy für minio beschäftigen. Die Software wurde bereits oben schon installiert, also können wir direkt mit der Konfiguration der Seite beginnen. Dazu wechseln wir in das Konfigurationsverzeichnis für die Webseiten</p><div class="code-block"><div class="code-block-header"><span class="code-lang-label">bash</span><button class="code-copy-btn" type="button" aria-label="Code kopieren" data-umami-event="Code Copy" data-umami-event-lang="bash"><svg class="icon-copy" xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"/><path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"/></svg><svg class="icon-check" xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><polyline points="20 6 9 17 4 12"/></svg></button></div><div class="highlight"><pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>cd /etc/nginx/sites-available</span></span></code></pre></div></div><p>Dort legen wir dann die Seitenkonfiguration an</p><div class="code-block"><div class="code-block-header"><span class="code-lang-label">bash</span><button class="code-copy-btn" type="button" aria-label="Code kopieren" data-umami-event="Code Copy" data-umami-event-lang="bash"><svg class="icon-copy" xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"/><path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"/></svg><svg class="icon-check" xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><polyline points="20 6 9 17 4 12"/></svg></button></div><div class="highlight"><pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>touch minio.conf</span></span></code></pre></div></div><p>und können dann auch diese im Anschluss bearbeiten</p><div class="code-block"><div class="code-block-header"><span class="code-lang-label">bash</span><button class="code-copy-btn" type="button" aria-label="Code kopieren" data-umami-event="Code Copy" data-umami-event-lang="bash"><svg class="icon-copy" xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"/><path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"/></svg><svg class="icon-check" xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><polyline points="20 6 9 17 4 12"/></svg></button></div><div class="highlight"><pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>vim minio.conf</span></span></code></pre></div></div><p>Dort kannst du dann folgendes rein kopieren:</p><div class="code-block"><div class="code-block-header"><span class="code-lang-label">conf</span><button class="code-copy-btn" type="button" aria-label="Code kopieren" data-umami-event="Code Copy" data-umami-event-lang="conf"><svg class="icon-copy" xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"/><path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"/></svg><svg class="icon-check" xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><polyline points="20 6 9 17 4 12"/></svg></button></div><pre tabindex="0"><code class="language-conf" data-lang="conf">## API End Point
server
{
# Listen
listen 80;
listen [::]:80;
listen 443 ssl http2;
listen [::]:443 ssl http2;
# Directory &amp; Server Naming
server_name s3.example.com;
# HTTP to HTTPS redirection
if ($scheme != "https")
{
return 301 https://$host$request_uri;
}
# SSL
ssl_certificate /etc/letsencrypt/live/minio.example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/minio.example.com/privkey.pem;
# Disable Hidden FIle Access Except Lets Encrypt Verification
location ~ /\.well-known
{
allow all;
}
# Allow special characters in headers
ignore_invalid_headers off;
# Allow any size file to be uploaded.
# Set to a value such as 1000m; to restrict file size to a specific value
client_max_body_size 0;
# Disable buffering
proxy_buffering off;
proxy_request_buffering off;
location /
{
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_connect_timeout 300;
# Default is HTTP/1, keepalive is only enabled in HTTP/1.1
proxy_http_version 1.1;
proxy_set_header Connection "";
chunked_transfer_encoding off;
proxy_pass http://127.0.0.1:9000;
}
# Nginx Logging
access_log /var/log/nginx/s3.example.com-access.log;
error_log /var/log/nginx/s3.example.com-error.log warn;
}
###################### Console ######################
server
{
# Listen
listen 80;
listen [::]:80;
listen 443 ssl http2;
listen [::]:443 ssl http2;
# Directory &amp; Server Naming
server_name minio.example.com;
# HTTP to HTTPS redirection
if ($scheme != "https")
{
return 301 https://$host$request_uri;
}
# SSL
ssl_certificate /etc/letsencrypt/live/minio.example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/minio.example.com/privkey.pem;
# Disable Hidden FIle Access Except Lets Encrypt Verification
location ~ /\.well-known
{
allow all;
}
# Allow special characters in headers
ignore_invalid_headers off;
# Allow any size file to be uploaded.
# Set to a value such as 1000m; to restrict file size to a specific value
client_max_body_size 0;
# Disable buffering
proxy_buffering off;
proxy_request_buffering off;
location /
{
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-NginX-Proxy true;
proxy_connect_timeout 300;
# To support websocket
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
chunked_transfer_encoding off;
proxy_pass http://127.0.0.1:9001;
}
# Nginx Logging
access_log /var/log/nginx/minio.example.com-access.log;
error_log /var/log/nginx/minio.example.com-error.log warn;
}</code></pre></div><p>Bitte beachte, dass du überall das<em>example.com</em> durch deine eigene Domain austauschst. Die Konfiguration habe ich von<a href="https://gist.github.com/amanjuman/800d81481634f296042457fa9fb21697" target="_blank" rel="noopener noreferrer">hier<svg class="link-external-icon" aria-hidden="true" focusable="false" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"/><polyline points="15 3 21 3 21 9"/><line x1="10" y1="14" x2="21" y2="3"/></svg><span class="visually-hidden"> (externer Link)</span></a>
übernommen und ein wenig angepasst.</p><p>Jetzt legen wir noch den symlink an</p><div class="code-block"><div class="code-block-header"><span class="code-lang-label">bash</span><button class="code-copy-btn" type="button" aria-label="Code kopieren" data-umami-event="Code Copy" data-umami-event-lang="bash"><svg class="icon-copy" xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"/><path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"/></svg><svg class="icon-check" xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><polyline points="20 6 9 17 4 12"/></svg></button></div><div class="highlight"><pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>ln /etc/nginx/site-available/minio.conf /etc/nginx/site-enabled/</span></span></code></pre></div></div><p>und sollten testen ob wir auch kein Fehler gemacht haben. Das können wir am einfachsten mittels</p><div class="code-block"><div class="code-block-header"><span class="code-lang-label">bash</span><button class="code-copy-btn" type="button" aria-label="Code kopieren" data-umami-event="Code Copy" data-umami-event-lang="bash"><svg class="icon-copy" xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"/><path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"/></svg><svg class="icon-check" xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><polyline points="20 6 9 17 4 12"/></svg></button></div><div class="highlight"><pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>nginx -t</span></span></code></pre></div></div><p>Hier sollte keine Ausgabe erscheinen. Andernfalls müstest du die angezeigten Fehler noch verbessern. Zu guter letzt können wir nginx neu starten</p><div class="code-block"><div class="code-block-header"><span class="code-lang-label">bash</span><button class="code-copy-btn" type="button" aria-label="Code kopieren" data-umami-event="Code Copy" data-umami-event-lang="bash"><svg class="icon-copy" xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"/><path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"/></svg><svg class="icon-check" xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><polyline points="20 6 9 17 4 12"/></svg></button></div><div class="highlight"><pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>systemctl restart nginx</span></span></code></pre></div></div><p>Jetzt kannst du auch Minio über https über deine Domainnamen erreichen. Solltest du Minio nur im lokalen Netzwerk verwenden, denk daran, dass noch im DNS entsprechend zu hinterlegen.</p><h2 id="optional-minio-admin-cli-installieren">Optional: Minio Admin Cli installieren<a href="#optional-minio-admin-cli-installieren" class="heading-anchor" aria-label="Diesen Abschnitt verlinken"><svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a></h2><p>Gegebenenfalls brauchst du zu einem späteren Zeitpunkt mal die Admin CLI von Minio. Also solltest du diese direkt mit installieren. Diese ist ein einfaches binary das wir nur auf das System kopieren müssen.</p><div class="code-block"><div class="code-block-header"><span class="code-lang-label">bash</span><button class="code-copy-btn" type="button" aria-label="Code kopieren" data-umami-event="Code Copy" data-umami-event-lang="bash"><svg class="icon-copy" xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"/><path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"/></svg><svg class="icon-check" xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><polyline points="20 6 9 17 4 12"/></svg></button></div><div class="highlight"><pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>curl https://dl.min.io/client/mc/release/linux-amd64/mc -o /usr/local/sbin/mc</span></span></code></pre></div></div><p>Allerdings wird es ohne Execute Rechte nicht ausgeführt werden können, also fügen wir diese noch hinzu</p><div class="code-block"><div class="code-block-header"><span class="code-lang-label">bash</span><button class="code-copy-btn" type="button" aria-label="Code kopieren" data-umami-event="Code Copy" data-umami-event-lang="bash"><svg class="icon-copy" xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"/><path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"/></svg><svg class="icon-check" xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><polyline points="20 6 9 17 4 12"/></svg></button></div><div class="highlight"><pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>chmod +x /usr/local/sbin/mc</span></span></code></pre></div></div><p>Anschließend könntest du mittels<strong>mc</strong> den Minio Server auch via CLI administrieren.</p><h2 id="fazit">Fazit<a href="#fazit" class="heading-anchor" aria-label="Diesen Abschnitt verlinken"><svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a></h2><p>In meinem<a href="https://teqqy.de/categories/kubernetes/" target="_blank" rel="noopener noreferrer">Kubernetes Cluster<svg class="link-external-icon" aria-hidden="true" focusable="false" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"/><polyline points="15 3 21 3 21 9"/><line x1="10" y1="14" x2="21" y2="3"/></svg><span class="visually-hidden"> (externer Link)</span></a>
verwende ich Minio um darauf<a href="/proxmox-backup-server/">Backups</a>
abzulegen die mittels<a href="https://github.com/backube/volsync" target="_blank" rel="noopener noreferrer">volsync<svg class="link-external-icon" aria-hidden="true" focusable="false" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"/><polyline points="15 3 21 3 21 9"/><line x1="10" y1="14" x2="21" y2="3"/></svg><span class="visually-hidden"> (externer Link)</span></a>
erstellt wurden. Ebenso verwendet Thanos den S3 Speicher als Langzeitspeicher um die Prometheus Daten lange aufzuheben.</p><p>Solltest du Fragen zu dem Tutorial haben, kannst du mich gerne über eine der im Blog angegebenen Netzwerke erreichen.</p>
]]></content:encoded><category>minio</category><category>nginx</category><category>ssl-tls</category><category>cloudflare</category></item><item><title>Traefik http3 aktivieren</title><link>https://www.teqqy.de/traefik-http3-aktivieren/</link><pubDate>Tue, 06 Feb 2024 00:00:00 +0000</pubDate><lastBuildDate>Tue, 06 Feb 2024 00:00:00 +0000</lastBuildDate><guid isPermaLink="true">https://www.teqqy.de/traefik-http3-aktivieren/</guid><description>Wie langjährige Leser meines Blogs oder Zuschauer meines YouTube Kanals wissen, nutze ich primär Traefik als Reverse Proxy unter Docker. Über die letzten Jahre hat sich entsprechend etwas an Know how angesammelt. Durch einen Beitrag (externer Link) auf Mastodon von Thomas Leister (externer Link) bin ich darauf gekommen auch mal http3 zu aktivieren. Was du entsprechend tun musst, um das bei dir ebenfalls einzurichten habe ich hier aufgeschrieben.</description><content:encoded>&lt;![CDATA[<p>Wie langjährige Leser meines Blogs oder Zuschauer meines YouTube Kanals wissen, nutze ich primär Traefik als Reverse Proxy unter Docker. Über die letzten Jahre hat sich entsprechend etwas an Know how angesammelt. Durch einen<a href="https://metalhead.club/@thomas/111833215602688918#." target="_blank" rel="noopener noreferrer">Beitrag<svg class="link-external-icon" aria-hidden="true" focusable="false" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"/><polyline points="15 3 21 3 21 9"/><line x1="10" y1="14" x2="21" y2="3"/></svg><span class="visually-hidden"> (externer Link)</span></a>
auf Mastodon von<a href="https://thomas-leister.de" target="_blank" rel="noopener noreferrer">Thomas Leister<svg class="link-external-icon" aria-hidden="true" focusable="false" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"/><polyline points="15 3 21 3 21 9"/><line x1="10" y1="14" x2="21" y2="3"/></svg><span class="visually-hidden"> (externer Link)</span></a>
bin ich darauf gekommen auch mal http3 zu aktivieren. Was du entsprechend tun musst, um das bei dir ebenfalls einzurichten habe ich hier aufgeschrieben.</p><h2 id="vorteile-von-http3">Vorteile von http3<a href="#vorteile-von-http3" class="heading-anchor" aria-label="Diesen Abschnitt verlinken"><svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a></h2><p><a href="https://en.wikipedia.org/wiki/HTTP/3" target="_blank" rel="noopener noreferrer">HTTP/3<svg class="link-external-icon" aria-hidden="true" focusable="false" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"/><polyline points="15 3 21 3 21 9"/><line x1="10" y1="14" x2="21" y2="3"/></svg><span class="visually-hidden"> (externer Link)</span></a>
ist die neueste Version des Hypertext Transfer Protocols (HTTP) und bringt mehrere Vorteile gegenüber seinen Vorgängerversionen, insbesondere HTTP/1.1 und HTTP/2, mit sich. Hier sind einige der wichtigsten Vorteile von HTTP/3:</p><ol><li><p><strong>Schnellerer Verbindungsaufbau:</strong> HTTP/3 verwendet das<a href="https://en.wikipedia.org/wiki/QUIC" target="_blank" rel="noopener noreferrer">QUIC<svg class="link-external-icon" aria-hidden="true" focusable="false" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"/><polyline points="15 3 21 3 21 9"/><line x1="10" y1="14" x2="21" y2="3"/></svg><span class="visually-hidden"> (externer Link)</span></a>
-Protokoll (Quick UDP Internet Connections), das auf UDP (User Datagram Protocol) basiert. Im Vergleich zu TCP (Transmission Control Protocol), das in vorherigen HTTP-Versionen verwendet wurde, ermöglicht QUIC einen schnelleren Verbindungsaufbau. Es beseitigt die Latenz, die durch den sogenannten &ldquo;Handshake&rdquo; in TCP verursacht wird.</p></li><li><p><strong>Multiplexing ohne Head-of-Line-Blocking:</strong> HTTP/3 unterstützt effizientes Multiplexing von Anfragen und Antworten. Im Gegensatz zu HTTP/1.1, bei dem eine Verbindung nur eine Anfrage gleichzeitig behandeln kann (Head-of-Line-Blocking), können bei HTTP/3 mehrere Anfragen und Antworten gleichzeitig übertragen werden. Dies verbessert die Effizienz und verkürzt die Ladezeiten von Webseiten.</p></li><li><p><strong>Bessere Leistung bei Netzwerkproblemen:</strong> HTTP/3 wurde entwickelt, um besser mit Netzwerkproblemen umzugehen. Das QUIC-Protokoll ermöglicht es, Verbindungen beizubehalten, auch wenn sich die Netzwerkbedingungen ändern. Dies trägt dazu bei, dass die Leistung aufrechterhalten wird, selbst wenn es zu Paketverlusten oder Netzwerkwechseln kommt.</p></li><li><p><strong>Adaptivität:</strong> HTTP/3 wurde entwickelt, um sich besser an verschiedene Netzwerkbedingungen anzupassen. Es kann sich automatisch an veränderte Latenzen und Bandbreiten anpassen, um eine optimale Leistung zu gewährleisten.</p></li><li><p><strong>Verbesserte Sicherheit:</strong> HTTP/3 unterstützt standardmäßig Verschlüsselung durch Transport Layer Security (TLS). Die Integration von TLS in den Kern des Protokolls trägt zur Sicherheit der Datenübertragung bei.</p></li><li><p><strong>Flexibilität:</strong> HTTP/3 ist so konzipiert, dass es besser mit den Anforderungen moderner Webanwendungen und Dienste umgehen kann. Durch die kontinuierliche Entwicklung des Protokolls können zukünftige Anforderungen besser erfüllt werden.</p></li></ol><p>Es ist wichtig zu beachten, dass die Einführung von HTTP/3 nicht nur von den Vorteilen, sondern auch von der Unterstützung auf Server- und Clientseite abhängt. Nicht alle Webserver und Browser unterstützen möglicherweise bereits HTTP/3, aber die Akzeptanz nimmt stetig zu.</p><h2 id="anpassen-der-traefik-konfiguration">Anpassen der traefik Konfiguration<a href="#anpassen-der-traefik-konfiguration" class="heading-anchor" aria-label="Diesen Abschnitt verlinken"><svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a></h2><p>Ich verwendet primär die<code>traefik.yml</code> Datei um alles zu konfigurieren. Nutzt du mehr Labels, musst du das natürlich umbauen. Mit traefik 2.11 und 3 muss noch die experimentelle Funktion aktiviert werden. Dies kann zu einem späterern Zeitpunkt nicht mehr notwendig sein.</p><div class="code-block"><div class="code-block-header"><span class="code-lang-label">yaml</span><button class="code-copy-btn" type="button" aria-label="Code kopieren" data-umami-event="Code Copy" data-umami-event-lang="yaml"><svg class="icon-copy" xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"/><path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"/></svg><svg class="icon-check" xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><polyline points="20 6 9 17 4 12"/></svg></button></div><div class="highlight"><pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"><code class="language-yaml" data-lang="yaml"><span style="display:flex;"><span><span style="color:#7ee787">experimental</span>:<span style="color:#6e7681"/></span></span><span style="display:flex;"><span><span style="color:#6e7681"/><span style="color:#7ee787">http3</span>:<span style="color:#6e7681"/><span style="color:#79c0ff">true</span></span></span></code></pre></div></div><p>Nun sind noch die Entrypoints anzupassen. meiner heißt<code>websecure</code> für die Verbindung von https. Entsprechend brauchen wir hier nur</p><div class="code-block"><div class="code-block-header"><span class="code-lang-label">yaml</span><button class="code-copy-btn" type="button" aria-label="Code kopieren" data-umami-event="Code Copy" data-umami-event-lang="yaml"><svg class="icon-copy" xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"/><path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"/></svg><svg class="icon-check" xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><polyline points="20 6 9 17 4 12"/></svg></button></div><div class="highlight"><pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"><code class="language-yaml" data-lang="yaml"><span style="display:flex;"><span><span style="color:#6e7681"/><span style="color:#7ee787">http3</span>:<span style="color:#6e7681"/></span></span><span style="display:flex;"><span><span style="color:#6e7681"/><span style="color:#7ee787">advertisedPort</span>:<span style="color:#6e7681"/><span style="color:#a5d6ff">'443'</span></span></span></code></pre></div></div><p>hinzuzufügen. Der vollständigkeit halber sieht mein kompletter Block so aus:</p><div class="code-block"><div class="code-block-header"><span class="code-lang-label">yaml</span><button class="code-copy-btn" type="button" aria-label="Code kopieren" data-umami-event="Code Copy" data-umami-event-lang="yaml"><svg class="icon-copy" xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"/><path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"/></svg><svg class="icon-check" xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><polyline points="20 6 9 17 4 12"/></svg></button></div><div class="highlight"><pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"><code class="language-yaml" data-lang="yaml"><span style="display:flex;"><span><span style="color:#7ee787">entryPoints</span>:<span style="color:#6e7681"/></span></span><span style="display:flex;"><span><span style="color:#6e7681"/><span style="color:#7ee787">ping</span>:<span style="color:#6e7681"/></span></span><span style="display:flex;"><span><span style="color:#6e7681"/><span style="color:#7ee787">address</span>:<span style="color:#6e7681"/><span style="color:#a5d6ff">':88'</span><span style="color:#6e7681"/></span></span><span style="display:flex;"><span><span style="color:#6e7681"/><span style="color:#7ee787">web</span>:<span style="color:#6e7681"/></span></span><span style="display:flex;"><span><span style="color:#6e7681"/><span style="color:#7ee787">address</span>:<span style="color:#6e7681"/><span style="color:#a5d6ff">':80'</span><span style="color:#6e7681"/></span></span><span style="display:flex;"><span><span style="color:#6e7681"/><span style="color:#7ee787">http</span>:<span style="color:#6e7681"/></span></span><span style="display:flex;"><span><span style="color:#6e7681"/><span style="color:#7ee787">redirections</span>:<span style="color:#6e7681"/></span></span><span style="display:flex;"><span><span style="color:#6e7681"/><span style="color:#7ee787">entryPoint</span>:<span style="color:#6e7681"/></span></span><span style="display:flex;"><span><span style="color:#6e7681"/><span style="color:#7ee787">to</span>:<span style="color:#6e7681"/><span style="color:#a5d6ff">websecure</span><span style="color:#6e7681"/></span></span><span style="display:flex;"><span><span style="color:#6e7681"/><span style="color:#7ee787">scheme</span>:<span style="color:#6e7681"/><span style="color:#a5d6ff">https</span><span style="color:#6e7681"/></span></span><span style="display:flex;"><span><span style="color:#6e7681"/><span style="color:#7ee787">websecure</span>:<span style="color:#6e7681"/></span></span><span style="display:flex;"><span><span style="color:#6e7681"/><span style="color:#7ee787">address</span>:<span style="color:#6e7681"/><span style="color:#a5d6ff">':443'</span><span style="color:#6e7681"/></span></span><span style="display:flex;"><span><span style="color:#6e7681"/><span style="color:#7ee787">http</span>:<span style="color:#6e7681"/></span></span><span style="display:flex;"><span><span style="color:#6e7681"/><span style="color:#7ee787">http3</span>:<span style="color:#6e7681"/></span></span><span style="display:flex;"><span><span style="color:#6e7681"/><span style="color:#7ee787">advertisedPort</span>:<span style="color:#6e7681"/><span style="color:#a5d6ff">'443'</span><span style="color:#6e7681"/></span></span><span style="display:flex;"><span><span style="color:#6e7681"/><span style="color:#7ee787">proxyProtocol</span>:<span style="color:#6e7681"/></span></span><span style="display:flex;"><span><span style="color:#6e7681"/><span style="color:#7ee787">trustedIPs</span>:<span style="color:#6e7681"/></span></span><span style="display:flex;"><span><span style="color:#6e7681"/>-<span style="color:#a5d6ff">10.0.0.0</span><span style="color:#a5d6ff">/8</span><span style="color:#6e7681"/></span></span><span style="display:flex;"><span><span style="color:#6e7681"/>-<span style="color:#a5d6ff">172.16.0.0</span><span style="color:#a5d6ff">/12</span><span style="color:#6e7681"/></span></span><span style="display:flex;"><span><span style="color:#6e7681"/>-<span style="color:#a5d6ff">192.168.0.0</span><span style="color:#a5d6ff">/16</span><span style="color:#6e7681"/></span></span><span style="display:flex;"><span><span style="color:#6e7681"/><span style="color:#7ee787">forwardedHeaders</span>:<span style="color:#6e7681"/></span></span><span style="display:flex;"><span><span style="color:#6e7681"/><span style="color:#7ee787">trustedIPs</span>:<span style="color:#6e7681"/></span></span><span style="display:flex;"><span><span style="color:#6e7681"/>-<span style="color:#a5d6ff">10.0.0.0</span><span style="color:#a5d6ff">/8</span><span style="color:#6e7681"/></span></span><span style="display:flex;"><span><span style="color:#6e7681"/>-<span style="color:#a5d6ff">172.16.0.0</span><span style="color:#a5d6ff">/12</span><span style="color:#6e7681"/></span></span><span style="display:flex;"><span><span style="color:#6e7681"/>-<span style="color:#a5d6ff">192.168.0.0</span><span style="color:#a5d6ff">/16</span></span></span></code></pre></div></div><p>Natürlich reicht das nicht ganz aus. Wie ihr seht, veröffentliche ich Port<code>443</code> um http3 auszuliefern. Da http3 aber via QUIC über UPD kommuniziert, muss auch die<code>docker-compose.yaml</code> Datei angepasst werden.</p><p>Die Portkonfiguration sieht dann entsprechen so aus:</p><div class="code-block"><div class="code-block-header"><span class="code-lang-label">yaml</span><button class="code-copy-btn" type="button" aria-label="Code kopieren" data-umami-event="Code Copy" data-umami-event-lang="yaml"><svg class="icon-copy" xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"/><path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"/></svg><svg class="icon-check" xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><polyline points="20 6 9 17 4 12"/></svg></button></div><div class="highlight"><pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"><code class="language-yaml" data-lang="yaml"><span style="display:flex;"><span><span style="color:#6e7681"/><span style="color:#7ee787">ports</span>:<span style="color:#6e7681"/></span></span><span style="display:flex;"><span><span style="color:#6e7681"/>-<span style="color:#7ee787">target</span>:<span style="color:#6e7681"/><span style="color:#a5d6ff">80</span><span style="color:#6e7681"/></span></span><span style="display:flex;"><span><span style="color:#6e7681"/><span style="color:#7ee787">published</span>:<span style="color:#6e7681"/><span style="color:#a5d6ff">80</span><span style="color:#6e7681"/></span></span><span style="display:flex;"><span><span style="color:#6e7681"/><span style="color:#7ee787">protocol</span>:<span style="color:#6e7681"/><span style="color:#a5d6ff">tcp</span><span style="color:#6e7681"/></span></span><span style="display:flex;"><span><span style="color:#6e7681"/><span style="color:#7ee787">mode</span>:<span style="color:#6e7681"/><span style="color:#a5d6ff">host</span><span style="color:#6e7681"/></span></span><span style="display:flex;"><span><span style="color:#6e7681"/>-<span style="color:#7ee787">target</span>:<span style="color:#6e7681"/><span style="color:#a5d6ff">443</span><span style="color:#6e7681"/></span></span><span style="display:flex;"><span><span style="color:#6e7681"/><span style="color:#7ee787">published</span>:<span style="color:#6e7681"/><span style="color:#a5d6ff">443</span><span style="color:#6e7681"/></span></span><span style="display:flex;"><span><span style="color:#6e7681"/><span style="color:#7ee787">protocol</span>:<span style="color:#6e7681"/><span style="color:#a5d6ff">tcp</span><span style="color:#6e7681"/></span></span><span style="display:flex;"><span><span style="color:#6e7681"/><span style="color:#7ee787">mode</span>:<span style="color:#6e7681"/><span style="color:#a5d6ff">host</span><span style="color:#6e7681"/></span></span><span style="display:flex;"><span><span style="color:#6e7681"/>-<span style="color:#7ee787">target</span>:<span style="color:#6e7681"/><span style="color:#a5d6ff">443</span><span style="color:#6e7681"/></span></span><span style="display:flex;"><span><span style="color:#6e7681"/><span style="color:#7ee787">published</span>:<span style="color:#6e7681"/><span style="color:#a5d6ff">443</span><span style="color:#6e7681"/></span></span><span style="display:flex;"><span><span style="color:#6e7681"/><span style="color:#7ee787">protocol</span>:<span style="color:#6e7681"/><span style="color:#a5d6ff">udp</span><span style="color:#6e7681"/></span></span><span style="display:flex;"><span><span style="color:#6e7681"/><span style="color:#7ee787">mode</span>:<span style="color:#6e7681"/><span style="color:#a5d6ff">host</span></span></span></code></pre></div></div><p>Der letzte<code>target</code> Block ist der wichtige. Hier wird Port 443 auf udp ausgeliefert. Abschließend noch den Container neu starten</p><div class="code-block"><div class="code-block-header"><span class="code-lang-label">bash</span><button class="code-copy-btn" type="button" aria-label="Code kopieren" data-umami-event="Code Copy" data-umami-event-lang="bash"><svg class="icon-copy" xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"/><path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"/></svg><svg class="icon-check" xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><polyline points="20 6 9 17 4 12"/></svg></button></div><div class="highlight"><pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>docker compose rm -sf<span style="color:#ff7b72;font-weight:bold">&amp;&amp;</span> docker compose up -d</span></span></code></pre></div></div><p>Solltest du mehr als nur Traefik in der Datei haben, werden diese Services entsprechend auch neu gestartet. Ich empfehle zukünftig traefik zu separieren.</p>
]]></content:encoded><category>traefik</category><category>docker</category><category>networking</category></item><item><title>IPv6 mit Fritzbox und OpnSense bei Vodafone</title><link>https://www.teqqy.de/ipv6-mit-fritzbox-und-opnsense-bei-vodafone/</link><pubDate>Sun, 28 Jan 2024 13:40:00 +0200</pubDate><lastBuildDate>Sun, 28 Jan 2024 13:40:00 +0200</lastBuildDate><guid isPermaLink="true">https://www.teqqy.de/ipv6-mit-fritzbox-und-opnsense-bei-vodafone/</guid><description>Kunden bei Vodafone Kabel bekommen immer ein IPv6 Netz zugewiesen. In meinem Fall ist das ein /63 Netz. Da ich allerdings ein Doppel-NAT betreibe bekommen meine Clients keine IPv6 Adresse aus diesem Netz.
Warum überhaupt IPv6? IPv6 fördert die End-to-End-Konnektivität. Dies ist wichtig, um eine direkte Kommunikation zwischen den Endgeräten im Internet zu ermöglichen, ohne dass komplexe Netzwerkadressübersetzung (NAT) eingesetzt werden muss, wie dies häufig bei IPv4 der Fall ist. Zudem hat IPv6 einige Verbesserungen gegenüber IPv4 in Bezug auf die Netzwerkeffizienz und Leistung. Dies umfasst eine optimierte Header-Struktur, die die Router-Verarbeitung erleichtert, sowie die Unterstützung für Multicasting, was dazu beiträgt, den Datenverkehr effizienter zu gestalten. IPv6 wurde mit Sicherheitsverbesserungen konzipiert. IPsec (Internet Protocol Security) ist in IPv6 integriert und bietet eine standardmäßige Verschlüsselung und Authentifizierung des Datenverkehrs. Angesichts der begrenzten Verfügbarkeit von IPv4-Adressen ist IPv6 die Zukunft des Internetprotokolls. Die Umstellung auf IPv6 stellt sicher, dass Netzwerke auch in den kommenden Jahren und Jahrzehnten in der Lage sind, mit dem ständig wachsenden Bedarf an IP-Adressen Schritt zu halten.</description><content:encoded>&lt;![CDATA[<p>Kunden bei Vodafone Kabel bekommen immer ein IPv6 Netz zugewiesen. In meinem Fall ist das ein /63 Netz. Da ich allerdings ein Doppel-NAT betreibe bekommen meine Clients keine IPv6 Adresse aus diesem Netz.</p><h2 id="warum-überhaupt-ipv6">Warum überhaupt IPv6?<a href="#warum-%c3%bcberhaupt-ipv6" class="heading-anchor" aria-label="Diesen Abschnitt verlinken"><svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a></h2><p>IPv6 fördert die End-to-End-Konnektivität. Dies ist wichtig, um eine direkte Kommunikation zwischen den Endgeräten im Internet zu ermöglichen, ohne dass komplexe Netzwerkadressübersetzung (NAT) eingesetzt werden muss, wie dies häufig bei IPv4 der Fall ist. Zudem hat IPv6 einige Verbesserungen gegenüber IPv4 in Bezug auf die Netzwerkeffizienz und Leistung. Dies umfasst eine optimierte Header-Struktur, die die Router-Verarbeitung erleichtert, sowie die Unterstützung für Multicasting, was dazu beiträgt, den Datenverkehr effizienter zu gestalten. IPv6 wurde mit Sicherheitsverbesserungen konzipiert. IPsec (Internet Protocol Security) ist in IPv6 integriert und bietet eine standardmäßige Verschlüsselung und Authentifizierung des Datenverkehrs. Angesichts der begrenzten Verfügbarkeit von IPv4-Adressen ist IPv6 die Zukunft des Internetprotokolls. Die Umstellung auf IPv6 stellt sicher, dass Netzwerke auch in den kommenden Jahren und Jahrzehnten in der Lage sind, mit dem ständig wachsenden Bedarf an IP-Adressen Schritt zu halten.</p><h2 id="einstellungen-an-der-fritzbox">Einstellungen an der Fritzbox<a href="#einstellungen-an-der-fritzbox" class="heading-anchor" aria-label="Diesen Abschnitt verlinken"><svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a></h2><p>Zuerst stellen wir alles bei der Fritzbox ein. Wir navigieren zu<strong>Heimnetzwerk</strong> -&gt;<strong>Netzwerk</strong> -&gt;<strong>Netzwerkeinstellungen</strong> -&gt;<strong>IPv6-Einstellungen</strong>.</p><h3 id="router-advertisment-im-lan-aktiv">Router Advertisment im LAN aktiv<a href="#router-advertisment-im-lan-aktiv" class="heading-anchor" aria-label="Diesen Abschnitt verlinken"><svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a></h3><p>Die Einstellung ganz oben schalten wir ein. Dann möchten wir, dass die Unique Local Addresses (ULA) immer zugewiesen werden. Den ULA Prefix können wir uns quasi selbst ausdenken.</p><p><img src="/ipv6-mit-fritzbox-und-opnsense-bei-vodafone/images/ipv6-fritzbox-ula_hu_28c2bbdc597c26ab.webp" srcset="/ipv6-mit-fritzbox-und-opnsense-bei-vodafone/images/ipv6-fritzbox-ula_hu_38c9b78b550c34e.webp 384w, /ipv6-mit-fritzbox-und-opnsense-bei-vodafone/images/ipv6-fritzbox-ula_hu_28c2bbdc597c26ab.webp 768w" sizes="(max-width: 768px) 100vw, 768px" alt="Screenshot der Fritzboxoberfläche zur ULA IPv6 Konfiguration" loading="eager" fetchpriority="high" decoding="async" width="768" height="242"/><h3 id="dnsv6-server-im-heimnetz">DNSv6 Server im Heimnetz<a href="#dnsv6-server-im-heimnetz" class="heading-anchor" aria-label="Diesen Abschnitt verlinken"><svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a></h3><p>Ich habe den nicht aktiv. Ich versuche erst mal mein Pi-Hole im Netzwerk zu verwenden. Bisher habe ich noch keine Nachteile dadurch entdeckt.</p><h3 id="dhcp-v6-server-im-heimnetz">DHCP-v6 Server im Heimnetz<a href="#dhcp-v6-server-im-heimnetz" class="heading-anchor" aria-label="Diesen Abschnitt verlinken"><svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a></h3><p>Hier wird es spannend, weil hier die Zuweisung an die Endgeräte gemacht wird. Entsprechend aktivieren wir die erste Option<strong>DHCPv6-Server in der FRITZ!Box für das Heimnetz aktivieren</strong>. Dann möchten wir<strong>DNS-Server und IPv6-Präfix (IA_PD) zuweisen</strong>. Den Rest lassen wir auf Standardeinstellung.</p><p><img src="/ipv6-mit-fritzbox-und-opnsense-bei-vodafone/images/ipv6-fritzbox-dhcpv6-server_hu_836a1ac714b1082a.webp" srcset="/ipv6-mit-fritzbox-und-opnsense-bei-vodafone/images/ipv6-fritzbox-dhcpv6-server_hu_59b3e161b9642b73.webp 384w, /ipv6-mit-fritzbox-und-opnsense-bei-vodafone/images/ipv6-fritzbox-dhcpv6-server_hu_836a1ac714b1082a.webp 768w" sizes="(max-width: 768px) 100vw, 768px" alt="Screenshot der Fritzboxoberflächen der DHCPv6 Server Konfiguration" loading="lazy" fetchpriority="auto" decoding="async" width="768" height="324"/><h2 id="einstellungen-an-der-opnsense">Einstellungen an der opnSense<a href="#einstellungen-an-der-opnsense" class="heading-anchor" aria-label="Diesen Abschnitt verlinken"><svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a></h2><p>Nun können wir mit der Konfiguration der opnSense fortfahren. Grundlegend sollten die Einstellungen auch sehr nah zur pfSense sein. Die Screenshots passen dann natürlich nicht mehr.</p><h3 id="einstellungen-am-wan-interface">Einstellungen am WAN Interface<a href="#einstellungen-am-wan-interface" class="heading-anchor" aria-label="Diesen Abschnitt verlinken"><svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a></h3><p>Wir starten mit den Einstellungen am WAN Interface. Also der Port mit dem sich die opnSense zur Fritzbox verbindet. Als erstes stellen wir den<strong>IPv6 Konfigurationstyp</strong> auf<strong>DHCPv6</strong>. In der<strong>DHCPv6 Clientkonfiguration</strong> fordern wir das IPv6 Prefix an und stellen die<strong>Präfixdelegationsgröße</strong> auf 63 (also ein bit kleiner als unser Netzwerk groß ist). Zudem senden wir den IPv6 Präfixhinweis.</p><p><img src="/ipv6-mit-fritzbox-und-opnsense-bei-vodafone/images/ipv6-opnsense-dhcpv6-clientkonfiguration_hu_cfc724aa08c1e2b9.webp" srcset="/ipv6-mit-fritzbox-und-opnsense-bei-vodafone/images/ipv6-opnsense-dhcpv6-clientkonfiguration_hu_8fd9219d7c0b0ede.webp 384w, /ipv6-mit-fritzbox-und-opnsense-bei-vodafone/images/ipv6-opnsense-dhcpv6-clientkonfiguration_hu_cfc724aa08c1e2b9.webp 768w" sizes="(max-width: 768px) 100vw, 768px" alt="Screenshot der opnSense Oberfläche zu der DHCPv6 Clientkonfiguration" loading="lazy" fetchpriority="auto" decoding="async" width="768" height="224"/><h3 id="einstellungen-des-lan-interface">Einstellungen des LAN Interface<a href="#einstellungen-des-lan-interface" class="heading-anchor" aria-label="Diesen Abschnitt verlinken"><svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a></h3><p>Wir können auf Grund der Zuweisung des Netzes bis zu zwei Client Netzwerke mit IPv6 Adressen ausstatten. Wenn nur nur ein internes Netzwerk hast, sollte das natürlich kein Problem sein. Ich habe aber mein Normales Netzwerk für Server etc vom Client-Netzwerk getrennt und vergebe hier pro Netz IPv6 Adressen. Netzwerke wie für IoT Geräte oder Gastnetze können per IPv4 weiterhin verbleiben.</p><p>Unter<strong>Schnittstellen</strong> -&gt;<strong>LAN</strong> möchten wir den<strong>IPv6 Konfigurationstyp</strong> ändern. Den müssen wir auf<strong>Schnittstelle aufzeichnen</strong> stellen. Ganz unten erscheint dann eine weitere Einstellungsgruppe mit dem Namen<strong>IPv6-Schnittstelle aufzeichnen</strong>. Die Schnittstelle setzen wir dann auf<strong>WAN</strong>, weil hier ja unsere IPv6 Pakete her kommen. Die Präfix-ID setzen wir auf<strong>0</strong>. Solltest du ein weiteres Netz konfigurieren, stellst du die ID dann im anderen Netz auf<strong>1</strong>. Wichtig ist unten noch das Häkchen bei<strong>Ermöglichen Sie die manuelle Anpassung von DHCPv6- und Router-Ankündigungen</strong>* zu setzen!</p><p>Hier das ganze noch mal als Screenshot:<img src="/ipv6-mit-fritzbox-und-opnsense-bei-vodafone/images/ipv6-opnsense-lan-einstellungen_hu_42d1930b9fe1a35c.webp" srcset="/ipv6-mit-fritzbox-und-opnsense-bei-vodafone/images/ipv6-opnsense-lan-einstellungen_hu_8f426b65c633d4b4.webp 384w, /ipv6-mit-fritzbox-und-opnsense-bei-vodafone/images/ipv6-opnsense-lan-einstellungen_hu_42d1930b9fe1a35c.webp 768w" sizes="(max-width: 768px) 100vw, 768px" alt="Screenshot der opnSense Oberfläche LAN Einstellungen" loading="lazy" fetchpriority="auto" decoding="async" width="768" height="673"/><h3 id="router-advertisement">Router Advertisement<a href="#router-advertisement" class="heading-anchor" aria-label="Diesen Abschnitt verlinken"><svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a></h3><p>Als nächstes müssen wir das Router Advertisement einstellen. Dazu auf<strong>Dienste</strong> -&gt;<strong>Router Advertisement</strong> -&gt;<strong>LAN</strong> klicken. Sollte der Punkt noch nicht vorhanden sein, kontrolliere mal ob du überall die Einstellungen auch korrekt gespeichert hast. Gegebenenfalls auch mal den Browser neu laden. Viel müssen wir hier nicht einstellen. Lediglich das<strong>Router Advertisement</strong> auf<strong>NichtVerwaltet</strong>.</p><h3 id="firewall-einstellungen-überprüfen-optional">Firewall Einstellungen überprüfen (optional)<a href="#firewall-einstellungen-%c3%bcberpr%c3%bcfen-optional" class="heading-anchor" aria-label="Diesen Abschnitt verlinken"><svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a></h3><p>Ich hatte noch das Problem, dass ich nur mit IPv4 Paketen ins Internet kam, allerdings nicht per IPv6. Entsprechend musste ich noch eine Firewall Regel anpassen. Unter<strong>Firewall</strong> -&gt;<strong>Regeln</strong> -&gt;<strong>LAN</strong>. Dort bearbeiten wir die<strong>ausgehende</strong> Regel und klicken hinten auf den Stift. Im sich öffnenden Fenster stellen wir die<strong>TCP/IP Version</strong> von<em>IPv4</em> auf<em>IPv4+IPv6</em> um. Anschließend auf speichern.</p><h2 id="testen-der-ipv6-verbindung">Testen der IPv6 Verbindung<a href="#testen-der-ipv6-verbindung" class="heading-anchor" aria-label="Diesen Abschnitt verlinken"><svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a></h2><p>Als erstes sollten wir gucken ob alle Interfaces auf der opnSense auch eine IPv6 Adresse bekommen haben. Dazu bitte unter<strong>Schnitstellen</strong> -&gt;<strong>Überblick</strong> deine WAN Schnittstelle aufklappen. Du solltest unter IPv6-Adresse nun zwei Adressen haben. Einmal aus dem Vodafone Netz und eine die mit<em>fd</em> beginnt. Das ist die Adresse aus dem Bereich das wir bei der Fritzbox unter<strong>ULA Prefix</strong> eingestellt haben. Unter deinen LAN Interfaces solltest du auch jeweils zwei Adressen haben. Wenn dem nicht so ist, kontrolliere nochmals alle Einstellungen.</p><p>Wenn bis dahin alles korrekt eingestellt wurde, öffnen wir die Seite<a href="https://ipv6-test.com" target="_blank" rel="noopener noreferrer">ipv6-test.com<svg class="link-external-icon" aria-hidden="true" focusable="false" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"/><polyline points="15 3 21 3 21 9"/><line x1="10" y1="14" x2="21" y2="3"/></svg><span class="visually-hidden"> (externer Link)</span></a>
. Diese kontrolliert nun ob ihr mit einer IPv4 und einer IPv6 Adresse ankommt. Entsprechend sollte es ähnlich zu meiner Anzeige sein.</p><p><img src="/ipv6-mit-fritzbox-und-opnsense-bei-vodafone/images/ipv6-verbindungstest_hu_6aa3aff41aab84dc.webp" srcset="/ipv6-mit-fritzbox-und-opnsense-bei-vodafone/images/ipv6-verbindungstest_hu_2bed0d5b4735c256.webp 384w, /ipv6-mit-fritzbox-und-opnsense-bei-vodafone/images/ipv6-verbindungstest_hu_6aa3aff41aab84dc.webp 768w" sizes="(max-width: 768px) 100vw, 768px" alt="Screenshot von ipv6-test.com mit funktionierender IPv6 Verbindung" loading="lazy" fetchpriority="auto" decoding="async" width="768" height="445"/>
]]></content:encoded><category>fritzbox</category><category>opnsense</category><category>networking</category></item><item><title>FreshRSS Setup: RSS Reader selbst hosten (Docker Guide 2025)</title><link>https://www.teqqy.de/freshrss-rss-reader-zum-selber-hosten/</link><pubDate>Sun, 06 Aug 2023 12:05:00 +0200</pubDate><lastBuildDate>Sun, 06 Aug 2023 12:05:00 +0200</lastBuildDate><guid isPermaLink="true">https://www.teqqy.de/freshrss-rss-reader-zum-selber-hosten/</guid><description>Du willst deine RSS-Feeds selbst verwalten, ohne auf Drittanbieter angewiesen zu sein? FreshRSS ist ein kostenloser, selbst gehosteter RSS-Reader, der dir volle Kontrolle über deine Nachrichtenquellen gibt. Die Open-Source-Software lässt sich in wenigen Minuten mit Docker installieren und funktioniert perfekt mit Apps wie Reeder (iOS) oder FeedMe (Android).
In dieser Anleitung zeige ich dir Schritt für Schritt, wie du FreshRSS einrichtest – von der Docker-Installation über das Importieren bestehender Feeds bis zur Einbindung mobiler Apps. Das Beste daran: FreshRSS bietet eine vollständige API-Unterstützung, sodass du deine Feeds überall synchronisiert nutzen kannst.</description><content:encoded>&lt;![CDATA[<p>Du willst deine RSS-Feeds selbst verwalten, ohne auf Drittanbieter angewiesen zu sein?<strong>FreshRSS ist ein kostenloser, selbst gehosteter RSS-Reader</strong>, der dir volle Kontrolle über deine Nachrichtenquellen gibt. Die Open-Source-Software lässt sich in wenigen Minuten mit Docker installieren und funktioniert perfekt mit Apps wie Reeder (iOS) oder FeedMe (Android).</p><p>In dieser Anleitung zeige ich dir Schritt für Schritt, wie du FreshRSS einrichtest – von der Docker-Installation über das Importieren bestehender Feeds bis zur Einbindung mobiler Apps. Das Beste daran: FreshRSS bietet eine<strong>vollständige API-Unterstützung</strong>, sodass du deine Feeds überall synchronisiert nutzen kannst.</p><p>Für mich persönlich war genau dieses API-Feature der entscheidende Grund, auf FreshRSS zu setzen. Nach Jahren der Nutzung kann ich sagen: Es ist die zuverlässigste selbst gehostete RSS-Lösung, die ich kenne.</p><p>Diejenigen die immer noch RSS nutzen wissen es sehr zu schätzen. Es gibt zwar mittlerweile viele Dienste die einen über neue Informationen auf Seiten benachrichtigen, aber wenn man „nur“ Blogs liest ist das Abonnement von RSS Feeds die wohl bessere Wahl.
Feedreader, eines der alten Google Produkte, war sicherlich ein Vorreiter auf diesem Gebiet. Im laufe der ganzen Jahre kamen und gingen dann viele andere Produkte und Onlinedienste. Ich setze schon seit Jahre auf eine selbst gehostete Variante mit<a href="https://freshrss.org" target="_blank" rel="noopener noreferrer">FreshRSS<svg class="link-external-icon" aria-hidden="true" focusable="false" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"/><polyline points="15 3 21 3 21 9"/><line x1="10" y1="14" x2="21" y2="3"/></svg><span class="visually-hidden"> (externer Link)</span></a>
.</p><p>In der Szene der Open Source RSS Tools gibt es natürlich viele weitere Programme die sicherlich auch alle sehr gut sind. Für mich gab es nie den Grund mir andere detaillierter anzusehen da ich mit FreshRSS sehr gut zurecht komme. Zudem bietet es ein Feature an, dass für mich ein entscheidendes Kriterium ist. Dazu aber später noch mehr.</p><h2 id="installation-von-freshrss">Installation von FreshRSS<a href="#installation-von-freshrss" class="heading-anchor" aria-label="Diesen Abschnitt verlinken"><svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a></h2><p>Wie viele andere Softwareprodukte, die ich hier vorstelle, kann FreshRSS auch unter Docker installiert werden. Glückerlicherweise gibt der Entwickler einem die Wahl ob man mit der integrierten SQLite arbeiten möchte, oder eine MySQL bzw. PostgresDB Datenbank anbinden möchte. Je nachdem wie die heimische Infrastruktur so aufgestellt ist, empfiehlt sich das eine oder andere mehr.</p><p>Für diejenigen die nichts mit Docker oder Containerisierung anfangen können, gibt es sogar noch die klassische Installation. Allerdings möchte ich in diesem Beitrag eher auf die Variante in Docker zurückgreifen.</p><h3 id="freshrss-mit-docker-compose">FreshRSS mit Docker Compose<a href="#freshrss-mit-docker-compose" class="heading-anchor" aria-label="Diesen Abschnitt verlinken"><svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a></h3><p>Ich habe hier mal eine<code>docker-compose.yaml</code> Datei vorbereitet die mit PostgresDB als Datenbankbackend arbeitet. Eine Anpassung auf MySQL/MariaDB ist recht einfach vorzunehmen. Lassen wir die DB weg, können wir auch einfach bei der Installation die SQLite Variante auswählen.</p><div class="code-block"><div class="code-block-header"><span class="code-lang-label">yaml</span><button class="code-copy-btn" type="button" aria-label="Code kopieren" data-umami-event="Code Copy" data-umami-event-lang="yaml"><svg class="icon-copy" xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"/><path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"/></svg><svg class="icon-check" xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><polyline points="20 6 9 17 4 12"/></svg></button></div><div class="highlight"><pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"><code class="language-yaml" data-lang="yaml"><span style="display:flex;"><span><span style="color:#ff7b72">---</span><span style="color:#6e7681"/></span></span><span style="display:flex;"><span><span style="color:#7ee787">services</span>:<span style="color:#6e7681"/></span></span><span style="display:flex;"><span><span style="color:#6e7681"/><span style="color:#7ee787">freshrss-db</span>:<span style="color:#6e7681"/></span></span><span style="display:flex;"><span><span style="color:#6e7681"/><span style="color:#7ee787">image</span>:<span style="color:#6e7681"/><span style="color:#a5d6ff">postgres:17</span><span style="color:#6e7681"/></span></span><span style="display:flex;"><span><span style="color:#6e7681"/><span style="color:#7ee787">container_name</span>:<span style="color:#6e7681"/><span style="color:#a5d6ff">fressrss-db</span><span style="color:#6e7681"/></span></span><span style="display:flex;"><span><span style="color:#6e7681"/><span style="color:#7ee787">restart</span>:<span style="color:#6e7681"/><span style="color:#a5d6ff">unless-stopped</span><span style="color:#6e7681"/></span></span><span style="display:flex;"><span><span style="color:#6e7681"/><span style="color:#7ee787">volumes</span>:<span style="color:#6e7681"/></span></span><span style="display:flex;"><span><span style="color:#6e7681"/>-<span style="color:#a5d6ff">/etc/localtime:/etc/localtime:ro</span><span style="color:#6e7681"/></span></span><span style="display:flex;"><span><span style="color:#6e7681"/>-<span style="color:#a5d6ff">/etc/timezone:/etc/timezone:ro</span><span style="color:#6e7681"/></span></span><span style="display:flex;"><span><span style="color:#6e7681"/>-<span style="color:#a5d6ff">/var/docker/freshrss/db:/var/lib/postgresql/data</span><span style="color:#6e7681"/></span></span><span style="display:flex;"><span><span style="color:#6e7681"/><span style="color:#7ee787">environment</span>:<span style="color:#6e7681"/></span></span><span style="display:flex;"><span><span style="color:#6e7681"/>-<span style="color:#a5d6ff">POSTGRES_USER=freshrss</span><span style="color:#6e7681"/></span></span><span style="display:flex;"><span><span style="color:#6e7681"/>-<span style="color:#a5d6ff">POSTGRES_PASSWORD=${POSTGRES_PASSWORD}</span><span style="color:#6e7681"/></span></span><span style="display:flex;"><span><span style="color:#6e7681"/>-<span style="color:#a5d6ff">POSTGRES_DB=freshrss</span><span style="color:#6e7681"/></span></span><span style="display:flex;"><span><span style="color:#6e7681"/></span></span><span style="display:flex;"><span><span style="color:#6e7681"/><span style="color:#7ee787">freshrss-app</span>:<span style="color:#6e7681"/></span></span><span style="display:flex;"><span><span style="color:#6e7681"/><span style="color:#7ee787">image</span>:<span style="color:#6e7681"/><span style="color:#a5d6ff">freshrss/freshrss:latest</span><span style="color:#6e7681"/></span></span><span style="display:flex;"><span><span style="color:#6e7681"/><span style="color:#7ee787">container_name</span>:<span style="color:#6e7681"/><span style="color:#a5d6ff">freshrss-app</span><span style="color:#6e7681"/></span></span><span style="display:flex;"><span><span style="color:#6e7681"/><span style="color:#7ee787">restart</span>:<span style="color:#6e7681"/><span style="color:#a5d6ff">unless-stopped</span><span style="color:#6e7681"/></span></span><span style="display:flex;"><span><span style="color:#6e7681"/><span style="color:#7ee787">depends_on</span>:<span style="color:#6e7681"/></span></span><span style="display:flex;"><span><span style="color:#6e7681"/>-<span style="color:#a5d6ff">freshrss-db</span><span style="color:#6e7681"/></span></span><span style="display:flex;"><span><span style="color:#6e7681"/><span style="color:#7ee787">volumes</span>:<span style="color:#6e7681"/></span></span><span style="display:flex;"><span><span style="color:#6e7681"/>-<span style="color:#a5d6ff">/etc/localtime:/etc/localtime:ro</span><span style="color:#6e7681"/></span></span><span style="display:flex;"><span><span style="color:#6e7681"/>-<span style="color:#a5d6ff">/etc/timezone:/etc/timezone:ro</span><span style="color:#6e7681"/></span></span><span style="display:flex;"><span><span style="color:#6e7681"/>-<span style="color:#a5d6ff">/var/docker/freshrss/data:/var/www/FreshRSS/data</span><span style="color:#6e7681"/></span></span><span style="display:flex;"><span><span style="color:#6e7681"/>-<span style="color:#a5d6ff">/var/docker/freshrss/extensions:/var/www/FreshRSS/extensions</span><span style="color:#6e7681"/></span></span><span style="display:flex;"><span><span style="color:#6e7681"/><span style="color:#7ee787">environment</span>:<span style="color:#6e7681"/></span></span><span style="display:flex;"><span><span style="color:#6e7681"/>-<span style="color:#a5d6ff">CRON_MIN=*/20</span><span style="color:#6e7681"/></span></span><span style="display:flex;"><span><span style="color:#6e7681"/><span style="color:#7ee787">ports</span>:<span style="color:#6e7681"/></span></span><span style="display:flex;"><span><span style="color:#6e7681"/>-<span style="color:#a5d6ff">80</span>:<span style="color:#a5d6ff">80</span></span></span></code></pre></div></div><p>Wer das ganze mittels Traefik auch sauber mit Zertifikaten etc hosten möchte, verweise ich einfach auf meine<a href="https://github.com/cbirkenbeul/docker-homelab/tree/master/compose-files-traefik-predefined/freshrss" target="_blank" rel="noopener noreferrer">vorbereitete Version auf GitHub<svg class="link-external-icon" aria-hidden="true" focusable="false" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"/><polyline points="15 3 21 3 21 9"/><line x1="10" y1="14" x2="21" y2="3"/></svg><span class="visually-hidden"> (externer Link)</span></a>
.</p><h3 id="webinstallation">Webinstallation<a href="#webinstallation" class="heading-anchor" aria-label="Diesen Abschnitt verlinken"><svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a></h3><p>Leider müssen wir noch ein paar Schritte unternehmen um den RSS-Reader wirklich komplett installieren zu können. Die Installation erkennt nicht die Datenbankparameter oder ähnliches sodass wir die Schritte manuell durchführen müssen.</p><p>Sobald das alles durch ist, können wir uns mit den Zugangsdaten anlegen die wir anfangs angegeben haben. Unser erster Nutzer ist nämlich direkt Administrator der Seite.</p><h3 id="erste-schritte-nach-der-installation">Erste Schritte nach der Installation<a href="#erste-schritte-nach-der-installation" class="heading-anchor" aria-label="Diesen Abschnitt verlinken"><svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a></h3><p>Grundsätzlich kann die Software direkt verwendet werden. Allerdings habe ich noch einen kleinen Tipp der das Leben im Nachgang einfacherer macht. Wer nämlich wie ich die Feeds nicht über den Browser konsumieren möchte, sondern mittels eine Anwendung muss die API frei schalten.
Dafür gehen wir rechts oben auf das Zahnrad und dann auf Authentifizierung. Hier setzen wir das Häkchen bei * API-Zugriff erlauben (für mobile Anwendungen benötigt)* und klicken auf<strong>Speichern</strong>
Nun müssen wir noch das API Kennwort für unseren Nutzer festlegen. Das machen wir in unserem Profil das ihr links oben direkt findet. Im unteren Bereich unter<em>API-Verwaltung</em> tragt ihr einfach ein Passwort ein. Sicherer wäre es, wenn ihr ein anderes verwendet als für euren Login.</p><h2 id="nutzung-von-freshrss">Nutzung von FreshRSS<a href="#nutzung-von-freshrss" class="heading-anchor" aria-label="Diesen Abschnitt verlinken"><svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a></h2><h3 id="löschen-des-freshrss-feeds-optional">Löschen des FreshRSS Feeds (optional)<a href="#l%c3%b6schen-des-freshrss-feeds-optional" class="heading-anchor" aria-label="Diesen Abschnitt verlinken"><svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a></h3><p>Nachdem wir die grundlegenden Schritte durchgeführt haben, können wir endlich die Software nutzen. Wir sollten zurück zur Startseite gehen - Klick links oben auf den Produktnamen. Anschließend wählen wir die ** Abonnementverwaltung** aus. Hier sollte bis auf den Feed der Software selbst nichts weiteres angezeigt werden.</p><p>Wenn ihr den Feed nicht benötigt, könnt ihr den natürlich löschen. Mit einem Klick auf das Zahnrad und dann rechts<strong>Entfernen</strong>.</p><h3 id="import-von-bestehenden-rss-abonnements-optional">Import von bestehenden RSS Abonnements (optional)<a href="#import-von-bestehenden-rss-abonnements-optional" class="heading-anchor" aria-label="Diesen Abschnitt verlinken"><svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a></h3><p>Natürlich kann man auch von seinem bestehenden RSS Feedreader die Feeds importieren. Also zumindest solange der bisherige auch ein Export in zum Beispiel OPML Format unterstützt. Alles mir bisher gängigen haben das beherrscht.
Hierzu klicken wir wieder auf<strong>Abonnementverwaltung</strong> und dann auf **Importieren / Exportieren **. Nun können wir rechts eine Datei unter<em>Importieren</em> auswählen und auf<strong>Importieren</strong> klicken.</p><h3 id="feeds-hinzufügen">Feeds hinzufügen<a href="#feeds-hinzuf%c3%bcgen" class="heading-anchor" aria-label="Diesen Abschnitt verlinken"><svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a></h3><p>Um neue Feeds hinzuzufügen, wie zum Beispiel den von teqqy.de, klickt man links oben auf das<strong>+</strong> Symbol. Anschließend kopiert man die Feed-URL in das Feld und klickt auf<strong>Hinzufügen</strong> Wer möchte, kann natürlich vorher noch eine<em>Kategorie</em> erstellen um gegebenenfalls eine größere Menge an Feeds besser zu verwalten.</p><h2 id="3rd-party-apps">3rd Party Apps<a href="#3rd-party-apps" class="heading-anchor" aria-label="Diesen Abschnitt verlinken"><svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a></h2><p>Da meine primären Endgeräte auf Apple Basis laufen, kann ich hier leider keine große Liste aufzeigen die ich empfehlen kann. Falls jemand ein guten RSS Client kennt der mit FreshRSS zusammen arbeitet, kann er mir den Tipp gerne zukommen lassen.</p><h3 id="macos-und-iosipados">MacOS und iOS/iPadOS<a href="#macos-und-iosipados" class="heading-anchor" aria-label="Diesen Abschnitt verlinken"><svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a></h3><p>Unter den Betriebssystemen verwende ich seit Jahren<a href="https://reederapp.com" target="_blank" rel="noopener noreferrer">Reeder<svg class="link-external-icon" aria-hidden="true" focusable="false" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"/><polyline points="15 3 21 3 21 9"/><line x1="10" y1="14" x2="21" y2="3"/></svg><span class="visually-hidden"> (externer Link)</span></a>
als RSS Reader App. Mittlerweile in Version 5 angekommen hatte es mich immer gut begleitet.
Seit in einer der letzten Versionen auch eine korrekte Unterstützung von FreshRSS via API hinzugekommen ist, war natürlich ein weiterer Grund auf die Liste gekommen.</p><p><img src="images/reeder5-freshrss-setup.webp" alt="Reeder5 FreshRSS Setup" loading="eager" fetchpriority="high" decoding="async"/><p>Um Reeder einzurichten brauchen wir wie<a href="/freshrss-rss-reader-zum-selber-hosten/#erste-schritte-nach-der-installation">oben beschrieben</a>
ein<em>API-Passwort</em>. In Reeder selbst gehen wir dann auf<strong>Accounts</strong> und<strong>Add Account</strong>. Ganz unten findet man dann FreshRSS zur Auswahl. Nun tragen wir die benötigten Daten ein und klicken auf<strong>Sign in</strong>. Anschließend zieht sich Reeder alle Informationen und würde noch ungelesene Artikel anzeigen.</p><h2 id="häufig-gestellte-fragen-zu-freshrss">Häufig gestellte Fragen zu FreshRSS<a href="#h%c3%a4ufig-gestellte-fragen-zu-freshrss" class="heading-anchor" aria-label="Diesen Abschnitt verlinken"><svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a></h2><h3 id="was-ist-freshrss">Was ist FreshRSS?<a href="#was-ist-freshrss" class="heading-anchor" aria-label="Diesen Abschnitt verlinken"><svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a></h3><p>FreshRSS ist ein kostenloser, Open-Source RSS-Reader, den du auf deinem eigenen Server installieren kannst. Anders als Cloud-Dienste behältst du die volle Kontrolle über deine Daten und Feeds.</p><h3 id="ist-freshrss-wirklich-kostenlos">Ist FreshRSS wirklich kostenlos?<a href="#ist-freshrss-wirklich-kostenlos" class="heading-anchor" aria-label="Diesen Abschnitt verlinken"><svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a></h3><p>Ja, FreshRSS ist komplett kostenlos und Open Source. Du benötigst lediglich einen Server oder Computer, auf dem du die Software installieren kannst. Es fallen keine Lizenzkosten an.</p><h3 id="welche-apps-kann-ich-mit-freshrss-nutzen">Welche Apps kann ich mit FreshRSS nutzen?<a href="#welche-apps-kann-ich-mit-freshrss-nutzen" class="heading-anchor" aria-label="Diesen Abschnitt verlinken"><svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a></h3><p>FreshRSS unterstützt verschiedene mobile Apps über seine API. Beliebte Optionen sind Reeder (iOS/macOS), FeedMe (Android) und NetNewsWire (iOS/macOS). Alle Apps, die mit Google Reader kompatibel waren, funktionieren meist auch mit FreshRSS.</p><h3 id="wie-viel-speicherplatz-benötigt-freshrss">Wie viel Speicherplatz benötigt FreshRSS?<a href="#wie-viel-speicherplatz-ben%c3%b6tigt-freshrss" class="heading-anchor" aria-label="Diesen Abschnitt verlinken"><svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a></h3><p>Die Installation selbst benötigt etwa 50-100 MB. Je nach Anzahl deiner Feeds und gespeicherten Artikeln solltest du 500 MB bis 2 GB Speicherplatz einplanen. Bei sehr vielen Feeds können es auch mehr werden.</p><h3 id="kann-ich-freshrss-ohne-docker-installieren">Kann ich FreshRSS ohne Docker installieren?<a href="#kann-ich-freshrss-ohne-docker-installieren" class="heading-anchor" aria-label="Diesen Abschnitt verlinken"><svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a></h3><p>Ja, FreshRSS lässt sich auch klassisch per PHP auf einem Webserver installieren. Die Anforderungen sind: PHP 7.4+, Apache oder Nginx, und optional MySQL/PostgreSQL. Die Docker-Variante ist jedoch einfacher zu verwalten.</p>
]]></content:encoded><category>rss</category><category>docker</category><category>homelab</category></item><item><title>Blogumzug von Wordpress zu Jekyll</title><link>https://www.teqqy.de/2023-07-blogumzug-von-wordpress-zu-jekyll/</link><pubDate>Mon, 31 Jul 2023 22:29:57 +0200</pubDate><lastBuildDate>Mon, 31 Jul 2023 22:29:57 +0200</lastBuildDate><guid isPermaLink="true">https://www.teqqy.de/2023-07-blogumzug-von-wordpress-zu-jekyll/</guid><description>In den letzten Jahren habe ich immer wieder aus verschiedenen Gründen die Blogsoftware gewechselt. Dieses Mal bin ich von Wordpress zu Jekyll umgezogen. Mein Vorgehen und Gründe möchte ich in diesem Beitrag erläutern.
Was ist Jekyll? Jekyll ist eine Blogsoftware bzw. ein sogenannter Static Site Generator. Primär wird Jekyll von GitHub Pages verwendet. Die meisten Tutorials die man so im Internet finden beziehen auch genau darauf. Grundlegend baut die Software Markdown-Dateien zu statischen HTML Dateien um diese mit einem einfachen Webserver ausliefern zu können. Im bequemsten Fall sogar mit dem integriertem.</description><content:encoded>&lt;![CDATA[<p>In den letzten Jahren habe ich immer wieder aus verschiedenen Gründen die Blogsoftware gewechselt. Dieses Mal bin ich von Wordpress zu Jekyll umgezogen. Mein Vorgehen und Gründe möchte ich in diesem Beitrag erläutern.</p><h2 id="was-ist-jekyll">Was ist Jekyll?<a href="#was-ist-jekyll" class="heading-anchor" aria-label="Diesen Abschnitt verlinken"><svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a></h2><p>Jekyll ist eine Blogsoftware bzw. ein sogenannter Static Site Generator. Primär wird Jekyll von GitHub Pages verwendet. Die meisten Tutorials die man so im Internet finden beziehen auch genau darauf. Grundlegend baut die Software Markdown-Dateien zu statischen HTML Dateien um diese mit einem einfachen Webserver ausliefern zu können. Im bequemsten Fall sogar mit dem integriertem.</p><h2 id="gründe-für-meinen-wechsel">Gründe für meinen Wechsel<a href="#gr%c3%bcnde-f%c3%bcr-meinen-wechsel" class="heading-anchor" aria-label="Diesen Abschnitt verlinken"><svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a></h2><p>Gründe könnten mannigfaltig sein. Schlussendlich läuft es aber darauf hinaus, dass Wordpress immer mächtiger wird. Das hat seine Vor- und Nachteile. Sicherlich ist es sehr praktisch für jeden Anwendungsfall Wordpress verwenden zu können, denn die verschiedenen Plugins und Themes machen das möglich. Viele großen Webseiten basieren auf Wordpress und mit dem notwendigen Know-How und Ressourcen lassen sich auch sehr Performance Webseiten bauen.
Der Nachteil der Erweiterbarkeit liegt entsprechend auch in der Pflege und den Bemühungen einen guten Wert für den LCP zu erreichen. Mir ist es im Laufe der Zeit nicht gelungen einen guten Wert zu erreichen. Am Hoster<a href="https://www.netcup.de/?ref=60644" target="_blank" rel="noopener noreferrer">Netcup<svg class="link-external-icon" aria-hidden="true" focusable="false" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"/><polyline points="15 3 21 3 21 9"/><line x1="10" y1="14" x2="21" y2="3"/></svg><span class="visually-hidden"> (externer Link)</span></a>
liegt es nicht, da ich hier auch verschiedene ausprobiert habe.
Zudem bin ich im Moment dabei mich von verschiedenen großen Softwareprodukten zu trennen und auf freiere Software zu setzen.</p><p>In der Webentwicklung steht LCP für &ldquo;Largest Contentful Paint&rdquo;. Es handelt sich um eine wichtige Metrik für die Ladeleistung einer Webseite. LCP misst die Zeit, die benötigt wird, um den größten sichtbaren Inhalt im Viewport eines Nutzers während des Seitenladens zu rendern. Ein guter LCP-Wert ist wichtig, um sicherzustellen, dass Webseiten schnell und reibungslos geladen werden und Benutzer eine bessere Erfahrung haben.
{:.note title=&ldquo;Was ist LCP?&rdquo;}</p><h2 id="installation-von-jekyll">Installation von Jekyll<a href="#installation-von-jekyll" class="heading-anchor" aria-label="Diesen Abschnitt verlinken"><svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a></h2><p>Die Installation von Jekyll kann unter verschiedenen Betriebssystemen durchgeführt werden. Allerdings ist Windows nicht mit dabei. Wenn man allerdings den Umweg über WSL2 geht, kann man der regulären Linux Installation für die verwendete Linux-Distribution folgen. In dieser Anleitung gehe ich erst mal auf die Installation unter MacOS ein, da ich persönlich dieses Betriebssystem verwende.
Alternative Installationen finden sich natürlich in der offiziellen Dokumentation. Gern kann dort diese entsprechend verwendet werden.</p><h3 id="installation-unter-macos">Installation unter MacOS<a href="#installation-unter-macos" class="heading-anchor" aria-label="Diesen Abschnitt verlinken"><svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a></h3><h4 id="installation-des-paketmanagers-brew">Installation des Paketmanagers brew<a href="#installation-des-paketmanagers-brew" class="heading-anchor" aria-label="Diesen Abschnitt verlinken"><svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a></h4><p>MacOS Nutzer haben in der Regel schon den Paketmanager<code>brew</code> installiert. Falls du das noch nicht getan hast, lässt sich das mittels</p><div class="code-block"><div class="code-block-header"><span class="code-lang-label">bash</span><button class="code-copy-btn" type="button" aria-label="Code kopieren" data-umami-event="Code Copy" data-umami-event-lang="bash"><svg class="icon-copy" xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"/><path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"/></svg><svg class="icon-check" xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><polyline points="20 6 9 17 4 12"/></svg></button></div><div class="highlight"><pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>/bin/bash -c<span style="color:#a5d6ff">"</span><span style="color:#ff7b72">$(</span>curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh<span style="color:#ff7b72">)</span><span style="color:#a5d6ff">"</span></span></span></code></pre></div></div><p>erledigen. Grundsätzlich sollte aber immer beim Ausführen von Programmen direkt aus dem Internet vorsichtig sein! Sobald das erledigt ist, brauchen wir jetzt den Ruby Installer denn Jekyll ist in der entsprechenden Programiersprache geschrieben.</p><h4 id="installation-von-ruby">Installation von ruby<a href="#installation-von-ruby" class="heading-anchor" aria-label="Diesen Abschnitt verlinken"><svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a></h4><div class="code-block"><div class="code-block-header"><span class="code-lang-label">bash</span><button class="code-copy-btn" type="button" aria-label="Code kopieren" data-umami-event="Code Copy" data-umami-event-lang="bash"><svg class="icon-copy" xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"/><path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"/></svg><svg class="icon-check" xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><polyline points="20 6 9 17 4 12"/></svg></button></div><div class="highlight"><pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>brew install chruby ruby-install xz</span></span></code></pre></div></div><p>Dies kann durchaus ein paar Minuten dauern, das ist nicht ungewöhnlich. Nun installieren wir noch ruby selbst.</p><div class="code-block"><div class="code-block-header"><span class="code-lang-label">bash</span><button class="code-copy-btn" type="button" aria-label="Code kopieren" data-umami-event="Code Copy" data-umami-event-lang="bash"><svg class="icon-copy" xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"/><path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"/></svg><svg class="icon-check" xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><polyline points="20 6 9 17 4 12"/></svg></button></div><div class="highlight"><pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>ruby-install ruby 3.2.2</span></span></code></pre></div></div><p>Beachte, dass die Version 3.2.2 die zum Zeitpunkt des Artikels die aktuellste Version ist, dass kann zum jetzigen Zeitpunkt anders sein.
Der nächste Schritt ist, dass wir ruby und die ganzen Environment Variablen noch aktivieren und in die MacOS Konfiguration speichern</p><div class="code-block"><div class="code-block-header"><span class="code-lang-label">bash</span><button class="code-copy-btn" type="button" aria-label="Code kopieren" data-umami-event="Code Copy" data-umami-event-lang="bash"><svg class="icon-copy" xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"/><path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"/></svg><svg class="icon-check" xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><polyline points="20 6 9 17 4 12"/></svg></button></div><div class="highlight"><pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>echo<span style="color:#a5d6ff">"source</span><span style="color:#ff7b72">$(</span>brew --prefix<span style="color:#ff7b72">)</span><span style="color:#a5d6ff">/opt/chruby/share/chruby/chruby.sh"</span> &gt;&gt; ~/.zshrc</span></span><span style="display:flex;"><span>echo<span style="color:#a5d6ff">"source</span><span style="color:#ff7b72">$(</span>brew --prefix<span style="color:#ff7b72">)</span><span style="color:#a5d6ff">/opt/chruby/share/chruby/auto.sh"</span> &gt;&gt; ~/.zshrc</span></span><span style="display:flex;"><span>echo<span style="color:#a5d6ff">"chruby ruby-3.2.2"</span> &gt;&gt; ~/.zshrc<span style="color:#8b949e;font-style:italic"># run 'chruby' to see actual version</span></span></span></code></pre></div></div><h4 id="installation-von-jekyll-1">Installation von Jekyll<a href="#installation-von-jekyll-1" class="heading-anchor" aria-label="Diesen Abschnitt verlinken"><svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a></h4><p>Endlich kommen wir zu dem Punkt, dass wir Jekyll selbst installieren können.</p><div class="code-block"><div class="code-block-header"><span class="code-lang-label">bash</span><button class="code-copy-btn" type="button" aria-label="Code kopieren" data-umami-event="Code Copy" data-umami-event-lang="bash"><svg class="icon-copy" xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"/><path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"/></svg><svg class="icon-check" xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><polyline points="20 6 9 17 4 12"/></svg></button></div><div class="highlight"><pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>gem install jekyll</span></span></code></pre></div></div><p>Auch der Schritt kann einige Zeit lang brauchen. Anschließend haben wir Jekyll installiert.</p><h2 id="jekyll-webseite-anlegen">Jekyll Webseite anlegen<a href="#jekyll-webseite-anlegen" class="heading-anchor" aria-label="Diesen Abschnitt verlinken"><svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a></h2><p>Sobald wir also eine lauffähige Version von Jekyll haben, können wir nun eine Webseite anlegen. Wir suchen uns also einen entsprechenden Ordner aus in dem die Installation durchgeführt werden soll. Ich mache sowas immer in einem Unterordner in meinem Homeverzeichnis.</p><div class="code-block"><div class="code-block-header"><span class="code-lang-label">bash</span><button class="code-copy-btn" type="button" aria-label="Code kopieren" data-umami-event="Code Copy" data-umami-event-lang="bash"><svg class="icon-copy" xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"/><path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"/></svg><svg class="icon-check" xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><polyline points="20 6 9 17 4 12"/></svg></button></div><div class="highlight"><pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>cd ~</span></span></code></pre></div></div><p>Den Namen den wir im install Befehl mitgeben wird auch der Name des Ordners sein. Natürlich kann der Prozess beliebig oft ausgeführt werden, falls euch das nicht gefällt.</p><div class="code-block"><div class="code-block-header"><span class="code-lang-label">bash</span><button class="code-copy-btn" type="button" aria-label="Code kopieren" data-umami-event="Code Copy" data-umami-event-lang="bash"><svg class="icon-copy" xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"/><path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"/></svg><svg class="icon-check" xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><polyline points="20 6 9 17 4 12"/></svg></button></div><div class="highlight"><pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>jekyll new blog</span></span></code></pre></div></div><p>Es entsteht dann eine ungefähr solche Ausgabe</p><div class="code-block"><div class="code-block-header"><span class="code-lang-label">bash</span><button class="code-copy-btn" type="button" aria-label="Code kopieren" data-umami-event="Code Copy" data-umami-event-lang="bash"><svg class="icon-copy" xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"/><path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"/></svg><svg class="icon-check" xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><polyline points="20 6 9 17 4 12"/></svg></button></div><div class="highlight"><pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>Running bundle install in /Users/teqqy/blog...</span></span><span style="display:flex;"><span> Bundler: Fetching gem metadata from https://rubygems.org/............</span></span><span style="display:flex;"><span> Bundler: Resolving dependencies...</span></span><span style="display:flex;"><span> Bundler: Fetching rouge 4.1.3</span></span><span style="display:flex;"><span> Bundler: Installing rouge 4.1.3</span></span><span style="display:flex;"><span> Bundler: Bundle complete!<span style="color:#a5d6ff">7</span> Gemfile dependencies,<span style="color:#a5d6ff">33</span> gems now installed.</span></span><span style="display:flex;"><span> Bundler: Use<span style="color:#a5d6ff">`</span>bundle info<span style="color:#ff7b72;font-weight:bold">[</span>gemname<span style="color:#ff7b72;font-weight:bold">]</span><span style="color:#a5d6ff">`</span> to see where a bundled gem is installed.</span></span><span style="display:flex;"><span>New jekyll site installed in /Users/teqqy/blog.</span></span><span style="display:flex;"><span><span style="color:#ff7b72;font-weight:bold">[</span>21:31:33<span style="color:#ff7b72;font-weight:bold">]</span><span style="color:#ff7b72;font-weight:bold">[</span>cost 3.162s<span style="color:#ff7b72;font-weight:bold">]</span> jekyll new blog</span></span></code></pre></div></div><p>Nun wechseln wir in das Verzeichnis und gucken mal was so für Dateien und Ordner dort hinterlegt sind.</p><div class="code-block"><div class="code-block-header"><span class="code-lang-label">bash</span><button class="code-copy-btn" type="button" aria-label="Code kopieren" data-umami-event="Code Copy" data-umami-event-lang="bash"><svg class="icon-copy" xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"/><path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"/></svg><svg class="icon-check" xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><polyline points="20 6 9 17 4 12"/></svg></button></div><div class="highlight"><pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span><span style="color:#ff7b72;font-weight:bold">[</span>21:32:50<span style="color:#ff7b72;font-weight:bold">]</span><span style="color:#ff7b72;font-weight:bold">[</span>~/blog<span style="color:#ff7b72;font-weight:bold">]</span> ❱❱❱ ls -l</span></span><span style="display:flex;"><span>total<span style="color:#a5d6ff">48</span></span></span><span style="display:flex;"><span>-rw-r--r--<span style="color:#a5d6ff">1</span> teqqy staff<span style="color:#a5d6ff">419</span><span style="color:#a5d6ff">31</span> Jul 21:31 404.html</span></span><span style="display:flex;"><span>-rw-r--r--<span style="color:#a5d6ff">1</span> teqqy staff<span style="color:#a5d6ff">1309</span><span style="color:#a5d6ff">31</span> Jul 21:31 Gemfile</span></span><span style="display:flex;"><span>-rw-r--r--<span style="color:#a5d6ff">1</span> teqqy staff<span style="color:#a5d6ff">2052</span><span style="color:#a5d6ff">31</span> Jul 21:31 Gemfile.lock</span></span><span style="display:flex;"><span>-rw-r--r--<span style="color:#a5d6ff">1</span> teqqy staff<span style="color:#a5d6ff">2079</span><span style="color:#a5d6ff">31</span> Jul 21:31 _config.yml</span></span><span style="display:flex;"><span>drwxr-xr-x<span style="color:#a5d6ff">3</span> teqqy staff<span style="color:#a5d6ff">96</span><span style="color:#a5d6ff">31</span> Jul 21:31 _posts</span></span><span style="display:flex;"><span>-rw-r--r--<span style="color:#a5d6ff">1</span> teqqy staff<span style="color:#a5d6ff">539</span><span style="color:#a5d6ff">31</span> Jul 21:31 about.markdown</span></span><span style="display:flex;"><span>-rw-r--r--<span style="color:#a5d6ff">1</span> teqqy staff<span style="color:#a5d6ff">175</span><span style="color:#a5d6ff">31</span> Jul 21:31 index.markdown</span></span></code></pre></div></div><p>Wie man sieht, sind das nicht viele Dateien. Nun sollten wir die<code>_config.yml</code> anpassen. Die Begriffe sollten selbsterklärend sein. Die Werte sind aber erst mal keine Pflicht.
Um jetzt die HTML Dateien bauen zu lassen verwenden wir folgenden Befehl</p><div class="code-block"><div class="code-block-header"><span class="code-lang-label">bash</span><button class="code-copy-btn" type="button" aria-label="Code kopieren" data-umami-event="Code Copy" data-umami-event-lang="bash"><svg class="icon-copy" xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"/><path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"/></svg><svg class="icon-check" xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><polyline points="20 6 9 17 4 12"/></svg></button></div><div class="highlight"><pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>jekyll serve</span></span></code></pre></div></div><p>Es erscheinen diverse Fehlermeldungen und Warnungen auf Grund von veralteten Abhängigkeiten. Leider sind diese immer noch nicht sauber gefixt. Die letzte Ausgabe sollte etwas in der Art von</p><div class="code-block"><div class="code-block-header"><span class="code-lang-label">bash</span><button class="code-copy-btn" type="button" aria-label="Code kopieren" data-umami-event="Code Copy" data-umami-event-lang="bash"><svg class="icon-copy" xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"/><path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"/></svg><svg class="icon-check" xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><polyline points="20 6 9 17 4 12"/></svg></button></div><div class="highlight"><pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>Run in verbose mode to see all warnings.</span></span><span style="display:flex;"><span><span style="color:#ff7b72">done</span> in 0.401 seconds.</span></span><span style="display:flex;"><span> Auto-regeneration: enabled<span style="color:#ff7b72">for</span><span style="color:#a5d6ff">'/Users/teqqy/blog'</span></span></span><span style="display:flex;"><span> Server address: http://127.0.0.1:4000/</span></span><span style="display:flex;"><span> Server running... press ctrl-c to stop.</span></span></code></pre></div></div><p>Enthalten. Jetzt könnt ihr euren Browser öffnen und die URL<code>http://127.0.0.1:4000</code> verwenden.</p><p>Wir brechen dann wieder den laufenden Server mit<code>CTRL-C</code> ab. Wenn wir jetzt nochmal die Verzeichnisse auflisten sehen wir, dass dort ein neuer Ordner<code>_site</code> erstellt worden ist.</p><div class="code-block"><div class="code-block-header"><span class="code-lang-label">bash</span><button class="code-copy-btn" type="button" aria-label="Code kopieren" data-umami-event="Code Copy" data-umami-event-lang="bash"><svg class="icon-copy" xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"/><path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"/></svg><svg class="icon-check" xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><polyline points="20 6 9 17 4 12"/></svg></button></div><div class="highlight"><pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span><span style="color:#ff7b72;font-weight:bold">[</span>21:40:43<span style="color:#ff7b72;font-weight:bold">]</span><span style="color:#ff7b72;font-weight:bold">[</span>~/blog<span style="color:#ff7b72;font-weight:bold">]</span> ❱❱❱ ls -l</span></span><span style="display:flex;"><span>total<span style="color:#a5d6ff">48</span></span></span><span style="display:flex;"><span>-rw-r--r--<span style="color:#a5d6ff">1</span> teqqy staff<span style="color:#a5d6ff">419</span><span style="color:#a5d6ff">31</span> Jul 21:31 404.html</span></span><span style="display:flex;"><span>-rw-r--r--<span style="color:#a5d6ff">1</span> teqqy staff<span style="color:#a5d6ff">1309</span><span style="color:#a5d6ff">31</span> Jul 21:31 Gemfile</span></span><span style="display:flex;"><span>-rw-r--r--<span style="color:#a5d6ff">1</span> teqqy staff<span style="color:#a5d6ff">2052</span><span style="color:#a5d6ff">31</span> Jul 21:31 Gemfile.lock</span></span><span style="display:flex;"><span>-rw-r--r--<span style="color:#a5d6ff">1</span> teqqy staff<span style="color:#a5d6ff">2079</span><span style="color:#a5d6ff">31</span> Jul 21:31 _config.yml</span></span><span style="display:flex;"><span>drwxr-xr-x<span style="color:#a5d6ff">3</span> teqqy staff<span style="color:#a5d6ff">96</span><span style="color:#a5d6ff">31</span> Jul 21:31 _posts</span></span><span style="display:flex;"><span>drwxr-xr-x<span style="color:#a5d6ff">8</span> teqqy staff<span style="color:#a5d6ff">256</span><span style="color:#a5d6ff">31</span> Jul 21:35 _site</span></span><span style="display:flex;"><span>-rw-r--r--<span style="color:#a5d6ff">1</span> teqqy staff<span style="color:#a5d6ff">539</span><span style="color:#a5d6ff">31</span> Jul 21:31 about.markdown</span></span><span style="display:flex;"><span>-rw-r--r--<span style="color:#a5d6ff">1</span> teqqy staff<span style="color:#a5d6ff">175</span><span style="color:#a5d6ff">31</span> Jul 21:31 index.markdown</span></span></code></pre></div></div><p>Dieser Ordner ist nun schlussendlich das wichtige. Dieser kann auf einen Webserver kopiert und ausgeliefert werden.</p><h3 id="webseite-bereitstellen">Webseite bereitstellen<a href="#webseite-bereitstellen" class="heading-anchor" aria-label="Diesen Abschnitt verlinken"><svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a></h3><p>Viele Tutorials im Internet verwenden den<code>jekyll serve</code> Befehl um die Webseite auszuliefern und richten einen Webserver wie NGINX oder apache2 als reverse proxy ein. Dies ist allerdings nicht der vom Hersteller empfohlene Weg. Ich für meinen Teil habe das Verzeichnis auf meinen Webserver kopiert und liefere es mit einem Nginx Docker-Container aus. Dieser hat entsprechende Traefik Labels, welches sich um die Zertifikate etc kümmert. Sicherlich kein Setup für jeden.</p><h4 id="nginx-docker-container">Nginx Docker Container<a href="#nginx-docker-container" class="heading-anchor" aria-label="Diesen Abschnitt verlinken"><svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a></h4><p>Meine verwendete<code>docker-compose.yaml</code> Datei kannst du natürlich übernehmen wenn du möchtest. Du müsstest nur die Werte entsprechend anpassen.</p><div class="code-block"><div class="code-block-header"><span class="code-lang-label">yaml</span><button class="code-copy-btn" type="button" aria-label="Code kopieren" data-umami-event="Code Copy" data-umami-event-lang="yaml"><svg class="icon-copy" xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"/><path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"/></svg><svg class="icon-check" xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><polyline points="20 6 9 17 4 12"/></svg></button></div><div class="highlight"><pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"><code class="language-yaml" data-lang="yaml"><span style="display:flex;"><span><span style="color:#ff7b72">---</span><span style="color:#6e7681"/></span></span><span style="display:flex;"><span><span style="color:#7ee787">version</span>:<span style="color:#6e7681"/><span style="color:#a5d6ff">"3.8"</span><span style="color:#6e7681"/></span></span><span style="display:flex;"><span><span style="color:#6e7681"/></span></span><span style="display:flex;"><span><span style="color:#7ee787">services</span>:<span style="color:#6e7681"/></span></span><span style="display:flex;"><span><span style="color:#6e7681"/><span style="color:#7ee787">nginx</span>:<span style="color:#6e7681"/></span></span><span style="display:flex;"><span><span style="color:#6e7681"/><span style="color:#7ee787">image</span>:<span style="color:#6e7681"/><span style="color:#a5d6ff">nginx</span><span style="color:#6e7681"/></span></span><span style="display:flex;"><span><span style="color:#6e7681"/><span style="color:#7ee787">container_name</span>:<span style="color:#6e7681"/><span style="color:#a5d6ff">nginx</span><span style="color:#6e7681"/></span></span><span style="display:flex;"><span><span style="color:#6e7681"/><span style="color:#7ee787">volumes</span>:<span style="color:#6e7681"/></span></span><span style="display:flex;"><span><span style="color:#6e7681"/>-<span style="color:#a5d6ff">./_site:/usr/share/nginx/html</span><span style="color:#6e7681"/></span></span><span style="display:flex;"><span><span style="color:#6e7681"/>-<span style="color:#a5d6ff">./nginx.conf:/etc/nginx/conf.d/www_nginx.conf</span><span style="color:#6e7681"/></span></span><span style="display:flex;"><span><span style="color:#6e7681"/><span style="color:#7ee787">labels</span>:<span style="color:#6e7681"/></span></span><span style="display:flex;"><span><span style="color:#6e7681"/>-<span style="color:#a5d6ff">"traefik.enable=true"</span><span style="color:#6e7681"/></span></span><span style="display:flex;"><span><span style="color:#6e7681"/>-<span style="color:#a5d6ff">"traefik.http.middlewares.nginx-https.redirectscheme.scheme=https"</span><span style="color:#6e7681"/></span></span><span style="display:flex;"><span><span style="color:#6e7681"/>-<span style="color:#a5d6ff">"traefik.http.middlewares.nginx-compress.compress=true"</span><span style="color:#6e7681"/></span></span><span style="display:flex;"><span><span style="color:#6e7681"/>-<span style="color:#a5d6ff">"traefik.http.routers.nginx-http.entrypoints=web"</span><span style="color:#6e7681"/></span></span><span style="display:flex;"><span><span style="color:#6e7681"/>-<span style="color:#a5d6ff">"traefik.http.routers.nginx-http.rule=Host(`www.example.com`) || Host(`example.com`)"</span><span style="color:#6e7681"/></span></span><span style="display:flex;"><span><span style="color:#6e7681"/>-<span style="color:#a5d6ff">"traefik.http.routers.nginx-http.middlewares=teqqy-https@docker"</span><span style="color:#6e7681"/></span></span><span style="display:flex;"><span><span style="color:#6e7681"/>-<span style="color:#a5d6ff">"traefik.http.routers.nginx.entrypoints=websecure"</span><span style="color:#6e7681"/></span></span><span style="display:flex;"><span><span style="color:#6e7681"/>-<span style="color:#a5d6ff">"traefik.http.routers.teqqy.rule=Host(`www.example.com``) || Host(`example.com``)"</span><span style="color:#6e7681"/></span></span><span style="display:flex;"><span><span style="color:#6e7681"/>-<span style="color:#a5d6ff">"traefik.http.routers.nginx.tls=true"</span><span style="color:#6e7681"/></span></span><span style="display:flex;"><span><span style="color:#6e7681"/>-<span style="color:#a5d6ff">"traefik.http.routers.nginx.tls.certresolver=default"</span><span style="color:#6e7681"/></span></span><span style="display:flex;"><span><span style="color:#6e7681"/>-<span style="color:#a5d6ff">"traefik.http.routers.nginx.middlewares=secHeaders@file"</span><span style="color:#6e7681"/></span></span><span style="display:flex;"><span><span style="color:#6e7681"/>-<span style="color:#a5d6ff">"traefik.http.routers.nginx.middlewares=teqqy-compress"</span><span style="color:#6e7681"/></span></span><span style="display:flex;"><span><span style="color:#6e7681"/>-<span style="color:#a5d6ff">"traefik.http.services.nginx.loadbalancer.server.port=80"</span><span style="color:#6e7681"/></span></span><span style="display:flex;"><span><span style="color:#6e7681"/><span style="color:#7ee787">networks</span>:<span style="color:#6e7681"/></span></span><span style="display:flex;"><span><span style="color:#6e7681"/>-<span style="color:#a5d6ff">teqqywp</span><span style="color:#6e7681"/></span></span><span style="display:flex;"><span><span style="color:#6e7681"/>-<span style="color:#a5d6ff">traefik_proxy</span><span style="color:#6e7681"/></span></span><span style="display:flex;"><span><span style="color:#6e7681"/></span></span><span style="display:flex;"><span><span style="color:#7ee787">networks</span>:<span style="color:#6e7681"/></span></span><span style="display:flex;"><span><span style="color:#6e7681"/><span style="color:#7ee787">traefik_proxy</span>:<span style="color:#6e7681"/></span></span><span style="display:flex;"><span><span style="color:#6e7681"/><span style="color:#7ee787">external</span>:<span style="color:#6e7681"/></span></span><span style="display:flex;"><span><span style="color:#6e7681"/><span style="color:#7ee787">name</span>:<span style="color:#6e7681"/><span style="color:#a5d6ff">traefik_proxy</span><span style="color:#6e7681"/></span></span><span style="display:flex;"><span><span style="color:#6e7681"/><span style="color:#7ee787">teqqywp</span>:<span style="color:#6e7681"/></span></span><span style="display:flex;"><span><span style="color:#6e7681"/><span style="color:#7ee787">driver</span>:<span style="color:#6e7681"/><span style="color:#a5d6ff">bridge</span></span></span></code></pre></div></div><h4 id="nginx-konfiguration">Nginx Konfiguration<a href="#nginx-konfiguration" class="heading-anchor" aria-label="Diesen Abschnitt verlinken"><svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a></h4><p>Ich binde noch eine eigene<code>nginx.conf</code> Datei ein in der ich noch Anpassungen für Caching und anderes mache.</p><div class="code-block"><div class="code-block-header"><span class="code-lang-label">conf</span><button class="code-copy-btn" type="button" aria-label="Code kopieren" data-umami-event="Code Copy" data-umami-event-lang="conf"><svg class="icon-copy" xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"/><path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"/></svg><svg class="icon-check" xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><polyline points="20 6 9 17 4 12"/></svg></button></div><pre tabindex="0"><code class="language-conf" data-lang="conf">server {
listen 80;
server_name example.com www.example.com
root /usr/share/nginx/html;
index index.html index.htm;
if (!-f "${request_filename}index.html") {
rewrite ^/(.*)/$ /$1 permanent;
}
if ($request_uri ~* "/index.html") {
rewrite (?i)^(.*)index\.html$ $1 permanent;
}
if ($request_uri ~* ".html") {
rewrite (?i)^(.*)/(.*)\.html $1/$2 permanent;
}
error_page 404 /404.html;
location / {
try_files $uri $uri.html $uri/ =404;
}
location ~* \.(?:ico|css|js|gif|jpe?g|png)$ {
expires 30d;
add_header Pragma public;
add_header Cache-Control "public";
}
# reduce the data that needs to be sent over network -- for testing environment
gzip on;
# gzip_static on;
gzip_min_length 10240;
gzip_comp_level 1;
gzip_vary on;
gzip_disable msie6;
gzip_proxied expired no-cache no-store private auth;
gzip_types
# text/html is always compressed by HttpGzipModule
text/css
text/javascript
text/xml
text/plain
text/x-component
application/javascript
application/x-javascript
application/json
application/xml
application/rss+xml
application/atom+xml
font/truetype
font/opentype
application/vnd.ms-fontobject
image/svg+xml;
# allow the server to close connection on non responding client, this will free up memory
reset_timedout_connection on;
# request timed out -- default 60
client_body_timeout 10;
# if client stop responding, free up memory -- default 60
send_timeout 2;
# server will close connection after this time -- default 75
keepalive_timeout 30;
# number of requests client can make over keep-alive -- for testing environment
keepalive_requests 100000;
}</code></pre></div><p>Nun kann der Container gestartet werden und nach kurzer Zeit könnt ihr die Seite über die angegebene URL aufrufen.</p><h2 id="wordpress-daten-exportieren">Wordpress Daten exportieren<a href="#wordpress-daten-exportieren" class="heading-anchor" aria-label="Diesen Abschnitt verlinken"><svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a></h2><p>Für den Export habe ich das Wordpress Plugin<a href="https://de.wordpress.org/plugins/jekyll-exporter/" target="_blank" rel="noopener noreferrer">Wordpress to Jekyll Exporter<svg class="link-external-icon" aria-hidden="true" focusable="false" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"/><polyline points="15 3 21 3 21 9"/><line x1="10" y1="14" x2="21" y2="3"/></svg><span class="visually-hidden"> (externer Link)</span></a>
verwendet. Es nicht das beste Plugin aber für mich hat es gereicht. In Wordpress können wir dann unter<strong>Werkzeuge</strong> den Export ausführen und bekommen eine ZIP-Datei zum Download.
Die Inhalte können wir direkt in unser Jekyll Verzeichnis kopieren und die Seiten neu genierieren lassen.</p><div class="code-block"><div class="code-block-header"><span class="code-lang-label">bash</span><button class="code-copy-btn" type="button" aria-label="Code kopieren" data-umami-event="Code Copy" data-umami-event-lang="bash"><svg class="icon-copy" xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"/><path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"/></svg><svg class="icon-check" xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><polyline points="20 6 9 17 4 12"/></svg></button></div><div class="highlight"><pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>jekyll serve</span></span></code></pre></div></div><p>Nun können wir den Ordner<code>_site</code> wieder auf unseren Webserver kopieren. Den Container müssen wir nicht neu starten, denn nginx liefert die Dateien direkt aus. Ein einfacher reload im Browser reicht dafür aus.</p><h2 id="jekyll-anapssen">Jekyll anapssen<a href="#jekyll-anapssen" class="heading-anchor" aria-label="Diesen Abschnitt verlinken"><svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a></h2><p>Jetzt liegt es an euch, Jekyll entsprechend den Bedürfnissen anzu passen. Heißt ein Theme herunter zu laden oder mit Plugins zu erweitern.</p>
]]></content:encoded><category>wordpress</category><category>jekyll</category><category>nginx</category><category>docker</category></item><item><title>Teslamate 2025 - Datenlogger für Tesla Fahrzeuge</title><link>https://www.teqqy.de/teslamate-datenlogger-fur-tesla-fahrzeuge/</link><pubDate>Mon, 27 Mar 2023 20:19:57 +0200</pubDate><lastBuildDate>Mon, 27 Mar 2023 20:19:57 +0200</lastBuildDate><guid isPermaLink="true">https://www.teqqy.de/teslamate-datenlogger-fur-tesla-fahrzeuge/</guid><description>Update Dezember 2025: Dieser Artikel wurde überarbeitet und berücksichtigt die wichtigen Änderungen der Tesla Fleet API sowie aktuelle Teslamate-Versionen.
Moderne Fahrzeuge bieten mittlerweile eine API-Schnittstelle, um alle möglichen Daten auslesen zu können. Tesla war einer der ersten Hersteller, der dies umfangreich zur Verfügung stellt. Entsprechend sind Softwareprodukte wie Teslamate entstanden. Teslamate ist ein selbstgehosteter Open-Source-Datenlogger, der deine Tesla-Daten kontinuierlich erfasst, speichert und mit Grafana visualisiert.
Was hat sich 2025 geändert? Die wichtigsten Updates auf einen Blick:</description><content:encoded>&lt;![CDATA[<p><strong>Update Dezember 2025:</strong> Dieser Artikel wurde überarbeitet und berücksichtigt die wichtigen Änderungen der Tesla Fleet API sowie aktuelle Teslamate-Versionen.</p><p>Moderne Fahrzeuge bieten mittlerweile eine API-Schnittstelle, um alle möglichen Daten auslesen zu können. Tesla war einer der ersten Hersteller, der dies umfangreich zur Verfügung stellt. Entsprechend sind Softwareprodukte wie Teslamate entstanden. Teslamate ist ein selbstgehosteter Open-Source-Datenlogger, der deine Tesla-Daten kontinuierlich erfasst, speichert und mit Grafana visualisiert.</p><h2 id="was-hat-sich-2025-geändert">Was hat sich 2025 geändert?<a href="#was-hat-sich-2025-ge%c3%a4ndert" class="heading-anchor" aria-label="Diesen Abschnitt verlinken"><svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a></h2><p>Die wichtigsten Updates auf einen Blick:</p><p><strong>Tesla Fleet API:</strong> Tesla hat die inoffizielle &ldquo;Owner API&rdquo; durch die offizielle Fleet API ersetzt. Seit Februar 2025 gilt ein Pay-per-Use-Modell mit monatlichem $10-Freikontingent. Für Privatnutzer mit 1-2 Fahrzeugen reicht das Kontingent meist aus, zusätzliche Kosten liegen bei etwa $2-5/Monat bei intensiver Nutzung.</p><p><strong>PostgreSQL 17:</strong> Teslamate benötigt nun mindestens PostgreSQL 16.7 oder 17.3. Die Entwickler empfehlen PostgreSQL 17.</p><p><strong>Fleet Telemetry:</strong> Neu ist die Möglichkeit, dass das Fahrzeug Daten direkt streamt. Das ist präziser und günstiger als klassisches Polling, aber komplexer in der Einrichtung. Fleet Telemetry erfordert einen eigenen Server-Endpunkt und TLS-Zertifikate. Die Daten werden dann vom Fahrzeug per WebSocket gestreamt, sobald sich Werte ändern. Das spart API-Kosten, da du nicht mehr aktiv pollen musst. Besonders bei Fahrten erhältst du hochfrequente Daten mit minimaler Latenz. Für die meisten Nutzer funktioniert das bewährte Polling jedoch weiterhin problemlos und ist deutlich einfacher einzurichten.</p><h2 id="teslamate--installieren-oder-einkaufen">Teslamate – Installieren oder einkaufen?<a href="#teslamate--installieren-oder-einkaufen" class="heading-anchor" aria-label="Diesen Abschnitt verlinken"><svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a></h2><p>Teslamate ist keine Software-as-a-Service, sondern wird vom Nutzer selbst installiert. Ob im heimischen Homelab oder auf einem VPS-Server in der Cloud, z. B. bei<a href="https://www.netcup.de/?ref=60644" target="_blank" rel="noopener noreferrer">Netcup<svg class="link-external-icon" aria-hidden="true" focusable="false" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"/><polyline points="15 3 21 3 21 9"/><line x1="10" y1="14" x2="21" y2="3"/></svg><span class="visually-hidden"> (externer Link)</span></a>
– beides funktioniert. Ich hoste die Software auf meinem eigenen Server im Heimnetzwerk.</p><p>Die Installation ist mit<a href="/wordpress-docker-performance/">Docker</a>
sehr einfach. Du benötigst eine Datenbank (PostgreSQL) und den Anwendungscontainer. Für die Visualisierung setzt Teslamate auf Grafana mit fertig konfigurierten Dashboards.</p><h2 id="voraussetzungen">Voraussetzungen<a href="#voraussetzungen" class="heading-anchor" aria-label="Diesen Abschnitt verlinken"><svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a></h2><p><strong>Hardware &amp; Software:</strong></p><ul><li>Server mit mindestens 2 GB RAM (Raspberry Pi 4/5, NAS, VPS)</li><li>Docker und Docker Compose installiert</li><li>Dauerhaft aktive Internetverbindung</li></ul><p><strong>Tesla-Account:</strong></p><ul><li>Tesla-Konto mit Zwei-Faktor-Authentifizierung</li><li>Tesla Developer Account (kostenlos bei<a href="https://developer.tesla.com" target="_blank" rel="noopener noreferrer">developer.tesla.com<svg class="link-external-icon" aria-hidden="true" focusable="false" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"/><polyline points="15 3 21 3 21 9"/><line x1="10" y1="14" x2="21" y2="3"/></svg><span class="visually-hidden"> (externer Link)</span></a>
)</li></ul><h2 id="tesla-developer-account-einrichten">Tesla Developer Account einrichten<a href="#tesla-developer-account-einrichten" class="heading-anchor" aria-label="Diesen Abschnitt verlinken"><svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a></h2><p>Seit der Umstellung auf die Fleet API brauchst du einen Developer Account:</p><ol><li>Melde dich bei<a href="https://developer.tesla.com" target="_blank" rel="noopener noreferrer">developer.tesla.com<svg class="link-external-icon" aria-hidden="true" focusable="false" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"/><polyline points="15 3 21 3 21 9"/><line x1="10" y1="14" x2="21" y2="3"/></svg><span class="visually-hidden"> (externer Link)</span></a>
mit deinem Tesla-Konto an</li><li>Erstelle eine neue Application (z.B. &ldquo;Teslamate Homelab&rdquo;)</li><li>Gib eine kurze Beschreibung an</li><li>Bei lokaler Nutzung kannst du localhost als Domain verwenden</li></ol><p>Die Prüfung dauert ein paar Tage, für private Zwecke erfolgt die Freigabe normalerweise problemlos. Das monatliche $10-Guthaben ist ein echtes Guthaben – du musst keine Kreditkarte hinterlegen, solange du darunter bleibst.</p><h2 id="token-erstellung">Token-Erstellung<a href="#token-erstellung" class="heading-anchor" aria-label="Diesen Abschnitt verlinken"><svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a></h2><p>Früher funktionierte die Anmeldung mit Benutzerdaten. Heute benötigst du einen „Refresh Token" und „Access Token". Diese generierst du am einfachsten mit Apps:</p><ul><li><strong>iOS:</strong> &ldquo;Auth for Tesla&rdquo; (Apple AppStore)</li><li><strong>Android:</strong> &ldquo;Tesla Tokens&rdquo; oder &ldquo;Auth for Tesla&rdquo;</li><li><strong>Windows/Mac:</strong> &ldquo;Tesla Auth&rdquo; oder Web-basierte Tools</li></ul><p><strong>Vorgehensweise:</strong></p><ol><li>App installieren und mit Tesla-Benutzernamen anmelden</li><li>Passwort eingeben</li><li>Beim zweiten Prompt deinen 2FA-Code eingeben (nicht nochmal das Passwort!)</li><li>App zeigt Refresh Token und Access Token – beide sicher aufbewahren</li></ol><p>Die Tokens bleiben mehrere Monate gültig. Teslamate erneuert den Access Token automatisch.</p><p><img src="/teslamate-datenlogger-fur-tesla-fahrzeuge/images/teslamate-tesla-token_hu_b53628674ab82b23.webp" srcset="/teslamate-datenlogger-fur-tesla-fahrzeuge/images/teslamate-tesla-token_hu_ecfb7a72ba31093e.webp 384w, /teslamate-datenlogger-fur-tesla-fahrzeuge/images/teslamate-tesla-token_hu_b53628674ab82b23.webp 768w" sizes="(max-width: 768px) 100vw, 768px" alt="" loading="eager" fetchpriority="high" decoding="async" width="768" height="595"/><h2 id="installation-mit-docker-compose">Installation mit Docker Compose<a href="#installation-mit-docker-compose" class="heading-anchor" aria-label="Diesen Abschnitt verlinken"><svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a></h2><p>Die einfachste Installation erfolgt über Docker Compose. Falls du Docker Compose noch nicht installiert hast:</p><div class="code-block"><div class="code-block-header"><span class="code-lang-label">bash</span><button class="code-copy-btn" type="button" aria-label="Code kopieren" data-umami-event="Code Copy" data-umami-event-lang="bash"><svg class="icon-copy" xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"/><path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"/></svg><svg class="icon-check" xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><polyline points="20 6 9 17 4 12"/></svg></button></div><div class="highlight"><pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span><span style="color:#8b949e;font-style:italic"># Auf Ubuntu/Debian</span></span></span><span style="display:flex;"><span>sudo apt install docker-compose-plugin</span></span><span style="display:flex;"><span>docker compose version</span></span></code></pre></div></div><p>Erstelle ein Arbeitsverzeichnis:</p><div class="code-block"><div class="code-block-header"><span class="code-lang-label">bash</span><button class="code-copy-btn" type="button" aria-label="Code kopieren" data-umami-event="Code Copy" data-umami-event-lang="bash"><svg class="icon-copy" xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"/><path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"/></svg><svg class="icon-check" xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><polyline points="20 6 9 17 4 12"/></svg></button></div><div class="highlight"><pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>mkdir ~/teslamate<span style="color:#ff7b72;font-weight:bold">&amp;&amp;</span> cd ~/teslamate</span></span></code></pre></div></div><p>Ich verweise auf die<a href="https://docs.teslamate.org/docs/installation/docker" target="_blank" rel="noopener noreferrer">offizielle Dokumentation<svg class="link-external-icon" aria-hidden="true" focusable="false" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"/><polyline points="15 3 21 3 21 9"/><line x1="10" y1="14" x2="21" y2="3"/></svg><span class="visually-hidden"> (externer Link)</span></a>
, da sich die Konfiguration regelmäßig ändert.</p><p><strong>Wichtige Anpassungen für 2025:</strong></p><div class="code-block"><div class="code-block-header"><span class="code-lang-label">yaml</span><button class="code-copy-btn" type="button" aria-label="Code kopieren" data-umami-event="Code Copy" data-umami-event-lang="yaml"><svg class="icon-copy" xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"/><path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"/></svg><svg class="icon-check" xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><polyline points="20 6 9 17 4 12"/></svg></button></div><div class="highlight"><pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"><code class="language-yaml" data-lang="yaml"><span style="display:flex;"><span><span style="color:#7ee787">version</span>:<span style="color:#6e7681"/><span style="color:#a5d6ff">"3"</span><span style="color:#6e7681"/></span></span><span style="display:flex;"><span><span style="color:#7ee787">services</span>:<span style="color:#6e7681"/></span></span><span style="display:flex;"><span><span style="color:#6e7681"/><span style="color:#7ee787">teslamate</span>:<span style="color:#6e7681"/></span></span><span style="display:flex;"><span><span style="color:#6e7681"/><span style="color:#7ee787">image</span>:<span style="color:#6e7681"/><span style="color:#a5d6ff">teslamate/teslamate:latest</span><span style="color:#6e7681"/></span></span><span style="display:flex;"><span><span style="color:#6e7681"/><span style="color:#7ee787">restart</span>:<span style="color:#6e7681"/><span style="color:#a5d6ff">always</span><span style="color:#6e7681"/></span></span><span style="display:flex;"><span><span style="color:#6e7681"/><span style="color:#7ee787">environment</span>:<span style="color:#6e7681"/></span></span><span style="display:flex;"><span><span style="color:#6e7681"/>-<span style="color:#a5d6ff">ENCRYPTION_KEY=dein_sicherer_schluessel</span><span style="color:#6e7681"/></span></span><span style="display:flex;"><span><span style="color:#6e7681"/>-<span style="color:#a5d6ff">DATABASE_USER=teslamate</span><span style="color:#6e7681"/></span></span><span style="display:flex;"><span><span style="color:#6e7681"/>-<span style="color:#a5d6ff">DATABASE_PASS=sicheres_passwort</span><span style="color:#6e7681"/></span></span><span style="display:flex;"><span><span style="color:#6e7681"/>-<span style="color:#a5d6ff">DATABASE_NAME=teslamate</span><span style="color:#6e7681"/></span></span><span style="display:flex;"><span><span style="color:#6e7681"/>-<span style="color:#a5d6ff">DATABASE_HOST=database</span><span style="color:#6e7681"/></span></span><span style="display:flex;"><span><span style="color:#6e7681"/>-<span style="color:#a5d6ff">TZ=Europe/Berlin</span><span style="color:#6e7681"/><span style="color:#8b949e;font-style:italic"># Deine Zeitzone!</span><span style="color:#6e7681"/></span></span><span style="display:flex;"><span><span style="color:#6e7681"/>-<span style="color:#a5d6ff">MQTT_DISABLE=true</span><span style="color:#6e7681"/><span style="color:#8b949e;font-style:italic"># Falls kein MQTT benötigt</span><span style="color:#6e7681"/></span></span><span style="display:flex;"><span><span style="color:#6e7681"/><span style="color:#7ee787">ports</span>:<span style="color:#6e7681"/></span></span><span style="display:flex;"><span><span style="color:#6e7681"/>-<span style="color:#a5d6ff">4000</span>:<span style="color:#a5d6ff">4000</span><span style="color:#6e7681"/></span></span><span style="display:flex;"><span><span style="color:#6e7681"/><span style="color:#7ee787">cap_drop</span>:<span style="color:#6e7681"/></span></span><span style="display:flex;"><span><span style="color:#6e7681"/>-<span style="color:#a5d6ff">all</span><span style="color:#6e7681"/></span></span><span style="display:flex;"><span><span style="color:#6e7681"/></span></span><span style="display:flex;"><span><span style="color:#6e7681"/><span style="color:#7ee787">database</span>:<span style="color:#6e7681"/></span></span><span style="display:flex;"><span><span style="color:#6e7681"/><span style="color:#7ee787">image</span>:<span style="color:#6e7681"/><span style="color:#a5d6ff">postgres:17</span><span style="color:#6e7681"/><span style="color:#8b949e;font-style:italic"># Mindestens 16.7 oder 17.3!</span><span style="color:#6e7681"/></span></span><span style="display:flex;"><span><span style="color:#6e7681"/><span style="color:#7ee787">restart</span>:<span style="color:#6e7681"/><span style="color:#a5d6ff">always</span><span style="color:#6e7681"/></span></span><span style="display:flex;"><span><span style="color:#6e7681"/><span style="color:#7ee787">environment</span>:<span style="color:#6e7681"/></span></span><span style="display:flex;"><span><span style="color:#6e7681"/>-<span style="color:#a5d6ff">POSTGRES_USER=teslamate</span><span style="color:#6e7681"/></span></span><span style="display:flex;"><span><span style="color:#6e7681"/>-<span style="color:#a5d6ff">POSTGRES_PASSWORD=sicheres_passwort</span><span style="color:#6e7681"/></span></span><span style="display:flex;"><span><span style="color:#6e7681"/>-<span style="color:#a5d6ff">POSTGRES_DB=teslamate</span><span style="color:#6e7681"/></span></span><span style="display:flex;"><span><span style="color:#6e7681"/><span style="color:#7ee787">volumes</span>:<span style="color:#6e7681"/></span></span><span style="display:flex;"><span><span style="color:#6e7681"/>-<span style="color:#a5d6ff">teslamate-db:/var/lib/postgresql/data</span><span style="color:#6e7681"/></span></span><span style="display:flex;"><span><span style="color:#6e7681"/></span></span><span style="display:flex;"><span><span style="color:#6e7681"/><span style="color:#7ee787">grafana</span>:<span style="color:#6e7681"/></span></span><span style="display:flex;"><span><span style="color:#6e7681"/><span style="color:#7ee787">image</span>:<span style="color:#6e7681"/><span style="color:#a5d6ff">teslamate/grafana:latest</span><span style="color:#6e7681"/></span></span><span style="display:flex;"><span><span style="color:#6e7681"/><span style="color:#7ee787">restart</span>:<span style="color:#6e7681"/><span style="color:#a5d6ff">always</span><span style="color:#6e7681"/></span></span><span style="display:flex;"><span><span style="color:#6e7681"/><span style="color:#7ee787">environment</span>:<span style="color:#6e7681"/></span></span><span style="display:flex;"><span><span style="color:#6e7681"/>-<span style="color:#a5d6ff">DATABASE_USER=teslamate</span><span style="color:#6e7681"/></span></span><span style="display:flex;"><span><span style="color:#6e7681"/>-<span style="color:#a5d6ff">DATABASE_PASS=sicheres_passwort</span><span style="color:#6e7681"/></span></span><span style="display:flex;"><span><span style="color:#6e7681"/>-<span style="color:#a5d6ff">DATABASE_NAME=teslamate</span><span style="color:#6e7681"/></span></span><span style="display:flex;"><span><span style="color:#6e7681"/>-<span style="color:#a5d6ff">DATABASE_HOST=database</span><span style="color:#6e7681"/></span></span><span style="display:flex;"><span><span style="color:#6e7681"/><span style="color:#7ee787">ports</span>:<span style="color:#6e7681"/></span></span><span style="display:flex;"><span><span style="color:#6e7681"/>-<span style="color:#a5d6ff">3000</span>:<span style="color:#a5d6ff">3000</span><span style="color:#6e7681"/></span></span><span style="display:flex;"><span><span style="color:#6e7681"/><span style="color:#7ee787">volumes</span>:<span style="color:#6e7681"/></span></span><span style="display:flex;"><span><span style="color:#6e7681"/>-<span style="color:#a5d6ff">teslamate-grafana-data:/var/lib/grafana</span><span style="color:#6e7681"/></span></span><span style="display:flex;"><span><span style="color:#6e7681"/></span></span><span style="display:flex;"><span><span style="color:#7ee787">volumes</span>:<span style="color:#6e7681"/></span></span><span style="display:flex;"><span><span style="color:#6e7681"/><span style="color:#7ee787">teslamate-db</span>:<span style="color:#6e7681"/></span></span><span style="display:flex;"><span><span style="color:#6e7681"/><span style="color:#a5d6ff">teslamate-grafana-data:</span></span></span></code></pre></div></div><p><strong>MQTT für Home Assistant:</strong></p><p>Wenn du die Daten an einen MQTT-Server weiterleiten willst (z. B. für<a href="/tesla-ueberschussladen-mit-home-assistant/">Home-Assistant</a>
), ersetze<code>MQTT_DISABLE=true</code> durch<code>MQTT_HOST=mosquitto</code> und füge einen Mosquitto-Container hinzu.</p><p><strong>Container starten:</strong></p><div class="code-block"><div class="code-block-header"><span class="code-lang-label">bash</span><button class="code-copy-btn" type="button" aria-label="Code kopieren" data-umami-event="Code Copy" data-umami-event-lang="bash"><svg class="icon-copy" xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"/><path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"/></svg><svg class="icon-check" xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><polyline points="20 6 9 17 4 12"/></svg></button></div><div class="highlight"><pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>docker compose up -d</span></span></code></pre></div></div><p>Teslamate ist anschließend unter<code>http://{IP-deines-Servers}:4000</code> erreichbar. Beim ersten Aufruf gibst du die zuvor generierten Tokens ein. Nach 1-2 Minuten (ggf. Fahrzeug mit der App aufwecken) sollten erste Daten angezeigt werden.</p><h2 id="auswertung-mit-grafana">Auswertung mit Grafana<a href="#auswertung-mit-grafana" class="heading-anchor" aria-label="Diesen Abschnitt verlinken"><svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a></h2><p>Ein großer Vorteil der vordefinierten Docker-Compose-Datei: Grafana ist direkt mit dabei. Grafana läuft standardmäßig unter<code>http://{IP-deines-Servers}:3000</code>.</p><p>Standard-Login (sofort ändern!):</p><ul><li>Benutzername:<code>admin</code></li><li>Passwort:<code>admin</code></li></ul><p><a href="/docker-monitoring-mit-prometheus-und-grafana/">Grafana</a>
hat die PostgreSQL-Datenbank als Datenquelle bereits konfiguriert und alle Dashboards sind importiert. Bei Nutzung einer eigenen Grafana-Instanz musst du die JSON-Dateien aus dem<a href="https://www.github.com/cbirkenbeul" target="_blank" rel="noopener noreferrer">GitHub<svg class="link-external-icon" aria-hidden="true" focusable="false" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"/><polyline points="15 3 21 3 21 9"/><line x1="10" y1="14" x2="21" y2="3"/></svg><span class="visually-hidden"> (externer Link)</span></a>
Repository manuell importieren.</p><p><strong>Wichtige Dashboards:</strong></p><ul><li><strong>Overview:</strong> Gesamtübersicht aller Kennzahlen – der perfekte Einstieg</li><li><strong>Drives:</strong> Fahrtenauswertung mit interaktiven Karten, zeigt Route, Geschwindigkeit und Verbrauch</li><li><strong>Charges:</strong> Detaillierte Ladehistorie mit Kostenanalyse pro Ladevorgang, Vergleich verschiedener Ladestationen</li><li><strong>Battery Health:</strong> Langzeitentwicklung der Batteriekapazität, zeigt Degradation über Zeit und Kilometer</li><li><strong>Efficiency:</strong> Verbrauchsanalysen nach Geschwindigkeit, Temperatur, Höhenmetern – erkenne was deine Reichweite beeinflusst</li><li><strong>Vampire Drain:</strong> Standby-Verbrauch im geparkten Zustand, hilft Phantom Drain zu identifizieren</li><li><strong>Locations:</strong> Häufige Aufenthaltsorte, automatische Geofencing-Erkennung</li><li><strong>Updates:</strong> Historie aller Software-Updates mit Zeitstempeln</li></ul><h2 id="langzeitnutzung-und-erkenntnisse">Langzeitnutzung und Erkenntnisse<a href="#langzeitnutzung-und-erkenntnisse" class="heading-anchor" aria-label="Diesen Abschnitt verlinken"><svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a></h2><p>Der wahre Wert zeigt sich nach mehreren Monaten. Hier konkrete Beispiele aus meiner Nutzung:</p><p><strong>Batteriedegradation:</strong> Mein Model Y zeigte nach 50.000 km etwa 4% Kapazitätsverlust. Typisch sind 3-5% in den ersten 50.000 km, danach verlangsamt sich die Degradation deutlich. Mit Teslamate siehst du die exakte Entwicklung und kannst Ausreißer (z.B. durch BMS-Kalibrierung) erkennen.</p><p><strong>Saisonale Unterschiede:</strong> Im Winter (Temperaturen um 0°C) liegt mein Verbrauch bei ca. 20-22 kWh/100km, im Sommer bei 15-17 kWh/100km. Das sind rund 30% Mehrverbrauch durch Heizung und kalte Batterie. Diese Daten helfen bei der Routenplanung.</p><p><strong>Kostenoptimierung:</strong> Heimladen (0,30 €/kWh) vs. Supercharger (0,52 €/kWh) – der Unterschied summiert sich. Bei 15.000 km jährlich spare ich durch Heimladen etwa 400 € pro Jahr. Noch besser:<a href="/tesla-ueberschussladen-mit-home-assistant/">PV-Überschussladen</a>
reduziert die Kosten auf ca. 0,08 €/kWh.</p><p><strong>Effizienz:</strong> Überraschend war, dass mein optimaler Geschwindigkeitsbereich bei 90-110 km/h liegt, nicht wie erwartet bei 70 km/h. Unter 70 km/h steigt der relative Verbrauch durch Hilfsaggregate wieder leicht an.</p><h2 id="troubleshooting">Troubleshooting<a href="#troubleshooting" class="heading-anchor" aria-label="Diesen Abschnitt verlinken"><svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a></h2><p><strong>Teslamate zeigt &ldquo;offline&rdquo; statt &ldquo;asleep&rdquo;:</strong>
Das ist seit Tesla-Firmware 2024.8+ normal. Tesla hat die API-Rückmeldung geändert – kein Teslamate-Bug.</p><p><strong>Token wird nicht akzeptiert:</strong>
Verwende den Refresh Token (der längere der beiden Strings), nicht den Access Token.</p><p><strong>Keine Daten:</strong>
Prüfe die Docker-Logs mit<code>docker compose logs teslamate</code>. Häufige Ursachen: Fahrzeug im Tiefschlaf, falsche Zeitzone, Netzwerkprobleme.</p><p><strong>Hohe API-Kosten:</strong>
Reduziere die Polling-Frequenz, nutze Fleet Telemetry oder prüfe auf unnötige Wake-Befehle.</p><h2 id="sicherheit-und-backup">Sicherheit und Backup<a href="#sicherheit-und-backup" class="heading-anchor" aria-label="Diesen Abschnitt verlinken"><svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a></h2><p><strong>Netzwerk:</strong></p><ul><li>Nicht direkt ins Internet exponieren</li><li>Reverse Proxy mit HTTPS nutzen (Nginx, Caddy, Traefik)</li><li>Firewall-Regeln aktivieren</li></ul><p><strong>Backup:</strong></p><div class="code-block"><div class="code-block-header"><span class="code-lang-label">bash</span><button class="code-copy-btn" type="button" aria-label="Code kopieren" data-umami-event="Code Copy" data-umami-event-lang="bash"><svg class="icon-copy" xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"/><path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"/></svg><svg class="icon-check" xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><polyline points="20 6 9 17 4 12"/></svg></button></div><div class="highlight"><pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>docker compose exec database pg_dump -U teslamate teslamate &gt; backup.sql</span></span></code></pre></div></div><p><strong>Updates:</strong></p><div class="code-block"><div class="code-block-header"><span class="code-lang-label">bash</span><button class="code-copy-btn" type="button" aria-label="Code kopieren" data-umami-event="Code Copy" data-umami-event-lang="bash"><svg class="icon-copy" xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"/><path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"/></svg><svg class="icon-check" xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><polyline points="20 6 9 17 4 12"/></svg></button></div><div class="highlight"><pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>docker compose pull</span></span><span style="display:flex;"><span>docker compose up -d</span></span></code></pre></div></div><h2 id="häufige-fragen">Häufige Fragen<a href="#h%c3%a4ufige-fragen" class="heading-anchor" aria-label="Diesen Abschnitt verlinken"><svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a></h2><p><strong>Kostet Teslamate Geld?</strong>
Die Software ist kostenlos. Tesla API-Kosten fallen an, werden aber meist vom $10-Freikontingent abgedeckt. Nur bei intensiver Nutzung entstehen ca. $2-5/Monat zusätzlich.</p><p><strong>Funktioniert es mit der neuen Fleet API?</strong>
Ja, vollständig kompatibel und aktuell gehalten.</p><p><strong>Entlädt es die Batterie?</strong>
Nein, der Zusatzverbrauch ist vernachlässigbar.</p><p><strong>Mehrere Fahrzeuge möglich?</strong>
Ja, jedes wird separat erfasst.</p><h2 id="fazit">Fazit<a href="#fazit" class="heading-anchor" aria-label="Diesen Abschnitt verlinken"><svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a></h2><p>Teslamate ist für mich die beste Lösung für umfassende Fahrzeugdatenanalyse. Die Vorteile:</p><ul><li>Volle Datenkontrolle durch Self-Hosting</li><li>Detaillierte Analysen mit Grafana</li><li>Geringe Kosten dank Freikontingent</li><li>Aktive Community</li><li>Perfekt für Home-Assistant-Integration</li></ul><p>Die Nachteile: Technisches Know-how erforderlich, eigener Server nötig, kein offizieller Support.</p><p>Für Tesla-Besitzer mit Smart-Home- oder Homelab-Affinität ist Teslamate eine hervorragende Software. Nach einigen Monaten Nutzung werden die Auswertungen besonders interessant, da sich Tendenzen und Langzeitentwicklungen zeigen. Selbst während der Fahrt liefern die Grafana-Dashboards diverse interessante Daten.</p><h2 id="tipps-für-fortgeschrittene">Tipps für Fortgeschrittene<a href="#tipps-f%c3%bcr-fortgeschrittene" class="heading-anchor" aria-label="Diesen Abschnitt verlinken"><svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a></h2><p><strong>Reverse Proxy Setup:</strong>
Für sicheren Zugriff von unterwegs empfehle ich einen Reverse Proxy mit Let&rsquo;s Encrypt SSL-Zertifikat. Traefik oder Caddy automatisieren den Prozess komplett.</p><p><strong>Datenbank-Optimierung:</strong>
Bei sehr alten Installationen kann ein manuelles Vacuum der Datenbank helfen:</p><div class="code-block"><div class="code-block-header"><span class="code-lang-label">bash</span><button class="code-copy-btn" type="button" aria-label="Code kopieren" data-umami-event="Code Copy" data-umami-event-lang="bash"><svg class="icon-copy" xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"/><path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"/></svg><svg class="icon-check" xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><polyline points="20 6 9 17 4 12"/></svg></button></div><div class="highlight"><pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>docker compose exec database vacuumdb -U teslamate -d teslamate -z -v</span></span></code></pre></div></div><p><strong>Custom Dashboards:</strong>
Grafana bietet unendliche Möglichkeiten. Du kannst beispielsweise Vergleiche mit anderen Tesla-Fahrern erstellen oder Korrelationen zwischen Wetter und Verbrauch visualisieren.</p><p><strong>Weiterführende Links:</strong></p><ul><li><a href="https://docs.teslamate.org" target="_blank" rel="noopener noreferrer">Teslamate Dokumentation<svg class="link-external-icon" aria-hidden="true" focusable="false" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"/><polyline points="15 3 21 3 21 9"/><line x1="10" y1="14" x2="21" y2="3"/></svg><span class="visually-hidden"> (externer Link)</span></a></li><li><a href="https://github.com/teslamate-org/teslamate" target="_blank" rel="noopener noreferrer">GitHub Repository<svg class="link-external-icon" aria-hidden="true" focusable="false" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"/><polyline points="15 3 21 3 21 9"/><line x1="10" y1="14" x2="21" y2="3"/></svg><span class="visually-hidden"> (externer Link)</span></a></li><li><a href="https://github.com/teslamate-org/teslamate/discussions" target="_blank" rel="noopener noreferrer">Community Forum<svg class="link-external-icon" aria-hidden="true" focusable="false" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"/><polyline points="15 3 21 3 21 9"/><line x1="10" y1="14" x2="21" y2="3"/></svg><span class="visually-hidden"> (externer Link)</span></a></li></ul>
]]></content:encoded><category>tesla</category><category>docker</category><category>grafana</category><category>homelab</category></item><item><title>Proxmox: Stromverbrauch senken mit 4 praxisbewährten Tipps</title><link>https://www.teqqy.de/proxmox-strom-sparen-4-tipps-von-mir/</link><pubDate>Tue, 14 Mar 2023 21:17:37 +0100</pubDate><lastBuildDate>Tue, 14 Mar 2023 21:17:37 +0100</lastBuildDate><guid isPermaLink="true">https://www.teqqy.de/proxmox-strom-sparen-4-tipps-von-mir/</guid><description>In Zeiten steigender Energiekosten und wachsender Umweltbewusstheit suchen viele von uns nach Wegen, um den Stromverbrauch in der IT-Infrastruktur zu senken. Gerade in Heimnetzwerken und bei kleinen Servern, die rund um die Uhr laufen, kann der Energiebedarf schnell zu einer nicht unerheblichen Kostenquelle werden. Wenn du, wie ich, Proxmox nutzt, ein Open-Source-Tool zur Virtualisierung, gibt es glücklicherweise einige effektive Möglichkeiten, den Stromverbrauch deines Setups zu optimieren, ohne dabei auf Leistung zu verzichten.</description><content:encoded>&lt;![CDATA[<p>In Zeiten steigender Energiekosten und wachsender Umweltbewusstheit suchen viele von uns nach Wegen, um den Stromverbrauch in der IT-Infrastruktur zu senken. Gerade in Heimnetzwerken und bei kleinen Servern, die rund um die Uhr laufen, kann der Energiebedarf schnell zu einer nicht unerheblichen Kostenquelle werden. Wenn du, wie ich, Proxmox nutzt, ein Open-Source-Tool zur Virtualisierung, gibt es glücklicherweise einige effektive Möglichkeiten, den Stromverbrauch deines Setups zu optimieren, ohne dabei auf Leistung zu verzichten.</p><p>In diesem Blogbeitrag teile ich vier erprobte Tipps, mit denen du deine Proxmox-Installation energieeffizienter gestalten kannst. Dabei geht es nicht nur um Hardware-Anpassungen, sondern auch um clevere Software-Optimierungen, die deine VMs und Container energieeffizienter machen. Egal, ob du ein erfahrener Proxmox-Nutzer bist oder gerade erst mit der Plattform beginnst, diese Tipps helfen dir, deine Stromrechnung zu senken und gleichzeitig einen kleinen Beitrag zum Umweltschutz zu leisten. Lass uns direkt loslegen und schauen, wie du aus deinem Proxmox-Server mehr Effizienz herausholen kannst!</p><h2 id="vorab-stromverbrauch-messen">Vorab: Stromverbrauch messen<a href="#vorab-stromverbrauch-messen" class="heading-anchor" aria-label="Diesen Abschnitt verlinken"><svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a></h2><p>Um überhaupt zu wissen wieviel Strom die Geräte verwenden sollte man diesen auch messen. Es kommt hierbei nicht auf gute Genauigkeit an, sondern um einfach mal ein Gefühl zu bekommen wieviel Strom die einzelnen Geräte so verbrauchen. Hierzu kann man sich ein<a href="https://amzn.to/3mQVYy9" target="_blank" rel="noopener noreferrer">günstiges Strommessgerät<svg class="link-external-icon" aria-hidden="true" focusable="false" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"/><polyline points="15 3 21 3 21 9"/><line x1="10" y1="14" x2="21" y2="3"/></svg><span class="visually-hidden"> (externer Link)</span></a>
anschaffen. Beachte bitte, das bei günstigen Geräten die Genauigkeit natürlich nicht unbedingt vorhanden ist. Wer ein Smart Home sein eigen nennt, kann direkt eine Steckdose mit Strommessfunktion vor das Homelab anschließen. So hast du mittels Software immer den aktuellen Stromverbrauch.</p><h2 id="auf-die-richtige-hardware-achten">Auf die richtige Hardware achten<a href="#auf-die-richtige-hardware-achten" class="heading-anchor" aria-label="Diesen Abschnitt verlinken"><svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a></h2><p>Natürlich steht und fällt schlussendlich alles mit der richtigen Hardware. Alte Enterprise Hardware verbraucht natürlich viel Strom. Entsprechen sind so genannte ThinClients eine sehr gute Lösung einen energieeffizienten Server zu bauen. Ich habe diese mal in einem Video vorgestellt.</p><p>Zudem kann man auch mit den richtigen Komponenten im Selbstbau einen guten Server zusammen stellen. Im<a href="https://www.hardwareluxx.de/community/threads/die-sparsamsten-systeme-30w-idle.1007101/page-86#post-29774572" target="_blank" rel="noopener noreferrer">Hardwareluxx Forum<svg class="link-external-icon" aria-hidden="true" focusable="false" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"/><polyline points="15 3 21 3 21 9"/><line x1="10" y1="14" x2="21" y2="3"/></svg><span class="visually-hidden"> (externer Link)</span></a>
gibt es eine verlinkte Google Sheets Datei die Systeme unter 30 Watt idle Verbrauch auflistet.</p><p>Wichtig ist auch, dass bei einem selbst zusammen gestelltem PC bzw. Server es auf alle Komponenten ankommt. Es fängt bei einem effizienten Netzteil an, geht über ein gutes Mainboard bishin zur richtigen Auswahl der CPU. Gerade bei letzterem ist es so, dass Intel noch ein wenig die Nase vorne hat was einen günstigeren Stromverbrauch im idle Status angeht. Wichtig ist auch, dass Intel-CPUs mit einem &ldquo;T&rdquo; in der Bezeichnung nur eine geringere TDP haben. Der TDP nat erst mal nichts mit dem Stromverbrauch zu tun sondern ist die maximale Wärmeabgabe. Eine T-CPU ist also für Systeme geeignet die vollständig passiv laufen sollen. Koponenten die eher für einen hohen Stromverbrauch sprechen wären</p><ul><li>Grafikkarten</li><li>RAID Controller / HBAs</li><li>Netzwerkkarten mit mehr als 10 GBit Geschwindigkeit</li></ul><p>Weiter unten den dem Beitrag gehe ich auf den ASPM Status ein. ASPM (Active State Power Management) bedeutet dass eine Komponente bestimmte Stromsparfunktionen erreichen kann oder nicht. Ganz grob lässt sich hier sagen, dass Enterprise-Hardware meistens nicht mit diesen Funktionen ausgestattet sind.</p><h2 id="bios-einstellungen-richtig-setzen">BIOS Einstellungen richtig setzen<a href="#bios-einstellungen-richtig-setzen" class="heading-anchor" aria-label="Diesen Abschnitt verlinken"><svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a></h2><h3 id="unnötige-hardware-deaktivieren">Unnötige Hardware deaktivieren<a href="#unn%c3%b6tige-hardware-deaktivieren" class="heading-anchor" aria-label="Diesen Abschnitt verlinken"><svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a></h3><p>Die meisten BIOS können verschiedene Geräte abschalten. Bei einem Virtualisierungshost wird zum Beispiel Audio häufig nicht gebraucht. Es wäre also dann ratsam die Soundkarte im BIOS zu deaktivieren. Ähnliches gilt für COM oder serielle Ports. Solltest du keine Grafikkarte oder andere Steckkarte die einen hohen PCI-Express Standard benötigt eingebaut haben, könntest du auch die PCIe Steckplätze z. B. von Version 4 auf 3 reduzieren. Auch dies spart gern mal das eine oder andere Watt.</p><h3 id="aspm-aktivieren">ASPM aktivieren<a href="#aspm-aktivieren" class="heading-anchor" aria-label="Diesen Abschnitt verlinken"><svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a></h3><p>ASPM steht für Active State Power Management und ist eine Technologie, die in Computern verwendet wird, um die Energieeffizienz von PCIe-Verbindungen zu verbessern. PCIe ist ein Hochgeschwindigkeits-Interface, das in Computern genutzt wird, um verschiedene Hardwarekomponenten wie Grafikkarten, Netzwerkkarten oder SSDs anzuschließen. ASPM zielt darauf ab, den Stromverbrauch von PCIe-Geräten zu reduzieren, indem es den Energieverbrauch in den Verbindungsleitungen zwischen der CPU (oder dem Chipsatz) und den angeschlossenen PCIe-Geräten dynamisch anpasst. Dies geschieht durch das automatische Umschalten zwischen verschiedenen Leistungszuständen, abhängig von der Auslastung und den aktuellen Anforderungen.</p><h3 id="cpu-stromsparfunktionen-aktivieren">CPU Stromsparfunktionen aktivieren<a href="#cpu-stromsparfunktionen-aktivieren" class="heading-anchor" aria-label="Diesen Abschnitt verlinken"><svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a></h3><p>Aktiviere im BIOS immer die C-States. Je nach Hersteller und Version solltest du bis zu C10 aktivieren können. Sei aber beruhigt wenn dein BIOS nur bis z. B. C6 konfigurierbar ist, viel Potential lässt du damit nicht liegen.</p><h2 id="c-states">C-States<a href="#c-states" class="heading-anchor" aria-label="Diesen Abschnitt verlinken"><svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a></h2><h3 id="was-sind-c-states">Was sind C-States<a href="#was-sind-c-states" class="heading-anchor" aria-label="Diesen Abschnitt verlinken"><svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a></h3><p>C-States, oder CPU-Schlafzustände, sind Zustände, in die eine CPU (Central Processing Unit, oder Zentraleinheit) eintreten kann, wenn sie nicht aktiv genutzt wird. Sie sind ein Teil der Leistungssteuerungsfunktionen moderner CPUs und dienen dazu, den Stromverbrauch zu reduzieren, wenn die volle Leistung der CPU nicht benötigt wird.</p><p>Es gibt verschiedene C-States, von C0 bis Cn (wobei n je nach Prozessor variiert). Hier sind einige der häufigsten:</p><ul><li>C0: Dies ist der Zustand, in dem die CPU aktiv ist und Aufgaben ausführt.</li><li>C1: Dies ist ein leichter Schlafzustand, in dem die CPU schnell in den aktiven Zustand zurückkehren kann. In diesem Zustand ist die CPU nicht aktiv, aber sie kann schnell wieder in den Betrieb versetzt werden.</li><li>C3: Dies ist ein tieferer Schlafzustand, in dem die CPU mehr Zeit benötigt, um in den aktiven Zustand zurückzukehren. In diesem Zustand werden mehr Teile der CPU abgeschaltet, was zu größerer Energieeinsparung führt.</li><li>C6: Dies ist ein noch tieferer Schlafzustand, in dem die CPU fast vollständig abgeschaltet wird. Die CPU benötigt die längste Zeit, um aus diesem Zustand wieder in den aktiven Zustand zurückzukehren, aber es wird auch die meiste Energie gespart.</li></ul><p>Der Wechsel zwischen diesen Zuständen wird automatisch vom Betriebssystem und der Hardware gesteuert, basierend auf der aktuellen CPU-Last und den Energieeinstellungen des Systems.</p><p>Anstreben sollte man immer den C10 Status. Bei einem Proxmox Server wirst du das aber wahrscheinlich nicht schaffen. Das System ist ja meistens dafür ausgelegt die ganze Zeit zu arbeiten. Vor allem wenn man viele virtuelle Maschinen oder LXC laufen lässt.</p><h3 id="mit-powertop-die-c-states-überprüfen">Mit powertop die C-States überprüfen<a href="#mit-powertop-die-c-states-%c3%bcberpr%c3%bcfen" class="heading-anchor" aria-label="Diesen Abschnitt verlinken"><svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a></h3><p>„powertop“ ist ein großartiges<a href="/linux-am-desktop-ein-kurzes-experiment/">Linux</a>
Kommando mit dem du die C-States deines Servers überprüfen kannst. Gehen diese wie in diesem Beispiel nur bis zu C3, wird weiterhin viel Energie „unnötig“ verbraucht.</p><p><img src="/proxmox-strom-sparen-4-tipps-von-mir/images/powertop-c3-states_hu_9dc579a198882aa8.webp" srcset="/proxmox-strom-sparen-4-tipps-von-mir/images/powertop-c3-states_hu_5df20e871831abb8.webp 384w, /proxmox-strom-sparen-4-tipps-von-mir/images/powertop-c3-states_hu_9dc579a198882aa8.webp 768w" sizes="(max-width: 768px) 100vw, 768px" alt="" loading="lazy" fetchpriority="auto" decoding="async" width="768" height="528"/><p>Häufig sind es PCI-Express Gerät die weitere C-States nicht erlauben. Mit dem Befehl</p><div class="code-block"><div class="code-block-header"><span class="code-lang-label"/><button class="code-copy-btn" type="button" aria-label="Code kopieren" data-umami-event="Code Copy" data-umami-event-lang=""><svg class="icon-copy" xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"/><path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"/></svg><svg class="icon-check" xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><polyline points="20 6 9 17 4 12"/></svg></button></div><pre tabindex="0"><code>lspci -vv | awk '/ASPM/{print $0}' RS= | grep --color -P '(^[a-z0-9:.]+|ASPM )'</code></pre></div><p>kannst du überprüfen ob für ein PCIe Gerät ein Active-State Power Management (ASPM) verfügbar ist. Sollte hier ein disabled dabei stehen, ist entweder die Funktion im BIOS deaktiviert oder das Gerät unterstützt diesen Modus nicht. Gerade ältere Geräte oder Enterprise Hardware wie 10G-Karten können hier ein Problem darstellen.</p><p><img src="/proxmox-strom-sparen-4-tipps-von-mir/images/aspm-status_hu_d270fd4f4d6a2d88.webp" srcset="/proxmox-strom-sparen-4-tipps-von-mir/images/aspm-status_hu_ed468d62ca537b49.webp 384w, /proxmox-strom-sparen-4-tipps-von-mir/images/aspm-status_hu_d270fd4f4d6a2d88.webp 768w" sizes="(max-width: 768px) 100vw, 768px" alt="" loading="lazy" fetchpriority="auto" decoding="async" width="768" height="250"/><h2 id="cpu-runter-takten-lassen-um-proxmox-strom-sparen-zu-lassen">CPU runter Takten lassen um Proxmox Strom sparen zu lassen<a href="#cpu-runter-takten-lassen-um-proxmox-strom-sparen-zu-lassen" class="heading-anchor" aria-label="Diesen Abschnitt verlinken"><svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a></h2><p><a href="/proxmox-cluster-im-homelab-mit-thinclients/">Proxmox</a>
hat per default sämtliche Stromsparfunktionen deaktiviert. Diese zu aktivieren ist offiziell nicht supportet, aber natürlich funktionieren diese Systeme weiterhin. Bitte beachte, dass diese Funktion auch dazu führen kann, dass das System träger reagiert, weil Komponenten erst aufgeweckt werden müssen.</p><p>Um zu überprüfen auf welchen Modus die CPU steht, kannst du folgenden Befehl nutzen:</p><div class="code-block"><div class="code-block-header"><span class="code-lang-label"/><button class="code-copy-btn" type="button" aria-label="Code kopieren" data-umami-event="Code Copy" data-umami-event-lang=""><svg class="icon-copy" xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"/><path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"/></svg><svg class="icon-check" xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><polyline points="20 6 9 17 4 12"/></svg></button></div><pre tabindex="0"><code>cat /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor</code></pre></div><p>Hier bekommst du für jeden CPU-Kern eine Zeile zurück geliefert. Im Standard steht hier überall „performance“. Wenn du jetzt</p><div class="code-block"><div class="code-block-header"><span class="code-lang-label"/><button class="code-copy-btn" type="button" aria-label="Code kopieren" data-umami-event="Code Copy" data-umami-event-lang=""><svg class="icon-copy" xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"/><path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"/></svg><svg class="icon-check" xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><polyline points="20 6 9 17 4 12"/></svg></button></div><pre tabindex="0"><code>cat /sys/devices/system/cpu/cpu*/cpufreq/scaling_cur_freq</code></pre></div><p>verwendet, siehst du auf welcher Frequenz deine CPU Kerne derzeit arbeiten. Um diese runter takten zu lassen sollte der „scaling_govenor“ auf „powersafe“ gestellt werden. Das kannst du einmalig mit</p><div class="code-block"><div class="code-block-header"><span class="code-lang-label"/><button class="code-copy-btn" type="button" aria-label="Code kopieren" data-umami-event="Code Copy" data-umami-event-lang=""><svg class="icon-copy" xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"/><path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"/></svg><svg class="icon-check" xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><polyline points="20 6 9 17 4 12"/></svg></button></div><pre tabindex="0"><code>echo "powersave" | tee /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor</code></pre></div><p>durchführen. Allerdings wird berichtet, dass bei Neustart oder Updates das wieder zurück gesetzt wird. Entsprechend habe ich mir den Befehl in die crontab eingetragen, dass dieser Befehl bei jedem reboot durchgeführt wird.</p><p>Dazu gehst du mit</p><div class="code-block"><div class="code-block-header"><span class="code-lang-label"/><button class="code-copy-btn" type="button" aria-label="Code kopieren" data-umami-event="Code Copy" data-umami-event-lang=""><svg class="icon-copy" xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"/><path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"/></svg><svg class="icon-check" xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><polyline points="20 6 9 17 4 12"/></svg></button></div><pre tabindex="0"><code>crontab -e</code></pre></div><p>in die Crontab Datei. Ggf. wirst du gefragt mit welchem Editor du diese öffnen möchtest. Ich empfehle dir hier „nano“.</p><p>Anschließend trägst du ganz unten folgendes ein</p><div class="code-block"><div class="code-block-header"><span class="code-lang-label"/><button class="code-copy-btn" type="button" aria-label="Code kopieren" data-umami-event="Code Copy" data-umami-event-lang=""><svg class="icon-copy" xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"/><path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"/></svg><svg class="icon-check" xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><polyline points="20 6 9 17 4 12"/></svg></button></div><pre tabindex="0"><code>@reboot echo "powersave" | tee /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor</code></pre></div><p>Die Datei kannst du dann mit STRG+X beenden. Bei Nachfrage ob du speichern möchtest, solltest du das natürlich bestätigen.</p><p>Anschließend kannst du mit den oben genannten Befehlen deine Eingaben überprüfen. Bei mir sieht das zur Zeit so aus:</p><p><img src="/proxmox-strom-sparen-4-tipps-von-mir/images/proxmox-strom-sparen-cpu-govenor_hu_98c2e3cdadd3965e.webp" srcset="/proxmox-strom-sparen-4-tipps-von-mir/images/proxmox-strom-sparen-cpu-govenor_hu_a8821be6864e7158.webp 384w, /proxmox-strom-sparen-4-tipps-von-mir/images/proxmox-strom-sparen-cpu-govenor_hu_98c2e3cdadd3965e.webp 768w" sizes="(max-width: 768px) 100vw, 768px" alt="" loading="lazy" fetchpriority="auto" decoding="async" width="768" height="574">
Meine derzeitigen Einstellungen des CPU govenor und scaling
{:.figcaption}</p><h2 id="zusatztipp">Zusatztipp<a href="#zusatztipp" class="heading-anchor" aria-label="Diesen Abschnitt verlinken"><svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a></h2><p>Versuche immer BIOS und alle Treiber auf den aktuellen Stand zu bringen. Auch neue Kernel-Versionen bringen häufig Verbesserungen im Bereich des Stromverbrauches. Es ist also auch hierfür ratsam seine Systeme in einem anständigem Zeitrahmen zu patchen.</p><h2 id="fazit">Fazit<a href="#fazit" class="heading-anchor" aria-label="Diesen Abschnitt verlinken"><svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a></h2><p>Ich habe diese Dinge selbst beachtet und konnte mit meinem Proxmox Strom sparen. Bei mir konnte ich den Verbrauch meine Servers von 36 Watt auf 24 Watt verringern. Das hört sich zwar erst einmal nicht viel an, sind aber bei uns derzeit auch knapp 52,56 Euro im Jahr. Kleinvieh macht schließlich auch Mist.</p><p>Die geeignet Hardware zu finden ist nicht immer einfach. Du kannst dich oben an der Liste aus dem Hardwareluxx-Forum orientieren. Andernfalls sind die Mitglieder im Unraid Forum (vor allem in deutschen Bereich) auch immer sehr daran interessiert ein paar Watt zu sparen. Hier kannst du auf die Suche nach guten Kombinationen für Hardware ausschau halten. Auch wenn Unraid nicht die typische Software für Virtualisierung ist.</p>
]]></content:encoded><category>proxmox</category><category>hardware</category><category>homelab</category></item><item><title>Proxmox Cluster im Homelab mit Thinclients</title><link>https://www.teqqy.de/proxmox-cluster-im-homelab-mit-thinclients/</link><pubDate>Fri, 30 Dec 2022 14:41:14 +0100</pubDate><lastBuildDate>Fri, 30 Dec 2022 14:41:14 +0100</lastBuildDate><guid isPermaLink="true">https://www.teqqy.de/proxmox-cluster-im-homelab-mit-thinclients/</guid><description>Wer meinen Blog verfolgt weiß, dass ich seit einiger Zeit einen Kubernetes Cluster verwendet habe. Dieser hat meine ganzen Anwendungen die man so im Homelab braucht gehostet. Nun bin ich auf ein Proxmox (externer Link) Cluster im Homelab mit Thinclients als Hardware umgestiegen.</description><content:encoded>&lt;![CDATA[<p>Wer meinen Blog verfolgt weiß, dass ich seit einiger Zeit einen<a href="/status-meines-k3s-homelab-stand-10-2021/">Kubernetes Cluster</a>
verwendet habe. Dieser hat meine ganzen Anwendungen die man so im Homelab braucht gehostet. Nun bin ich auf ein<a href="https://proxmox.com" target="_blank" rel="noopener noreferrer">Proxmox<svg class="link-external-icon" aria-hidden="true" focusable="false" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"/><polyline points="15 3 21 3 21 9"/><line x1="10" y1="14" x2="21" y2="3"/></svg><span class="visually-hidden"> (externer Link)</span></a>
Cluster im Homelab mit Thinclients als Hardware umgestiegen.</p><p>Zum Thema Thinclients und warum diese gerade in jetzigen Zeiten eine gute Alternative für Homelabs sind, habe ich bereits mal ein Video gedreht das vielleicht ganz spannend für dich sein kann.</p><div class="video-embed" data-src="https://www.youtube-nocookie.com/embed/AqLqKMTtbWA?autoplay=1&rel=0"><button class="video-embed-trigger" type="button" data-umami-event="Video Load" data-umami-event-provider="YouTube" data-umami-event-id="AqLqKMTtbWA"><svg class="video-embed-play-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true" width="48" height="48"><circle cx="12" cy="12" r="12" fill="rgba(0,0,0,0.6)"/><path d="M9.5 7.5l7 4.5-7 4.5V7.5z" fill="white"/></svg><span class="video-embed-title">YouTube Video</span><span class="video-embed-note">YouTube &middot; Klicken zum Laden</span></button></div><h2 id="grundsätzlicher-aufbau-des-proxmox-clusters-im-homelab">Grundsätzlicher Aufbau des Proxmox Clusters im Homelab<a href="#grunds%c3%a4tzlicher-aufbau-des-proxmox-clusters-im-homelab" class="heading-anchor" aria-label="Diesen Abschnitt verlinken"><svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a></h2><p>Mittlerweile nutze ich einen<a href="/proxmox-backup-server/">Proxmox</a>
Cluster über drei physische Nodes. Die Hardware ist zwar leicht unterschiedlich, aber als Gesamtcluster stehen mir damit genug Ressourcen zur Verfügung.</p><p><img src="/proxmox-cluster-im-homelab-mit-thinclients/images/proxmox-cluster-im-homelab-overview_hu_f0c618df5ff6a05a.webp" srcset="/proxmox-cluster-im-homelab-mit-thinclients/images/proxmox-cluster-im-homelab-overview_hu_85b28b3adfa7a04f.webp 384w, /proxmox-cluster-im-homelab-mit-thinclients/images/proxmox-cluster-im-homelab-overview_hu_f0c618df5ff6a05a.webp 768w" sizes="(max-width: 768px) 100vw, 768px" alt="Proxmox Cluster im Homelab mit Thinclients - Cluster Summary" loading="eager" fetchpriority="high" decoding="async" width="768" height="367">
Das Widget für Storage täuscht leider bei Proxmox immer gewaltig. Daruch, dass NFS-Freigaben eingebunden sind, werden diese mitgezählt.</p><p>Als Storage wird für die virtuellen Systeme ein Ceph-Cluster auf den gleichen Systemen ausgeführt. Für ISOs, Templates und Backups wird ein NFS-Storage von meinem<a href="/mein-homelab-dashboard-2022/">UnRaid</a>
Server aus bereit gestellt.</p><p><img src="/proxmox-cluster-im-homelab-mit-thinclients/images/proxmox-cluster-im-homelab-ceph_hu_b2ff2b06b6c8943c.webp" srcset="/proxmox-cluster-im-homelab-mit-thinclients/images/proxmox-cluster-im-homelab-ceph_hu_6b551e6ca17f0784.webp 384w, /proxmox-cluster-im-homelab-mit-thinclients/images/proxmox-cluster-im-homelab-ceph_hu_b2ff2b06b6c8943c.webp 768w" sizes="(max-width: 768px) 100vw, 768px" alt="Proxmox Cluster im Homelab mit Thinclients - Ceph" loading="lazy" fetchpriority="auto" decoding="async" width="768" height="364">
Ein weiteres System dient als<a href="/proxmox-backup-server/">Proxmox Backup Server</a>
und soll sich hier nur um entsprechend dieses kümmern.</p><h2 id="welche-hardware-verwende-ich">Welche Hardware verwende ich?<a href="#welche-hardware-verwende-ich" class="heading-anchor" aria-label="Diesen Abschnitt verlinken"><svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a></h2><p>Fassen wir erst mal die Hardware des neuen Cluster zusammen, damit du schon mal eine Vorstellung des ganzen hast:</p><ul><li>2 x Lenovo M900 mit Core i3-6100t, 24 GB RAM</li><li>2 x Lenovo M910 mit Core i5-6500t, 24 GB RAM</li></ul><p>Alle vier Systeme sind mit einer 120 GB SATA SSD ausgestattet. Ein i3 sowie beide i5 Systeme haben zusätzlich eine<a href="https://amzn.to/3i35I6o" target="_blank" rel="noopener noreferrer">500 GB NVMe SSD<svg class="link-external-icon" aria-hidden="true" focusable="false" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"/><polyline points="15 3 21 3 21 9"/><line x1="10" y1="14" x2="21" y2="3"/></svg><span class="visually-hidden"> (externer Link)</span></a>
eingebaut.</p><h2 id="die-verwendeten-netzwerkkomponenten">Die verwendeten Netzwerkkomponenten<a href="#die-verwendeten-netzwerkkomponenten" class="heading-anchor" aria-label="Diesen Abschnitt verlinken"><svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a></h2><h3 id="netzwerkkarten">Netzwerkkarten<a href="#netzwerkkarten" class="heading-anchor" aria-label="Diesen Abschnitt verlinken"><svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a></h3><p>Ich verwende die eingebaute Netzwerkschnittstelle für das normale Management und VM-Netzwerk. Hierauf liegt, wie bei Proxmox üblich, eine Linux Bridge.</p><p>Zusätzlich habe ich mir insgesamt sechs<a href="https://amzn.to/3WYekdr" target="_blank" rel="noopener noreferrer">USB-Netzwerkkarten<svg class="link-external-icon" aria-hidden="true" focusable="false" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"/><polyline points="15 3 21 3 21 9"/><line x1="10" y1="14" x2="21" y2="3"/></svg><span class="visually-hidden"> (externer Link)</span></a>
gekauft die mir in meiner<a href="https://s.teqqy.de/discord" target="_blank" rel="noopener noreferrer">Discord Community<svg class="link-external-icon" aria-hidden="true" focusable="false" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"/><polyline points="15 3 21 3 21 9"/><line x1="10" y1="14" x2="21" y2="3"/></svg><span class="visually-hidden"> (externer Link)</span></a>
empfohlen wurden. Jeweils zwei USB-Karten pro System, eine für das Cluster-Netzwerk und eine für Ceph.</p><p><img src="/proxmox-cluster-im-homelab-mit-thinclients/images/proxmox-cluster-im-homelab-usb-nics_hu_67088350f631ee83.webp" srcset="/proxmox-cluster-im-homelab-mit-thinclients/images/proxmox-cluster-im-homelab-usb-nics_hu_9cb8d109e81f832f.webp 384w, /proxmox-cluster-im-homelab-mit-thinclients/images/proxmox-cluster-im-homelab-usb-nics_hu_67088350f631ee83.webp 768w" sizes="(max-width: 768px) 100vw, 768px" alt="Proxmox USB NICs" loading="lazy" fetchpriority="auto" decoding="async" width="768" height="576"/><h3 id="switch-und-vlans">Switch und VLANs<a href="#switch-und-vlans" class="heading-anchor" aria-label="Diesen Abschnitt verlinken"><svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a></h3><p>Alle drei Netzwerkports hängen an einem<a href="https://www.amazon.de/shop/teqqyde/list/3M2TIB7XEB7CS?ref_=aip_sf_list_spv_ons_mixed_d" target="_blank" rel="noopener noreferrer">UniFi<svg class="link-external-icon" aria-hidden="true" focusable="false" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"/><polyline points="15 3 21 3 21 9"/><line x1="10" y1="14" x2="21" y2="3"/></svg><span class="visually-hidden"> (externer Link)</span></a>
USW-24-G2 Switch. Das Ceph Netzwerk sowie das Cluster Netzwerk haben ihre eigene VLAN erhalten. Dies wurde so gemacht um den Datenverkehr sauber zu trennen. Grundsätzlich kann zwar alles über eine NIC transferiert werden, allerdings ist dann doch ein deutlicher Performanceunterschied zu spüren. Ceph empfiehlt sowieso schon mindestens 10 GBit Netzwerke, besser gar 40 GBit. Für ein Homelab meiner Größe natürlich viel zu überdimensioniert.</p><p><img src="/proxmox-cluster-im-homelab-mit-thinclients/images/proxmox-cluster-im-homelab-switchports_hu_7d44f11fa1f57fac.webp" srcset="/proxmox-cluster-im-homelab-mit-thinclients/images/proxmox-cluster-im-homelab-switchports_hu_60547606351e821f.webp 384w, /proxmox-cluster-im-homelab-mit-thinclients/images/proxmox-cluster-im-homelab-switchports_hu_7d44f11fa1f57fac.webp 768w" sizes="(max-width: 768px) 100vw, 768px" alt="Switchports des Unifi USW-24-G2" loading="lazy" fetchpriority="auto" decoding="async" width="768" height="449"/><h2 id="backup-mittels-proxmox-backup-server">Backup mittels Proxmox Backup Server<a href="#backup-mittels-proxmox-backup-server" class="heading-anchor" aria-label="Diesen Abschnitt verlinken"><svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a></h2><p>Wie oben bereits erwähnt verwende ich den<a href="https://www.proxmox.com/de/proxmox-backup-server" target="_blank" rel="noopener noreferrer">Proxmox Backup Server<svg class="link-external-icon" aria-hidden="true" focusable="false" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"/><polyline points="15 3 21 3 21 9"/><line x1="10" y1="14" x2="21" y2="3"/></svg><span class="visually-hidden"> (externer Link)</span></a>
als Sicherungsanwendung. Dieser soll, so vom Hersteller empfohlen über lokale Festplatten verfügen. Da mein verwendeter Thinclient aber nicht ausreichend Speicherplatz hat, habe ich mein UnRaid Server angebunden. NFS Shares sind nicht direkt als Storage anlegbar, sondern müssen via mount am System selbst hinzugefügt werden. Anschließend lässt sich das Verzeichnis als Sicherungsziel definieren.</p><p><img src="/proxmox-cluster-im-homelab-mit-thinclients/images/proxmox-cluster-im-homelab-backup_hu_c3e77b59c8d53447.webp" srcset="/proxmox-cluster-im-homelab-mit-thinclients/images/proxmox-cluster-im-homelab-backup_hu_8f3a1ab24fb0d30d.webp 384w, /proxmox-cluster-im-homelab-mit-thinclients/images/proxmox-cluster-im-homelab-backup_hu_c3e77b59c8d53447.webp 768w" sizes="(max-width: 768px) 100vw, 768px" alt="Proxmox Backup Server Dashboard" loading="lazy" fetchpriority="auto" decoding="async" width="768" height="404">
Als retention policy verwende ich im privaten Bereich eigentlich fast immer</p><ul><li>7 tägliche Sicherungen</li><li>4 wöchentliche Sicherungen</li><li>12 monatliche Sicherungen</li></ul><p>Auf Sicherungen stündlich oder jährlich verzichte ich meist. Lediglich bei ZFS-Snapshots habe ich in der Vergangenheit auf stündliche „Sicherungen“ gesetzt.</p><h2 id="fazit">Fazit<a href="#fazit" class="heading-anchor" aria-label="Diesen Abschnitt verlinken"><svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a></h2><p>Der Cluster läuft noch nicht so lange. Allerdings habe ich auf ein paar Screenshots auf<a href="https://teqqy.social/@me" target="_blank" rel="noopener noreferrer">Mastodon<svg class="link-external-icon" aria-hidden="true" focusable="false" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"/><polyline points="15 3 21 3 21 9"/><line x1="10" y1="14" x2="21" y2="3"/></svg><span class="visually-hidden"> (externer Link)</span></a>
Feedback erhalten, dass man doch gerne mehr wissen möchte. Entsprechend habe ich den aktuellen Status einmal hier zusammen gefasst. Den späteren Endausbau mit den virtuellen Maschinen werde ich sicherlich noch mal präsentieren.</p>
]]></content:encoded><category>proxmox</category><category>homelab</category><category>unifi</category><category>backup</category></item><item><title>Aqara E1 - Smartes Heizkörperthermostat mit ZigBee</title><link>https://www.teqqy.de/aqara-e1-smartes-heizkoerperthermostat-mit-zigbee/</link><pubDate>Thu, 24 Nov 2022 11:41:50 +0100</pubDate><lastBuildDate>Thu, 24 Nov 2022 11:41:50 +0100</lastBuildDate><guid isPermaLink="true">https://www.teqqy.de/aqara-e1-smartes-heizkoerperthermostat-mit-zigbee/</guid><description>Vor einiger Zeit sind die neuen Heizkörperthermostate von Aqara auf den Markt gekommen: Die Aqara E1 (externer Link) . Diese verwenden das ZigBee Protokoll und können so mit vielen verschiedenen Smart-Home Gateways verbunden werden, nicht nur mit dem Aqara eigenen.</description><content:encoded>&lt;![CDATA[<p>Vor einiger Zeit sind die neuen Heizkörperthermostate von Aqara auf den Markt gekommen: Die<a href="https://amzn.to/3AGZSgS" target="_blank" rel="noopener noreferrer">Aqara E1<svg class="link-external-icon" aria-hidden="true" focusable="false" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"/><polyline points="15 3 21 3 21 9"/><line x1="10" y1="14" x2="21" y2="3"/></svg><span class="visually-hidden"> (externer Link)</span></a>
. Diese verwenden das ZigBee Protokoll und können so mit vielen verschiedenen Smart-Home Gateways verbunden werden, nicht nur mit dem Aqara eigenen.</p><p><img src="/aqara-e1-smartes-heizkoerperthermostat-mit-zigbee/images/aqara-e1-verpackung_hu_8ebad66f95e82c8f.webp" srcset="/aqara-e1-smartes-heizkoerperthermostat-mit-zigbee/images/aqara-e1-verpackung_hu_8ebad66f95e82c8f.webp 384w" sizes="(max-width: 768px) 100vw, 768px" alt="Aqara E1 Verpackung" loading="eager" fetchpriority="high" decoding="async" width="384" height="512">
Ich bin schon seit Jahren auf der Suche nach einigermaßen bezahlbaren und guten Thermostaten. Meine Lieblinge bisher waren die Eurotronics Z-Wave, leider gibt es diese nur noch in der neuen Version welche häufiger zu Problemen führen. Meine alten hingegen funktionieren nach jetzt 5 Jahren immer noch sehr gut. Batteriewechsel ist hier so alle 1,5 – 2 Jahre notwendig.</p><p>Als die<a href="https://amzn.to/3AGZSgS" target="_blank" rel="noopener noreferrer">Aqara E1<svg class="link-external-icon" aria-hidden="true" focusable="false" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"/><polyline points="15 3 21 3 21 9"/><line x1="10" y1="14" x2="21" y2="3"/></svg><span class="visually-hidden"> (externer Link)</span></a>
jetzt bei Amazon im Angebot waren, musste ich mir mal zwei Stück bestellen um diese auszuprobieren. Optisch kommen sie ziemlich wuchtig daher, aber ohne für mich klobig zu wirken. Das Display vorne ist natürlich nicht unbedingt für jede Montage gut geeignet. Dafür ist die Anzeige schön hell und kann so auch in einem nicht optimalen Winkel gut eingesehen werden.</p><h2 id="lieferumfang-der-aqara-e1">Lieferumfang der Aqara E1<a href="#lieferumfang-der-aqara-e1" class="heading-anchor" aria-label="Diesen Abschnitt verlinken"><svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a></h2><p>Im Lieferumfang befinden sich</p><ul><li>Das Heizkörperthermostat</li><li>drei Adapterringe</li><li>Anleitung</li></ul><p>Die Anleitung ist natürlich in den gängigen Sprachen incl. Deutsch vorhanden.</p><p><img src="/aqara-e1-smartes-heizkoerperthermostat-mit-zigbee/images/aqara-e1-lieferumfang_hu_3c337b95860b82b8.webp" srcset="/aqara-e1-smartes-heizkoerperthermostat-mit-zigbee/images/aqara-e1-lieferumfang_hu_6f10c11be5c8ddda.webp 384w, /aqara-e1-smartes-heizkoerperthermostat-mit-zigbee/images/aqara-e1-lieferumfang_hu_3c337b95860b82b8.webp 768w" sizes="(max-width: 768px) 100vw, 768px" alt="Lieferumfang Aqara E1" loading="lazy" fetchpriority="auto" decoding="async" width="768" height="576"/><h2 id="verbindung-mit-einem-gateway">Verbindung mit einem Gateway<a href="#verbindung-mit-einem-gateway" class="heading-anchor" aria-label="Diesen Abschnitt verlinken"><svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a></h2><p>In meinem Smart-Home werden die<a href="https://amzn.to/3AGZSgS" target="_blank" rel="noopener noreferrer">Aqara E1<svg class="link-external-icon" aria-hidden="true" focusable="false" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"/><polyline points="15 3 21 3 21 9"/><line x1="10" y1="14" x2="21" y2="3"/></svg><span class="visually-hidden"> (externer Link)</span></a>
mit<a href="https://www.zigbee2mqtt.io" target="_blank" rel="noopener noreferrer">zigbee2mqtt<svg class="link-external-icon" aria-hidden="true" focusable="false" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"/><polyline points="15 3 21 3 21 9"/><line x1="10" y1="14" x2="21" y2="3"/></svg><span class="visually-hidden"> (externer Link)</span></a>
verbunden. Ich verwende dieses Gateway schon lange und ist nicht direkt mit meiner<a href="/tesla-ueberschussladen-mit-home-assistant/">Home Assistant</a>
Instanz auf dem gleichen System. Beim Einbinden der neuen Thermostate habe ich festgestellt, dass man mindestens die Version 1.28 verwenden muss, weil vorher das Gerät nicht erkannt wurde. Stand Ende November 2022 sind wir bei Version 1.28.2, also sollte es für dich kein Problem sein, das Gerät zu betreiben.</p><p>Es werden Stand jetzt aber noch nicht alle Funktionen unterstützt die mit dem<a href="https://amzn.to/3tV0hsn" target="_blank" rel="noopener noreferrer">Aqara Hub E2<svg class="link-external-icon" aria-hidden="true" focusable="false" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"/><polyline points="15 3 21 3 21 9"/><line x1="10" y1="14" x2="21" y2="3"/></svg><span class="visually-hidden"> (externer Link)</span></a>
möglich wären. Hier können nämlich externe<a href="https://amzn.to/3ECPx75" target="_blank" rel="noopener noreferrer">Temperatursensoren wie die von Aqara<svg class="link-external-icon" aria-hidden="true" focusable="false" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"/><polyline points="15 3 21 3 21 9"/><line x1="10" y1="14" x2="21" y2="3"/></svg><span class="visually-hidden"> (externer Link)</span></a>
direkt verbunden werden. So wird eine realistischere Temperatur des Raumes an das Thermostat übermittelt. Ebenso die Türerkennung über die Tür- und Fenstersensoren sind noch nicht aktiv. Beides aber eine Frage der Zeit, weil es hierfür schon bereits eine aktive Entwicklung bei<a href="https://www.github.com/cbirkenbeul" target="_blank" rel="noopener noreferrer">GitHub<svg class="link-external-icon" aria-hidden="true" focusable="false" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"/><polyline points="15 3 21 3 21 9"/><line x1="10" y1="14" x2="21" y2="3"/></svg><span class="visually-hidden"> (externer Link)</span></a>
gibt.</p><p><img src="/aqara-e1-smartes-heizkoerperthermostat-mit-zigbee/images/aqara-e1-zigbee2mqtt_hu_f84f374163c8f22e.webp" srcset="/aqara-e1-smartes-heizkoerperthermostat-mit-zigbee/images/aqara-e1-zigbee2mqtt_hu_eed5f30a0d6fdb90.webp 384w, /aqara-e1-smartes-heizkoerperthermostat-mit-zigbee/images/aqara-e1-zigbee2mqtt_hu_f84f374163c8f22e.webp 768w" sizes="(max-width: 768px) 100vw, 768px" alt="Aqara E1 Screenshot aus zigbee2mqtt" loading="lazy" fetchpriority="auto" decoding="async" width="768" height="365">
Im Betrieb sind die Geräte ziemlich schnell. Wird die Temperatur via Software oder am Gerät geändert, stellt der Motor die Heizung direkt ein. Allerdings ist dieser bei meinen zwei Geräten nicht wirklich leise. Zwar hört man diese in 1 – 2 m Entfernung nicht mehr, aber empfindliche Menschen könnten diese doch wahrnehmen.</p><p>Zum Batterieverbrauch kann man natürlich nach zwei Wochen noch nichts sagen. Andere ZigBee Thermostate alten bei mir aber immer mindestens ein Jahr. Da ich alle mit Akkus betreibe werden diese im Sommer, wenn die Heizung eh aus ist, gerade geladen und wieder neu eingelegt.</p><p>In der kurzen Zeit machen die Geräte aber einen sehr guten Eindruck und bisher kann ich sie gut weiterempfehlen. Der Markt an smarten Heizkörperthermostaten wird in den nächsten Jahren sicherlich umkämpfter werden, da ist es gut qualitativ gute Alternativen zu haben.</p>
]]></content:encoded><category>smart-home</category><category>zigbee</category><category>home-assistant</category><category>iot</category></item><item><title>Wechsel von Twitter von Mastodon?!</title><link>https://www.teqqy.de/wechsel-von-twitter-von-mastodon/</link><pubDate>Mon, 21 Nov 2022 22:38:19 +0100</pubDate><lastBuildDate>Mon, 21 Nov 2022 22:38:19 +0100</lastBuildDate><guid isPermaLink="true">https://www.teqqy.de/wechsel-von-twitter-von-mastodon/</guid><description>Wer nicht grad unter einem Stein lebt, bekommt ein wenig die Tragik um Twitter und Elon Musk mit. Musk ist IMHO eh sehr kontrovers und die Dinge die gerade auf der Plattform passieren passen nicht jedem.
Seit einiger Zeit wechseln viele Menschen von Twitter zu Mastodon um einen anderen Microblogging-Dienst zu verwenden. Ob man die zwei Plattformen wirklich vergleichen kann sei mal dahin gestellt.
Ich für meinen Teil wollte der Plattform mal eine Chance geben. Natürlich habe ich mir dafür nicht einfach eine Instanz ausgesucht, sondern habe mir eine eigene Instanz in meinem Homelab installiert. Grundsätzlich ist das auch keine schwere Aufgabe. Leider benötigt allerdings eine Installation doch recht viel Ressourcen.</description><content:encoded>&lt;![CDATA[<p>Wer nicht grad unter einem Stein lebt, bekommt ein wenig die Tragik um Twitter und Elon Musk mit. Musk ist IMHO eh sehr kontrovers und die Dinge die gerade auf der Plattform passieren passen nicht jedem.</p><p>Seit einiger Zeit wechseln viele Menschen von Twitter zu Mastodon um einen anderen Microblogging-Dienst zu verwenden. Ob man die zwei Plattformen wirklich vergleichen kann sei mal dahin gestellt.</p><p>Ich für meinen Teil wollte der Plattform mal eine Chance geben. Natürlich habe ich mir dafür nicht einfach eine Instanz ausgesucht, sondern habe mir eine eigene Instanz in meinem Homelab installiert. Grundsätzlich ist das auch keine schwere Aufgabe. Leider benötigt allerdings eine Installation doch recht viel Ressourcen.</p><p>Die Standardinstallation von tootsuite benötigt</p><ul><li>Elasticsearch</li><li>Postgres Datenbank</li><li>S3 Storage</li><li>Redis</li></ul><p>und natürlich die normalen Container für die Software an sich.</p><p>Ob Mastodon und diese Installation langfristig für mich bestand haben wird, wird die Zeit zeigen. Ich wollte mal bis Ende des Jahres warten wie es sich entwickelt. Sollte ich dann dabei bleiben werde ich die Instanz sicherlich auf meinen VPS bei<a href="https://www.netcup.de/?ref=60644" target="_blank" rel="noopener noreferrer">Netcup<svg class="link-external-icon" aria-hidden="true" focusable="false" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"/><polyline points="15 3 21 3 21 9"/><line x1="10" y1="14" x2="21" y2="3"/></svg><span class="visually-hidden"> (externer Link)</span></a>
umziehen.</p>
]]></content:encoded><category>mastodon</category><category>fediverse</category><category>twitter</category><category>homelab</category></item><item><title>Modulare WLAN Wetterstation für dein Garten</title><link>https://www.teqqy.de/modulare-wlan-wetterstation-fuer-dein-garten/</link><pubDate>Sun, 14 Aug 2022 16:14:20 +0200</pubDate><lastBuildDate>Sun, 14 Aug 2022 16:14:20 +0200</lastBuildDate><guid isPermaLink="true">https://www.teqqy.de/modulare-wlan-wetterstation-fuer-dein-garten/</guid><description>Wenn man auf den gängigen Shop-Seiten nach einer WLAN Wetterstation (externer Link) sucht, findet man ziemlich viele Geräte. Teilweise Smart, manche sehr einfach und manch andere messen eigentlich selbst gar nix sondern beziehen ihre Daten nur von zentralen Diensten.</description><content:encoded>&lt;![CDATA[<p>Wenn man auf den gängigen Shop-Seiten nach einer WLAN<a href="https://www.amazon.de/shop/teqqyde/list/28WUZEF8NCNN8?ref_=aip_sf_list_spv_ons_mixed_d" target="_blank" rel="noopener noreferrer">Wetterstation<svg class="link-external-icon" aria-hidden="true" focusable="false" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"/><polyline points="15 3 21 3 21 9"/><line x1="10" y1="14" x2="21" y2="3"/></svg><span class="visually-hidden"> (externer Link)</span></a>
sucht, findet man ziemlich viele Geräte. Teilweise Smart, manche sehr einfach und manch andere messen eigentlich selbst gar nix sondern beziehen ihre Daten nur von zentralen Diensten.</p><p>Wie du vielleicht weißt, betreiben wir schon seit einigen Jahren eine eigene<a href="/wetterstation-mit-dem-raspberry-pi/">kleine Wetterstation</a>
in unserem Garten. Diese basierte bisher auf einer Foggit WH1080. Einem sehr gängigen System, das uns vor kurzem aber leider im Stich gelassen hatte. Die Daten wurden hier vom Außensensor immer an die Konsole übermittelt und dort von einem<a href="https://amzn.to/3C3tfeS" target="_blank" rel="noopener noreferrer">Raspberry Pi<svg class="link-external-icon" aria-hidden="true" focusable="false" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"/><polyline points="15 3 21 3 21 9"/><line x1="10" y1="14" x2="21" y2="3"/></svg><span class="visually-hidden"> (externer Link)</span></a>
per USB ausgelesen. Die Wettersoftware weewx hat dann unsere Wetter-Webseite erstellt.</p><p><a href="images/wetter-ockenheim.webp">Screenshot unserer Wetter Webseite</a>
Ich musste nun eine neue<a href="https://www.amazon.de/shop/teqqyde/list/28WUZEF8NCNN8?ref_=aip_sf_list_spv_ons_mixed_d" target="_blank" rel="noopener noreferrer">Wetterstation<svg class="link-external-icon" aria-hidden="true" focusable="false" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"/><polyline points="15 3 21 3 21 9"/><line x1="10" y1="14" x2="21" y2="3"/></svg><span class="visually-hidden"> (externer Link)</span></a>
finden. Eigentlich wollte ich schon immer eine Davis Vantage 2 haben, allerdings ist mir diese zu kostenintensiv. Also suchte ich nach einer guten, aber günstigen Lösung. Am liebsten noch modularer als unsere bisherige. Diese hatte nämlich lediglich eine Außeneinheit, sodass die einzelnen Sensoren nicht gut platziert werden können.</p><p>Nach etwas Recherche bin ich auf die Firma Ecowitt gestoßen die gute Hardware zu vernünftigen Preisen verkauft. Natürlich kommen auch diese Sensoren nicht an die Qualität offizieller Wetterstationen heran, aber darum geht es uns auch gar nicht.</p><h2 id="komponenten">Komponenten<a href="#komponenten" class="heading-anchor" aria-label="Diesen Abschnitt verlinken"><svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a></h2><h3 id="wlan-wetterstation-empfänger">WLAN Wetterstation Empfänger<a href="#wlan-wetterstation-empf%c3%a4nger" class="heading-anchor" aria-label="Diesen Abschnitt verlinken"><svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a></h3><p>Das Herz ist der Empfänger<a href="https://amzn.to/3JCfeaq" target="_blank" rel="noopener noreferrer">GW1100<svg class="link-external-icon" aria-hidden="true" focusable="false" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"/><polyline points="15 3 21 3 21 9"/><line x1="10" y1="14" x2="21" y2="3"/></svg><span class="visually-hidden"> (externer Link)</span></a>
der alle Signale der einzelnen Sensoren empfängt. Hier können natürlich auch alle Werte direkt in einer Weboberfläche abgefragt werden. Wer eine Konsole lieber hat, wird auch hier fündig. Wir für unseren Teil konnten auf die Konsole verzichten und nutzen lieber unsere Webseite.</p><h3 id="außensensor-temperatur">Außensensor Temperatur<a href="#au%c3%9fensensor-temperatur" class="heading-anchor" aria-label="Diesen Abschnitt verlinken"><svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a></h3><p>Der alte Sensor war leider direkt in der Sonne. Ich habe ihn zwar so positioniert, dass zumindest nicht die Mittagssonne drauf trifft, aber morgens und abends wurden die Ergebnisse doch sehr verfälscht. Durch die modulare Bauweise konnte ich den neuen Temperatursensor<a href="https://www.ecowitt.com/shop/goodsDetail/193" target="_blank" rel="noopener noreferrer">WH32<svg class="link-external-icon" aria-hidden="true" focusable="false" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"/><polyline points="15 3 21 3 21 9"/><line x1="10" y1="14" x2="21" y2="3"/></svg><span class="visually-hidden"> (externer Link)</span></a>
nun an die Ostseite des Hauses hängen. Allerdings auch so, dass er keine direkte Sonnenstrahlung abbekommt.</p><p>Offiziell soll ein Temperatursensor zwei Meter über den Boden in einer aktiv belüfteten Wetterhütte stehen.</p><h3 id="außensensor-windrichtung-und--geschwindigkeit">Außensensor Windrichtung und -geschwindigkeit<a href="#au%c3%9fensensor-windrichtung-und--geschwindigkeit" class="heading-anchor" aria-label="Diesen Abschnitt verlinken"><svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a></h3><p>Der Windsensor<a href="https://www.ecowitt.com/shop/goodsDetail/43" target="_blank" rel="noopener noreferrer">WS68<svg class="link-external-icon" aria-hidden="true" focusable="false" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"/><polyline points="15 3 21 3 21 9"/><line x1="10" y1="14" x2="21" y2="3"/></svg><span class="visually-hidden"> (externer Link)</span></a>
ist eine Einheit und besteht aus einem Sensor der die Windgeschwindigkeit misst, sowie unterhalb für die Windrichtung. Durch den Umbau konnten wir jetzt diesen Teil auch ein Stück höher hängen um ein weniger Verwirbelungen durch „nahestehende“ Pflanzen zu messen.</p><p><img src="/modulare-wlan-wetterstation-fuer-dein-garten/images/wlan-wetterstation-windmesser_hu_a77c307e31412520.webp" srcset="/modulare-wlan-wetterstation-fuer-dein-garten/images/wlan-wetterstation-windmesser_hu_398f4bfbd2e7860b.webp 384w, /modulare-wlan-wetterstation-fuer-dein-garten/images/wlan-wetterstation-windmesser_hu_a77c307e31412520.webp 768w" sizes="(max-width: 768px) 100vw, 768px" alt="Ecowitt WS68 der WLAN Wetterstation" loading="eager" fetchpriority="high" decoding="async" width="768" height="351">
Der DWD gibt vor, dass der Windmesser auf mindestens 10 Meter Höhe positioniert werden muss. Zudem muss reichlich Platz zu nahestehenden Gebäuden und Pflanzen eingehalten werden.</p><h3 id="außensensor-regenmesser">Außensensor Regenmesser<a href="#au%c3%9fensensor-regenmesser" class="heading-anchor" aria-label="Diesen Abschnitt verlinken"><svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a></h3><p>Der Regenmesser der WH1080 war nicht wirklich gut. Wie eigentlich alle Sensoren in dieser Preisregion wird die Regenmenge durch eine Wippe berechnet. Grundsätzlich ist das kein Problem, solange man die Wippe einmal im Jahr säubert.</p><p>Leider war der Trichter der alten Station sehr klein, sodass kaum Regen direkt hinein regnete. Der neue Sensor<a href="https://amzn.to/3JB5tsU" target="_blank" rel="noopener noreferrer">WH40<svg class="link-external-icon" aria-hidden="true" focusable="false" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"/><polyline points="15 3 21 3 21 9"/><line x1="10" y1="14" x2="21" y2="3"/></svg><span class="visually-hidden"> (externer Link)</span></a>
ist deutlich größer und kann nun Regenstärken ab 0,1 mm messen. Der alte hatte lediglich eine Genauigkeit von 0,3 mm.</p><p><img src="/modulare-wlan-wetterstation-fuer-dein-garten/images/wlan-wetterstation-regenmesser_hu_3629ee7460d0e.webp" srcset="/modulare-wlan-wetterstation-fuer-dein-garten/images/wlan-wetterstation-regenmesser_hu_7d1cc9db6719a76d.webp 384w, /modulare-wlan-wetterstation-fuer-dein-garten/images/wlan-wetterstation-regenmesser_hu_3629ee7460d0e.webp 768w" sizes="(max-width: 768px) 100vw, 768px" alt="Ecowitt WH40 der WLAN Wetterstation" loading="lazy" fetchpriority="auto" decoding="async" width="768" height="543">
Die Positionierung konnte ich auch verbessern, sodass mehr Platz um den Sensor herum ist. Zudem werde ich bei Gelegenheit noch eine Erweiterung drucken die den Rand erhöht. So kann selbst bei stärkerem Wind besser gemessen werden.</p><h2 id="anbindung-an-weewx">Anbindung an weewx<a href="#anbindung-an-weewx" class="heading-anchor" aria-label="Diesen Abschnitt verlinken"><svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a></h2><p>Das Gateway GW1100 wird ins heimische WLAN integriert (sonst wäre es ja auch keine WLAN Wetterstation 😉) und kann dann mit weewx ausgelesen werden.</p><p>Offiziell werden die Ecowitt gateways von Haus aus unterstützt. Die Community empfehlt aber einen<a href="https://github.com/gjr80/weewx-gw1000" target="_blank" rel="noopener noreferrer">alternativen Treiber<svg class="link-external-icon" aria-hidden="true" focusable="false" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"/><polyline points="15 3 21 3 21 9"/><line x1="10" y1="14" x2="21" y2="3"/></svg><span class="visually-hidden"> (externer Link)</span></a>
zu verwenden er die Sensoren besser ausliest.</p><p>Sobald der Treiber installiert ist, kann die Wetterstation einfach in der weewx.conf Datei hinzufügt werden und die Daten werden ausgelesen.</p><h2 id="youtube-video">YouTube Video<a href="#youtube-video" class="heading-anchor" aria-label="Diesen Abschnitt verlinken"><svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a></h2><p>Möchtest du noch ein paar mehr Worte zu unserer WLAN Wetterstation wissen, kannst du dir gerne dieses YouTube Video auf meinem Kanal anschauen.</p><div class="video-embed" data-src="https://www.youtube-nocookie.com/embed/jgyqSV-op9M?autoplay=1&rel=0"><button class="video-embed-trigger" type="button" data-umami-event="Video Load" data-umami-event-provider="YouTube" data-umami-event-id="jgyqSV-op9M"><svg class="video-embed-play-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true" width="48" height="48"><circle cx="12" cy="12" r="12" fill="rgba(0,0,0,0.6)"/><path d="M9.5 7.5l7 4.5-7 4.5V7.5z" fill="white"/></svg><span class="video-embed-title">YouTube Video</span><span class="video-embed-note">YouTube &middot; Klicken zum Laden</span></button></div>
]]></content:encoded><category>iot</category><category>raspberry-pi</category><category>hardware</category></item></channel></rss>