{"version":"https://jsonfeed.org/version/1.1","title":"teqqy","home_page_url":"https://www.teqqy.de/","feed_url":"https://www.teqqy.de/feed.json","description":"Ein Blog über Technik und mehr","language":"de","authors":[{"name":"teqqy"}],"items":[{"id":"https://www.teqqy.de/gitops-ohne-komodo/","url":"https://www.teqqy.de/gitops-ohne-komodo/","title":"GitOps ohne Komodo: Webhook-basiertes Auto-Deployment für Docker Compose","summary":"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.\n","content_html":"\u003cp\u003eWer meinen \u003ca href=\"/selfhosted-setup-2025-mein-neuer-workflow-mit-proxmox-komodo-und-gitops/\"\u003eletzten Beitrag zum Homelab Setup 2025\u003c/a\u003e\n gelesen hat, weiß dass ich dort \u003ca href=\"https://komo.do/\" target=\"_blank\" rel=\"noopener noreferrer\"\u003eKomodo\u003csvg 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\"\u003e\n  \u003cpath d=\"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6\"/\u003e\n  \u003cpolyline points=\"15 3 21 3 21 9\"/\u003e\n  \u003cline x1=\"10\" y1=\"14\" x2=\"21\" y2=\"3\"/\u003e\n\u003c/svg\u003e\u003cspan class=\"visually-hidden\"\u003e (externer Link)\u003c/span\u003e\u003c/a\u003e\n 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.\u003c/p\u003e\n\u003cp\u003eDie 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.\u003c/p\u003e\n\u003ch2 id=\"das-grundprinzip\"\u003eDas Grundprinzip\u003ca href=\"#das-grundprinzip\" class=\"heading-anchor\" aria-label=\"Diesen Abschnitt verlinken\"\u003e\u003csvg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"\u003e\u003cpath d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\"\u003e\u003c/path\u003e\u003cpath d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eDas Setup basiert auf drei Komponenten die zusammenspielen:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ca href=\"https://about.gitea.com/\" target=\"_blank\" rel=\"noopener noreferrer\"\u003eGitea\u003csvg 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\"\u003e\n  \u003cpath d=\"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6\"/\u003e\n  \u003cpolyline points=\"15 3 21 3 21 9\"/\u003e\n  \u003cline x1=\"10\" y1=\"14\" x2=\"21\" y2=\"3\"/\u003e\n\u003c/svg\u003e\u003cspan class=\"visually-hidden\"\u003e (externer Link)\u003c/span\u003e\u003c/a\u003e\n\u003c/strong\u003e – mein selbst gehosteter Git-Server, auf dem die Compose-Dateien liegen\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ca href=\"https://docs.renovatebot.com/\" target=\"_blank\" rel=\"noopener noreferrer\"\u003eRenovate\u003csvg 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\"\u003e\n  \u003cpath d=\"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6\"/\u003e\n  \u003cpolyline points=\"15 3 21 3 21 9\"/\u003e\n  \u003cline x1=\"10\" y1=\"14\" x2=\"21\" y2=\"3\"/\u003e\n\u003c/svg\u003e\u003cspan class=\"visually-hidden\"\u003e (externer Link)\u003c/span\u003e\u003c/a\u003e\n\u003c/strong\u003e – ü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 \u003ccode\u003emain\u003c/code\u003e.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ca href=\"https://github.com/adnanh/webhook\" target=\"_blank\" rel=\"noopener noreferrer\"\u003ewebhook\u003csvg 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\"\u003e\n  \u003cpath d=\"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6\"/\u003e\n  \u003cpolyline points=\"15 3 21 3 21 9\"/\u003e\n  \u003cline x1=\"10\" y1=\"14\" x2=\"21\" y2=\"3\"/\u003e\n\u003c/svg\u003e\u003cspan class=\"visually-hidden\"\u003e (externer Link)\u003c/span\u003e\u003c/a\u003e\n\u003c/strong\u003e – 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.\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003eDer Datenfluss sieht so aus:\u003c/p\u003e\n\u003cdiv class=\"code-block\"\u003e\n  \u003cdiv class=\"code-block-header\"\u003e\n    \u003cspan class=\"code-lang-label\"\u003e\u003c/span\u003e\n    \u003cbutton class=\"code-copy-btn\" type=\"button\" aria-label=\"Code kopieren\" data-umami-event=\"Code Copy\" data-umami-event-lang=\"\"\u003e\n      \u003csvg 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\"\u003e\u003crect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\"\u003e\u003c/rect\u003e\u003cpath d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\"\u003e\u003c/path\u003e\u003c/svg\u003e\n      \u003csvg 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\"\u003e\u003cpolyline points=\"20 6 9 17 4 12\"\u003e\u003c/polyline\u003e\u003c/svg\u003e\n    \u003c/button\u003e\n  \u003c/div\u003e\u003cpre tabindex=\"0\"\u003e\u003ccode\u003eRenovate erkennt neues Image-Tag\n  → PR in Gitea\n  → Merge\n  → Gitea feuert Webhook\n  → webhook-Binary ruft deploy.sh auf\n  → git pull + docker compose up -d\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cp\u003eKein Polling, kein Daemon der irgendwelche Container-Registries beobachtet, kein Framework das eigene Meinungen zu File Permissions hat.\u003c/p\u003e\n\u003ch2 id=\"warum-nicht-einfach-watchtower-oder-ein-cron-script\"\u003eWarum nicht einfach Watchtower oder ein Cron-Script?\u003ca href=\"#warum-nicht-einfach-watchtower-oder-ein-cron-script\" class=\"heading-anchor\" aria-label=\"Diesen Abschnitt verlinken\"\u003e\u003csvg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"\u003e\u003cpath d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\"\u003e\u003c/path\u003e\u003cpath d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eBevor ich zu webhook gegriffen habe, hatte ich kurz zwei andere Ansätze im Kopf.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e\u003ca href=\"https://containrrr.dev/watchtower/\" target=\"_blank\" rel=\"noopener noreferrer\"\u003eWatchtower\u003csvg 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\"\u003e\n  \u003cpath d=\"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6\"/\u003e\n  \u003cpolyline points=\"15 3 21 3 21 9\"/\u003e\n  \u003cline x1=\"10\" y1=\"14\" x2=\"21\" y2=\"3\"/\u003e\n\u003c/svg\u003e\u003cspan class=\"visually-hidden\"\u003e (externer Link)\u003c/span\u003e\u003c/a\u003e\n\u003c/strong\u003e ü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.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eCron-Script mit \u003ccode\u003egit fetch\u003c/code\u003e\u003c/strong\u003e 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.\u003c/p\u003e\n\u003cp\u003ewebhook ist der sauberste Weg: Event-getrieben, kein Extra-Daemon, ein einzelnes Binary ohne Abhängigkeiten.\u003c/p\u003e\n\u003ch2 id=\"repo-struktur\"\u003eRepo-Struktur\u003ca href=\"#repo-struktur\" class=\"heading-anchor\" aria-label=\"Diesen Abschnitt verlinken\"\u003e\u003csvg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"\u003e\u003cpath d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\"\u003e\u003c/path\u003e\u003cpath d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eIch habe pro Server ein eigenes Repository:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003eapps-stack\u003c/code\u003e für den \u003ccode\u003edocker01\u003c/code\u003e – dort laufen Tools wie \u003ca href=\"https://docs.paperless-ngx.com/\" target=\"_blank\" rel=\"noopener noreferrer\"\u003ePaperless-ngx\u003csvg 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\"\u003e\n  \u003cpath d=\"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6\"/\u003e\n  \u003cpolyline points=\"15 3 21 3 21 9\"/\u003e\n  \u003cline x1=\"10\" y1=\"14\" x2=\"21\" y2=\"3\"/\u003e\n\u003c/svg\u003e\u003cspan class=\"visually-hidden\"\u003e (externer Link)\u003c/span\u003e\u003c/a\u003e\n, \u003ca href=\"https://immich.app/\" target=\"_blank\" rel=\"noopener noreferrer\"\u003eImmich\u003csvg 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\"\u003e\n  \u003cpath d=\"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6\"/\u003e\n  \u003cpolyline points=\"15 3 21 3 21 9\"/\u003e\n  \u003cline x1=\"10\" y1=\"14\" x2=\"21\" y2=\"3\"/\u003e\n\u003c/svg\u003e\u003cspan class=\"visually-hidden\"\u003e (externer Link)\u003c/span\u003e\u003c/a\u003e\n, \u003ca href=\"https://github.com/dani-garcia/vaultwarden\" target=\"_blank\" rel=\"noopener noreferrer\"\u003eVaultwarden\u003csvg 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\"\u003e\n  \u003cpath d=\"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6\"/\u003e\n  \u003cpolyline points=\"15 3 21 3 21 9\"/\u003e\n  \u003cline x1=\"10\" y1=\"14\" x2=\"21\" y2=\"3\"/\u003e\n\u003c/svg\u003e\u003cspan class=\"visually-hidden\"\u003e (externer Link)\u003c/span\u003e\u003c/a\u003e\n und ähnliches\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003emedia-stack\u003c/code\u003e für den \u003ccode\u003emedia01\u003c/code\u003e – dort leben alle \u003ccode\u003e*arr\u003c/code\u003e-Container und was sonst noch zum Medien-Stack gehört\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eJedes Repo enthält einfach die \u003ccode\u003ecompose.yaml\u003c/code\u003e sowie ggf. weitere Konfigurationsdateien die einzelne Anwendungen benötigen. Nichts Besonderes.\u003c/p\u003e\n\u003ch3 id=\"renovate-in-den-repos\"\u003eRenovate in den Repos\u003ca href=\"#renovate-in-den-repos\" class=\"heading-anchor\" aria-label=\"Diesen Abschnitt verlinken\"\u003e\u003csvg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"\u003e\u003cpath d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\"\u003e\u003c/path\u003e\u003cpath d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eRenovate läuft selfhosted und überprüft per Cronjob alle vier Stunden die Image-Tags in den Compose-Dateien. Dafür reicht eine minimale \u003ccode\u003erenovate.json\u003c/code\u003e im Repo-Root:\u003c/p\u003e\n\u003cdiv class=\"code-block\"\u003e\n  \u003cdiv class=\"code-block-header\"\u003e\n    \u003cspan class=\"code-lang-label\"\u003ejson\u003c/span\u003e\n    \u003cbutton class=\"code-copy-btn\" type=\"button\" aria-label=\"Code kopieren\" data-umami-event=\"Code Copy\" data-umami-event-lang=\"json\"\u003e\n      \u003csvg 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\"\u003e\u003crect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\"\u003e\u003c/rect\u003e\u003cpath d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\"\u003e\u003c/path\u003e\u003c/svg\u003e\n      \u003csvg 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\"\u003e\u003cpolyline points=\"20 6 9 17 4 12\"\u003e\u003c/polyline\u003e\u003c/svg\u003e\n    \u003c/button\u003e\n  \u003c/div\u003e\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e6edf3;background-color:#0d1117;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-json\" data-lang=\"json\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e{\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#7ee787\"\u003e\u0026#34;$schema\u0026#34;\u003c/span\u003e: \u003cspan style=\"color:#a5d6ff\"\u003e\u0026#34;https://docs.renovatebot.com/renovate-schema.json\u0026#34;\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#7ee787\"\u003e\u0026#34;extends\u0026#34;\u003c/span\u003e: [\u003cspan style=\"color:#a5d6ff\"\u003e\u0026#34;config:base\u0026#34;\u003c/span\u003e],\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#7ee787\"\u003e\u0026#34;docker-compose\u0026#34;\u003c/span\u003e: {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#7ee787\"\u003e\u0026#34;enabled\u0026#34;\u003c/span\u003e: \u003cspan style=\"color:#79c0ff\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  }\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e}\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/div\u003e\n\u003cp\u003eRenovate 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 \u003ccode\u003emajor.minor.patch\u003c/code\u003e) lässt sich das besonders fein steuern – z. B. nur Patch-Updates automatisch mergen, bei Minor-Updates erst schauen was sich geändert hat.\u003c/p\u003e\n\u003cp\u003eFü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.\u003c/p\u003e\n\u003ch2 id=\"webhook-installieren-und-konfigurieren\"\u003ewebhook installieren und konfigurieren\u003ca href=\"#webhook-installieren-und-konfigurieren\" class=\"heading-anchor\" aria-label=\"Diesen Abschnitt verlinken\"\u003e\u003csvg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"\u003e\u003cpath d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\"\u003e\u003c/path\u003e\u003cpath d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003e\u003ccode\u003ewebhook\u003c/code\u003e gibt es als einzelnes Binary, alternativ auch als Paket:\u003c/p\u003e\n\u003cdiv class=\"code-block\"\u003e\n  \u003cdiv class=\"code-block-header\"\u003e\n    \u003cspan class=\"code-lang-label\"\u003ebash\u003c/span\u003e\n    \u003cbutton class=\"code-copy-btn\" type=\"button\" aria-label=\"Code kopieren\" data-umami-event=\"Code Copy\" data-umami-event-lang=\"bash\"\u003e\n      \u003csvg 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\"\u003e\u003crect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\"\u003e\u003c/rect\u003e\u003cpath d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\"\u003e\u003c/path\u003e\u003c/svg\u003e\n      \u003csvg 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\"\u003e\u003cpolyline points=\"20 6 9 17 4 12\"\u003e\u003c/polyline\u003e\u003c/svg\u003e\n    \u003c/button\u003e\n  \u003c/div\u003e\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e6edf3;background-color:#0d1117;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eapt install webhook\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/div\u003e\n\u003cp\u003eDie Konfiguration liegt unter \u003ccode\u003e/etc/webhook/webhook.conf\u003c/code\u003e:\u003c/p\u003e\n\u003cdiv class=\"code-block\"\u003e\n  \u003cdiv class=\"code-block-header\"\u003e\n    \u003cspan class=\"code-lang-label\"\u003eyaml\u003c/span\u003e\n    \u003cbutton class=\"code-copy-btn\" type=\"button\" aria-label=\"Code kopieren\" data-umami-event=\"Code Copy\" data-umami-event-lang=\"yaml\"\u003e\n      \u003csvg 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\"\u003e\u003crect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\"\u003e\u003c/rect\u003e\u003cpath d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\"\u003e\u003c/path\u003e\u003c/svg\u003e\n      \u003csvg 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\"\u003e\u003cpolyline points=\"20 6 9 17 4 12\"\u003e\u003c/polyline\u003e\u003c/svg\u003e\n    \u003c/button\u003e\n  \u003c/div\u003e\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e6edf3;background-color:#0d1117;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-yaml\" data-lang=\"yaml\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e- \u003cspan style=\"color:#7ee787\"\u003eid\u003c/span\u003e:\u003cspan style=\"color:#6e7681\"\u003e \u003c/span\u003e\u003cspan style=\"color:#a5d6ff\"\u003edeploy\u003c/span\u003e\u003cspan style=\"color:#6e7681\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#6e7681\"\u003e  \u003c/span\u003e\u003cspan style=\"color:#7ee787\"\u003eexecute-command\u003c/span\u003e:\u003cspan style=\"color:#6e7681\"\u003e \u003c/span\u003e\u003cspan style=\"color:#a5d6ff\"\u003e/opt/scripts/deploy.sh\u003c/span\u003e\u003cspan style=\"color:#6e7681\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#6e7681\"\u003e  \u003c/span\u003e\u003cspan style=\"color:#7ee787\"\u003ecommand-working-directory\u003c/span\u003e:\u003cspan style=\"color:#6e7681\"\u003e \u003c/span\u003e\u003cspan style=\"color:#a5d6ff\"\u003e/opt/media-stack\u003c/span\u003e\u003cspan style=\"color:#6e7681\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#6e7681\"\u003e  \u003c/span\u003e\u003cspan style=\"color:#7ee787\"\u003etrigger-rule\u003c/span\u003e:\u003cspan style=\"color:#6e7681\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#6e7681\"\u003e    \u003c/span\u003e\u003cspan style=\"color:#7ee787\"\u003ematch\u003c/span\u003e:\u003cspan style=\"color:#6e7681\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#6e7681\"\u003e      \u003c/span\u003e\u003cspan style=\"color:#7ee787\"\u003etype\u003c/span\u003e:\u003cspan style=\"color:#6e7681\"\u003e \u003c/span\u003e\u003cspan style=\"color:#a5d6ff\"\u003epayload-hmac-sha256\u003c/span\u003e\u003cspan style=\"color:#6e7681\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#6e7681\"\u003e      \u003c/span\u003e\u003cspan style=\"color:#7ee787\"\u003esecret\u003c/span\u003e:\u003cspan style=\"color:#6e7681\"\u003e \u003c/span\u003e\u003cspan style=\"color:#a5d6ff\"\u003e\u0026#34;{{getenv \\\u0026#34;WEBHOOK_SECRET\\\u0026#34;}}\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#6e7681\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#6e7681\"\u003e      \u003c/span\u003e\u003cspan style=\"color:#7ee787\"\u003eparameter\u003c/span\u003e:\u003cspan style=\"color:#6e7681\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#6e7681\"\u003e        \u003c/span\u003e\u003cspan style=\"color:#7ee787\"\u003esource\u003c/span\u003e:\u003cspan style=\"color:#6e7681\"\u003e \u003c/span\u003e\u003cspan style=\"color:#a5d6ff\"\u003eheader\u003c/span\u003e\u003cspan style=\"color:#6e7681\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#6e7681\"\u003e        \u003c/span\u003e\u003cspan style=\"color:#7ee787\"\u003ename\u003c/span\u003e:\u003cspan style=\"color:#6e7681\"\u003e \u003c/span\u003e\u003cspan style=\"color:#a5d6ff\"\u003eX-Gitea-Signature\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/div\u003e\n\u003cp\u003eEin paar Anmerkungen dazu:\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eHeader-Name:\u003c/strong\u003e Gitea schickt die Signatur als \u003ccode\u003eX-Gitea-Signature\u003c/code\u003e – ohne \u003ccode\u003e-256\u003c/code\u003e-Suffix und ohne \u003ccode\u003esha256=\u003c/code\u003e-Präfix im Wert. Das klingt trivial, hat mich aber beim ersten Versuch einen Debugging-Durchgang gekostet.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eSecret als Umgebungsvariable:\u003c/strong\u003e 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 \u003ccode\u003egetenv\u003c/code\u003e aus der Umgebung gelesen.\u003c/p\u003e\n\u003cp\u003eDas Secret generieren:\u003c/p\u003e\n\u003cdiv class=\"code-block\"\u003e\n  \u003cdiv class=\"code-block-header\"\u003e\n    \u003cspan class=\"code-lang-label\"\u003ebash\u003c/span\u003e\n    \u003cbutton class=\"code-copy-btn\" type=\"button\" aria-label=\"Code kopieren\" data-umami-event=\"Code Copy\" data-umami-event-lang=\"bash\"\u003e\n      \u003csvg 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\"\u003e\u003crect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\"\u003e\u003c/rect\u003e\u003cpath d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\"\u003e\u003c/path\u003e\u003c/svg\u003e\n      \u003csvg 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\"\u003e\u003cpolyline points=\"20 6 9 17 4 12\"\u003e\u003c/polyline\u003e\u003c/svg\u003e\n    \u003c/button\u003e\n  \u003c/div\u003e\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e6edf3;background-color:#0d1117;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eopenssl rand -hex \u003cspan style=\"color:#a5d6ff\"\u003e32\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/div\u003e\n\u003cp\u003eUnd in eine Secrets-Datei schreiben die nur root lesen kann:\u003c/p\u003e\n\u003cdiv class=\"code-block\"\u003e\n  \u003cdiv class=\"code-block-header\"\u003e\n    \u003cspan class=\"code-lang-label\"\u003ebash\u003c/span\u003e\n    \u003cbutton class=\"code-copy-btn\" type=\"button\" aria-label=\"Code kopieren\" data-umami-event=\"Code Copy\" data-umami-event-lang=\"bash\"\u003e\n      \u003csvg 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\"\u003e\u003crect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\"\u003e\u003c/rect\u003e\u003cpath d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\"\u003e\u003c/path\u003e\u003c/svg\u003e\n      \u003csvg 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\"\u003e\u003cpolyline points=\"20 6 9 17 4 12\"\u003e\u003c/polyline\u003e\u003c/svg\u003e\n    \u003c/button\u003e\n  \u003c/div\u003e\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e6edf3;background-color:#0d1117;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#8b949e;font-style:italic\"\u003e# /etc/webhook/secrets.env\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#79c0ff\"\u003eWEBHOOK_SECRET\u003c/span\u003e\u003cspan style=\"color:#ff7b72;font-weight:bold\"\u003e=\u003c/span\u003edein-generierter-string\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/div\u003e\n\u003cdiv class=\"code-block\"\u003e\n  \u003cdiv class=\"code-block-header\"\u003e\n    \u003cspan class=\"code-lang-label\"\u003ebash\u003c/span\u003e\n    \u003cbutton class=\"code-copy-btn\" type=\"button\" aria-label=\"Code kopieren\" data-umami-event=\"Code Copy\" data-umami-event-lang=\"bash\"\u003e\n      \u003csvg 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\"\u003e\u003crect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\"\u003e\u003c/rect\u003e\u003cpath d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\"\u003e\u003c/path\u003e\u003c/svg\u003e\n      \u003csvg 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\"\u003e\u003cpolyline points=\"20 6 9 17 4 12\"\u003e\u003c/polyline\u003e\u003c/svg\u003e\n    \u003c/button\u003e\n  \u003c/div\u003e\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e6edf3;background-color:#0d1117;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003echmod \u003cspan style=\"color:#a5d6ff\"\u003e600\u003c/span\u003e /etc/webhook/secrets.env\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/div\u003e\n\u003ch3 id=\"systemd-unit\"\u003eSystemd-Unit\u003ca href=\"#systemd-unit\" class=\"heading-anchor\" aria-label=\"Diesen Abschnitt verlinken\"\u003e\u003csvg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"\u003e\u003cpath d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\"\u003e\u003c/path\u003e\u003cpath d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/h3\u003e\n\u003cdiv class=\"code-block\"\u003e\n  \u003cdiv class=\"code-block-header\"\u003e\n    \u003cspan class=\"code-lang-label\"\u003eini\u003c/span\u003e\n    \u003cbutton class=\"code-copy-btn\" type=\"button\" aria-label=\"Code kopieren\" data-umami-event=\"Code Copy\" data-umami-event-lang=\"ini\"\u003e\n      \u003csvg 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\"\u003e\u003crect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\"\u003e\u003c/rect\u003e\u003cpath d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\"\u003e\u003c/path\u003e\u003c/svg\u003e\n      \u003csvg 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\"\u003e\u003cpolyline points=\"20 6 9 17 4 12\"\u003e\u003c/polyline\u003e\u003c/svg\u003e\n    \u003c/button\u003e\n  \u003c/div\u003e\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e6edf3;background-color:#0d1117;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-ini\" data-lang=\"ini\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#8b949e;font-style:italic\"\u003e# /etc/systemd/system/webhook.service\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#ff7b72\"\u003e[Unit]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eDescription\u003cspan style=\"color:#ff7b72;font-weight:bold\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#a5d6ff\"\u003eWebhook Receiver\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eAfter\u003cspan style=\"color:#ff7b72;font-weight:bold\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#a5d6ff\"\u003enetwork.target\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#ff7b72\"\u003e[Service]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eUser\u003cspan style=\"color:#ff7b72;font-weight:bold\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#a5d6ff\"\u003eteqqy  # Hier den eigenen Usernamen eintragen\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eEnvironmentFile\u003cspan style=\"color:#ff7b72;font-weight:bold\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#a5d6ff\"\u003e/etc/webhook/secrets.env\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eExecStart\u003cspan style=\"color:#ff7b72;font-weight:bold\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#a5d6ff\"\u003e/usr/bin/webhook -hooks /etc/webhook/webhook.conf -port 9000\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eRestart\u003cspan style=\"color:#ff7b72;font-weight:bold\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#a5d6ff\"\u003eon-failure\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#ff7b72\"\u003e[Install]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eWantedBy\u003cspan style=\"color:#ff7b72;font-weight:bold\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#a5d6ff\"\u003emulti-user.target\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/div\u003e\n\u003cp\u003e\u003ccode\u003eUser=teqqy\u003c/code\u003e 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 \u003ccode\u003edocker\u003c/code\u003e-Gruppe sein.\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003eEnvironmentFile\u003c/code\u003e lädt die \u003ccode\u003esecrets.env\u003c/code\u003e und stellt \u003ccode\u003eWEBHOOK_SECRET\u003c/code\u003e als Umgebungsvariable bereit, bevor der Prozess startet – so kommt das Secret sauber in den \u003ccode\u003egetenv\u003c/code\u003e-Aufruf der Konfiguration. \u003ccode\u003eRestart=on-failure\u003c/code\u003e sorgt dafür dass der Daemon bei einem unerwarteten Absturz automatisch neu startet, ohne dass man manuell eingreifen muss.\u003c/p\u003e\n\u003cdiv class=\"code-block\"\u003e\n  \u003cdiv class=\"code-block-header\"\u003e\n    \u003cspan class=\"code-lang-label\"\u003ebash\u003c/span\u003e\n    \u003cbutton class=\"code-copy-btn\" type=\"button\" aria-label=\"Code kopieren\" data-umami-event=\"Code Copy\" data-umami-event-lang=\"bash\"\u003e\n      \u003csvg 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\"\u003e\u003crect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\"\u003e\u003c/rect\u003e\u003cpath d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\"\u003e\u003c/path\u003e\u003c/svg\u003e\n      \u003csvg 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\"\u003e\u003cpolyline points=\"20 6 9 17 4 12\"\u003e\u003c/polyline\u003e\u003c/svg\u003e\n    \u003c/button\u003e\n  \u003c/div\u003e\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e6edf3;background-color:#0d1117;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003esystemctl enable --now webhook\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/div\u003e\n\u003ch2 id=\"gitea-webhook-einrichten\"\u003eGitea Webhook einrichten\u003ca href=\"#gitea-webhook-einrichten\" class=\"heading-anchor\" aria-label=\"Diesen Abschnitt verlinken\"\u003e\u003csvg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"\u003e\u003cpath d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\"\u003e\u003c/path\u003e\u003cpath d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eIn Gitea unter \u003ccode\u003eRepository → Einstellungen → Webhooks → Webhook hinzufügen → Gitea\u003c/code\u003e:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eZiel-URL:\u003c/strong\u003e \u003ccode\u003ehttp://media01.example.com:9000/hooks/deploy\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eSecret:\u003c/strong\u003e denselben String den du oben generiert hast\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eTrigger:\u003c/strong\u003e Nur \u003ccode\u003ePush\u003c/code\u003e-Events reichen aus\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eGitea berechnet bei jedem Push automatisch eine HMAC-SHA256-Signatur über den Request-Body und schickt sie als \u003ccode\u003eX-Gitea-Signature\u003c/code\u003e-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.\u003c/p\u003e\n\u003cp\u003ePort 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.\u003c/p\u003e\n\u003ch2 id=\"das-deploy-script\"\u003eDas Deploy-Script\u003ca href=\"#das-deploy-script\" class=\"heading-anchor\" aria-label=\"Diesen Abschnitt verlinken\"\u003e\u003csvg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"\u003e\u003cpath d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\"\u003e\u003c/path\u003e\u003cpath d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/h2\u003e\n\u003cdiv class=\"code-block\"\u003e\n  \u003cdiv class=\"code-block-header\"\u003e\n    \u003cspan class=\"code-lang-label\"\u003ebash\u003c/span\u003e\n    \u003cbutton class=\"code-copy-btn\" type=\"button\" aria-label=\"Code kopieren\" data-umami-event=\"Code Copy\" data-umami-event-lang=\"bash\"\u003e\n      \u003csvg 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\"\u003e\u003crect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\"\u003e\u003c/rect\u003e\u003cpath d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\"\u003e\u003c/path\u003e\u003c/svg\u003e\n      \u003csvg 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\"\u003e\u003cpolyline points=\"20 6 9 17 4 12\"\u003e\u003c/polyline\u003e\u003c/svg\u003e\n    \u003c/button\u003e\n  \u003c/div\u003e\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e6edf3;background-color:#0d1117;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#8b949e;font-weight:bold;font-style:italic\"\u003e#!/bin/bash\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eset -euo pipefail\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#79c0ff\"\u003eREPO\u003c/span\u003e\u003cspan style=\"color:#ff7b72;font-weight:bold\"\u003e=\u003c/span\u003e/opt/media-stack\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#79c0ff\"\u003eLOG\u003c/span\u003e\u003cspan style=\"color:#ff7b72;font-weight:bold\"\u003e=\u003c/span\u003e/opt/deploy-logs/deploy-\u003cspan style=\"color:#ff7b72\"\u003e$(\u003c/span\u003edate +%Y%m%d-%H%M%S\u003cspan style=\"color:#ff7b72\"\u003e)\u003c/span\u003e.log\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eexec \u0026gt;\u0026gt; \u003cspan style=\"color:#a5d6ff\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#79c0ff\"\u003e$LOG\u003c/span\u003e\u003cspan style=\"color:#a5d6ff\"\u003e\u0026#34;\u003c/span\u003e 2\u0026gt;\u0026amp;\u003cspan style=\"color:#a5d6ff\"\u003e1\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eecho \u003cspan style=\"color:#a5d6ff\"\u003e\u0026#34;=== Deploy \u003c/span\u003e\u003cspan style=\"color:#ff7b72\"\u003e$(\u003c/span\u003edate\u003cspan style=\"color:#ff7b72\"\u003e)\u003c/span\u003e\u003cspan style=\"color:#a5d6ff\"\u003e ===\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ecd \u003cspan style=\"color:#a5d6ff\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#79c0ff\"\u003e$REPO\u003c/span\u003e\u003cspan style=\"color:#a5d6ff\"\u003e\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003egit pull origin main\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003edocker compose up -d --remove-orphans\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003edocker compose ps\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eecho \u003cspan style=\"color:#a5d6ff\"\u003e\u0026#34;=== Done ===\u0026#34;\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/div\u003e\n\u003cp\u003e\u003ccode\u003eset -euo pipefail\u003c/code\u003e sorgt dafür dass das Script bei jedem Fehler sofort abbricht und einen Exit-Code ≠ 0 zurückgibt. Den loggt webhook dann ebenfalls, sodass \u003ccode\u003ejournalctl -u webhook\u003c/code\u003e bei Problemen der erste Anlaufpunkt ist.\u003c/p\u003e\n\u003cp\u003eDas Log-Verzeichnis muss dem ausführenden User gehören:\u003c/p\u003e\n\u003cdiv class=\"code-block\"\u003e\n  \u003cdiv class=\"code-block-header\"\u003e\n    \u003cspan class=\"code-lang-label\"\u003ebash\u003c/span\u003e\n    \u003cbutton class=\"code-copy-btn\" type=\"button\" aria-label=\"Code kopieren\" data-umami-event=\"Code Copy\" data-umami-event-lang=\"bash\"\u003e\n      \u003csvg 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\"\u003e\u003crect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\"\u003e\u003c/rect\u003e\u003cpath d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\"\u003e\u003c/path\u003e\u003c/svg\u003e\n      \u003csvg 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\"\u003e\u003cpolyline points=\"20 6 9 17 4 12\"\u003e\u003c/polyline\u003e\u003c/svg\u003e\n    \u003c/button\u003e\n  \u003c/div\u003e\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e6edf3;background-color:#0d1117;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003emkdir -p /opt/deploy-logs\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003echown teqqy:teqqy /opt/deploy-logs\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/div\u003e\n\u003ch2 id=\"stolpersteine-die-ich-unterwegs-getroffen-habe\"\u003eStolpersteine die ich unterwegs getroffen habe\u003ca href=\"#stolpersteine-die-ich-unterwegs-getroffen-habe\" class=\"heading-anchor\" aria-label=\"Diesen Abschnitt verlinken\"\u003e\u003csvg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"\u003e\u003cpath d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\"\u003e\u003c/path\u003e\u003cpath d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003e\u003ccode\u003e.git\u003c/code\u003e-Verzeichnis Ownership:\u003c/strong\u003e Wenn das Repo irgendwann mal als anderer User geklont oder gepullt wurde, verweigert Git den Zugriff mit einer Warnung zu \u0026ldquo;dubiosen Besitzverhältnissen\u0026rdquo;. Fix:\u003c/p\u003e\n\u003cdiv class=\"code-block\"\u003e\n  \u003cdiv class=\"code-block-header\"\u003e\n    \u003cspan class=\"code-lang-label\"\u003ebash\u003c/span\u003e\n    \u003cbutton class=\"code-copy-btn\" type=\"button\" aria-label=\"Code kopieren\" data-umami-event=\"Code Copy\" data-umami-event-lang=\"bash\"\u003e\n      \u003csvg 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\"\u003e\u003crect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\"\u003e\u003c/rect\u003e\u003cpath d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\"\u003e\u003c/path\u003e\u003c/svg\u003e\n      \u003csvg 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\"\u003e\u003cpolyline points=\"20 6 9 17 4 12\"\u003e\u003c/polyline\u003e\u003c/svg\u003e\n    \u003c/button\u003e\n  \u003c/div\u003e\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e6edf3;background-color:#0d1117;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003echown -R teqqy:teqqy /opt/media-stack/.git\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/div\u003e\n\u003cp\u003e\u003cstrong\u003e\u003ccode\u003esafe.directory\u003c/code\u003e:\u003c/strong\u003e In manchen Setups hilft zusätzlich:\u003c/p\u003e\n\u003cdiv class=\"code-block\"\u003e\n  \u003cdiv class=\"code-block-header\"\u003e\n    \u003cspan class=\"code-lang-label\"\u003ebash\u003c/span\u003e\n    \u003cbutton class=\"code-copy-btn\" type=\"button\" aria-label=\"Code kopieren\" data-umami-event=\"Code Copy\" data-umami-event-lang=\"bash\"\u003e\n      \u003csvg 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\"\u003e\u003crect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\"\u003e\u003c/rect\u003e\u003cpath d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\"\u003e\u003c/path\u003e\u003c/svg\u003e\n      \u003csvg 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\"\u003e\u003cpolyline points=\"20 6 9 17 4 12\"\u003e\u003c/polyline\u003e\u003c/svg\u003e\n    \u003c/button\u003e\n  \u003c/div\u003e\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e6edf3;background-color:#0d1117;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003egit config --global --add safe.directory /opt/media-stack\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/div\u003e\n\u003cp\u003e\u003cstrong\u003e\u003ccode\u003e/var/log\u003c/code\u003e Permissions:\u003c/strong\u003e Der ausführende User hat dort keine Schreibrechte. Deshalb das Log-Verzeichnis in einen Pfad legen der dem User gehört – ich nutze \u003ccode\u003e/opt/deploy-logs\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e\u003ccode\u003e*arr\u003c/code\u003e-Container und UID/GID:\u003c/strong\u003e Meine \u003ccode\u003e*arr\u003c/code\u003e-Container laufen mit \u003ccode\u003e99:100\u003c/code\u003e (Unraid-kompatibel wegen NFS). Beim allerersten Deployment legt Docker die Bind-Mount-Verzeichnisse mit \u003ccode\u003e1000:1000\u003c/code\u003e an wenn sie noch nicht existieren. Einmalig vor dem ersten Start:\u003c/p\u003e\n\u003cdiv class=\"code-block\"\u003e\n  \u003cdiv class=\"code-block-header\"\u003e\n    \u003cspan class=\"code-lang-label\"\u003ebash\u003c/span\u003e\n    \u003cbutton class=\"code-copy-btn\" type=\"button\" aria-label=\"Code kopieren\" data-umami-event=\"Code Copy\" data-umami-event-lang=\"bash\"\u003e\n      \u003csvg 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\"\u003e\u003crect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\"\u003e\u003c/rect\u003e\u003cpath d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\"\u003e\u003c/path\u003e\u003c/svg\u003e\n      \u003csvg 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\"\u003e\u003cpolyline points=\"20 6 9 17 4 12\"\u003e\u003c/polyline\u003e\u003c/svg\u003e\n    \u003c/button\u003e\n  \u003c/div\u003e\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e6edf3;background-color:#0d1117;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003echown -R 99:100 /mnt/data/arr/\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/div\u003e\n\u003cp\u003eDanach ist das kein Thema mehr da die Verzeichnisse bereits existieren.\u003c/p\u003e\n\u003ch2 id=\"monitoring\"\u003eMonitoring\u003ca href=\"#monitoring\" class=\"heading-anchor\" aria-label=\"Diesen Abschnitt verlinken\"\u003e\u003csvg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"\u003e\u003cpath d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\"\u003e\u003c/path\u003e\u003cpath d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eIch setze \u003ca href=\"https://uptime.kuma.pet/\" target=\"_blank\" rel=\"noopener noreferrer\"\u003eUptime Kuma\u003csvg 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\"\u003e\n  \u003cpath d=\"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6\"/\u003e\n  \u003cpolyline points=\"15 3 21 3 21 9\"/\u003e\n  \u003cline x1=\"10\" y1=\"14\" x2=\"21\" y2=\"3\"/\u003e\n\u003c/svg\u003e\u003cspan class=\"visually-hidden\"\u003e (externer Link)\u003c/span\u003e\u003c/a\u003e\n 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 \u003ccode\u003ejournalctl -u webhook\u003c/code\u003e liefern dann die Details warum es schiefgelaufen ist.\u003c/p\u003e\n\u003cp\u003eEin Dead-Man\u0026rsquo;s-Switch (z. B. über Healthchecks.io) wäre der nächste sinnvolle Schritt wenn man auch merken will wenn ein Deploy einfach \u003cem\u003eausbleibt\u003c/em\u003e – aber für einen Media-Stack ist das für mich nicht kritisch genug um extra Aufwand zu treiben.\u003c/p\u003e\n\u003ch2 id=\"fazit\"\u003eFazit\u003ca href=\"#fazit\" class=\"heading-anchor\" aria-label=\"Diesen Abschnitt verlinken\"\u003e\u003csvg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"\u003e\u003cpath d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\"\u003e\u003c/path\u003e\u003cpath d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eDas 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.\u003c/p\u003e\n\u003cp\u003eWer ä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.\u003c/p\u003e\n\u003cp\u003eBei Fragen oder Anmerkungen erreichst du mich über die Links in der Menüleiste.\u003c/p\u003e\n","date_published":"2026-06-03T00:00:00+02:00","date_modified":"2026-06-03T00:00:00+02:00","tags":["gitops","docker","gitea","renovate","homelab"]},{"id":"https://www.teqqy.de/selfhosted-setup-2025-mein-neuer-workflow-mit-proxmox-komodo-und-gitops/","url":"https://www.teqqy.de/selfhosted-setup-2025-mein-neuer-workflow-mit-proxmox-komodo-und-gitops/","title":"Selfhosted Setup 2025: Mein neuer Workflow mit Proxmox, Komodo und GitOps","summary":"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 \u0026ldquo;alles kaputt macht\u0026rdquo;.\n","content_html":"\u003cp\u003eDiejenigen 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 \u003ca href=\"https://www.reddit.com/r/homelab/\" target=\"_blank\" rel=\"noopener noreferrer\"\u003er/homelab\u003csvg 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\"\u003e\n  \u003cpath d=\"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6\"/\u003e\n  \u003cpolyline points=\"15 3 21 3 21 9\"/\u003e\n  \u003cline x1=\"10\" y1=\"14\" x2=\"21\" y2=\"3\"/\u003e\n\u003c/svg\u003e\u003cspan class=\"visually-hidden\"\u003e (externer Link)\u003c/span\u003e\u003c/a\u003e\n 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 \u0026ldquo;alles kaputt macht\u0026rdquo;.\u003c/p\u003e\n\u003caside class=\"callout callout-info\" role=\"note\" aria-label=\"Hinweis\"\u003e\n  \u003csvg 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\"\u003e\n    \u003ccircle cx=\"12\" cy=\"12\" r=\"10\"/\u003e\n    \u003cline x1=\"12\" y1=\"8\" x2=\"12\" y2=\"12\"/\u003e\n    \u003cline x1=\"12\" y1=\"16\" x2=\"12.01\" y2=\"16\"/\u003e\n  \u003c/svg\u003e\n  \u003cdiv class=\"callout-content\"\u003e\n    \u003cp class=\"callout-title\"\u003eHinweis\u003c/p\u003e\n    \u003cdiv class=\"callout-body\"\u003e\u003cstrong\u003eGitOps\u003c/strong\u003e 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.\u003c/div\u003e\n  \u003c/div\u003e\n\u003c/aside\u003e\n\n\u003cp\u003eMein 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 \u003cem\u003e:latest\u003c/em\u003e 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.\u003c/p\u003e\n\u003cp\u003eAls 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.\u003c/p\u003e\n\u003ch2 id=\"das-grundprinzip-meines-homelabs\"\u003eDas Grundprinzip meines Homelabs\u003ca href=\"#das-grundprinzip-meines-homelabs\" class=\"heading-anchor\" aria-label=\"Diesen Abschnitt verlinken\"\u003e\u003csvg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"\u003e\u003cpath d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\"\u003e\u003c/path\u003e\u003cpath d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eNachdem ich mir ein paar Blog Beiträge (z. B. \u003ca 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\"\u003eden\u003csvg 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\"\u003e\n  \u003cpath d=\"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6\"/\u003e\n  \u003cpolyline points=\"15 3 21 3 21 9\"/\u003e\n  \u003cline x1=\"10\" y1=\"14\" x2=\"21\" y2=\"3\"/\u003e\n\u003c/svg\u003e\u003cspan class=\"visually-hidden\"\u003e (externer Link)\u003c/span\u003e\u003c/a\u003e\n hier) und YouTube Videos (z. B. \u003ca href=\"https://www.youtube.com/watch?v=O22C8Q1u4fA\" target=\"_blank\" rel=\"noopener noreferrer\"\u003edas\u003csvg 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\"\u003e\n  \u003cpath d=\"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6\"/\u003e\n  \u003cpolyline points=\"15 3 21 3 21 9\"/\u003e\n  \u003cline x1=\"10\" y1=\"14\" x2=\"21\" y2=\"3\"/\u003e\n\u003c/svg\u003e\u003cspan class=\"visually-hidden\"\u003e (externer Link)\u003c/span\u003e\u003c/a\u003e\n 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 \u0026ldquo;Backend\u0026rdquo; ggf. aussehen könnte.\u003c/p\u003e\n\u003cp\u003eDer 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.\u003c/p\u003e\n\u003cp\u003eDes 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.\u003c/p\u003e\n\u003ch2 id=\"wie-sieht-mein-homelab-jetzt-aus\"\u003eWie sieht mein Homelab jetzt aus?\u003ca href=\"#wie-sieht-mein-homelab-jetzt-aus\" class=\"heading-anchor\" aria-label=\"Diesen Abschnitt verlinken\"\u003e\u003csvg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"\u003e\u003cpath d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\"\u003e\u003c/path\u003e\u003cpath d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eMittlerweile 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.\u003c/p\u003e\n\u003cp\u003eDie 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:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003einfra01 - Für Infrastruktur relevante Systeme\u003c/li\u003e\n\u003cli\u003edocker01 - Für meine ganzen \u0026ldquo;normalen\u0026rdquo; Anwendungen\u003c/li\u003e\n\u003cli\u003emedia01 - Für alle Anwendungen rund um Bewegbild\u003c/li\u003e\n\u003cli\u003eha01 - Home Assistant\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e\u003cimg 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\"\u003e\u003c/p\u003e\n\u003cp\u003eDazu 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.\u003c/p\u003e\n\u003ch3 id=\"infra01---das-backend-meine-homelabs\"\u003einfra01 - Das Backend meine Homelabs\u003ca href=\"#infra01---das-backend-meine-homelabs\" class=\"heading-anchor\" aria-label=\"Diesen Abschnitt verlinken\"\u003e\u003csvg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"\u003e\u003cpath d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\"\u003e\u003c/path\u003e\u003cpath d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eAls 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:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eTraefik: Mein GoTo Reverse Proxy den ich eigentlich überall einsetze (Webseite: \u003ca href=\"https://traefik.io\" target=\"_blank\" rel=\"noopener noreferrer\"\u003ehttps://traefik.io\u003csvg 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\"\u003e\n  \u003cpath d=\"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6\"/\u003e\n  \u003cpolyline points=\"15 3 21 3 21 9\"/\u003e\n  \u003cline x1=\"10\" y1=\"14\" x2=\"21\" y2=\"3\"/\u003e\n\u003c/svg\u003e\u003cspan class=\"visually-hidden\"\u003e (externer Link)\u003c/span\u003e\u003c/a\u003e\n)\u003c/li\u003e\n\u003cli\u003eGitea: Interner GIT Server für sämtliche Konfigurationsdateien (Webseite: \u003ca href=\"https://about.gitea.com/\" target=\"_blank\" rel=\"noopener noreferrer\"\u003ehttps://about.gitea.com/\u003csvg 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\"\u003e\n  \u003cpath d=\"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6\"/\u003e\n  \u003cpolyline points=\"15 3 21 3 21 9\"/\u003e\n  \u003cline x1=\"10\" y1=\"14\" x2=\"21\" y2=\"3\"/\u003e\n\u003c/svg\u003e\u003cspan class=\"visually-hidden\"\u003e (externer Link)\u003c/span\u003e\u003c/a\u003e\n)\u003c/li\u003e\n\u003cli\u003eKomodo: Deployment der Container (Webseite: \u003ca href=\"https://komo.do/\" target=\"_blank\" rel=\"noopener noreferrer\"\u003ehttps://komo.do/\u003csvg 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\"\u003e\n  \u003cpath d=\"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6\"/\u003e\n  \u003cpolyline points=\"15 3 21 3 21 9\"/\u003e\n  \u003cline x1=\"10\" y1=\"14\" x2=\"21\" y2=\"3\"/\u003e\n\u003c/svg\u003e\u003cspan class=\"visually-hidden\"\u003e (externer Link)\u003c/span\u003e\u003c/a\u003e\n)\u003c/li\u003e\n\u003cli\u003eUptime-Kuma: Verfügbarkeitsmonitoring der Anwendungen (Webseite: \u003ca href=\"https://uptimekuma.org/\" target=\"_blank\" rel=\"noopener noreferrer\"\u003ehttps://uptimekuma.org/\u003csvg 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\"\u003e\n  \u003cpath d=\"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6\"/\u003e\n  \u003cpolyline points=\"15 3 21 3 21 9\"/\u003e\n  \u003cline x1=\"10\" y1=\"14\" x2=\"21\" y2=\"3\"/\u003e\n\u003c/svg\u003e\u003cspan class=\"visually-hidden\"\u003e (externer Link)\u003c/span\u003e\u003c/a\u003e\n)\u003c/li\u003e\n\u003cli\u003eAuthentik: Single Sign On für fast alle Anwendungen (Webseite: \u003ca href=\"https://goauthentik.io/\" target=\"_blank\" rel=\"noopener noreferrer\"\u003ehttps://goauthentik.io/\u003csvg 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\"\u003e\n  \u003cpath d=\"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6\"/\u003e\n  \u003cpolyline points=\"15 3 21 3 21 9\"/\u003e\n  \u003cline x1=\"10\" y1=\"14\" x2=\"21\" y2=\"3\"/\u003e\n\u003c/svg\u003e\u003cspan class=\"visually-hidden\"\u003e (externer Link)\u003c/span\u003e\u003c/a\u003e\n)\u003c/li\u003e\n\u003cli\u003eBeszel: Lastmonitoring der Systeme (Webseite: \u003ca href=\"https://beszel.dev/\" target=\"_blank\" rel=\"noopener noreferrer\"\u003ehttps://beszel.dev/\u003csvg 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\"\u003e\n  \u003cpath d=\"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6\"/\u003e\n  \u003cpolyline points=\"15 3 21 3 21 9\"/\u003e\n  \u003cline x1=\"10\" y1=\"14\" x2=\"21\" y2=\"3\"/\u003e\n\u003c/svg\u003e\u003cspan class=\"visually-hidden\"\u003e (externer Link)\u003c/span\u003e\u003c/a\u003e\n)\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"docker01---anwendungen-des-täglichen-bedarfs\"\u003edocker01 - Anwendungen des täglichen Bedarfs\u003ca href=\"#docker01---anwendungen-des-t%c3%a4glichen-bedarfs\" class=\"heading-anchor\" aria-label=\"Diesen Abschnitt verlinken\"\u003e\u003csvg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"\u003e\u003cpath d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\"\u003e\u003c/path\u003e\u003cpath d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eAuf 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 \u003ca href=\"/meine-top-10-selfhosted-und-homelab-software-2025-lieblings-tools-fuers-neue-jahr/\"\u003emeiner Top 10 schon verbloggt habe\u003c/a\u003e\n. Zusätlich aber auch Dinge wie\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eTreafik\u003c/li\u003e\n\u003cli\u003eAdGuardHome Sync: Synct meine beiden AdGuardHome LXC (Webseite: \u003ca href=\"https://github.com/bakito/adguardhome-sync\" target=\"_blank\" rel=\"noopener noreferrer\"\u003ehttps://github.com/bakito/adguardhome-sync\u003csvg 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\"\u003e\n  \u003cpath d=\"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6\"/\u003e\n  \u003cpolyline points=\"15 3 21 3 21 9\"/\u003e\n  \u003cline x1=\"10\" y1=\"14\" x2=\"21\" y2=\"3\"/\u003e\n\u003c/svg\u003e\u003cspan class=\"visually-hidden\"\u003e (externer Link)\u003c/span\u003e\u003c/a\u003e\n)\u003c/li\u003e\n\u003cli\u003eautokuma: Halbautomatisches hinzufügen der Anwendungen zu Uptime Kuma (Webseite: \u003ca href=\"https://github.com/BigBoot/AutoKuma\" target=\"_blank\" rel=\"noopener noreferrer\"\u003ehttps://github.com/BigBoot/AutoKuma\u003csvg 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\"\u003e\n  \u003cpath d=\"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6\"/\u003e\n  \u003cpolyline points=\"15 3 21 3 21 9\"/\u003e\n  \u003cline x1=\"10\" y1=\"14\" x2=\"21\" y2=\"3\"/\u003e\n\u003c/svg\u003e\u003cspan class=\"visually-hidden\"\u003e (externer Link)\u003c/span\u003e\u003c/a\u003e\n)\u003c/li\u003e\n\u003cli\u003ebeszel-agent: Monitoring Agent für Beszel\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"media01---für-das-bewegbild\"\u003emedia01 - Für das Bewegbild\u003ca href=\"#media01---f%c3%bcr-das-bewegbild\" class=\"heading-anchor\" aria-label=\"Diesen Abschnitt verlinken\"\u003e\u003csvg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"\u003e\u003cpath d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\"\u003e\u003c/path\u003e\u003cpath d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eAlle 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.\u003c/p\u003e\n\u003ch2 id=\"mein-workflow\"\u003eMein Workflow\u003ca href=\"#mein-workflow\" class=\"heading-anchor\" aria-label=\"Diesen Abschnitt verlinken\"\u003e\u003csvg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"\u003e\u003cpath d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\"\u003e\u003c/path\u003e\u003cpath d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eSchlussendlich 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.\u003c/p\u003e\n\u003cp\u003eIch habe also zwei Repositories auf meinem Git Server erstellt, einen für den docker01 als \u0026ldquo;apps-stack\u0026rdquo; sowie für den media01 als \u0026ldquo;media-stack\u0026rdquo;. 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.\nDie 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.\u003c/p\u003e\n\u003ch2 id=\"update-management-der-container\"\u003eUpdate Management der Container\u003ca href=\"#update-management-der-container\" class=\"heading-anchor\" aria-label=\"Diesen Abschnitt verlinken\"\u003e\u003csvg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"\u003e\u003cpath d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\"\u003e\u003c/path\u003e\u003cpath d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eIn 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.\u003c/p\u003e\n\u003cp\u003e\u003cimg 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\"\u003e\u003c/p\u003e\n\u003cp\u003eSollte 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.\u003c/p\u003e\n\u003ch2 id=\"backup-und-restore\"\u003eBackup und Restore\u003ca href=\"#backup-und-restore\" class=\"heading-anchor\" aria-label=\"Diesen Abschnitt verlinken\"\u003e\u003csvg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"\u003e\u003cpath d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\"\u003e\u003c/path\u003e\u003cpath d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eIm 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 \u003ca href=\"/proxmox-backup-server-auf-unraid-via-nfs-sichern/\"\u003ediesem\u003c/a\u003e\n Beitrag lesen.\u003c/p\u003e\n\u003cp\u003eWeiter 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.\u003c/p\u003e\n\u003caside class=\"callout callout-info\" role=\"note\" aria-label=\"Hinweis\"\u003e\n  \u003csvg 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\"\u003e\n    \u003ccircle cx=\"12\" cy=\"12\" r=\"10\"/\u003e\n    \u003cline x1=\"12\" y1=\"8\" x2=\"12\" y2=\"12\"/\u003e\n    \u003cline x1=\"12\" y1=\"16\" x2=\"12.01\" y2=\"16\"/\u003e\n  \u003c/svg\u003e\n  \u003cdiv class=\"callout-content\"\u003e\n    \u003cp class=\"callout-title\"\u003eHinweis\u003c/p\u003e\n    \u003cdiv class=\"callout-body\"\u003eDas \u003cstrong\u003e3-2-1\u003c/strong\u003e-Backup-Prinzip beschreibt eine einfache Strategie, um Daten zuverlässig zu schützen. Dabei existieren \u003cstrong\u003e3\u003c/strong\u003e Kopien der Daten, gespeichert auf \u003cstrong\u003e2\u003c/strong\u003e unterschiedlichen Medien, wobei \u003cstrong\u003e1\u003c/strong\u003e 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.\u003c/div\u003e\n  \u003c/div\u003e\n\u003c/aside\u003e\n\n\u003ch2 id=\"fazit\"\u003eFazit\u003ca href=\"#fazit\" class=\"heading-anchor\" aria-label=\"Diesen Abschnitt verlinken\"\u003e\u003csvg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"\u003e\u003cpath d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\"\u003e\u003c/path\u003e\u003cpath d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eDas 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.\u003c/p\u003e\n","date_published":"2025-11-30T12:20:00+01:00","date_modified":"2025-11-30T12:20:00+01:00","tags":["proxmox","komodo","gitops","gitea"]},{"id":"https://www.teqqy.de/meine-top-10-selfhosted-und-homelab-software-2025-lieblings-tools-fuers-neue-jahr/","url":"https://www.teqqy.de/meine-top-10-selfhosted-und-homelab-software-2025-lieblings-tools-fuers-neue-jahr/","title":"Meine Top 10 Selfhosted \u0026 Homelab Software 2025 – Lieblings-Tools fürs neue Jahr","summary":"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.\nPlatz 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.\n","content_html":"\u003cp\u003eWie in den Jahren \u003ca href=\"/2021-11-meine-top-10-homelab-services/\"\u003e2021\u003c/a\u003e\n und \u003ca href=\"/meine-top-10-homelab-services-2024/\"\u003e2024\u003c/a\u003e\n 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.\u003c/p\u003e\n\u003ch2 id=\"platz-10-wanderer\"\u003ePlatz 10: Wanderer\u003ca href=\"#platz-10-wanderer\" class=\"heading-anchor\" aria-label=\"Diesen Abschnitt verlinken\"\u003e\u003csvg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"\u003e\u003cpath d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\"\u003e\u003c/path\u003e\u003cpath d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eBeginnen möchte ich die Liste mit der App \u003ca href=\"https://wanderer.to\" target=\"_blank\" rel=\"noopener noreferrer\"\u003eWanderer\u003csvg 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\"\u003e\n  \u003cpath d=\"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6\"/\u003e\n  \u003cpolyline points=\"15 3 21 3 21 9\"/\u003e\n  \u003cline x1=\"10\" y1=\"14\" x2=\"21\" y2=\"3\"/\u003e\n\u003c/svg\u003e\u003cspan class=\"visually-hidden\"\u003e (externer Link)\u003c/span\u003e\u003c/a\u003e\n. Hier kannst du deine Wanderrouten sammeln – quasi ein \u003cem\u003eKomoot fürs Selfhosting\u003c/em\u003e. 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.\u003c/p\u003e\n\u003cp\u003eSeit 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.\u003c/p\u003e\n\u003cp\u003eIch 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.\u003c/p\u003e\n\u003ch2 id=\"platz-9-nextcloud\"\u003ePlatz 9: Nextcloud\u003ca href=\"#platz-9-nextcloud\" class=\"heading-anchor\" aria-label=\"Diesen Abschnitt verlinken\"\u003e\u003csvg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"\u003e\u003cpath d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\"\u003e\u003c/path\u003e\u003cpath d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003e\u003ca href=\"https://nextcloud.com\" target=\"_blank\" rel=\"noopener noreferrer\"\u003eNextcloud\u003csvg 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\"\u003e\n  \u003cpath d=\"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6\"/\u003e\n  \u003cpolyline points=\"15 3 21 3 21 9\"/\u003e\n  \u003cline x1=\"10\" y1=\"14\" x2=\"21\" y2=\"3\"/\u003e\n\u003c/svg\u003e\u003cspan class=\"visually-hidden\"\u003e (externer Link)\u003c/span\u003e\u003c/a\u003e\n 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.\u003c/p\u003e\n\u003cp\u003eIn meinem \u003ca href=\"https://teqqy.de/tags/homelab/\" target=\"_blank\" rel=\"noopener noreferrer\"\u003eHomelab\u003csvg 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\"\u003e\n  \u003cpath d=\"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6\"/\u003e\n  \u003cpolyline points=\"15 3 21 3 21 9\"/\u003e\n  \u003cline x1=\"10\" y1=\"14\" x2=\"21\" y2=\"3\"/\u003e\n\u003c/svg\u003e\u003cspan class=\"visually-hidden\"\u003e (externer Link)\u003c/span\u003e\u003c/a\u003e\n 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.\u003c/p\u003e\n\u003ch2 id=\"platz-8-jellyfin\"\u003ePlatz 8: Jellyfin\u003ca href=\"#platz-8-jellyfin\" class=\"heading-anchor\" aria-label=\"Diesen Abschnitt verlinken\"\u003e\u003csvg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"\u003e\u003cpath d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\"\u003e\u003c/path\u003e\u003cpath d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003e\u003ca href=\"https://jellyfin.org\" target=\"_blank\" rel=\"noopener noreferrer\"\u003eJellyfin\u003csvg 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\"\u003e\n  \u003cpath d=\"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6\"/\u003e\n  \u003cpolyline points=\"15 3 21 3 21 9\"/\u003e\n  \u003cline x1=\"10\" y1=\"14\" x2=\"21\" y2=\"3\"/\u003e\n\u003c/svg\u003e\u003cspan class=\"visually-hidden\"\u003e (externer Link)\u003c/span\u003e\u003c/a\u003e\n, der allseits bekannte Mediaplayer. Was für mich der Unterschied zum Platzhirsch Plex ist, habe ich schon in einem älteren \u003ca href=\"/plex-vs-jellyfin-ein-persoenlicher-vergleich/\"\u003eBlogartikel\u003c/a\u003e\n 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.\u003c/p\u003e\n\u003cp\u003eJellyfin 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.\u003c/p\u003e\n\u003ch2 id=\"platz-7-freshrss\"\u003ePlatz 7: FreshRSS\u003ca href=\"#platz-7-freshrss\" class=\"heading-anchor\" aria-label=\"Diesen Abschnitt verlinken\"\u003e\u003csvg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"\u003e\u003cpath d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\"\u003e\u003c/path\u003e\u003cpath d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eZu \u003ca href=\"https://freshrss.org\" target=\"_blank\" rel=\"noopener noreferrer\"\u003eFreshRSS\u003csvg 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\"\u003e\n  \u003cpath d=\"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6\"/\u003e\n  \u003cpolyline points=\"15 3 21 3 21 9\"/\u003e\n  \u003cline x1=\"10\" y1=\"14\" x2=\"21\" y2=\"3\"/\u003e\n\u003c/svg\u003e\u003cspan class=\"visually-hidden\"\u003e (externer Link)\u003c/span\u003e\u003c/a\u003e\n habe ich schon ein paar Mal etwas veröffentlicht. Für mich ist es weiterhin \u003cem\u003edie\u003c/em\u003e 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 \u003cem\u003eReeder\u003c/em\u003e auf meine Instanz zu – diese Verbindung funktioniert seit jeher absolut zuverlässig.\u003c/p\u003e\n\u003ch2 id=\"platz-6-mealie\"\u003ePlatz 6: Mealie\u003ca href=\"#platz-6-mealie\" class=\"heading-anchor\" aria-label=\"Diesen Abschnitt verlinken\"\u003e\u003csvg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"\u003e\u003cpath d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\"\u003e\u003c/path\u003e\u003cpath d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eWer gerne kocht, kennt das Problem: Rezepte sind überall verteilt, und viele Rezeptseiten sind inzwischen reine Tracking- und Werbeschleudern. Deshalb setze ich auf \u003ca href=\"https://mealie.io\" target=\"_blank\" rel=\"noopener noreferrer\"\u003eMealie\u003csvg 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\"\u003e\n  \u003cpath d=\"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6\"/\u003e\n  \u003cpolyline points=\"15 3 21 3 21 9\"/\u003e\n  \u003cline x1=\"10\" y1=\"14\" x2=\"21\" y2=\"3\"/\u003e\n\u003c/svg\u003e\u003cspan class=\"visually-hidden\"\u003e (externer Link)\u003c/span\u003e\u003c/a\u003e\n und trage dort alle Rezepte ein, die sich lohnen.\u003c/p\u003e\n\u003cp\u003e\u003cimg 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\"\u003e\u003c/p\u003e\n\u003cp\u003eMealie 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.\u003c/p\u003e\n\u003cp\u003eMealie 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!\u003c/p\u003e\n\u003ch2 id=\"platz-5-immich\"\u003ePlatz 5: Immich\u003ca href=\"#platz-5-immich\" class=\"heading-anchor\" aria-label=\"Diesen Abschnitt verlinken\"\u003e\u003csvg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"\u003e\u003cpath d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\"\u003e\u003c/path\u003e\u003cpath d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003e\u003ca href=\"https://immich.app\" target=\"_blank\" rel=\"noopener noreferrer\"\u003eImmich\u003csvg 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\"\u003e\n  \u003cpath d=\"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6\"/\u003e\n  \u003cpolyline points=\"15 3 21 3 21 9\"/\u003e\n  \u003cline x1=\"10\" y1=\"14\" x2=\"21\" y2=\"3\"/\u003e\n\u003c/svg\u003e\u003cspan class=\"visually-hidden\"\u003e (externer Link)\u003c/span\u003e\u003c/a\u003e\n 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.\u003c/p\u003e\n\u003cp\u003eEines meiner Highlights ist die \u003cem\u003eErinnerungen\u003c/em\u003e-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.\u003c/p\u003e\n\u003cp\u003eDie 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.\u003c/p\u003e\n\u003ch2 id=\"platz-4-adventure-log\"\u003ePlatz 4: Adventure Log\u003ca href=\"#platz-4-adventure-log\" class=\"heading-anchor\" aria-label=\"Diesen Abschnitt verlinken\"\u003e\u003csvg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"\u003e\u003cpath d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\"\u003e\u003c/path\u003e\u003cpath d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003e\u003ca href=\"https://adventurelog.app\" target=\"_blank\" rel=\"noopener noreferrer\"\u003eAdventure Log\u003csvg 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\"\u003e\n  \u003cpath d=\"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6\"/\u003e\n  \u003cpolyline points=\"15 3 21 3 21 9\"/\u003e\n  \u003cline x1=\"10\" y1=\"14\" x2=\"21\" y2=\"3\"/\u003e\n\u003c/svg\u003e\u003cspan class=\"visually-hidden\"\u003e (externer Link)\u003c/span\u003e\u003c/a\u003e\n war ein Zufallsfund im Subreddit r/selfhosted. Der Entwickler hat die Software dort kurz vorgestellt, und seitdem bin ich Fan.\u003c/p\u003e\n\u003cp\u003e\u003cimg 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\"\u003e\u003c/p\u003e\n\u003cp\u003eMit 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.\u003c/p\u003e\n\u003cp\u003eHier spielt auch wieder die Immich-Integration eine Rolle: Man kann auf Alben aus Immich verweisen und sie direkt in den jeweiligen Reisen anzeigen.\u003c/p\u003e\n\u003cp\u003eAdventure 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.\u003c/p\u003e\n\u003ch2 id=\"platz-3-statistics-for-strava\"\u003ePlatz 3: Statistics for Strava\u003ca href=\"#platz-3-statistics-for-strava\" class=\"heading-anchor\" aria-label=\"Diesen Abschnitt verlinken\"\u003e\u003csvg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"\u003e\u003cpath d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\"\u003e\u003c/path\u003e\u003cpath d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eSeit einigen Monaten gehe ich wieder regelmäßig laufen. \u003cstrong\u003eStrava\u003c/strong\u003e begleitet mich dabei schon seit Jahren. \u003ca href=\"https://github.com/robiningelbrecht/statistics-for-strava\" target=\"_blank\" rel=\"noopener noreferrer\"\u003eStatistics for Strava\u003csvg 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\"\u003e\n  \u003cpath d=\"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6\"/\u003e\n  \u003cpolyline points=\"15 3 21 3 21 9\"/\u003e\n  \u003cline x1=\"10\" y1=\"14\" x2=\"21\" y2=\"3\"/\u003e\n\u003c/svg\u003e\u003cspan class=\"visually-hidden\"\u003e (externer Link)\u003c/span\u003e\u003c/a\u003e\n erweitert die Funktionen des Standardaccounts um zusätzliche Auswertungen. Wichtig: Der Entwickler darf laut API-Richtlinien keine Features anbieten, die mit Strava Premium konkurrieren.\u003c/p\u003e\n\u003cp\u003e\u003cimg 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\"\u003e\u003c/p\u003e\n\u003cp\u003eTrotzdem 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.\u003c/p\u003e\n\u003cp\u003eStatistics 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.\u003c/p\u003e\n\u003cp\u003eWenn du möchtest, kannst du mir gern auf \u003ca href=\"https://www.strava.com/athletes/4091921\" target=\"_blank\" rel=\"noopener noreferrer\"\u003eStrava\u003csvg 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\"\u003e\n  \u003cpath d=\"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6\"/\u003e\n  \u003cpolyline points=\"15 3 21 3 21 9\"/\u003e\n  \u003cline x1=\"10\" y1=\"14\" x2=\"21\" y2=\"3\"/\u003e\n\u003c/svg\u003e\u003cspan class=\"visually-hidden\"\u003e (externer Link)\u003c/span\u003e\u003c/a\u003e\n folgen.\u003c/p\u003e\n\u003ch2 id=\"platz-2-mastodon\"\u003ePlatz 2: Mastodon\u003ca href=\"#platz-2-mastodon\" class=\"heading-anchor\" aria-label=\"Diesen Abschnitt verlinken\"\u003e\u003csvg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"\u003e\u003cpath d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\"\u003e\u003c/path\u003e\u003cpath d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003e\u003ca href=\"https://joinmastodon.org\" target=\"_blank\" rel=\"noopener noreferrer\"\u003eMastodon\u003csvg 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\"\u003e\n  \u003cpath d=\"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6\"/\u003e\n  \u003cpolyline points=\"15 3 21 3 21 9\"/\u003e\n  \u003cline x1=\"10\" y1=\"14\" x2=\"21\" y2=\"3\"/\u003e\n\u003c/svg\u003e\u003cspan class=\"visually-hidden\"\u003e (externer Link)\u003c/span\u003e\u003c/a\u003e\n 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 \u003ca href=\"/gotosocial-als-activitypub-server-meine-erfahrungen/\"\u003eBeiträge\u003c/a\u003e\n beschrieben habe.\u003c/p\u003e\n\u003cp\u003eTrotzdem 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.\u003c/p\u003e\n\u003cp\u003eBei mir läuft Mastodon als Docker-Container auf meinem VPS, auf dem auch dieser Blog gehostet ist. Die Container-Installation macht Updates deutlich einfacher.\u003c/p\u003e\n\u003ch2 id=\"platz-1-proxmox\"\u003ePlatz 1: Proxmox\u003ca href=\"#platz-1-proxmox\" class=\"heading-anchor\" aria-label=\"Diesen Abschnitt verlinken\"\u003e\u003csvg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"\u003e\u003cpath d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\"\u003e\u003c/path\u003e\u003cpath d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eDie wohl wichtigste Software in meinem Homelab ist definitiv \u003ca href=\"https://www.proxmox.com\" target=\"_blank\" rel=\"noopener noreferrer\"\u003eProxmox\u003csvg 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\"\u003e\n  \u003cpath d=\"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6\"/\u003e\n  \u003cpolyline points=\"15 3 21 3 21 9\"/\u003e\n  \u003cline x1=\"10\" y1=\"14\" x2=\"21\" y2=\"3\"/\u003e\n\u003c/svg\u003e\u003cspan class=\"visually-hidden\"\u003e (externer Link)\u003c/span\u003e\u003c/a\u003e\n. 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.\u003c/p\u003e\n\u003cp\u003eDamit 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. 😊\u003c/p\u003e\n\u003cp\u003eSpannend finde ich jedenfalls, wie sich mein Homelab über die Jahre verändert hat – und das bringt mich direkt zum Fazit.\u003c/p\u003e\n\u003ch2 id=\"fazit--was-sich-seit-2024-verändert-hat\"\u003eFazit – was sich seit 2024 verändert hat\u003ca href=\"#fazit--was-sich-seit-2024-ver%c3%a4ndert-hat\" class=\"heading-anchor\" aria-label=\"Diesen Abschnitt verlinken\"\u003e\u003csvg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"\u003e\u003cpath d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\"\u003e\u003c/path\u003e\u003cpath d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eWenn 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.\u003c/p\u003e\n\u003cp\u003eDas 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.\u003c/p\u003e\n\u003cp\u003eEin 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.\u003c/p\u003e\n\u003cp\u003eSpannend 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.\u003c/p\u003e\n\u003cp\u003eMal 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.\u003c/p\u003e\n","date_published":"2025-10-13T17:20:00+01:00","date_modified":"2025-10-13T17:20:00+01:00","tags":["proxmox","mastodon","nextcloud","jellyfin"]},{"id":"https://www.teqqy.de/gotosocial-als-activitypub-server-meine-erfahrungen/","url":"https://www.teqqy.de/gotosocial-als-activitypub-server-meine-erfahrungen/","title":"GoToSocial als ActivityPub Server - Meine Erfahrungen","summary":"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.\n","content_html":"\u003cp\u003eIch bin seit der Übernahme von Twitter durch Elon Musk auch auf \u003ca href=\"https://joinmastodon.org/de\" target=\"_blank\" rel=\"noopener noreferrer\"\u003eMastodon\u003csvg 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\"\u003e\n  \u003cpath d=\"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6\"/\u003e\n  \u003cpolyline points=\"15 3 21 3 21 9\"/\u003e\n  \u003cline x1=\"10\" y1=\"14\" x2=\"21\" y2=\"3\"/\u003e\n\u003c/svg\u003e\u003cspan class=\"visually-hidden\"\u003e (externer Link)\u003c/span\u003e\u003c/a\u003e\n 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.\u003c/p\u003e\n\u003cp\u003e\u003cimg 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\"\u003e\u003c/p\u003e\n\u003ch2 id=\"mein-werdegang-im-fediverse\"\u003eMein Werdegang im Fediverse\u003ca href=\"#mein-werdegang-im-fediverse\" class=\"heading-anchor\" aria-label=\"Diesen Abschnitt verlinken\"\u003e\u003csvg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"\u003e\u003cpath d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\"\u003e\u003c/path\u003e\u003cpath d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eSeit 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 \u003ca href=\"https://mastodon.social/explore\" target=\"_blank\" rel=\"noopener noreferrer\"\u003emastodon.social\u003csvg 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\"\u003e\n  \u003cpath d=\"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6\"/\u003e\n  \u003cpolyline points=\"15 3 21 3 21 9\"/\u003e\n  \u003cline x1=\"10\" y1=\"14\" x2=\"21\" y2=\"3\"/\u003e\n\u003c/svg\u003e\u003cspan class=\"visually-hidden\"\u003e (externer Link)\u003c/span\u003e\u003c/a\u003e\n oder \u003ca href=\"https://chaos.social/explore\" target=\"_blank\" rel=\"noopener noreferrer\"\u003echaos.social\u003csvg 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\"\u003e\n  \u003cpath d=\"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6\"/\u003e\n  \u003cpolyline points=\"15 3 21 3 21 9\"/\u003e\n  \u003cline x1=\"10\" y1=\"14\" x2=\"21\" y2=\"3\"/\u003e\n\u003c/svg\u003e\u003cspan class=\"visually-hidden\"\u003e (externer Link)\u003c/span\u003e\u003c/a\u003e\n 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.\u003c/p\u003e\n\u003ch2 id=\"umzug-ins-homelab\"\u003eUmzug ins Homelab\u003ca href=\"#umzug-ins-homelab\" class=\"heading-anchor\" aria-label=\"Diesen Abschnitt verlinken\"\u003e\u003csvg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"\u003e\u003cpath d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\"\u003e\u003c/path\u003e\u003cpath d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eEin paar Monate später lief mein Kubernetes-\u003ca href=\"https://teqqy.de/tags/homelab/\" target=\"_blank\" rel=\"noopener noreferrer\"\u003eHomelab\u003csvg 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\"\u003e\n  \u003cpath d=\"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6\"/\u003e\n  \u003cpolyline points=\"15 3 21 3 21 9\"/\u003e\n  \u003cline x1=\"10\" y1=\"14\" x2=\"21\" y2=\"3\"/\u003e\n\u003c/svg\u003e\u003cspan class=\"visually-hidden\"\u003e (externer Link)\u003c/span\u003e\u003c/a\u003e\n 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.\u003c/p\u003e\n\u003ch2 id=\"der-umstieg-auf-gotosocial\"\u003eDer Umstieg auf GoToSocial\u003ca href=\"#der-umstieg-auf-gotosocial\" class=\"heading-anchor\" aria-label=\"Diesen Abschnitt verlinken\"\u003e\u003csvg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"\u003e\u003cpath d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\"\u003e\u003c/path\u003e\u003cpath d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eVor einigen Wochen schrieb \u003ca href=\"https://me.klein.ruhr/@matthias\" target=\"_blank\" rel=\"noopener noreferrer\"\u003eMatthias\u003csvg 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\"\u003e\n  \u003cpath d=\"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6\"/\u003e\n  \u003cpolyline points=\"15 3 21 3 21 9\"/\u003e\n  \u003cline x1=\"10\" y1=\"14\" x2=\"21\" y2=\"3\"/\u003e\n\u003c/svg\u003e\u003cspan class=\"visually-hidden\"\u003e (externer Link)\u003c/span\u003e\u003c/a\u003e\n dann über sein Experiment mit \u003ca href=\"https://gotosocial.org/\" target=\"_blank\" rel=\"noopener noreferrer\"\u003eGoToSocial\u003csvg 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\"\u003e\n  \u003cpath d=\"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6\"/\u003e\n  \u003cpolyline points=\"15 3 21 3 21 9\"/\u003e\n  \u003cline x1=\"10\" y1=\"14\" x2=\"21\" y2=\"3\"/\u003e\n\u003c/svg\u003e\u003cspan class=\"visually-hidden\"\u003e (externer Link)\u003c/span\u003e\u003c/a\u003e\n – 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.\u003c/p\u003e\n\u003cp\u003eMatthias hat hier ein paar Beobachtungen \u003ca href=\"https://blog.klein.ruhr/gotosocial-ready-for-prime-time\" target=\"_blank\" rel=\"noopener noreferrer\"\u003eauf seinem Blog\u003csvg 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\"\u003e\n  \u003cpath d=\"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6\"/\u003e\n  \u003cpolyline points=\"15 3 21 3 21 9\"/\u003e\n  \u003cline x1=\"10\" y1=\"14\" x2=\"21\" y2=\"3\"/\u003e\n\u003c/svg\u003e\u003cspan class=\"visually-hidden\"\u003e (externer Link)\u003c/span\u003e\u003c/a\u003e\n dazu geschrieben was die Unterschiede der Performance sowie des Resourcenverbrauches angeht. Sehr spannend zu lesen.\u003c/p\u003e\n\u003cp\u003eAlso 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.\u003c/p\u003e\n\u003ch2 id=\"problem-nummer-1---wanderer-und-das-schweigen-im-feed\"\u003eProblem Nummer 1 - Wanderer und das schweigen im Feed\u003ca href=\"#problem-nummer-1---wanderer-und-das-schweigen-im-feed\" class=\"heading-anchor\" aria-label=\"Diesen Abschnitt verlinken\"\u003e\u003csvg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"\u003e\u003cpath d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\"\u003e\u003c/path\u003e\u003cpath d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eDas 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 \u003ca href=\"https://wanderer.to/\" target=\"_blank\" rel=\"noopener noreferrer\"\u003eWanderer\u003csvg 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\"\u003e\n  \u003cpath d=\"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6\"/\u003e\n  \u003cpolyline points=\"15 3 21 3 21 9\"/\u003e\n  \u003cline x1=\"10\" y1=\"14\" x2=\"21\" y2=\"3\"/\u003e\n\u003c/svg\u003e\u003cspan class=\"visually-hidden\"\u003e (externer Link)\u003c/span\u003e\u003c/a\u003e\n 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.\u003c/p\u003e\n\u003cp\u003eNach 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\u0026hellip; Nix\u0026hellip;\nNach 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.\u003c/p\u003e\n\u003cp\u003eIch 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.\u003c/p\u003e\n\u003ch2 id=\"problem-nummer-2---peertube-und-seine-follower\"\u003eProblem Nummer 2 - PeerTube und seine Follower\u003ca href=\"#problem-nummer-2---peertube-und-seine-follower\" class=\"heading-anchor\" aria-label=\"Diesen Abschnitt verlinken\"\u003e\u003csvg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"\u003e\u003cpath d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\"\u003e\u003c/path\u003e\u003cpath d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eDas 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 \u003ca href=\"https://joinpeertube.org/de\" target=\"_blank\" rel=\"noopener noreferrer\"\u003ePeerTube\u003csvg 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\"\u003e\n  \u003cpath d=\"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6\"/\u003e\n  \u003cpolyline points=\"15 3 21 3 21 9\"/\u003e\n  \u003cline x1=\"10\" y1=\"14\" x2=\"21\" y2=\"3\"/\u003e\n\u003c/svg\u003e\u003cspan class=\"visually-hidden\"\u003e (externer Link)\u003c/span\u003e\u003c/a\u003e\n an: eine dezentrale Videoplattform, die nach dem gleichen Prinzip funktioniert wie Mastodon, nur eben für Videos.\u003c/p\u003e\n\u003cp\u003eDie 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.\u003c/p\u003e\n\u003cp\u003eAuch 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.\u003c/p\u003e\n\u003cp\u003eIch 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.\u003c/p\u003e\n\u003ch2 id=\"zwischenfazit--kleine-tools-große-hürden\"\u003eZwischenfazit – Kleine Tools, große Hürden\u003ca href=\"#zwischenfazit--kleine-tools-gro%c3%9fe-h%c3%bcrden\" class=\"heading-anchor\" aria-label=\"Diesen Abschnitt verlinken\"\u003e\u003csvg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"\u003e\u003cpath d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\"\u003e\u003c/path\u003e\u003cpath d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eIch 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.\u003c/p\u003e\n\u003cp\u003eDer 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.\u003c/p\u003e\n\u003cp\u003eUnd 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.\u003c/p\u003e\n\u003ch2 id=\"fazit\"\u003eFazit\u003ca href=\"#fazit\" class=\"heading-anchor\" aria-label=\"Diesen Abschnitt verlinken\"\u003e\u003csvg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"\u003e\u003cpath d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\"\u003e\u003c/path\u003e\u003cpath d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eWer 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..\u003c/p\u003e\n","date_published":"2025-10-05T11:20:00+01:00","date_modified":"2025-10-05T11:20:00+01:00","tags":["fediverse","mastodon"]},{"id":"https://www.teqqy.de/iventoy-pxe-server-unter-debian-lxc-installieren/","url":"https://www.teqqy.de/iventoy-pxe-server-unter-debian-lxc-installieren/","title":"iVentoy PXE Server unter Debian LXC installieren","summary":"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.\nEs 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.\n","content_html":"\u003cp\u003eIn 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.\u003c/p\u003e\n\u003cp\u003eEs 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.\u003c/p\u003e\n\u003cp\u003eIch 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.\u003c/p\u003e\n\u003ch2 id=\"was-ist-ein-pxe-server\"\u003eWas ist ein PXE Server?\u003ca href=\"#was-ist-ein-pxe-server\" class=\"heading-anchor\" aria-label=\"Diesen Abschnitt verlinken\"\u003e\u003csvg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"\u003e\u003cpath d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\"\u003e\u003c/path\u003e\u003cpath d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eEin 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.\u003c/p\u003e\n\u003ch2 id=\"lxc-anlegen\"\u003eLXC anlegen\u003ca href=\"#lxc-anlegen\" class=\"heading-anchor\" aria-label=\"Diesen Abschnitt verlinken\"\u003e\u003csvg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"\u003e\u003cpath d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\"\u003e\u003c/path\u003e\u003cpath d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eUnter 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.\nZudem 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.\nWenn 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\u003c/p\u003e\n\u003cdiv class=\"code-block\"\u003e\n  \u003cdiv class=\"code-block-header\"\u003e\n    \u003cspan class=\"code-lang-label\"\u003ebash\u003c/span\u003e\n    \u003cbutton class=\"code-copy-btn\" type=\"button\" aria-label=\"Code kopieren\" data-umami-event=\"Code Copy\" data-umami-event-lang=\"bash\"\u003e\n      \u003csvg 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\"\u003e\u003crect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\"\u003e\u003c/rect\u003e\u003cpath d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\"\u003e\u003c/path\u003e\u003c/svg\u003e\n      \u003csvg 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\"\u003e\u003cpolyline points=\"20 6 9 17 4 12\"\u003e\u003c/polyline\u003e\u003c/svg\u003e\n    \u003c/button\u003e\n  \u003c/div\u003e\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e6edf3;background-color:#0d1117;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003enano /etc/pve/lxc/\u0026lt;LXC ID\u0026gt;.conf\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/div\u003e\n\u003cp\u003eDie LXC ID siehst du im Proxmox Frontend.\nHier fügen wir am Ende folgendes ein\u003c/p\u003e\n\u003cdiv class=\"code-block\"\u003e\n  \u003cdiv class=\"code-block-header\"\u003e\n    \u003cspan class=\"code-lang-label\"\u003e\u003c/span\u003e\n    \u003cbutton class=\"code-copy-btn\" type=\"button\" aria-label=\"Code kopieren\" data-umami-event=\"Code Copy\" data-umami-event-lang=\"\"\u003e\n      \u003csvg 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\"\u003e\u003crect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\"\u003e\u003c/rect\u003e\u003cpath d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\"\u003e\u003c/path\u003e\u003c/svg\u003e\n      \u003csvg 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\"\u003e\u003cpolyline points=\"20 6 9 17 4 12\"\u003e\u003c/polyline\u003e\u003c/svg\u003e\n    \u003c/button\u003e\n  \u003c/div\u003e\u003cpre tabindex=\"0\"\u003e\u003ccode\u003elxc.apparmor.profile: unconfined\nlxc.cap.drop:\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cp\u003eNun können wir den Container starten.\u003c/p\u003e\n\u003ch2 id=\"iventoy-installieren\"\u003eiVentoy installieren\u003ca href=\"#iventoy-installieren\" class=\"heading-anchor\" aria-label=\"Diesen Abschnitt verlinken\"\u003e\u003csvg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"\u003e\u003cpath d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\"\u003e\u003c/path\u003e\u003cpath d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eAls erstes sollten wir natürlich das System aktualliseren\u003c/p\u003e\n\u003cdiv class=\"code-block\"\u003e\n  \u003cdiv class=\"code-block-header\"\u003e\n    \u003cspan class=\"code-lang-label\"\u003ebash\u003c/span\u003e\n    \u003cbutton class=\"code-copy-btn\" type=\"button\" aria-label=\"Code kopieren\" data-umami-event=\"Code Copy\" data-umami-event-lang=\"bash\"\u003e\n      \u003csvg 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\"\u003e\u003crect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\"\u003e\u003c/rect\u003e\u003cpath d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\"\u003e\u003c/path\u003e\u003c/svg\u003e\n      \u003csvg 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\"\u003e\u003cpolyline points=\"20 6 9 17 4 12\"\u003e\u003c/polyline\u003e\u003c/svg\u003e\n    \u003c/button\u003e\n  \u003c/div\u003e\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e6edf3;background-color:#0d1117;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eapt update \u003cspan style=\"color:#ff7b72;font-weight:bold\"\u003e\u0026amp;\u0026amp;\u003c/span\u003e apt upgrade -y\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/div\u003e\n\u003cp\u003eJetzt benötigen wir bei einem LXC noch diverse Pakete. Bei einer VM könnten diese nicht notwendig sein.\u003c/p\u003e\n\u003cdiv class=\"code-block\"\u003e\n  \u003cdiv class=\"code-block-header\"\u003e\n    \u003cspan class=\"code-lang-label\"\u003ebash\u003c/span\u003e\n    \u003cbutton class=\"code-copy-btn\" type=\"button\" aria-label=\"Code kopieren\" data-umami-event=\"Code Copy\" data-umami-event-lang=\"bash\"\u003e\n      \u003csvg 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\"\u003e\u003crect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\"\u003e\u003c/rect\u003e\u003cpath d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\"\u003e\u003c/path\u003e\u003c/svg\u003e\n      \u003csvg 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\"\u003e\u003cpolyline points=\"20 6 9 17 4 12\"\u003e\u003c/polyline\u003e\u003c/svg\u003e\n    \u003c/button\u003e\n  \u003c/div\u003e\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e6edf3;background-color:#0d1117;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eapt install libevent-2.1-7 libevent-pthreads-2.1-7 glibc libwim15 libhivex0 wget\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/div\u003e\n\u003cp\u003eJetzt laden wir uns noch das aktuelle Paket bei \u003ca href=\"https://github.com/ventoy/PXE/releases\" target=\"_blank\" rel=\"noopener noreferrer\"\u003eGitHub\u003csvg 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\"\u003e\n  \u003cpath d=\"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6\"/\u003e\n  \u003cpolyline points=\"15 3 21 3 21 9\"/\u003e\n  \u003cline x1=\"10\" y1=\"14\" x2=\"21\" y2=\"3\"/\u003e\n\u003c/svg\u003e\u003cspan class=\"visually-hidden\"\u003e (externer Link)\u003c/span\u003e\u003c/a\u003e\n herunter. Am besten vorher die aktuelle Version kontrollieren.\u003c/p\u003e\n\u003cdiv class=\"code-block\"\u003e\n  \u003cdiv class=\"code-block-header\"\u003e\n    \u003cspan class=\"code-lang-label\"\u003ebash\u003c/span\u003e\n    \u003cbutton class=\"code-copy-btn\" type=\"button\" aria-label=\"Code kopieren\" data-umami-event=\"Code Copy\" data-umami-event-lang=\"bash\"\u003e\n      \u003csvg 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\"\u003e\u003crect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\"\u003e\u003c/rect\u003e\u003cpath d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\"\u003e\u003c/path\u003e\u003c/svg\u003e\n      \u003csvg 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\"\u003e\u003cpolyline points=\"20 6 9 17 4 12\"\u003e\u003c/polyline\u003e\u003c/svg\u003e\n    \u003c/button\u003e\n  \u003c/div\u003e\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e6edf3;background-color:#0d1117;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ewget https://github.com/ventoy/PXE/releases/download/v1.0.20/iventoy-1.0.20-linux-free.tar.gz\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/div\u003e\n\u003cp\u003eAnschließend können wir das Paket entpacken\u003c/p\u003e\n\u003cdiv class=\"code-block\"\u003e\n  \u003cdiv class=\"code-block-header\"\u003e\n    \u003cspan class=\"code-lang-label\"\u003ebash\u003c/span\u003e\n    \u003cbutton class=\"code-copy-btn\" type=\"button\" aria-label=\"Code kopieren\" data-umami-event=\"Code Copy\" data-umami-event-lang=\"bash\"\u003e\n      \u003csvg 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\"\u003e\u003crect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\"\u003e\u003c/rect\u003e\u003cpath d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\"\u003e\u003c/path\u003e\u003c/svg\u003e\n      \u003csvg 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\"\u003e\u003cpolyline points=\"20 6 9 17 4 12\"\u003e\u003c/polyline\u003e\u003c/svg\u003e\n    \u003c/button\u003e\n  \u003c/div\u003e\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e6edf3;background-color:#0d1117;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003etar xvfz iventoy-1.0.20-linux-free.tar.gz\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/div\u003e\n\u003cp\u003eIch für meinen Teil packe solche Installationen immer nach \u003ccode\u003e/opt\u003c/code\u003e, aber das kannst du gerne anpassen. Ich verschiebe also die iVentoy Installation und benenne gleichzeitig den Ordner um\u003c/p\u003e\n\u003cdiv class=\"code-block\"\u003e\n  \u003cdiv class=\"code-block-header\"\u003e\n    \u003cspan class=\"code-lang-label\"\u003ebash\u003c/span\u003e\n    \u003cbutton class=\"code-copy-btn\" type=\"button\" aria-label=\"Code kopieren\" data-umami-event=\"Code Copy\" data-umami-event-lang=\"bash\"\u003e\n      \u003csvg 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\"\u003e\u003crect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\"\u003e\u003c/rect\u003e\u003cpath d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\"\u003e\u003c/path\u003e\u003c/svg\u003e\n      \u003csvg 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\"\u003e\u003cpolyline points=\"20 6 9 17 4 12\"\u003e\u003c/polyline\u003e\u003c/svg\u003e\n    \u003c/button\u003e\n  \u003c/div\u003e\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e6edf3;background-color:#0d1117;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003emv iventoy-1.0.20-linux-free /opt/pxe\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/div\u003e\n\u003cp\u003eEs sollte bei dir dann ungefähr so aussehen.\n\u003cimg 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\"\u003e\nWichtig ist das Verzeichnis \u003cstrong\u003eISO\u003c/strong\u003e, weil du dort alle ISO Dateien ablegen muss welche du im Netzwerk verfügbar haben möchtest.\u003c/p\u003e\n\u003ch2 id=\"iventoy-starten-und-einrichten\"\u003eiVentoy starten und einrichten\u003ca href=\"#iventoy-starten-und-einrichten\" class=\"heading-anchor\" aria-label=\"Diesen Abschnitt verlinken\"\u003e\u003csvg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"\u003e\u003cpath d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\"\u003e\u003c/path\u003e\u003cpath d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eNun können wir das Programm starten\u003c/p\u003e\n\u003cdiv class=\"code-block\"\u003e\n  \u003cdiv class=\"code-block-header\"\u003e\n    \u003cspan class=\"code-lang-label\"\u003ebash\u003c/span\u003e\n    \u003cbutton class=\"code-copy-btn\" type=\"button\" aria-label=\"Code kopieren\" data-umami-event=\"Code Copy\" data-umami-event-lang=\"bash\"\u003e\n      \u003csvg 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\"\u003e\u003crect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\"\u003e\u003c/rect\u003e\u003cpath d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\"\u003e\u003c/path\u003e\u003c/svg\u003e\n      \u003csvg 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\"\u003e\u003cpolyline points=\"20 6 9 17 4 12\"\u003e\u003c/polyline\u003e\u003c/svg\u003e\n    \u003c/button\u003e\n  \u003c/div\u003e\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e6edf3;background-color:#0d1117;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e./iventoy.sh start\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/div\u003e\n\u003cp\u003eDu bekommst dann eine Ausgabe unter welcher PID der Prozess läuft und wie du auf die Webseite zugreifen kannst.\nWir rufen also die iVentoy Seite einmal mit der IP deines Containers sowie Port 26000 auf und bekommen dann sowas angezeigt\n\u003cimg 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\"\u003e\nNun 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 \u003cstrong\u003eConfiguration\u003c/strong\u003e und stellst bei \u003cstrong\u003eServer Mode\u003c/strong\u003e auf \u003cstrong\u003eExternal\u003c/strong\u003e. Etwas oben drüber dann auf speichern klicken.\nUnter \u003cstrong\u003eImage Management\u003c/strong\u003e 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.\u003c/p\u003e\n\u003cp\u003eZu guter letzte müssen wir den Server \u0026ldquo;nochmal\u0026rdquo; starten. Unter \u003cstrong\u003eBoot Information\u003c/strong\u003e ist rechts ein Play-Button der grün hinterlegt ist. Den musst du unbedingt anklicken, sonst funktioniert es nicht.\u003c/p\u003e\n\u003cp\u003eWenn du jetzt ein System mit der Bootoption Netzwerk am Anfang startest erwartet dich dann solch eine Anzeige\n\u003cimg 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\"\u003e\u003c/p\u003e\n","date_published":"2025-03-26T12:00:00+01:00","date_modified":"2025-03-26T12:00:00+01:00","tags":["pxe","proxmox","linux"]},{"id":"https://www.teqqy.de/zahlen-daten-fakten-nach-fuenf-jahren-tesla-model-3/","url":"https://www.teqqy.de/zahlen-daten-fakten-nach-fuenf-jahren-tesla-model-3/","title":"Tesla Model 3: Warum ich nach 5 Jahren \u0026 77.000 km verkaufe","summary":"Tesla Model 3 Langzeittest: 77.000 km nach 5 Jahren - Ehrliche Bilanz zu Kosten, Verbrauch \u0026amp; 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.\n","content_html":"\u003ch1 id=\"tesla-model-3-langzeittest-77000-km-nach-5-jahren---ehrliche-bilanz-zu-kosten-verbrauch--akkugesundheit\"\u003eTesla Model 3 Langzeittest: 77.000 km nach 5 Jahren - Ehrliche Bilanz zu Kosten, Verbrauch \u0026amp; Akkugesundheit\u003ca href=\"#tesla-model-3-langzeittest-77000-km-nach-5-jahren---ehrliche-bilanz-zu-kosten-verbrauch--akkugesundheit\" class=\"heading-anchor\" aria-label=\"Diesen Abschnitt verlinken\"\u003e\u003csvg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"\u003e\u003cpath d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\"\u003e\u003c/path\u003e\u003cpath d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/h1\u003e\n\u003cp\u003eNach 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.\u003c/p\u003e\n\u003ch2 id=\"der-start-corona-sei-dank-fast-ohne-auto-dastanden\"\u003eDer Start: Corona sei Dank fast ohne Auto dastanden\u003ca href=\"#der-start-corona-sei-dank-fast-ohne-auto-dastanden\" class=\"heading-anchor\" aria-label=\"Diesen Abschnitt verlinken\"\u003e\u003csvg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"\u003e\u003cpath d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\"\u003e\u003c/path\u003e\u003cpath d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eVor 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.\u003c/p\u003e\n\u003ch2 id=\"verarbeitungsqualität-nach-5-jahren-besser-als-ihr-ruf\"\u003eVerarbeitungsqualität nach 5 Jahren: Besser als ihr Ruf\u003ca href=\"#verarbeitungsqualit%c3%a4t-nach-5-jahren-besser-als-ihr-ruf\" class=\"heading-anchor\" aria-label=\"Diesen Abschnitt verlinken\"\u003e\u003csvg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"\u003e\u003cpath d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\"\u003e\u003c/path\u003e\u003cpath d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eIn 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\u0026hellip;\u003c/p\u003e\n\u003cp\u003eIm 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.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eWas nach 5 Jahren auffällt:\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eKeine größeren Qualitätsprobleme\u003c/li\u003e\n\u003cli\u003eEinzelne fehlende Plastikfixierungen im Innenraum\u003c/li\u003e\n\u003cli\u003eLackierung und Verarbeitung insgesamt solide\u003c/li\u003e\n\u003cli\u003eKeine Rostprobleme oder Spaltmaße-Dramen\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"verbrauch-und-kosten-im-detail-die-nackten-zahlen\"\u003eVerbrauch und Kosten im Detail: Die nackten Zahlen\u003ca href=\"#verbrauch-und-kosten-im-detail-die-nackten-zahlen\" class=\"heading-anchor\" aria-label=\"Diesen Abschnitt verlinken\"\u003e\u003csvg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"\u003e\u003cpath d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\"\u003e\u003c/path\u003e\u003cpath d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003e\u003cimg 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\"\u003e\u003c/p\u003e\n\u003cp\u003eIch 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.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eDie harten Fakten:\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eGesamtkilometer:\u003c/strong\u003e 76.922 km (davon 76.310 km getrackt)\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eDurchschnittsverbrauch:\u003c/strong\u003e 20,6 kWh/100 km\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eGesamte Ladekosten:\u003c/strong\u003e ca. 3.500 Euro\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eKosten pro Kilometer:\u003c/strong\u003e ca. 4,6 Cent\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eAC/DC-Verhältnis:\u003c/strong\u003e 80/20\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"warum-unser-verbrauch-höher-liegt\"\u003eWarum unser Verbrauch höher liegt\u003ca href=\"#warum-unser-verbrauch-h%c3%b6her-liegt\" class=\"heading-anchor\" aria-label=\"Diesen Abschnitt verlinken\"\u003e\u003csvg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"\u003e\u003cpath d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\"\u003e\u003c/path\u003e\u003cpath d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eWir 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.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eZum Vergleich:\u003c/strong\u003e 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. \u003cstrong\u003eErsparnis: ca. 5.500 Euro\u003c/strong\u003e - und das obwohl wir zu 80 % an der heimischen Wallbox laden konnten.\u003c/p\u003e\n\u003ch2 id=\"akkugesundheit-nach-77000-km-das-ist-der-wichtigste-wert\"\u003eAkkugesundheit nach 77.000 km: Das ist der wichtigste Wert\u003ca href=\"#akkugesundheit-nach-77000-km-das-ist-der-wichtigste-wert\" class=\"heading-anchor\" aria-label=\"Diesen Abschnitt verlinken\"\u003e\u003csvg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"\u003e\u003cpath d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\"\u003e\u003c/path\u003e\u003cpath d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eDas Verhältnis zwischen AC und DC laden beträgt 80/20. Das ergibt einen derzeitigen \u003cstrong\u003eState of Health (SoH) von 93 %\u003c/strong\u003e laut Tronity. Bedeutet: Der Akku unseres Autos hat noch 93 % der Leistung seines Neuzustandes.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eWas bedeutet das konkret?\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eVon ursprünglich ca. 500 km Reichweite (WLTP) bleiben noch ca. 465 km\u003c/li\u003e\n\u003cli\u003eDer Verlust von 7 % in 5 Jahren ist völlig im Rahmen\u003c/li\u003e\n\u003cli\u003eHochgerechnet hätte der Akku nach 10 Jahren noch etwa 86 % Kapazität\u003c/li\u003e\n\u003cli\u003eTesla gibt 8 Jahre Garantie auf mindestens 70 % Restkapazität\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"6-länder-0-ladeprobleme-langstreckentauglichkeit-im-test\"\u003e6 Länder, 0 Ladeprobleme: Langstreckentauglichkeit im Test\u003ca href=\"#6-l%c3%a4nder-0-ladeprobleme-langstreckentauglichkeit-im-test\" class=\"heading-anchor\" aria-label=\"Diesen Abschnitt verlinken\"\u003e\u003csvg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"\u003e\u003cpath d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\"\u003e\u003c/path\u003e\u003cpath d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eWir 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.\u003c/p\u003e\n\u003cp\u003eLediglich unser Roadtrip im Jahr 2024 hat uns durch Frankreich, Spanien und Portugal geführt. Damals sind wir knapp \u003cstrong\u003e6.200 km in 14 Tagen\u003c/strong\u003e gefahren. Ein Urlaub der toll und zugleich ansträngend war.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eLadeerfahrung auf Langstrecke:\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eTesla Supercharger: Quasi immer verfügbar und zuverlässig\u003c/li\u003e\n\u003cli\u003eAndere Anbieter: Mittlerweile deutlich besser als vor 5 Jahren\u003c/li\u003e\n\u003cli\u003eLadeplanung: Mit der Tesla-Navigation eigentlich kein Thema\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"warum-wir-nach-5-jahren-verkaufen-die-ehrlichen-gründe\"\u003eWarum wir nach 5 Jahren verkaufen: Die ehrlichen Gründe\u003ca href=\"#warum-wir-nach-5-jahren-verkaufen-die-ehrlichen-gr%c3%bcnde\" class=\"heading-anchor\" aria-label=\"Diesen Abschnitt verlinken\"\u003e\u003csvg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"\u003e\u003cpath d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\"\u003e\u003c/path\u003e\u003cpath d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eNach fünf Jahren werden wir das Auto verkaufen. Das hat mehrere Gründe:\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e1. Die Marke und ihr Geschäftsführer\u003c/strong\u003e\nWir 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.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e2. Zeit für etwas Neues\u003c/strong\u003e\nNach 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.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e3. Zu viel Touchscreen, zu wenig Tasten\u003c/strong\u003e\nDer 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.\u003c/p\u003e\n\u003ch2 id=\"was-kommt-als-nächstes\"\u003eWas kommt als Nächstes?\u003ca href=\"#was-kommt-als-n%c3%a4chstes\" class=\"heading-anchor\" aria-label=\"Diesen Abschnitt verlinken\"\u003e\u003csvg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"\u003e\u003cpath d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\"\u003e\u003c/path\u003e\u003cpath d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eWir haben uns jetzt einen \u003cstrong\u003eNIO\u003c/strong\u003e zugelegt den wir mindestens die nächsten drei Jahre fahren werden. Warum? Das wird ein eigener Erfahrungsbericht - stay tuned!\u003c/p\u003e\n\u003ch2 id=\"fazit-lohnt-sich-ein-tesla-model-3-nach-5-jahren-noch\"\u003eFazit: Lohnt sich ein Tesla Model 3 nach 5 Jahren noch?\u003ca href=\"#fazit-lohnt-sich-ein-tesla-model-3-nach-5-jahren-noch\" class=\"heading-anchor\" aria-label=\"Diesen Abschnitt verlinken\"\u003e\u003csvg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"\u003e\u003cpath d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\"\u003e\u003c/path\u003e\u003cpath d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003eDie Top 3 Vorteile:\u003c/strong\u003e\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\u003cstrong\u003eNiedrige Betriebskosten:\u003c/strong\u003e 4,6 Cent/km sind unschlagbar günstig\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eAkkugesundheit:\u003c/strong\u003e 93 % nach 77.000 km spricht für die Batteriequalität\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eLadeinfrastruktur:\u003c/strong\u003e Supercharger-Netz ist und bleibt der Goldstandard\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e\u003cstrong\u003eDie Top 3 Nachteile:\u003c/strong\u003e\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\u003cstrong\u003eBedienkonzept:\u003c/strong\u003e Immer mehr Funktionen nur über Touchscreen nervig\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eMarkenimage:\u003c/strong\u003e Das Thema Elon Musk polarisiert stark\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eKleine Qualitätsmängel:\u003c/strong\u003e Cent-Artikel wie Plastikclips wurden gespart\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e\u003cstrong\u003eFür wen lohnt sich ein gebrauchter Tesla Model 3?\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eWer primär Kurzstrecke und gelegentlich Langstrecke fährt\u003c/li\u003e\n\u003cli\u003eWer Zugang zu günstigen Lademöglichkeiten hat (Wallbox, Arbeit)\u003c/li\u003e\n\u003cli\u003eWer mit dem Touchscreen-Konzept gut zurechtkommt\u003c/li\u003e\n\u003cli\u003eWer ein Auto mit niedrigen laufenden Kosten sucht\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eWer sollte die Finger davonlassen?\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eWer viele physische Bedienelemente bevorzugt\u003c/li\u003e\n\u003cli\u003eWer ausschließlich öffentlich laden müsste\u003c/li\u003e\n\u003cli\u003eWer mit der Marke Tesla nicht identifizieren möchte\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003ch2 id=\"häufige-fragen-zum-tesla-model-3-langzeittest\"\u003eHäufige Fragen zum Tesla Model 3 Langzeittest\u003ca href=\"#h%c3%a4ufige-fragen-zum-tesla-model-3-langzeittest\" class=\"heading-anchor\" aria-label=\"Diesen Abschnitt verlinken\"\u003e\u003csvg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"\u003e\u003cpath d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\"\u003e\u003c/path\u003e\u003cpath d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003eWie hoch ist der Wertverlust nach 5 Jahren?\u003c/strong\u003e\n\u003cem\u003e[Falls du den Verkaufspreis schon kennst, könntest du das hier ergänzen]\u003c/em\u003e\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eWürdest du das Auto nochmal kaufen?\u003c/strong\u003e\nJa, 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.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eWie oft musstest du an die Werkstatt?\u003c/strong\u003e\n\u003cem\u003e[Hier könntest du deine Erfahrungen ergänzen]\u003c/em\u003e\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eLohnt sich ein Tesla Model 3 gebraucht?\u003c/strong\u003e\nAbsolut, wenn du mit dem Bedienkonzept klarkommst und günstig laden kannst. Die Technik ist ausgereift, die Akkus halten gut.\u003c/p\u003e\n","date_published":"2025-03-16T12:00:00+01:00","date_modified":"2025-03-16T12:00:00+01:00","tags":["tesla"]},{"id":"https://www.teqqy.de/bunte-labels-beit-github-gitlab-gitea-und-co/","url":"https://www.teqqy.de/bunte-labels-beit-github-gitlab-gitea-und-co/","title":"Bunte Labels in GitHub (und GitLab, Gitea): Anleitung \u0026 Workflow","summary":"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.\n","content_html":"\u003cp\u003eWie Menschen die mir auf social media folgen wissen, betreibe ich einen kleinen \u003ca href=\"tags/kubernetes/\"\u003eKubernetes\u003c/a\u003e\n Cluster im GitOps Prinzip. Meine \u003ca href=\"https://github.com/cbirkenbeul/homelab\" target=\"_blank\" rel=\"noopener noreferrer\"\u003evollständige Konfiguration\u003csvg 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\"\u003e\n  \u003cpath d=\"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6\"/\u003e\n  \u003cpolyline points=\"15 3 21 3 21 9\"/\u003e\n  \u003cline x1=\"10\" y1=\"14\" x2=\"21\" y2=\"3\"/\u003e\n\u003c/svg\u003e\u003cspan class=\"visually-hidden\"\u003e (externer Link)\u003c/span\u003e\u003c/a\u003e\n befindet sich auf der Cloud Plattform GitHub und kann dort von allen eingesehen werden.\nDazu 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 \u003ca href=\"https://github.com/renovatebot/renovate\" target=\"_blank\" rel=\"noopener noreferrer\"\u003eRenovate\u003csvg 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\"\u003e\n  \u003cpath d=\"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6\"/\u003e\n  \u003cpolyline points=\"15 3 21 3 21 9\"/\u003e\n  \u003cline x1=\"10\" y1=\"14\" x2=\"21\" y2=\"3\"/\u003e\n\u003c/svg\u003e\u003cspan class=\"visually-hidden\"\u003e (externer Link)\u003c/span\u003e\u003c/a\u003e\n 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.\u003c/p\u003e\n\u003cp\u003eIm Standard sind alle Labels bei den Plattformen wie GitHub, Gitlab oder \u003ca href=\"https://www.youtube.com/watch?v=2h-gkICAcbk\" target=\"_blank\" rel=\"noopener noreferrer\"\u003egitea\u003csvg 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\"\u003e\n  \u003cpath d=\"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6\"/\u003e\n  \u003cpolyline points=\"15 3 21 3 21 9\"/\u003e\n  \u003cline x1=\"10\" y1=\"14\" x2=\"21\" y2=\"3\"/\u003e\n\u003c/svg\u003e\u003cspan class=\"visually-hidden\"\u003e (externer Link)\u003c/span\u003e\u003c/a\u003e\n 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.\u003c/p\u003e\n\u003cp\u003eIch 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 \u003ccode\u003e.github\u003c/code\u003e. Auf anderen Plattformen sollte er analog zur Plattform heißen.\u003c/p\u003e\n\u003cp\u003eIn diesem Unterordner erstellen wir einen weiteren Order mit dem Namen \u003ccode\u003eworkflows\u003c/code\u003e. Sämtliche \u003ccode\u003ey(a)ml\u003c/code\u003eDateien werden hier als eingenständiger Workflow auf der jeweiligen Plattform aufgeführt.\u003c/p\u003e\n\u003cp\u003eNun können wir auch den Workflow bzw. GitHub Action anlegen. Ich habe sie bei mir \u003ccode\u003elabel-sync.yaml\u003c/code\u003e genannt und folgendes in die Datei kopiert:\u003c/p\u003e\n\u003cdiv class=\"code-block\"\u003e\n  \u003cdiv class=\"code-block-header\"\u003e\n    \u003cspan class=\"code-lang-label\"\u003eyaml\u003c/span\u003e\n    \u003cbutton class=\"code-copy-btn\" type=\"button\" aria-label=\"Code kopieren\" data-umami-event=\"Code Copy\" data-umami-event-lang=\"yaml\"\u003e\n      \u003csvg 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\"\u003e\u003crect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\"\u003e\u003c/rect\u003e\u003cpath d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\"\u003e\u003c/path\u003e\u003c/svg\u003e\n      \u003csvg 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\"\u003e\u003cpolyline points=\"20 6 9 17 4 12\"\u003e\u003c/polyline\u003e\u003c/svg\u003e\n    \u003c/button\u003e\n  \u003c/div\u003e\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e6edf3;background-color:#0d1117;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-yaml\" data-lang=\"yaml\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#ff7b72\"\u003e---\u003c/span\u003e\u003cspan style=\"color:#6e7681\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#8b949e;font-style:italic\"\u003e# yaml-language-server: $schema=https://json.schemastore.org/github-workflow.json\u003c/span\u003e\u003cspan style=\"color:#6e7681\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#7ee787\"\u003ename\u003c/span\u003e:\u003cspan style=\"color:#6e7681\"\u003e \u003c/span\u003e\u003cspan style=\"color:#a5d6ff\"\u003e\u0026#34;Label Sync\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#6e7681\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#6e7681\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#7ee787\"\u003eon\u003c/span\u003e:\u003cspan style=\"color:#6e7681\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#6e7681\"\u003e  \u003c/span\u003e\u003cspan style=\"color:#7ee787\"\u003eworkflow_dispatch\u003c/span\u003e:\u003cspan style=\"color:#6e7681\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#6e7681\"\u003e  \u003c/span\u003e\u003cspan style=\"color:#7ee787\"\u003epush\u003c/span\u003e:\u003cspan style=\"color:#6e7681\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#6e7681\"\u003e    \u003c/span\u003e\u003cspan style=\"color:#7ee787\"\u003ebranches\u003c/span\u003e:\u003cspan style=\"color:#6e7681\"\u003e \u003c/span\u003e[\u003cspan style=\"color:#a5d6ff\"\u003e\u0026#34;main\u0026#34;\u003c/span\u003e]\u003cspan style=\"color:#6e7681\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#6e7681\"\u003e    \u003c/span\u003e\u003cspan style=\"color:#7ee787\"\u003epaths\u003c/span\u003e:\u003cspan style=\"color:#6e7681\"\u003e \u003c/span\u003e[\u003cspan style=\"color:#a5d6ff\"\u003e\u0026#34;.github/labels.yaml\u0026#34;\u003c/span\u003e]\u003cspan style=\"color:#6e7681\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#6e7681\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#7ee787\"\u003ejobs\u003c/span\u003e:\u003cspan style=\"color:#6e7681\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#6e7681\"\u003e  \u003c/span\u003e\u003cspan style=\"color:#7ee787\"\u003elabel-sync\u003c/span\u003e:\u003cspan style=\"color:#6e7681\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#6e7681\"\u003e    \u003c/span\u003e\u003cspan style=\"color:#7ee787\"\u003ename\u003c/span\u003e:\u003cspan style=\"color:#6e7681\"\u003e \u003c/span\u003e\u003cspan style=\"color:#a5d6ff\"\u003eLabel Sync\u003c/span\u003e\u003cspan style=\"color:#6e7681\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#6e7681\"\u003e    \u003c/span\u003e\u003cspan style=\"color:#7ee787\"\u003eruns-on\u003c/span\u003e:\u003cspan style=\"color:#6e7681\"\u003e \u003c/span\u003e\u003cspan style=\"color:#a5d6ff\"\u003eubuntu-latest\u003c/span\u003e\u003cspan style=\"color:#6e7681\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#6e7681\"\u003e    \u003c/span\u003e\u003cspan style=\"color:#7ee787\"\u003esteps\u003c/span\u003e:\u003cspan style=\"color:#6e7681\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#6e7681\"\u003e      \u003c/span\u003e- \u003cspan style=\"color:#7ee787\"\u003ename\u003c/span\u003e:\u003cspan style=\"color:#6e7681\"\u003e \u003c/span\u003e\u003cspan style=\"color:#a5d6ff\"\u003eCheckout\u003c/span\u003e\u003cspan style=\"color:#6e7681\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#6e7681\"\u003e        \u003c/span\u003e\u003cspan style=\"color:#7ee787\"\u003euses\u003c/span\u003e:\u003cspan style=\"color:#6e7681\"\u003e \u003c/span\u003e\u003cspan style=\"color:#a5d6ff\"\u003eactions/checkout@v4\u003c/span\u003e\u003cspan style=\"color:#6e7681\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#6e7681\"\u003e        \u003c/span\u003e\u003cspan style=\"color:#7ee787\"\u003ewith\u003c/span\u003e:\u003cspan style=\"color:#6e7681\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#6e7681\"\u003e          \u003c/span\u003e\u003cspan style=\"color:#7ee787\"\u003esparse-checkout\u003c/span\u003e:\u003cspan style=\"color:#6e7681\"\u003e \u003c/span\u003e\u003cspan style=\"color:#a5d6ff\"\u003e.github/labels.yaml\u003c/span\u003e\u003cspan style=\"color:#6e7681\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#6e7681\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#6e7681\"\u003e      \u003c/span\u003e- \u003cspan style=\"color:#7ee787\"\u003ename\u003c/span\u003e:\u003cspan style=\"color:#6e7681\"\u003e \u003c/span\u003e\u003cspan style=\"color:#a5d6ff\"\u003eSync Labels\u003c/span\u003e\u003cspan style=\"color:#6e7681\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#6e7681\"\u003e        \u003c/span\u003e\u003cspan style=\"color:#7ee787\"\u003euses\u003c/span\u003e:\u003cspan style=\"color:#6e7681\"\u003e \u003c/span\u003e\u003cspan style=\"color:#a5d6ff\"\u003eEndBug/label-sync@v2\u003c/span\u003e\u003cspan style=\"color:#6e7681\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#6e7681\"\u003e        \u003c/span\u003e\u003cspan style=\"color:#7ee787\"\u003ewith\u003c/span\u003e:\u003cspan style=\"color:#6e7681\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#6e7681\"\u003e          \u003c/span\u003e\u003cspan style=\"color:#7ee787\"\u003econfig-file\u003c/span\u003e:\u003cspan style=\"color:#6e7681\"\u003e \u003c/span\u003e\u003cspan style=\"color:#a5d6ff\"\u003e.github/labels.yaml\u003c/span\u003e\u003cspan style=\"color:#6e7681\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#6e7681\"\u003e          \u003c/span\u003e\u003cspan style=\"color:#7ee787\"\u003edelete-other-labels\u003c/span\u003e:\u003cspan style=\"color:#6e7681\"\u003e \u003c/span\u003e\u003cspan style=\"color:#79c0ff\"\u003etrue\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/div\u003e\n\u003cp\u003eGlü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 \u003ccode\u003elabels.yaml\u003c/code\u003e. Diese müssen wir noch in dem Ordner \u003ccode\u003e.github\u003c/code\u003e anlegen und befüllen.\u003c/p\u003e\n\u003cp\u003eIn diese Datei kommen dann sämtliche Labels mit dem entsprechenden HTML-Farbcode. Bei mir sieht die Datei so aus:\u003c/p\u003e\n\u003cdiv class=\"code-block\"\u003e\n  \u003cdiv class=\"code-block-header\"\u003e\n    \u003cspan class=\"code-lang-label\"\u003eyaml\u003c/span\u003e\n    \u003cbutton class=\"code-copy-btn\" type=\"button\" aria-label=\"Code kopieren\" data-umami-event=\"Code Copy\" data-umami-event-lang=\"yaml\"\u003e\n      \u003csvg 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\"\u003e\u003crect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\"\u003e\u003c/rect\u003e\u003cpath d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\"\u003e\u003c/path\u003e\u003c/svg\u003e\n      \u003csvg 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\"\u003e\u003cpolyline points=\"20 6 9 17 4 12\"\u003e\u003c/polyline\u003e\u003c/svg\u003e\n    \u003c/button\u003e\n  \u003c/div\u003e\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e6edf3;background-color:#0d1117;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-yaml\" data-lang=\"yaml\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#ff7b72\"\u003e---\u003c/span\u003e\u003cspan style=\"color:#6e7681\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#8b949e;font-style:italic\"\u003e# Areas\u003c/span\u003e\u003cspan style=\"color:#6e7681\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e- \u003cspan style=\"color:#7ee787\"\u003ename\u003c/span\u003e:\u003cspan style=\"color:#6e7681\"\u003e \u003c/span\u003e\u003cspan style=\"color:#a5d6ff\"\u003earea/ansible\u003c/span\u003e\u003cspan style=\"color:#6e7681\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#6e7681\"\u003e  \u003c/span\u003e\u003cspan style=\"color:#7ee787\"\u003ecolor\u003c/span\u003e:\u003cspan style=\"color:#6e7681\"\u003e \u003c/span\u003e\u003cspan style=\"color:#a5d6ff\"\u003e\u0026#34;0e8a16\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#6e7681\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e- \u003cspan style=\"color:#7ee787\"\u003ename\u003c/span\u003e:\u003cspan style=\"color:#6e7681\"\u003e \u003c/span\u003e\u003cspan style=\"color:#a5d6ff\"\u003earea/docs\u003c/span\u003e\u003cspan style=\"color:#6e7681\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#6e7681\"\u003e  \u003c/span\u003e\u003cspan style=\"color:#7ee787\"\u003ecolor\u003c/span\u003e:\u003cspan style=\"color:#6e7681\"\u003e \u003c/span\u003e\u003cspan style=\"color:#a5d6ff\"\u003e\u0026#34;0e8a16\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#6e7681\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e- \u003cspan style=\"color:#7ee787\"\u003ename\u003c/span\u003e:\u003cspan style=\"color:#6e7681\"\u003e \u003c/span\u003e\u003cspan style=\"color:#a5d6ff\"\u003earea/github\u003c/span\u003e\u003cspan style=\"color:#6e7681\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#6e7681\"\u003e  \u003c/span\u003e\u003cspan style=\"color:#7ee787\"\u003ecolor\u003c/span\u003e:\u003cspan style=\"color:#6e7681\"\u003e \u003c/span\u003e\u003cspan style=\"color:#a5d6ff\"\u003e\u0026#34;0e8a16\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#6e7681\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e- \u003cspan style=\"color:#7ee787\"\u003ename\u003c/span\u003e:\u003cspan style=\"color:#6e7681\"\u003e \u003c/span\u003e\u003cspan style=\"color:#a5d6ff\"\u003earea/kubernetes\u003c/span\u003e\u003cspan style=\"color:#6e7681\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#6e7681\"\u003e  \u003c/span\u003e\u003cspan style=\"color:#7ee787\"\u003ecolor\u003c/span\u003e:\u003cspan style=\"color:#6e7681\"\u003e \u003c/span\u003e\u003cspan style=\"color:#a5d6ff\"\u003e\u0026#34;0e8a16\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#6e7681\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e- \u003cspan style=\"color:#7ee787\"\u003ename\u003c/span\u003e:\u003cspan style=\"color:#6e7681\"\u003e \u003c/span\u003e\u003cspan style=\"color:#a5d6ff\"\u003earea/terraform\u003c/span\u003e\u003cspan style=\"color:#6e7681\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#6e7681\"\u003e  \u003c/span\u003e\u003cspan style=\"color:#7ee787\"\u003ecolor\u003c/span\u003e:\u003cspan style=\"color:#6e7681\"\u003e \u003c/span\u003e\u003cspan style=\"color:#a5d6ff\"\u003e\u0026#34;0e8a16\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#6e7681\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#8b949e;font-style:italic\"\u003e# Clusters\u003c/span\u003e\u003cspan style=\"color:#6e7681\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e- \u003cspan style=\"color:#7ee787\"\u003ename\u003c/span\u003e:\u003cspan style=\"color:#6e7681\"\u003e \u003c/span\u003e\u003cspan style=\"color:#a5d6ff\"\u003ecluster/main\u003c/span\u003e\u003cspan style=\"color:#6e7681\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#6e7681\"\u003e  \u003c/span\u003e\u003cspan style=\"color:#7ee787\"\u003ecolor\u003c/span\u003e:\u003cspan style=\"color:#6e7681\"\u003e \u003c/span\u003e\u003cspan style=\"color:#a5d6ff\"\u003e\u0026#34;ffc300\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#6e7681\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e- \u003cspan style=\"color:#7ee787\"\u003ename\u003c/span\u003e:\u003cspan style=\"color:#6e7681\"\u003e \u003c/span\u003e\u003cspan style=\"color:#a5d6ff\"\u003ecluster/storage\u003c/span\u003e\u003cspan style=\"color:#6e7681\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#6e7681\"\u003e  \u003c/span\u003e\u003cspan style=\"color:#7ee787\"\u003ecolor\u003c/span\u003e:\u003cspan style=\"color:#6e7681\"\u003e \u003c/span\u003e\u003cspan style=\"color:#a5d6ff\"\u003e\u0026#34;ffc300\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#6e7681\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#8b949e;font-style:italic\"\u003e# Renovate Types\u003c/span\u003e\u003cspan style=\"color:#6e7681\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e- \u003cspan style=\"color:#7ee787\"\u003ename\u003c/span\u003e:\u003cspan style=\"color:#6e7681\"\u003e \u003c/span\u003e\u003cspan style=\"color:#a5d6ff\"\u003erenovate/ansible\u003c/span\u003e\u003cspan style=\"color:#6e7681\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#6e7681\"\u003e  \u003c/span\u003e\u003cspan style=\"color:#7ee787\"\u003ecolor\u003c/span\u003e:\u003cspan style=\"color:#6e7681\"\u003e \u003c/span\u003e\u003cspan style=\"color:#a5d6ff\"\u003e\u0026#34;027fa0\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#6e7681\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e- \u003cspan style=\"color:#7ee787\"\u003ename\u003c/span\u003e:\u003cspan style=\"color:#6e7681\"\u003e \u003c/span\u003e\u003cspan style=\"color:#a5d6ff\"\u003erenovate/container\u003c/span\u003e\u003cspan style=\"color:#6e7681\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#6e7681\"\u003e  \u003c/span\u003e\u003cspan style=\"color:#7ee787\"\u003ecolor\u003c/span\u003e:\u003cspan style=\"color:#6e7681\"\u003e \u003c/span\u003e\u003cspan style=\"color:#a5d6ff\"\u003e\u0026#34;027fa0\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#6e7681\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e- \u003cspan style=\"color:#7ee787\"\u003ename\u003c/span\u003e:\u003cspan style=\"color:#6e7681\"\u003e \u003c/span\u003e\u003cspan style=\"color:#a5d6ff\"\u003erenovate/github-action\u003c/span\u003e\u003cspan style=\"color:#6e7681\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#6e7681\"\u003e  \u003c/span\u003e\u003cspan style=\"color:#7ee787\"\u003ecolor\u003c/span\u003e:\u003cspan style=\"color:#6e7681\"\u003e \u003c/span\u003e\u003cspan style=\"color:#a5d6ff\"\u003e\u0026#34;027fa0\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#6e7681\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e- \u003cspan style=\"color:#7ee787\"\u003ename\u003c/span\u003e:\u003cspan style=\"color:#6e7681\"\u003e \u003c/span\u003e\u003cspan style=\"color:#a5d6ff\"\u003erenovate/grafana-dashboard\u003c/span\u003e\u003cspan style=\"color:#6e7681\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#6e7681\"\u003e  \u003c/span\u003e\u003cspan style=\"color:#7ee787\"\u003ecolor\u003c/span\u003e:\u003cspan style=\"color:#6e7681\"\u003e \u003c/span\u003e\u003cspan style=\"color:#a5d6ff\"\u003e\u0026#34;027fa0\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#6e7681\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e- \u003cspan style=\"color:#7ee787\"\u003ename\u003c/span\u003e:\u003cspan style=\"color:#6e7681\"\u003e \u003c/span\u003e\u003cspan style=\"color:#a5d6ff\"\u003erenovate/github-release\u003c/span\u003e\u003cspan style=\"color:#6e7681\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#6e7681\"\u003e  \u003c/span\u003e\u003cspan style=\"color:#7ee787\"\u003ecolor\u003c/span\u003e:\u003cspan style=\"color:#6e7681\"\u003e \u003c/span\u003e\u003cspan style=\"color:#a5d6ff\"\u003e\u0026#34;027fa0\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#6e7681\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e- \u003cspan style=\"color:#7ee787\"\u003ename\u003c/span\u003e:\u003cspan style=\"color:#6e7681\"\u003e \u003c/span\u003e\u003cspan style=\"color:#a5d6ff\"\u003erenovate/helm\u003c/span\u003e\u003cspan style=\"color:#6e7681\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#6e7681\"\u003e  \u003c/span\u003e\u003cspan style=\"color:#7ee787\"\u003ecolor\u003c/span\u003e:\u003cspan style=\"color:#6e7681\"\u003e \u003c/span\u003e\u003cspan style=\"color:#a5d6ff\"\u003e\u0026#34;027fa0\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#6e7681\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e- \u003cspan style=\"color:#7ee787\"\u003ename\u003c/span\u003e:\u003cspan style=\"color:#6e7681\"\u003e \u003c/span\u003e\u003cspan style=\"color:#a5d6ff\"\u003erenovate/terraform\u003c/span\u003e\u003cspan style=\"color:#6e7681\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#6e7681\"\u003e  \u003c/span\u003e\u003cspan style=\"color:#7ee787\"\u003ecolor\u003c/span\u003e:\u003cspan style=\"color:#6e7681\"\u003e \u003c/span\u003e\u003cspan style=\"color:#a5d6ff\"\u003e\u0026#34;027fa0\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#6e7681\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#8b949e;font-style:italic\"\u003e# Semantic Types\u003c/span\u003e\u003cspan style=\"color:#6e7681\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e- \u003cspan style=\"color:#7ee787\"\u003ename\u003c/span\u003e:\u003cspan style=\"color:#6e7681\"\u003e \u003c/span\u003e\u003cspan style=\"color:#a5d6ff\"\u003etype/digest\u003c/span\u003e\u003cspan style=\"color:#6e7681\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#6e7681\"\u003e  \u003c/span\u003e\u003cspan style=\"color:#7ee787\"\u003ecolor\u003c/span\u003e:\u003cspan style=\"color:#6e7681\"\u003e \u003c/span\u003e\u003cspan style=\"color:#a5d6ff\"\u003e\u0026#34;ffeC19\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#6e7681\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e- \u003cspan style=\"color:#7ee787\"\u003ename\u003c/span\u003e:\u003cspan style=\"color:#6e7681\"\u003e \u003c/span\u003e\u003cspan style=\"color:#a5d6ff\"\u003etype/patch\u003c/span\u003e\u003cspan style=\"color:#6e7681\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#6e7681\"\u003e  \u003c/span\u003e\u003cspan style=\"color:#7ee787\"\u003ecolor\u003c/span\u003e:\u003cspan style=\"color:#6e7681\"\u003e \u003c/span\u003e\u003cspan style=\"color:#a5d6ff\"\u003e\u0026#34;ffeC19\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#6e7681\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e- \u003cspan style=\"color:#7ee787\"\u003ename\u003c/span\u003e:\u003cspan style=\"color:#6e7681\"\u003e \u003c/span\u003e\u003cspan style=\"color:#a5d6ff\"\u003etype/minor\u003c/span\u003e\u003cspan style=\"color:#6e7681\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#6e7681\"\u003e  \u003c/span\u003e\u003cspan style=\"color:#7ee787\"\u003ecolor\u003c/span\u003e:\u003cspan style=\"color:#6e7681\"\u003e \u003c/span\u003e\u003cspan style=\"color:#a5d6ff\"\u003e\u0026#34;ff9800\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#6e7681\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e- \u003cspan style=\"color:#7ee787\"\u003ename\u003c/span\u003e:\u003cspan style=\"color:#6e7681\"\u003e \u003c/span\u003e\u003cspan style=\"color:#a5d6ff\"\u003etype/major\u003c/span\u003e\u003cspan style=\"color:#6e7681\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#6e7681\"\u003e  \u003c/span\u003e\u003cspan style=\"color:#7ee787\"\u003ecolor\u003c/span\u003e:\u003cspan style=\"color:#6e7681\"\u003e \u003c/span\u003e\u003cspan style=\"color:#a5d6ff\"\u003e\u0026#34;f6412d\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#6e7681\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#8b949e;font-style:italic\"\u003e# Uncategorized\u003c/span\u003e\u003cspan style=\"color:#6e7681\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e- \u003cspan style=\"color:#7ee787\"\u003ename\u003c/span\u003e:\u003cspan style=\"color:#6e7681\"\u003e \u003c/span\u003e\u003cspan style=\"color:#a5d6ff\"\u003ehold\u003c/span\u003e\u003cspan style=\"color:#6e7681\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#6e7681\"\u003e  \u003c/span\u003e\u003cspan style=\"color:#7ee787\"\u003ecolor\u003c/span\u003e:\u003cspan style=\"color:#6e7681\"\u003e \u003c/span\u003e\u003cspan style=\"color:#a5d6ff\"\u003e\u0026#34;ee0701\u0026#34;\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/div\u003e\n\u003cp\u003eWir 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:\n\u003cimg 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\"\u003e\u003c/p\u003e\n","date_published":"2024-10-28T18:45:00+01:00","date_modified":"2024-10-28T18:45:00+01:00","tags":["github","gitlab","gitea","renovate"]},{"id":"https://www.teqqy.de/meine-top-10-homelab-services-2024/","url":"https://www.teqqy.de/meine-top-10-homelab-services-2024/","title":"Meine Top 10 Homelab Services 2024","summary":"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.\nNummer 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.\n","content_html":"\u003cp\u003eNach 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.\u003c/p\u003e\n\u003ch2 id=\"nummer-10-ghostfolio\"\u003eNummer 10: Ghostfolio\u003ca href=\"#nummer-10-ghostfolio\" class=\"heading-anchor\" aria-label=\"Diesen Abschnitt verlinken\"\u003e\u003csvg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"\u003e\u003cpath d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\"\u003e\u003c/path\u003e\u003cpath d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003e\u003ca href=\"https://ghostfol.io\" target=\"_blank\" rel=\"noopener noreferrer\"\u003eGhostfolio\u003csvg 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\"\u003e\n  \u003cpath d=\"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6\"/\u003e\n  \u003cpolyline points=\"15 3 21 3 21 9\"/\u003e\n  \u003cline x1=\"10\" y1=\"14\" x2=\"21\" y2=\"3\"/\u003e\n\u003c/svg\u003e\u003cspan class=\"visually-hidden\"\u003e (externer Link)\u003c/span\u003e\u003c/a\u003e\n 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.\u003c/p\u003e\n\u003cdiv class=\"video-embed\" data-src=\"https://www.youtube-nocookie.com/embed/X_87ZBOlpJQ?autoplay=1\u0026rel=0\"\u003e\n  \u003cbutton class=\"video-embed-trigger\" type=\"button\" data-umami-event=\"Video Load\" data-umami-event-provider=\"YouTube\" data-umami-event-id=\"X_87ZBOlpJQ\"\u003e\n    \u003csvg 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\"\u003e\u003ccircle cx=\"12\" cy=\"12\" r=\"12\" fill=\"rgba(0,0,0,0.6)\"/\u003e\u003cpath d=\"M9.5 7.5l7 4.5-7 4.5V7.5z\" fill=\"white\"/\u003e\u003c/svg\u003e\n    \u003cspan class=\"video-embed-title\"\u003eYouTube Video\u003c/span\u003e\n    \u003cspan class=\"video-embed-note\"\u003eYouTube \u0026middot; Klicken zum Laden\u003c/span\u003e\n  \u003c/button\u003e\n\u003c/div\u003e\n\n\u003cp\u003eÜ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.\u003c/p\u003e\n\u003ch2 id=\"nummer-9-mealie\"\u003eNummer 9: Mealie\u003ca href=\"#nummer-9-mealie\" class=\"heading-anchor\" aria-label=\"Diesen Abschnitt verlinken\"\u003e\u003csvg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"\u003e\u003cpath d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\"\u003e\u003c/path\u003e\u003cpath d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003e\u003ca href=\"https://mealie.io/\" target=\"_blank\" rel=\"noopener noreferrer\"\u003eMealie\u003csvg 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\"\u003e\n  \u003cpath d=\"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6\"/\u003e\n  \u003cpolyline points=\"15 3 21 3 21 9\"/\u003e\n  \u003cline x1=\"10\" y1=\"14\" x2=\"21\" y2=\"3\"/\u003e\n\u003c/svg\u003e\u003cspan class=\"visually-hidden\"\u003e (externer Link)\u003c/span\u003e\u003c/a\u003e\n 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.\u003c/p\u003e\n\u003cp\u003eWer tiefer bei Mealie einsteigen möchte, kann sogar auch einen Wochenplan erstellen und die entsprechende Einklaufsliste sich ausgeben lassen.\u003c/p\u003e\n\u003ch2 id=\"nummer-8-evcc\"\u003eNummer 8: EVCC\u003ca href=\"#nummer-8-evcc\" class=\"heading-anchor\" aria-label=\"Diesen Abschnitt verlinken\"\u003e\u003csvg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"\u003e\u003cpath d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\"\u003e\u003c/path\u003e\u003cpath d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eIch 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.\nBei meiner Recherche wie ich mein Unterfangen herstellerunabhängig realisieren kann, bin ich auf \u003ca href=\"https://evcc.io/\" target=\"_blank\" rel=\"noopener noreferrer\"\u003eEVCC\u003csvg 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\"\u003e\n  \u003cpath d=\"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6\"/\u003e\n  \u003cpolyline points=\"15 3 21 3 21 9\"/\u003e\n  \u003cline x1=\"10\" y1=\"14\" x2=\"21\" y2=\"3\"/\u003e\n\u003c/svg\u003e\u003cspan class=\"visually-hidden\"\u003e (externer Link)\u003c/span\u003e\u003c/a\u003e\n 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.\u003c/p\u003e\n\u003cp\u003eEVCC 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.\u003c/p\u003e\n\u003cp\u003eDie 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.\u003c/p\u003e\n\u003cp\u003eZudem kann EVCC mittlerweile die heimische Batterie der PV-Anlage auch über Netzladen aufladen. Zumindest noch so lange wie es gesetzlich erlaubt ist.\u003c/p\u003e\n\u003ch2 id=\"nummer-7-paperless-ngx\"\u003eNummer 7: Paperless-NGX\u003ca href=\"#nummer-7-paperless-ngx\" class=\"heading-anchor\" aria-label=\"Diesen Abschnitt verlinken\"\u003e\u003csvg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"\u003e\u003cpath d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\"\u003e\u003c/path\u003e\u003cpath d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eIch denke, dass jedem Paperless-NGX bekannt sein wird. Falls nicht:\nPaperless-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.\u003c/p\u003e\n\u003cp\u003eIch 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 \u0026ldquo;Paperparrot\u0026rdquo;. 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.\u003c/p\u003e\n\u003ch2 id=\"nummer-6-stirling-pdf\"\u003eNummer 6: Stirling PDF\u003ca href=\"#nummer-6-stirling-pdf\" class=\"heading-anchor\" aria-label=\"Diesen Abschnitt verlinken\"\u003e\u003csvg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"\u003e\u003cpath d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\"\u003e\u003c/path\u003e\u003cpath d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eWas 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.\u003c/p\u003e\n\u003cp\u003e\u003cimg 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\"\u003e\u003c/p\u003e\n\u003ch2 id=\"nummer-5-minio\"\u003eNummer 5: Minio\u003ca href=\"#nummer-5-minio\" class=\"heading-anchor\" aria-label=\"Diesen Abschnitt verlinken\"\u003e\u003csvg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"\u003e\u003cpath d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\"\u003e\u003c/path\u003e\u003cpath d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003e\u003ca href=\"https://min.io/\" target=\"_blank\" rel=\"noopener noreferrer\"\u003eMinio\u003csvg 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\"\u003e\n  \u003cpath d=\"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6\"/\u003e\n  \u003cpolyline points=\"15 3 21 3 21 9\"/\u003e\n  \u003cline x1=\"10\" y1=\"14\" x2=\"21\" y2=\"3\"/\u003e\n\u003c/svg\u003e\u003cspan class=\"visually-hidden\"\u003e (externer Link)\u003c/span\u003e\u003c/a\u003e\n 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.\u003c/p\u003e\n\u003cp\u003eIch 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.\u003c/p\u003e\n\u003ch2 id=\"nummer-4-gatus\"\u003eNummer 4: Gatus\u003ca href=\"#nummer-4-gatus\" class=\"heading-anchor\" aria-label=\"Diesen Abschnitt verlinken\"\u003e\u003csvg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"\u003e\u003cpath d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\"\u003e\u003c/path\u003e\u003cpath d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eViele werden Uptime Kuma als \u0026ldquo;Monitoring-Tool\u0026rdquo; 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 \u0026ldquo;alten\u0026rdquo; 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.\u003c/p\u003e\n\u003cp\u003eGatus 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.\u003c/p\u003e\n\u003ch2 id=\"nummer-3-immich\"\u003eNummer 3: Immich\u003ca href=\"#nummer-3-immich\" class=\"heading-anchor\" aria-label=\"Diesen Abschnitt verlinken\"\u003e\u003csvg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"\u003e\u003cpath d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\"\u003e\u003c/path\u003e\u003cpath d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eImmich 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 \u0026ldquo;Langzeitbackup\u0026rdquo; 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.\u003c/p\u003e\n\u003cp\u003eDie 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.\u003c/p\u003e\n\u003cdiv class=\"video-embed\" data-src=\"https://www.youtube-nocookie.com/embed/XRsZi7vxVlQ?autoplay=1\u0026rel=0\"\u003e\n  \u003cbutton class=\"video-embed-trigger\" type=\"button\" data-umami-event=\"Video Load\" data-umami-event-provider=\"YouTube\" data-umami-event-id=\"XRsZi7vxVlQ\"\u003e\n    \u003csvg 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\"\u003e\u003ccircle cx=\"12\" cy=\"12\" r=\"12\" fill=\"rgba(0,0,0,0.6)\"/\u003e\u003cpath d=\"M9.5 7.5l7 4.5-7 4.5V7.5z\" fill=\"white\"/\u003e\u003c/svg\u003e\n    \u003cspan class=\"video-embed-title\"\u003eYouTube Video\u003c/span\u003e\n    \u003cspan class=\"video-embed-note\"\u003eYouTube \u0026middot; Klicken zum Laden\u003c/span\u003e\n  \u003c/button\u003e\n\u003c/div\u003e\n\n\u003ch2 id=\"nummer-2-mastodon-server\"\u003eNummer 2: Mastodon Server\u003ca href=\"#nummer-2-mastodon-server\" class=\"heading-anchor\" aria-label=\"Diesen Abschnitt verlinken\"\u003e\u003csvg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"\u003e\u003cpath d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\"\u003e\u003c/path\u003e\u003cpath d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eAls 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 \u0026ldquo;verlassen\u0026rdquo; 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.\u003c/p\u003e\n\u003cp\u003eSeit 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.\u003c/p\u003e\n\u003ch2 id=\"nummer-1-home-assistant\"\u003eNummer 1: Home Assistant\u003ca href=\"#nummer-1-home-assistant\" class=\"heading-anchor\" aria-label=\"Diesen Abschnitt verlinken\"\u003e\u003csvg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"\u003e\u003cpath d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\"\u003e\u003c/path\u003e\u003cpath d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eAuch in meinem alten Beitrag war Home Assistant die beliebteste Software in meinem Homelab. Wobei die Position 1 nicht unbedingt aus dem \u0026ldquo;Lieblings\u0026rdquo;-Faktor heraus entstand sondern weil sie einfach Elementar wichtig geworden ist. Mit \u003ca href=\"https://www.home-assistant.io/\" target=\"_blank\" rel=\"noopener noreferrer\"\u003eHome Assistant\u003csvg 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\"\u003e\n  \u003cpath d=\"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6\"/\u003e\n  \u003cpolyline points=\"15 3 21 3 21 9\"/\u003e\n  \u003cline x1=\"10\" y1=\"14\" x2=\"21\" y2=\"3\"/\u003e\n\u003c/svg\u003e\u003cspan class=\"visually-hidden\"\u003e (externer Link)\u003c/span\u003e\u003c/a\u003e\n 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.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e10 Z-Wave\u003c/li\u003e\n\u003cli\u003e24 ZigBee\u003c/li\u003e\n\u003cli\u003e8 WiFi\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eAktoren, 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.\nManchmal 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.\u003c/p\u003e\n","date_published":"2024-10-20T13:00:00+01:00","date_modified":"2024-10-20T13:00:00+01:00","tags":["homelab","mastodon","home-assistant","minio"]},{"id":"https://www.teqqy.de/proxmox-backup-server-auf-unraid-via-nfs-sichern/","url":"https://www.teqqy.de/proxmox-backup-server-auf-unraid-via-nfs-sichern/","title":"Proxmox Backup Server auf UnRaid via NFS sichern","summary":"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.\nYouTube Video YouTube \u0026middot; 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.\n","content_html":"\u003cp\u003eDer 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.\u003c/p\u003e\n\u003cdiv class=\"video-embed\" data-src=\"https://www.youtube-nocookie.com/embed/ckq4ux-ZSvU?autoplay=1\u0026rel=0\"\u003e\n  \u003cbutton class=\"video-embed-trigger\" type=\"button\" data-umami-event=\"Video Load\" data-umami-event-provider=\"YouTube\" data-umami-event-id=\"ckq4ux-ZSvU\"\u003e\n    \u003csvg 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\"\u003e\u003ccircle cx=\"12\" cy=\"12\" r=\"12\" fill=\"rgba(0,0,0,0.6)\"/\u003e\u003cpath d=\"M9.5 7.5l7 4.5-7 4.5V7.5z\" fill=\"white\"/\u003e\u003c/svg\u003e\n    \u003cspan class=\"video-embed-title\"\u003eYouTube Video\u003c/span\u003e\n    \u003cspan class=\"video-embed-note\"\u003eYouTube \u0026middot; Klicken zum Laden\u003c/span\u003e\n  \u003c/button\u003e\n\u003c/div\u003e\n\n\u003cp\u003eIn 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.\u003c/p\u003e\n\u003ch2 id=\"nfs-freigabe-in-unraid-anlegen\"\u003eNFS Freigabe in Unraid anlegen\u003ca href=\"#nfs-freigabe-in-unraid-anlegen\" class=\"heading-anchor\" aria-label=\"Diesen Abschnitt verlinken\"\u003e\u003csvg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"\u003e\u003cpath d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\"\u003e\u003c/path\u003e\u003cpath d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eIn Unraid legen wir uns zuerst eine Freigabe an. In dieser Anleitung heißt die Freigabe \u003cem\u003eproxmox\u003c/em\u003e. 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.\nWenn die Freigabe angelegt ist, möchte wir diese natürlich via NFS publizieren. Also stellen wir \u003cstrong\u003eExportieren\u003c/strong\u003e auf \u003cstrong\u003eja\u003c/strong\u003e. Anschließend müssen wir die \u003cstrong\u003eSicherheit\u003c/strong\u003e von \u003cstrong\u003eÖffentlich\u003c/strong\u003e auf \u003cstrong\u003eprivat\u003c/strong\u003e umstellen. Das ist wichtig, da wir sonst keine besonderen NFS Export Parameter mitgeben können. In dem Feld \u003cstrong\u003eRegel\u003c/strong\u003e Tragen wir dann folgendes ein:\u003c/p\u003e\n\u003cdiv class=\"code-block\"\u003e\n  \u003cdiv class=\"code-block-header\"\u003e\n    \u003cspan class=\"code-lang-label\"\u003e\u003c/span\u003e\n    \u003cbutton class=\"code-copy-btn\" type=\"button\" aria-label=\"Code kopieren\" data-umami-event=\"Code Copy\" data-umami-event-lang=\"\"\u003e\n      \u003csvg 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\"\u003e\u003crect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\"\u003e\u003c/rect\u003e\u003cpath d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\"\u003e\u003c/path\u003e\u003c/svg\u003e\n      \u003csvg 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\"\u003e\u003cpolyline points=\"20 6 9 17 4 12\"\u003e\u003c/polyline\u003e\u003c/svg\u003e\n    \u003c/button\u003e\n  \u003c/div\u003e\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e192.168.10.19/24(sec=sys,rw,insecure,anongid=100,anonuid=99,no_root_squash)\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cp\u003eDie 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.\u003c/p\u003e\n\u003cp\u003e\u003cimg 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\"\u003e\u003c/p\u003e\n\u003ch2 id=\"pbs-nfs-freigabe-einrichten\"\u003ePBS NFS Freigabe einrichten\u003ca href=\"#pbs-nfs-freigabe-einrichten\" class=\"heading-anchor\" aria-label=\"Diesen Abschnitt verlinken\"\u003e\u003csvg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"\u003e\u003cpath d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\"\u003e\u003c/path\u003e\u003cpath d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eNun 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.\u003c/p\u003e\n\u003cdiv class=\"video-embed\" data-src=\"https://www.youtube-nocookie.com/embed/fOMzkReoaBI?autoplay=1\u0026rel=0\"\u003e\n  \u003cbutton class=\"video-embed-trigger\" type=\"button\" data-umami-event=\"Video Load\" data-umami-event-provider=\"YouTube\" data-umami-event-id=\"fOMzkReoaBI\"\u003e\n    \u003csvg 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\"\u003e\u003ccircle cx=\"12\" cy=\"12\" r=\"12\" fill=\"rgba(0,0,0,0.6)\"/\u003e\u003cpath d=\"M9.5 7.5l7 4.5-7 4.5V7.5z\" fill=\"white\"/\u003e\u003c/svg\u003e\n    \u003cspan class=\"video-embed-title\"\u003eYouTube Video\u003c/span\u003e\n    \u003cspan class=\"video-embed-note\"\u003eYouTube \u0026middot; Klicken zum Laden\u003c/span\u003e\n  \u003c/button\u003e\n\u003c/div\u003e\n\n\u003cp\u003eWir müssen uns per SSH mit dem Server verbinden. Anschließend überprüfen wir ob der NFS Client installiert ist bzw. installieren ihn direkt.\u003c/p\u003e\n\u003cdiv class=\"code-block\"\u003e\n  \u003cdiv class=\"code-block-header\"\u003e\n    \u003cspan class=\"code-lang-label\"\u003ebash\u003c/span\u003e\n    \u003cbutton class=\"code-copy-btn\" type=\"button\" aria-label=\"Code kopieren\" data-umami-event=\"Code Copy\" data-umami-event-lang=\"bash\"\u003e\n      \u003csvg 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\"\u003e\u003crect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\"\u003e\u003c/rect\u003e\u003cpath d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\"\u003e\u003c/path\u003e\u003c/svg\u003e\n      \u003csvg 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\"\u003e\u003cpolyline points=\"20 6 9 17 4 12\"\u003e\u003c/polyline\u003e\u003c/svg\u003e\n    \u003c/button\u003e\n  \u003c/div\u003e\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e6edf3;background-color:#0d1117;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eapt install nfs-common\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/div\u003e\n\u003cp\u003eBei 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 \u003cem\u003e/mnt\u003c/em\u003e gelegt. Also erstellen wir uns dort drin ein Verzeichnis in dem wir das NAS mounten.\u003c/p\u003e\n\u003cdiv class=\"code-block\"\u003e\n  \u003cdiv class=\"code-block-header\"\u003e\n    \u003cspan class=\"code-lang-label\"\u003ebash\u003c/span\u003e\n    \u003cbutton class=\"code-copy-btn\" type=\"button\" aria-label=\"Code kopieren\" data-umami-event=\"Code Copy\" data-umami-event-lang=\"bash\"\u003e\n      \u003csvg 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\"\u003e\u003crect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\"\u003e\u003c/rect\u003e\u003cpath d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\"\u003e\u003c/path\u003e\u003c/svg\u003e\n      \u003csvg 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\"\u003e\u003cpolyline points=\"20 6 9 17 4 12\"\u003e\u003c/polyline\u003e\u003c/svg\u003e\n    \u003c/button\u003e\n  \u003c/div\u003e\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e6edf3;background-color:#0d1117;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003emkdir -p /mnt/nfs-backup\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/div\u003e\n\u003cp\u003eDu kannst natürlich den Part \u003cem\u003enfs-backup\u003c/em\u003e umbenennen. Passe nur den Rest der Anleitung entsprechend an deine Umgebung an.\u003c/p\u003e\n\u003cp\u003eNun mounten wir die Freigabe mit\u003c/p\u003e\n\u003cdiv class=\"code-block\"\u003e\n  \u003cdiv class=\"code-block-header\"\u003e\n    \u003cspan class=\"code-lang-label\"\u003ebash\u003c/span\u003e\n    \u003cbutton class=\"code-copy-btn\" type=\"button\" aria-label=\"Code kopieren\" data-umami-event=\"Code Copy\" data-umami-event-lang=\"bash\"\u003e\n      \u003csvg 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\"\u003e\u003crect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\"\u003e\u003c/rect\u003e\u003cpath d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\"\u003e\u003c/path\u003e\u003c/svg\u003e\n      \u003csvg 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\"\u003e\u003cpolyline points=\"20 6 9 17 4 12\"\u003e\u003c/polyline\u003e\u003c/svg\u003e\n    \u003c/button\u003e\n  \u003c/div\u003e\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e6edf3;background-color:#0d1117;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003emount -t nfs 192.168.10.21:/mnt/user/proxmox /mnt/nfs-backup\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/div\u003e\n\u003cp\u003eDie 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.\nDamit die Freigabe auch nach dem Neustart vom PBS wieder funktioniert sollten wir das permanent machen. Dazu editieren wir die \u003cstrong\u003e/etc/fstab\u003c/strong\u003e Datei\u003c/p\u003e\n\u003cdiv class=\"code-block\"\u003e\n  \u003cdiv class=\"code-block-header\"\u003e\n    \u003cspan class=\"code-lang-label\"\u003ebash\u003c/span\u003e\n    \u003cbutton class=\"code-copy-btn\" type=\"button\" aria-label=\"Code kopieren\" data-umami-event=\"Code Copy\" data-umami-event-lang=\"bash\"\u003e\n      \u003csvg 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\"\u003e\u003crect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\"\u003e\u003c/rect\u003e\u003cpath d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\"\u003e\u003c/path\u003e\u003c/svg\u003e\n      \u003csvg 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\"\u003e\u003cpolyline points=\"20 6 9 17 4 12\"\u003e\u003c/polyline\u003e\u003c/svg\u003e\n    \u003c/button\u003e\n  \u003c/div\u003e\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e6edf3;background-color:#0d1117;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003enano /etc/fstab\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/div\u003e\n\u003cp\u003eUnd fügen am Ende folgende Zeile ein:\u003c/p\u003e\n\u003cdiv class=\"code-block\"\u003e\n  \u003cdiv class=\"code-block-header\"\u003e\n    \u003cspan class=\"code-lang-label\"\u003econf\u003c/span\u003e\n    \u003cbutton class=\"code-copy-btn\" type=\"button\" aria-label=\"Code kopieren\" data-umami-event=\"Code Copy\" data-umami-event-lang=\"conf\"\u003e\n      \u003csvg 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\"\u003e\u003crect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\"\u003e\u003c/rect\u003e\u003cpath d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\"\u003e\u003c/path\u003e\u003c/svg\u003e\n      \u003csvg 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\"\u003e\u003cpolyline points=\"20 6 9 17 4 12\"\u003e\u003c/polyline\u003e\u003c/svg\u003e\n    \u003c/button\u003e\n  \u003c/div\u003e\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-conf\" data-lang=\"conf\"\u003e192.168.10.21:/mnt/user/proxmox /mnt/nfs-backup nfs rw 0 0\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003ch2 id=\"berechtigungen-der-freigabe-anpassen\"\u003eBerechtigungen der Freigabe anpassen\u003ca href=\"#berechtigungen-der-freigabe-anpassen\" class=\"heading-anchor\" aria-label=\"Diesen Abschnitt verlinken\"\u003e\u003csvg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"\u003e\u003cpath d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\"\u003e\u003c/path\u003e\u003cpath d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eDer Proxmox Backup Server erstellt die Sicherungen mit dem Nutzer \u003cstrong\u003ebackup\u003c/strong\u003e und der UUID/GUID \u003cstrong\u003e34\u003c/strong\u003e. 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.\u003c/p\u003e\n\u003cdiv class=\"code-block\"\u003e\n  \u003cdiv class=\"code-block-header\"\u003e\n    \u003cspan class=\"code-lang-label\"\u003ebash\u003c/span\u003e\n    \u003cbutton class=\"code-copy-btn\" type=\"button\" aria-label=\"Code kopieren\" data-umami-event=\"Code Copy\" data-umami-event-lang=\"bash\"\u003e\n      \u003csvg 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\"\u003e\u003crect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\"\u003e\u003c/rect\u003e\u003cpath d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\"\u003e\u003c/path\u003e\u003c/svg\u003e\n      \u003csvg 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\"\u003e\u003cpolyline points=\"20 6 9 17 4 12\"\u003e\u003c/polyline\u003e\u003c/svg\u003e\n    \u003c/button\u003e\n  \u003c/div\u003e\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e6edf3;background-color:#0d1117;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003emkdir -p /mnt/nfs-backup/backups\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/div\u003e\n\u003cp\u003eAuch hier kannst du das gerne an deine Gegebenheiten anpassen. Anschließend ändern wir den Besitzer des Ordners\u003c/p\u003e\n\u003cdiv class=\"code-block\"\u003e\n  \u003cdiv class=\"code-block-header\"\u003e\n    \u003cspan class=\"code-lang-label\"\u003ebash\u003c/span\u003e\n    \u003cbutton class=\"code-copy-btn\" type=\"button\" aria-label=\"Code kopieren\" data-umami-event=\"Code Copy\" data-umami-event-lang=\"bash\"\u003e\n      \u003csvg 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\"\u003e\u003crect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\"\u003e\u003c/rect\u003e\u003cpath d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\"\u003e\u003c/path\u003e\u003c/svg\u003e\n      \u003csvg 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\"\u003e\u003cpolyline points=\"20 6 9 17 4 12\"\u003e\u003c/polyline\u003e\u003c/svg\u003e\n    \u003c/button\u003e\n  \u003c/div\u003e\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e6edf3;background-color:#0d1117;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003echown backup:backup /mnt/nfs-backup/backups\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/div\u003e\n\u003cp\u003eSollte hier ein Fehler auftreten mit \u003cem\u003eOperation not permitted\u003c/em\u003e hast du ggf. die Anleitung oben zu Unraid vergessen. Die NFS Export Parameter sind nämlich hier entscheidend.\u003c/p\u003e\n\u003ch2 id=\"datastore-im-proxmox-backup-server-hinzufügen\"\u003eDatastore im Proxmox Backup Server hinzufügen\u003ca href=\"#datastore-im-proxmox-backup-server-hinzuf%c3%bcgen\" class=\"heading-anchor\" aria-label=\"Diesen Abschnitt verlinken\"\u003e\u003csvg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"\u003e\u003cpath d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\"\u003e\u003c/path\u003e\u003cpath d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eJetzt können wir endlich die Freigabe auch im PBS hinzufügen. Dazu verbinden wir uns zur PBS GUI und wählen links unter \u003cstrong\u003eDatastore\u003c/strong\u003e \u003cstrong\u003eAdd Datastore\u003c/strong\u003e aus.\nDen Namen kannst du natürlich frei vergeben. Als \u003cstrong\u003eBacking Path\u003c/strong\u003e kommt der Pfad der Freigabe rein. In unserem Fall \u003cem\u003e/mnt/nfs-backup/backups\u003c/em\u003e\nSolltest du den angepasst haben, bitte entsprechend hier auch tun. Die restlichen Parameter kannst du nach belieben einstellen.\u003c/p\u003e\n\u003cp\u003e\u003cimg 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\"\u003e\u003c/p\u003e\n\u003cp\u003eSollte hier ein Fehler auftreten wird der Backup-Nutzer nicht in das Verzeichnis schreiben dürfen. Überprüfe nochmal die Berechtigungen des Pfades.\u003c/p\u003e\n\u003cp\u003eDer 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.\u003c/p\u003e\n","date_published":"2024-03-15T11:45:00+01:00","date_modified":"2024-03-15T11:45:00+01:00","tags":["proxmox","backup","unraid"]},{"id":"https://www.teqqy.de/2024-02-s3-speicher-mit-minio-und-nginx-tutorial/","url":"https://www.teqqy.de/2024-02-s3-speicher-mit-minio-und-nginx-tutorial/","title":"Tutorial: S3 Speicher mit Minio \u0026 nginx (ohne Docker) selbst hosten","summary":"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\u0026rsquo;s encrypt Zertifikaten ab, sodass immer eine gesicherte Verbindung aufgebaut werden kann.\n","content_html":"\u003cp\u003eIch 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 \u003ca href=\"https://min.io/\" target=\"_blank\" rel=\"noopener noreferrer\"\u003eMinio\u003csvg 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\"\u003e\n  \u003cpath d=\"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6\"/\u003e\n  \u003cpolyline points=\"15 3 21 3 21 9\"/\u003e\n  \u003cline x1=\"10\" y1=\"14\" x2=\"21\" y2=\"3\"/\u003e\n\u003c/svg\u003e\u003cspan class=\"visually-hidden\"\u003e (externer Link)\u003c/span\u003e\u003c/a\u003e\n auf einem Debian 12 (Bookworm) System. Dazu verwenden wir direkt nginx als Reverse Proxy und sichern das mittels Let\u0026rsquo;s encrypt Zertifikaten ab, sodass immer eine gesicherte Verbindung aufgebaut werden kann.\u003c/p\u003e\n\u003ch2 id=\"was-ist-s3-speicher\"\u003eWas ist S3 Speicher?\u003ca href=\"#was-ist-s3-speicher\" class=\"heading-anchor\" aria-label=\"Diesen Abschnitt verlinken\"\u003e\u003csvg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"\u003e\u003cpath d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\"\u003e\u003c/path\u003e\u003cpath d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eS3-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 \u0026ldquo;Buckets\u0026rdquo; organisiert, die als virtuelle Container dienen, um die Objekte zu gruppieren.\u003c/p\u003e\n\u003ch2 id=\"installation-von-minio\"\u003eInstallation von Minio\u003ca href=\"#installation-von-minio\" class=\"heading-anchor\" aria-label=\"Diesen Abschnitt verlinken\"\u003e\u003csvg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"\u003e\u003cpath d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\"\u003e\u003c/path\u003e\u003cpath d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/h2\u003e\n\u003ch3 id=\"anlegen-des-nutzers-und-gruppe\"\u003eAnlegen des Nutzers und Gruppe\u003ca href=\"#anlegen-des-nutzers-und-gruppe\" class=\"heading-anchor\" aria-label=\"Diesen Abschnitt verlinken\"\u003e\u003csvg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"\u003e\u003cpath d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\"\u003e\u003c/path\u003e\u003cpath d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eMittlerweile gibt es extra Paket für \u003ca href=\"https://www.debian.org\" target=\"_blank\" rel=\"noopener noreferrer\"\u003eDebian\u003csvg 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\"\u003e\n  \u003cpath d=\"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6\"/\u003e\n  \u003cpolyline points=\"15 3 21 3 21 9\"/\u003e\n  \u003cline x1=\"10\" y1=\"14\" x2=\"21\" y2=\"3\"/\u003e\n\u003c/svg\u003e\u003cspan class=\"visually-hidden\"\u003e (externer Link)\u003c/span\u003e\u003c/a\u003e\n 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.\u003c/p\u003e\n\u003cdiv class=\"code-block\"\u003e\n  \u003cdiv class=\"code-block-header\"\u003e\n    \u003cspan class=\"code-lang-label\"\u003ebash\u003c/span\u003e\n    \u003cbutton class=\"code-copy-btn\" type=\"button\" aria-label=\"Code kopieren\" data-umami-event=\"Code Copy\" data-umami-event-lang=\"bash\"\u003e\n      \u003csvg 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\"\u003e\u003crect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\"\u003e\u003c/rect\u003e\u003cpath d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\"\u003e\u003c/path\u003e\u003c/svg\u003e\n      \u003csvg 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\"\u003e\u003cpolyline points=\"20 6 9 17 4 12\"\u003e\u003c/polyline\u003e\u003c/svg\u003e\n    \u003c/button\u003e\n  \u003c/div\u003e\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e6edf3;background-color:#0d1117;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003egroupadd -r minio-user\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003euseradd -M -r -g minio-user minio-user\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/div\u003e\n\u003cp\u003eWie 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.\u003c/p\u003e\n\u003ch3 id=\"datenverzeichnis-vorbereiten\"\u003eDatenverzeichnis vorbereiten\u003ca href=\"#datenverzeichnis-vorbereiten\" class=\"heading-anchor\" aria-label=\"Diesen Abschnitt verlinken\"\u003e\u003csvg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"\u003e\u003cpath d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\"\u003e\u003c/path\u003e\u003cpath d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eAls nächstes solltest du dir noch Gedanken machen wohin auf deinem System die Daten abgelegt werden sollen. In meinem Fall lege dich diese nach \u003cem\u003e/opt\u003c/em\u003e ab.\nZuerst wird das Verzeichnis angelegt und anschließend bekommt unser Minio Nutzer \u003cem\u003eminio-user\u003c/em\u003e das Verzeichnis als Besitzer zugeordnet.\u003c/p\u003e\n\u003cdiv class=\"code-block\"\u003e\n  \u003cdiv class=\"code-block-header\"\u003e\n    \u003cspan class=\"code-lang-label\"\u003ebash\u003c/span\u003e\n    \u003cbutton class=\"code-copy-btn\" type=\"button\" aria-label=\"Code kopieren\" data-umami-event=\"Code Copy\" data-umami-event-lang=\"bash\"\u003e\n      \u003csvg 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\"\u003e\u003crect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\"\u003e\u003c/rect\u003e\u003cpath d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\"\u003e\u003c/path\u003e\u003c/svg\u003e\n      \u003csvg 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\"\u003e\u003cpolyline points=\"20 6 9 17 4 12\"\u003e\u003c/polyline\u003e\u003c/svg\u003e\n    \u003c/button\u003e\n  \u003c/div\u003e\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e6edf3;background-color:#0d1117;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003emkdir -p /opt/minio\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003echown minio-user:minio-user /opt/minio\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/div\u003e\n\u003ch3 id=\"minio-paket-installieren\"\u003eMinio Paket installieren\u003ca href=\"#minio-paket-installieren\" class=\"heading-anchor\" aria-label=\"Diesen Abschnitt verlinken\"\u003e\u003csvg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"\u003e\u003cpath d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\"\u003e\u003c/path\u003e\u003cpath d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eGlü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 \u003cem\u003esystemd\u003c/em\u003e Skript um das Programm sauber darüber starte und stoppen zu können.\nZuerst 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 \u003ca href=\"https://dl.min.io/server/minio/release/linux-amd64/archive\" target=\"_blank\" rel=\"noopener noreferrer\"\u003ehier\u003csvg 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\"\u003e\n  \u003cpath d=\"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6\"/\u003e\n  \u003cpolyline points=\"15 3 21 3 21 9\"/\u003e\n  \u003cline x1=\"10\" y1=\"14\" x2=\"21\" y2=\"3\"/\u003e\n\u003c/svg\u003e\u003cspan class=\"visually-hidden\"\u003e (externer Link)\u003c/span\u003e\u003c/a\u003e\n welche die aktuelle Version ist und ersetze die Versionnummer.\u003c/p\u003e\n\u003cdiv class=\"code-block\"\u003e\n  \u003cdiv class=\"code-block-header\"\u003e\n    \u003cspan class=\"code-lang-label\"\u003ebash\u003c/span\u003e\n    \u003cbutton class=\"code-copy-btn\" type=\"button\" aria-label=\"Code kopieren\" data-umami-event=\"Code Copy\" data-umami-event-lang=\"bash\"\u003e\n      \u003csvg 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\"\u003e\u003crect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\"\u003e\u003c/rect\u003e\u003cpath d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\"\u003e\u003c/path\u003e\u003c/svg\u003e\n      \u003csvg 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\"\u003e\u003cpolyline points=\"20 6 9 17 4 12\"\u003e\u003c/polyline\u003e\u003c/svg\u003e\n    \u003c/button\u003e\n  \u003c/div\u003e\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e6edf3;background-color:#0d1117;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ewget https://dl.min.io/server/minio/release/linux-amd64/archive/minio_20240217011557.0.0_amd64.deb -O minio.deb\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/div\u003e\n\u003cp\u003eSollte dein System aus irgendwelchen Gründen den Befehl \u003cstrong\u003ewget\u003c/strong\u003e nicht kennen kannst du den mittels\u003c/p\u003e\n\u003cdiv class=\"code-block\"\u003e\n  \u003cdiv class=\"code-block-header\"\u003e\n    \u003cspan class=\"code-lang-label\"\u003ebash\u003c/span\u003e\n    \u003cbutton class=\"code-copy-btn\" type=\"button\" aria-label=\"Code kopieren\" data-umami-event=\"Code Copy\" data-umami-event-lang=\"bash\"\u003e\n      \u003csvg 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\"\u003e\u003crect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\"\u003e\u003c/rect\u003e\u003cpath d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\"\u003e\u003c/path\u003e\u003c/svg\u003e\n      \u003csvg 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\"\u003e\u003cpolyline points=\"20 6 9 17 4 12\"\u003e\u003c/polyline\u003e\u003c/svg\u003e\n    \u003c/button\u003e\n  \u003c/div\u003e\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e6edf3;background-color:#0d1117;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eapt install wget -y\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/div\u003e\n\u003cp\u003einstallieren.\u003c/p\u003e\n\u003cp\u003eNun brauchen wir nur noch Minio zu installieren und haben schon einen großen Teil erledigt.\u003c/p\u003e\n\u003cdiv class=\"code-block\"\u003e\n  \u003cdiv class=\"code-block-header\"\u003e\n    \u003cspan class=\"code-lang-label\"\u003ebash\u003c/span\u003e\n    \u003cbutton class=\"code-copy-btn\" type=\"button\" aria-label=\"Code kopieren\" data-umami-event=\"Code Copy\" data-umami-event-lang=\"bash\"\u003e\n      \u003csvg 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\"\u003e\u003crect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\"\u003e\u003c/rect\u003e\u003cpath d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\"\u003e\u003c/path\u003e\u003c/svg\u003e\n      \u003csvg 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\"\u003e\u003cpolyline points=\"20 6 9 17 4 12\"\u003e\u003c/polyline\u003e\u003c/svg\u003e\n    \u003c/button\u003e\n  \u003c/div\u003e\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e6edf3;background-color:#0d1117;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003edpkg -i minio.deb\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/div\u003e\n\u003cp\u003eNach ein paar Sekunden ist das ganze auch schon fertig und wir können anfangen das Programm zu konfigurieren.\u003c/p\u003e\n\u003ch2 id=\"standardkonfiguration-für-minio-anlegen\"\u003eStandardkonfiguration für Minio anlegen\u003ca href=\"#standardkonfiguration-f%c3%bcr-minio-anlegen\" class=\"heading-anchor\" aria-label=\"Diesen Abschnitt verlinken\"\u003e\u003csvg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"\u003e\u003cpath d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\"\u003e\u003c/path\u003e\u003cpath d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eWir 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\u003c/p\u003e\n\u003cdiv class=\"code-block\"\u003e\n  \u003cdiv class=\"code-block-header\"\u003e\n    \u003cspan class=\"code-lang-label\"\u003ebash\u003c/span\u003e\n    \u003cbutton class=\"code-copy-btn\" type=\"button\" aria-label=\"Code kopieren\" data-umami-event=\"Code Copy\" data-umami-event-lang=\"bash\"\u003e\n      \u003csvg 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\"\u003e\u003crect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\"\u003e\u003c/rect\u003e\u003cpath d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\"\u003e\u003c/path\u003e\u003c/svg\u003e\n      \u003csvg 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\"\u003e\u003cpolyline points=\"20 6 9 17 4 12\"\u003e\u003c/polyline\u003e\u003c/svg\u003e\n    \u003c/button\u003e\n  \u003c/div\u003e\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e6edf3;background-color:#0d1117;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003etouch /etc/default/minio\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/div\u003e\n\u003cp\u003eund bearbeiten diese. Ich verwende immer \u003cem\u003evim\u003c/em\u003e als Editor. Du kannst natürlich auch gerne \u003cem\u003enano\u003c/em\u003e verwenden wenn dir das lieber ist.\u003c/p\u003e\n\u003cdiv class=\"code-block\"\u003e\n  \u003cdiv class=\"code-block-header\"\u003e\n    \u003cspan class=\"code-lang-label\"\u003ebash\u003c/span\u003e\n    \u003cbutton class=\"code-copy-btn\" type=\"button\" aria-label=\"Code kopieren\" data-umami-event=\"Code Copy\" data-umami-event-lang=\"bash\"\u003e\n      \u003csvg 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\"\u003e\u003crect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\"\u003e\u003c/rect\u003e\u003cpath d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\"\u003e\u003c/path\u003e\u003c/svg\u003e\n      \u003csvg 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\"\u003e\u003cpolyline points=\"20 6 9 17 4 12\"\u003e\u003c/polyline\u003e\u003c/svg\u003e\n    \u003c/button\u003e\n  \u003c/div\u003e\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e6edf3;background-color:#0d1117;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003evim /etc/default/minio\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/div\u003e\n\u003cp\u003eDarin kopieren wir jetzt folgende Zeilen\u003c/p\u003e\n\u003cdiv class=\"code-block\"\u003e\n  \u003cdiv class=\"code-block-header\"\u003e\n    \u003cspan class=\"code-lang-label\"\u003e\u003c/span\u003e\n    \u003cbutton class=\"code-copy-btn\" type=\"button\" aria-label=\"Code kopieren\" data-umami-event=\"Code Copy\" data-umami-event-lang=\"\"\u003e\n      \u003csvg 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\"\u003e\u003crect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\"\u003e\u003c/rect\u003e\u003cpath d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\"\u003e\u003c/path\u003e\u003c/svg\u003e\n      \u003csvg 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\"\u003e\u003cpolyline points=\"20 6 9 17 4 12\"\u003e\u003c/polyline\u003e\u003c/svg\u003e\n    \u003c/button\u003e\n  \u003c/div\u003e\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e# Definition des Admin Accounts\nMINIO_ROOT_USER=myminioadmin\nMINIO_ROOT_PASSWORD=minio-secret-key-change-me\n\n# MINIO_VOLUMES setzt das Verzeichnis in dem unsere Daten gespeichert werden\n\nMINIO_VOLUMES=\u0026#34;/opt/minio\u0026#34;\n\n# Damit wir auch die Konsole bzw. Webfrontend verwenden können, müssen wir das natürlich noch setzen\nMINIO_OPTS=\u0026#34;--console-address :9001\u0026#34;\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cp\u003eBitte pass entsprechend \u003cstrong\u003eMINIO_ROOT_USER\u003c/strong\u003e und \u003cstrong\u003eMINIO_ROOT_PASSWORD\u003c/strong\u003e 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.\u003c/p\u003e\n\u003ch2 id=\"minio-starten-und-login\"\u003eMinio starten und Login\u003ca href=\"#minio-starten-und-login\" class=\"heading-anchor\" aria-label=\"Diesen Abschnitt verlinken\"\u003e\u003csvg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"\u003e\u003cpath d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\"\u003e\u003c/path\u003e\u003cpath d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eNun starten wir Minio erst einmal um zu sehen ob alles funktioniert. Zudem sollten wir uns auch einmal anmelden um auch das gegengetestet zu haben.\u003c/p\u003e\n\u003cdiv class=\"code-block\"\u003e\n  \u003cdiv class=\"code-block-header\"\u003e\n    \u003cspan class=\"code-lang-label\"\u003ebash\u003c/span\u003e\n    \u003cbutton class=\"code-copy-btn\" type=\"button\" aria-label=\"Code kopieren\" data-umami-event=\"Code Copy\" data-umami-event-lang=\"bash\"\u003e\n      \u003csvg 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\"\u003e\u003crect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\"\u003e\u003c/rect\u003e\u003cpath d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\"\u003e\u003c/path\u003e\u003c/svg\u003e\n      \u003csvg 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\"\u003e\u003cpolyline points=\"20 6 9 17 4 12\"\u003e\u003c/polyline\u003e\u003c/svg\u003e\n    \u003c/button\u003e\n  \u003c/div\u003e\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e6edf3;background-color:#0d1117;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003esystemctl enable minio\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003esystemctl start minio\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/div\u003e\n\u003cp\u003eNun öffnen wir einen Browser und navigieren zu \u003cstrong\u003e{HOSTIP}:9001\u003c/strong\u003e und sollten anschließend so ein Bild sehen.\n\u003cimg 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\"\u003e\nBitte anschließend einmal einloggen um zu sehen, dass auch deine Zugangsdaten korrekt funktionieren.\u003c/p\u003e\n\u003ch2 id=\"nginx-als-rervse-proxy-mit-zertifkat-einrichten\"\u003enginx als Rervse Proxy mit Zertifkat einrichten\u003ca href=\"#nginx-als-rervse-proxy-mit-zertifkat-einrichten\" class=\"heading-anchor\" aria-label=\"Diesen Abschnitt verlinken\"\u003e\u003csvg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"\u003e\u003cpath d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\"\u003e\u003c/path\u003e\u003cpath d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eIch verwende in dem Tutorial \u003cstrong\u003eCerbot\u003c/strong\u003e zum generieren des Let\u0026rsquo;s encrypt Zertifikates. Zudem wird mein öffentliches DNS meiner Domain von Cloudflare betrieben. Entsprechend verwende ich hier die \u003cem\u003edns-challenge\u003c/em\u003e mit Cloudflare und API Token.\u003c/p\u003e\n\u003ch3 id=\"cloudflare-api-token-generieren\"\u003eCloudflare API Token generieren\u003ca href=\"#cloudflare-api-token-generieren\" class=\"heading-anchor\" aria-label=\"Diesen Abschnitt verlinken\"\u003e\u003csvg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"\u003e\u003cpath d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\"\u003e\u003c/path\u003e\u003cpath d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eAuf der Cloudflare Profilseite gibt es den Punkt \u003ca href=\"https://dash.cloudflare.com/profile/api-tokens\" target=\"_blank\" rel=\"noopener noreferrer\"\u003eAPI Tokens\u003csvg 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\"\u003e\n  \u003cpath d=\"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6\"/\u003e\n  \u003cpolyline points=\"15 3 21 3 21 9\"/\u003e\n  \u003cline x1=\"10\" y1=\"14\" x2=\"21\" y2=\"3\"/\u003e\n\u003c/svg\u003e\u003cspan class=\"visually-hidden\"\u003e (externer Link)\u003c/span\u003e\u003c/a\u003e\n (Generischer Link dorthin). Dort legen wir uns rechts oben ein neuen Token an und verwenden das Template \u003cstrong\u003eEdit Zone DNS\u003c/strong\u003e. Du solltest nun ungefähr dieses Bild hier sehen.\n\u003cimg 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\"\u003e\nDen Bereich Permissions lassen wir so wie er ist. Im Bereich \u003cstrong\u003eZone Resources\u003c/strong\u003e müssen wir im letzten drop down Feld in der Reihe nur noch die entsprechende Domain auswählen. Den Rest können wir mit \u003cstrong\u003eContinue to summary\u003c/strong\u003e ebenfalls auslassen. Auf der nächsten Seite bestätigen wir mit \u003cstrong\u003eCreate Token\u003c/strong\u003e 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.\u003c/p\u003e\n\u003ch3 id=\"pakete-installieren\"\u003ePakete installieren\u003ca href=\"#pakete-installieren\" class=\"heading-anchor\" aria-label=\"Diesen Abschnitt verlinken\"\u003e\u003csvg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"\u003e\u003cpath d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\"\u003e\u003c/path\u003e\u003cpath d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eNun zurück zu unserer Linux Maschine. Wir können hier nun endlich alle benötigten Pakete installieren die wir brauchen.\u003c/p\u003e\n\u003cdiv class=\"code-block\"\u003e\n  \u003cdiv class=\"code-block-header\"\u003e\n    \u003cspan class=\"code-lang-label\"\u003ebash\u003c/span\u003e\n    \u003cbutton class=\"code-copy-btn\" type=\"button\" aria-label=\"Code kopieren\" data-umami-event=\"Code Copy\" data-umami-event-lang=\"bash\"\u003e\n      \u003csvg 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\"\u003e\u003crect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\"\u003e\u003c/rect\u003e\u003cpath d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\"\u003e\u003c/path\u003e\u003c/svg\u003e\n      \u003csvg 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\"\u003e\u003cpolyline points=\"20 6 9 17 4 12\"\u003e\u003c/polyline\u003e\u003c/svg\u003e\n    \u003c/button\u003e\n  \u003c/div\u003e\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e6edf3;background-color:#0d1117;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eapt install nginx certbot python3-certbot-dns-cloudflare\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/div\u003e\n\u003cp\u003eDies benötigt ein paar Sekunden und wir können weiter machen uns unser Zertifikat zu besorgen.\u003c/p\u003e\n\u003ch3 id=\"lets-encrypt-zertifikat-mit-certbot-beantragen\"\u003eLet\u0026rsquo;s encrypt Zertifikat mit Certbot beantragen\u003ca href=\"#lets-encrypt-zertifikat-mit-certbot-beantragen\" class=\"heading-anchor\" aria-label=\"Diesen Abschnitt verlinken\"\u003e\u003csvg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"\u003e\u003cpath d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\"\u003e\u003c/path\u003e\u003cpath d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eZuerst richten wir noch die Punkte für die DNS Challenge zu Cloudflare ein. Dazu erstellen wir uns ein Verzeichnis\u003c/p\u003e\n\u003cdiv class=\"code-block\"\u003e\n  \u003cdiv class=\"code-block-header\"\u003e\n    \u003cspan class=\"code-lang-label\"\u003ebash\u003c/span\u003e\n    \u003cbutton class=\"code-copy-btn\" type=\"button\" aria-label=\"Code kopieren\" data-umami-event=\"Code Copy\" data-umami-event-lang=\"bash\"\u003e\n      \u003csvg 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\"\u003e\u003crect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\"\u003e\u003c/rect\u003e\u003cpath d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\"\u003e\u003c/path\u003e\u003c/svg\u003e\n      \u003csvg 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\"\u003e\u003cpolyline points=\"20 6 9 17 4 12\"\u003e\u003c/polyline\u003e\u003c/svg\u003e\n    \u003c/button\u003e\n  \u003c/div\u003e\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e6edf3;background-color:#0d1117;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003emkdir -p /etc/certbot\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/div\u003e\n\u003cp\u003eund legen uns dort eine Datei an\u003c/p\u003e\n\u003cdiv class=\"code-block\"\u003e\n  \u003cdiv class=\"code-block-header\"\u003e\n    \u003cspan class=\"code-lang-label\"\u003ebash\u003c/span\u003e\n    \u003cbutton class=\"code-copy-btn\" type=\"button\" aria-label=\"Code kopieren\" data-umami-event=\"Code Copy\" data-umami-event-lang=\"bash\"\u003e\n      \u003csvg 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\"\u003e\u003crect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\"\u003e\u003c/rect\u003e\u003cpath d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\"\u003e\u003c/path\u003e\u003c/svg\u003e\n      \u003csvg 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\"\u003e\u003cpolyline points=\"20 6 9 17 4 12\"\u003e\u003c/polyline\u003e\u003c/svg\u003e\n    \u003c/button\u003e\n  \u003c/div\u003e\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e6edf3;background-color:#0d1117;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003etouch /etc/certbot/credentials\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/div\u003e\n\u003cp\u003ein diese kommt nun unser Cloudflare Token. Also editieren wir die Datei\u003c/p\u003e\n\u003cdiv class=\"code-block\"\u003e\n  \u003cdiv class=\"code-block-header\"\u003e\n    \u003cspan class=\"code-lang-label\"\u003ebash\u003c/span\u003e\n    \u003cbutton class=\"code-copy-btn\" type=\"button\" aria-label=\"Code kopieren\" data-umami-event=\"Code Copy\" data-umami-event-lang=\"bash\"\u003e\n      \u003csvg 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\"\u003e\u003crect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\"\u003e\u003c/rect\u003e\u003cpath d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\"\u003e\u003c/path\u003e\u003c/svg\u003e\n      \u003csvg 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\"\u003e\u003cpolyline points=\"20 6 9 17 4 12\"\u003e\u003c/polyline\u003e\u003c/svg\u003e\n    \u003c/button\u003e\n  \u003c/div\u003e\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e6edf3;background-color:#0d1117;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003evim /etc/certbot/credentials\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/div\u003e\n\u003cp\u003eund kopieren folgendes dort rein\u003c/p\u003e\n\u003cdiv class=\"code-block\"\u003e\n  \u003cdiv class=\"code-block-header\"\u003e\n    \u003cspan class=\"code-lang-label\"\u003e\u003c/span\u003e\n    \u003cbutton class=\"code-copy-btn\" type=\"button\" aria-label=\"Code kopieren\" data-umami-event=\"Code Copy\" data-umami-event-lang=\"\"\u003e\n      \u003csvg 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\"\u003e\u003crect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\"\u003e\u003c/rect\u003e\u003cpath d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\"\u003e\u003c/path\u003e\u003c/svg\u003e\n      \u003csvg 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\"\u003e\u003cpolyline points=\"20 6 9 17 4 12\"\u003e\u003c/polyline\u003e\u003c/svg\u003e\n    \u003c/button\u003e\n  \u003c/div\u003e\u003cpre tabindex=\"0\"\u003e\u003ccode\u003edns_cloudflare_api_token={DEIN_CLOUDFLARE_API_TOKEN}\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cp\u003eDamit die Datei nicht von jedem Nutzer auf dem System gelesen werden kann, passen wir noch die Berechtigungen mittels\u003c/p\u003e\n\u003cdiv class=\"code-block\"\u003e\n  \u003cdiv class=\"code-block-header\"\u003e\n    \u003cspan class=\"code-lang-label\"\u003ebash\u003c/span\u003e\n    \u003cbutton class=\"code-copy-btn\" type=\"button\" aria-label=\"Code kopieren\" data-umami-event=\"Code Copy\" data-umami-event-lang=\"bash\"\u003e\n      \u003csvg 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\"\u003e\u003crect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\"\u003e\u003c/rect\u003e\u003cpath d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\"\u003e\u003c/path\u003e\u003c/svg\u003e\n      \u003csvg 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\"\u003e\u003cpolyline points=\"20 6 9 17 4 12\"\u003e\u003c/polyline\u003e\u003c/svg\u003e\n    \u003c/button\u003e\n  \u003c/div\u003e\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e6edf3;background-color:#0d1117;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003echmod \u003cspan style=\"color:#a5d6ff\"\u003e600\u003c/span\u003e /etc/certbot/credentials\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/div\u003e\n\u003cp\u003ean. 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.\u003c/p\u003e\n\u003cdiv class=\"code-block\"\u003e\n  \u003cdiv class=\"code-block-header\"\u003e\n    \u003cspan class=\"code-lang-label\"\u003ebash\u003c/span\u003e\n    \u003cbutton class=\"code-copy-btn\" type=\"button\" aria-label=\"Code kopieren\" data-umami-event=\"Code Copy\" data-umami-event-lang=\"bash\"\u003e\n      \u003csvg 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\"\u003e\u003crect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\"\u003e\u003c/rect\u003e\u003cpath d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\"\u003e\u003c/path\u003e\u003c/svg\u003e\n      \u003csvg 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\"\u003e\u003cpolyline points=\"20 6 9 17 4 12\"\u003e\u003c/polyline\u003e\u003c/svg\u003e\n    \u003c/button\u003e\n  \u003c/div\u003e\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e6edf3;background-color:#0d1117;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ecertbot certonly --dns-cloudflare --dns-cloudflare-credentials /etc/certbot/credentials -d minio.example.com -d s3.example.com\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/div\u003e\n\u003caside class=\"callout callout-info\" role=\"note\" aria-label=\"Hinweis\"\u003e\n  \u003csvg 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\"\u003e\n    \u003ccircle cx=\"12\" cy=\"12\" r=\"10\"/\u003e\n    \u003cline x1=\"12\" y1=\"8\" x2=\"12\" y2=\"12\"/\u003e\n    \u003cline x1=\"12\" y1=\"16\" x2=\"12.01\" y2=\"16\"/\u003e\n  \u003c/svg\u003e\n  \u003cdiv class=\"callout-content\"\u003e\n    \u003cp class=\"callout-title\"\u003eHinweis\u003c/p\u003e\n    \u003cdiv class=\"callout-body\"\u003eAus 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.\u003c/div\u003e\n  \u003c/div\u003e\n\u003c/aside\u003e\n\n\u003ch3 id=\"nginx-einrichten\"\u003enginx einrichten\u003ca href=\"#nginx-einrichten\" class=\"heading-anchor\" aria-label=\"Diesen Abschnitt verlinken\"\u003e\u003csvg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"\u003e\u003cpath d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\"\u003e\u003c/path\u003e\u003cpath d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eNun 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\u003c/p\u003e\n\u003cdiv class=\"code-block\"\u003e\n  \u003cdiv class=\"code-block-header\"\u003e\n    \u003cspan class=\"code-lang-label\"\u003ebash\u003c/span\u003e\n    \u003cbutton class=\"code-copy-btn\" type=\"button\" aria-label=\"Code kopieren\" data-umami-event=\"Code Copy\" data-umami-event-lang=\"bash\"\u003e\n      \u003csvg 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\"\u003e\u003crect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\"\u003e\u003c/rect\u003e\u003cpath d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\"\u003e\u003c/path\u003e\u003c/svg\u003e\n      \u003csvg 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\"\u003e\u003cpolyline points=\"20 6 9 17 4 12\"\u003e\u003c/polyline\u003e\u003c/svg\u003e\n    \u003c/button\u003e\n  \u003c/div\u003e\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e6edf3;background-color:#0d1117;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ecd /etc/nginx/sites-available\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/div\u003e\n\u003cp\u003eDort legen wir dann die Seitenkonfiguration an\u003c/p\u003e\n\u003cdiv class=\"code-block\"\u003e\n  \u003cdiv class=\"code-block-header\"\u003e\n    \u003cspan class=\"code-lang-label\"\u003ebash\u003c/span\u003e\n    \u003cbutton class=\"code-copy-btn\" type=\"button\" aria-label=\"Code kopieren\" data-umami-event=\"Code Copy\" data-umami-event-lang=\"bash\"\u003e\n      \u003csvg 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\"\u003e\u003crect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\"\u003e\u003c/rect\u003e\u003cpath d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\"\u003e\u003c/path\u003e\u003c/svg\u003e\n      \u003csvg 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\"\u003e\u003cpolyline points=\"20 6 9 17 4 12\"\u003e\u003c/polyline\u003e\u003c/svg\u003e\n    \u003c/button\u003e\n  \u003c/div\u003e\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e6edf3;background-color:#0d1117;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003etouch minio.conf\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/div\u003e\n\u003cp\u003eund können dann auch diese im Anschluss bearbeiten\u003c/p\u003e\n\u003cdiv class=\"code-block\"\u003e\n  \u003cdiv class=\"code-block-header\"\u003e\n    \u003cspan class=\"code-lang-label\"\u003ebash\u003c/span\u003e\n    \u003cbutton class=\"code-copy-btn\" type=\"button\" aria-label=\"Code kopieren\" data-umami-event=\"Code Copy\" data-umami-event-lang=\"bash\"\u003e\n      \u003csvg 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\"\u003e\u003crect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\"\u003e\u003c/rect\u003e\u003cpath d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\"\u003e\u003c/path\u003e\u003c/svg\u003e\n      \u003csvg 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\"\u003e\u003cpolyline points=\"20 6 9 17 4 12\"\u003e\u003c/polyline\u003e\u003c/svg\u003e\n    \u003c/button\u003e\n  \u003c/div\u003e\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e6edf3;background-color:#0d1117;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003evim minio.conf\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/div\u003e\n\u003cp\u003eDort kannst du dann folgendes rein kopieren:\u003c/p\u003e\n\u003cdiv class=\"code-block\"\u003e\n  \u003cdiv class=\"code-block-header\"\u003e\n    \u003cspan class=\"code-lang-label\"\u003econf\u003c/span\u003e\n    \u003cbutton class=\"code-copy-btn\" type=\"button\" aria-label=\"Code kopieren\" data-umami-event=\"Code Copy\" data-umami-event-lang=\"conf\"\u003e\n      \u003csvg 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\"\u003e\u003crect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\"\u003e\u003c/rect\u003e\u003cpath d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\"\u003e\u003c/path\u003e\u003c/svg\u003e\n      \u003csvg 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\"\u003e\u003cpolyline points=\"20 6 9 17 4 12\"\u003e\u003c/polyline\u003e\u003c/svg\u003e\n    \u003c/button\u003e\n  \u003c/div\u003e\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-conf\" data-lang=\"conf\"\u003e## API End Point\nserver\n{\n\t# Listen\n\tlisten 80;\n\tlisten [::]:80;\n\tlisten 443 ssl http2;\n\tlisten [::]:443 ssl http2;\n\n\t# Directory \u0026amp; Server Naming\n\tserver_name s3.example.com;\n\n\t# HTTP to HTTPS redirection\n\tif ($scheme != \u0026#34;https\u0026#34;)\n\t{\n\t\treturn 301 https://$host$request_uri;\n\t}\n\n\t# SSL\n\tssl_certificate /etc/letsencrypt/live/minio.example.com/fullchain.pem;\n\tssl_certificate_key /etc/letsencrypt/live/minio.example.com/privkey.pem;\n\n\t# Disable Hidden FIle Access Except Lets Encrypt Verification\n\tlocation ~ /\\.well-known\n\t{\n\t\tallow all;\n\t}\n\n\t# Allow special characters in headers\n\tignore_invalid_headers off;\n\n\t# Allow any size file to be uploaded.\n\t# Set to a value such as 1000m; to restrict file size to a specific value\n\tclient_max_body_size 0;\n\n\t# Disable buffering\n\tproxy_buffering off;\n\tproxy_request_buffering off;\n\n\tlocation /\n\t{\n\t\tproxy_set_header Host $http_host;\n\t\tproxy_set_header X-Real-IP $remote_addr;\n\t\tproxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;\n\t\tproxy_set_header X-Forwarded-Proto $scheme;\n\n\t\tproxy_connect_timeout 300;\n\t\t# Default is HTTP/1, keepalive is only enabled in HTTP/1.1\n\t\tproxy_http_version 1.1;\n\t\tproxy_set_header Connection \u0026#34;\u0026#34;;\n\t\tchunked_transfer_encoding off;\n\t\tproxy_pass http://127.0.0.1:9000;\n\t}\n\n\t# Nginx Logging\n\taccess_log /var/log/nginx/s3.example.com-access.log;\n\terror_log /var/log/nginx/s3.example.com-error.log warn;\n}\n\n###################### Console ######################\n\nserver\n{\n\t# Listen\n\tlisten 80;\n\tlisten [::]:80;\n\tlisten 443 ssl http2;\n\tlisten [::]:443 ssl http2;\n\n\t# Directory \u0026amp; Server Naming\n\tserver_name minio.example.com;\n\n\t# HTTP to HTTPS redirection\n\tif ($scheme != \u0026#34;https\u0026#34;)\n\t{\n\t\treturn 301 https://$host$request_uri;\n\t}\n\n\t# SSL\n\tssl_certificate /etc/letsencrypt/live/minio.example.com/fullchain.pem;\n\tssl_certificate_key /etc/letsencrypt/live/minio.example.com/privkey.pem;\n\n\t# Disable Hidden FIle Access Except Lets Encrypt Verification\n\tlocation ~ /\\.well-known\n\t{\n\t\tallow all;\n\t}\n\n\t# Allow special characters in headers\n\tignore_invalid_headers off;\n\n\t# Allow any size file to be uploaded.\n\t# Set to a value such as 1000m; to restrict file size to a specific value\n\tclient_max_body_size 0;\n\n\t# Disable buffering\n\tproxy_buffering off;\n\tproxy_request_buffering off;\n\n\tlocation /\n\t{\n\t\tproxy_set_header Host $http_host;\n\t\tproxy_set_header X-Real-IP $remote_addr;\n\t\tproxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;\n\t\tproxy_set_header X-Forwarded-Proto $scheme;\n\t\tproxy_set_header X-NginX-Proxy true;\n\t\tproxy_connect_timeout 300;\n\n\t\t# To support websocket\n\t\tproxy_http_version 1.1;\n\t\tproxy_set_header Upgrade $http_upgrade;\n\t\tproxy_set_header Connection \u0026#34;upgrade\u0026#34;;\n\n\t\tchunked_transfer_encoding off;\n\t\tproxy_pass http://127.0.0.1:9001;\n\t}\n\n\t# Nginx Logging\n\taccess_log /var/log/nginx/minio.example.com-access.log;\n\terror_log /var/log/nginx/minio.example.com-error.log warn;\n}\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cp\u003eBitte beachte, dass du überall das \u003cem\u003eexample.com\u003c/em\u003e durch deine eigene Domain austauschst. Die Konfiguration habe ich von \u003ca href=\"https://gist.github.com/amanjuman/800d81481634f296042457fa9fb21697\" target=\"_blank\" rel=\"noopener noreferrer\"\u003ehier\u003csvg 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\"\u003e\n  \u003cpath d=\"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6\"/\u003e\n  \u003cpolyline points=\"15 3 21 3 21 9\"/\u003e\n  \u003cline x1=\"10\" y1=\"14\" x2=\"21\" y2=\"3\"/\u003e\n\u003c/svg\u003e\u003cspan class=\"visually-hidden\"\u003e (externer Link)\u003c/span\u003e\u003c/a\u003e\n übernommen und ein wenig angepasst.\u003c/p\u003e\n\u003cp\u003eJetzt legen wir noch den symlink an\u003c/p\u003e\n\u003cdiv class=\"code-block\"\u003e\n  \u003cdiv class=\"code-block-header\"\u003e\n    \u003cspan class=\"code-lang-label\"\u003ebash\u003c/span\u003e\n    \u003cbutton class=\"code-copy-btn\" type=\"button\" aria-label=\"Code kopieren\" data-umami-event=\"Code Copy\" data-umami-event-lang=\"bash\"\u003e\n      \u003csvg 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\"\u003e\u003crect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\"\u003e\u003c/rect\u003e\u003cpath d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\"\u003e\u003c/path\u003e\u003c/svg\u003e\n      \u003csvg 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\"\u003e\u003cpolyline points=\"20 6 9 17 4 12\"\u003e\u003c/polyline\u003e\u003c/svg\u003e\n    \u003c/button\u003e\n  \u003c/div\u003e\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e6edf3;background-color:#0d1117;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eln /etc/nginx/site-available/minio.conf /etc/nginx/site-enabled/\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/div\u003e\n\u003cp\u003eund sollten testen ob wir auch kein Fehler gemacht haben. Das können wir am einfachsten mittels\u003c/p\u003e\n\u003cdiv class=\"code-block\"\u003e\n  \u003cdiv class=\"code-block-header\"\u003e\n    \u003cspan class=\"code-lang-label\"\u003ebash\u003c/span\u003e\n    \u003cbutton class=\"code-copy-btn\" type=\"button\" aria-label=\"Code kopieren\" data-umami-event=\"Code Copy\" data-umami-event-lang=\"bash\"\u003e\n      \u003csvg 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\"\u003e\u003crect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\"\u003e\u003c/rect\u003e\u003cpath d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\"\u003e\u003c/path\u003e\u003c/svg\u003e\n      \u003csvg 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\"\u003e\u003cpolyline points=\"20 6 9 17 4 12\"\u003e\u003c/polyline\u003e\u003c/svg\u003e\n    \u003c/button\u003e\n  \u003c/div\u003e\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e6edf3;background-color:#0d1117;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003enginx -t\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/div\u003e\n\u003cp\u003eHier sollte keine Ausgabe erscheinen. Andernfalls müstest du die angezeigten Fehler noch verbessern. Zu guter letzt können wir nginx neu starten\u003c/p\u003e\n\u003cdiv class=\"code-block\"\u003e\n  \u003cdiv class=\"code-block-header\"\u003e\n    \u003cspan class=\"code-lang-label\"\u003ebash\u003c/span\u003e\n    \u003cbutton class=\"code-copy-btn\" type=\"button\" aria-label=\"Code kopieren\" data-umami-event=\"Code Copy\" data-umami-event-lang=\"bash\"\u003e\n      \u003csvg 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\"\u003e\u003crect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\"\u003e\u003c/rect\u003e\u003cpath d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\"\u003e\u003c/path\u003e\u003c/svg\u003e\n      \u003csvg 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\"\u003e\u003cpolyline points=\"20 6 9 17 4 12\"\u003e\u003c/polyline\u003e\u003c/svg\u003e\n    \u003c/button\u003e\n  \u003c/div\u003e\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e6edf3;background-color:#0d1117;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003esystemctl restart nginx\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/div\u003e\n\u003cp\u003eJetzt 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.\u003c/p\u003e\n\u003ch2 id=\"optional-minio-admin-cli-installieren\"\u003eOptional: Minio Admin Cli installieren\u003ca href=\"#optional-minio-admin-cli-installieren\" class=\"heading-anchor\" aria-label=\"Diesen Abschnitt verlinken\"\u003e\u003csvg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"\u003e\u003cpath d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\"\u003e\u003c/path\u003e\u003cpath d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eGegebenenfalls 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.\u003c/p\u003e\n\u003cdiv class=\"code-block\"\u003e\n  \u003cdiv class=\"code-block-header\"\u003e\n    \u003cspan class=\"code-lang-label\"\u003ebash\u003c/span\u003e\n    \u003cbutton class=\"code-copy-btn\" type=\"button\" aria-label=\"Code kopieren\" data-umami-event=\"Code Copy\" data-umami-event-lang=\"bash\"\u003e\n      \u003csvg 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\"\u003e\u003crect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\"\u003e\u003c/rect\u003e\u003cpath d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\"\u003e\u003c/path\u003e\u003c/svg\u003e\n      \u003csvg 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\"\u003e\u003cpolyline points=\"20 6 9 17 4 12\"\u003e\u003c/polyline\u003e\u003c/svg\u003e\n    \u003c/button\u003e\n  \u003c/div\u003e\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e6edf3;background-color:#0d1117;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ecurl https://dl.min.io/client/mc/release/linux-amd64/mc -o /usr/local/sbin/mc\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/div\u003e\n\u003cp\u003eAllerdings wird es ohne Execute Rechte nicht ausgeführt werden können, also fügen wir diese noch hinzu\u003c/p\u003e\n\u003cdiv class=\"code-block\"\u003e\n  \u003cdiv class=\"code-block-header\"\u003e\n    \u003cspan class=\"code-lang-label\"\u003ebash\u003c/span\u003e\n    \u003cbutton class=\"code-copy-btn\" type=\"button\" aria-label=\"Code kopieren\" data-umami-event=\"Code Copy\" data-umami-event-lang=\"bash\"\u003e\n      \u003csvg 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\"\u003e\u003crect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\"\u003e\u003c/rect\u003e\u003cpath d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\"\u003e\u003c/path\u003e\u003c/svg\u003e\n      \u003csvg 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\"\u003e\u003cpolyline points=\"20 6 9 17 4 12\"\u003e\u003c/polyline\u003e\u003c/svg\u003e\n    \u003c/button\u003e\n  \u003c/div\u003e\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e6edf3;background-color:#0d1117;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003echmod +x /usr/local/sbin/mc\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/div\u003e\n\u003cp\u003eAnschließend könntest du mittels \u003cstrong\u003emc\u003c/strong\u003e den Minio Server auch via CLI administrieren.\u003c/p\u003e\n\u003ch2 id=\"fazit\"\u003eFazit\u003ca href=\"#fazit\" class=\"heading-anchor\" aria-label=\"Diesen Abschnitt verlinken\"\u003e\u003csvg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"\u003e\u003cpath d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\"\u003e\u003c/path\u003e\u003cpath d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eIn meinem \u003ca href=\"https://teqqy.de/categories/kubernetes/\" target=\"_blank\" rel=\"noopener noreferrer\"\u003eKubernetes Cluster\u003csvg 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\"\u003e\n  \u003cpath d=\"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6\"/\u003e\n  \u003cpolyline points=\"15 3 21 3 21 9\"/\u003e\n  \u003cline x1=\"10\" y1=\"14\" x2=\"21\" y2=\"3\"/\u003e\n\u003c/svg\u003e\u003cspan class=\"visually-hidden\"\u003e (externer Link)\u003c/span\u003e\u003c/a\u003e\n verwende ich Minio um darauf \u003ca href=\"/proxmox-backup-server/\"\u003eBackups\u003c/a\u003e\n abzulegen die mittels \u003ca href=\"https://github.com/backube/volsync\" target=\"_blank\" rel=\"noopener noreferrer\"\u003evolsync\u003csvg 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\"\u003e\n  \u003cpath d=\"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6\"/\u003e\n  \u003cpolyline points=\"15 3 21 3 21 9\"/\u003e\n  \u003cline x1=\"10\" y1=\"14\" x2=\"21\" y2=\"3\"/\u003e\n\u003c/svg\u003e\u003cspan class=\"visually-hidden\"\u003e (externer Link)\u003c/span\u003e\u003c/a\u003e\n erstellt wurden. Ebenso verwendet Thanos den S3 Speicher als Langzeitspeicher um die Prometheus Daten lange aufzuheben.\u003c/p\u003e\n\u003cp\u003eSolltest du Fragen zu dem Tutorial haben, kannst du mich gerne über eine der im Blog angegebenen Netzwerke erreichen.\u003c/p\u003e\n","date_published":"2024-02-24T21:18:00+01:00","date_modified":"2024-02-24T21:18:00+01:00","tags":["minio","nginx","ssl-tls","cloudflare"]},{"id":"https://www.teqqy.de/traefik-http3-aktivieren/","url":"https://www.teqqy.de/traefik-http3-aktivieren/","title":"Traefik http3 aktivieren","summary":"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.\n","content_html":"\u003cp\u003eWie 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 \u003ca href=\"https://metalhead.club/@thomas/111833215602688918#.\" target=\"_blank\" rel=\"noopener noreferrer\"\u003eBeitrag\u003csvg 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\"\u003e\n  \u003cpath d=\"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6\"/\u003e\n  \u003cpolyline points=\"15 3 21 3 21 9\"/\u003e\n  \u003cline x1=\"10\" y1=\"14\" x2=\"21\" y2=\"3\"/\u003e\n\u003c/svg\u003e\u003cspan class=\"visually-hidden\"\u003e (externer Link)\u003c/span\u003e\u003c/a\u003e\n auf Mastodon von \u003ca href=\"https://thomas-leister.de\" target=\"_blank\" rel=\"noopener noreferrer\"\u003eThomas Leister\u003csvg 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\"\u003e\n  \u003cpath d=\"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6\"/\u003e\n  \u003cpolyline points=\"15 3 21 3 21 9\"/\u003e\n  \u003cline x1=\"10\" y1=\"14\" x2=\"21\" y2=\"3\"/\u003e\n\u003c/svg\u003e\u003cspan class=\"visually-hidden\"\u003e (externer Link)\u003c/span\u003e\u003c/a\u003e\n bin ich darauf gekommen auch mal http3 zu aktivieren. Was du entsprechend tun musst, um das bei dir ebenfalls einzurichten habe ich hier aufgeschrieben.\u003c/p\u003e\n\u003ch2 id=\"vorteile-von-http3\"\u003eVorteile von http3\u003ca href=\"#vorteile-von-http3\" class=\"heading-anchor\" aria-label=\"Diesen Abschnitt verlinken\"\u003e\u003csvg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"\u003e\u003cpath d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\"\u003e\u003c/path\u003e\u003cpath d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003e\u003ca href=\"https://en.wikipedia.org/wiki/HTTP/3\" target=\"_blank\" rel=\"noopener noreferrer\"\u003eHTTP/3\u003csvg 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\"\u003e\n  \u003cpath d=\"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6\"/\u003e\n  \u003cpolyline points=\"15 3 21 3 21 9\"/\u003e\n  \u003cline x1=\"10\" y1=\"14\" x2=\"21\" y2=\"3\"/\u003e\n\u003c/svg\u003e\u003cspan class=\"visually-hidden\"\u003e (externer Link)\u003c/span\u003e\u003c/a\u003e\n 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:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eSchnellerer Verbindungsaufbau:\u003c/strong\u003e HTTP/3 verwendet das \u003ca href=\"https://en.wikipedia.org/wiki/QUIC\" target=\"_blank\" rel=\"noopener noreferrer\"\u003eQUIC\u003csvg 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\"\u003e\n  \u003cpath d=\"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6\"/\u003e\n  \u003cpolyline points=\"15 3 21 3 21 9\"/\u003e\n  \u003cline x1=\"10\" y1=\"14\" x2=\"21\" y2=\"3\"/\u003e\n\u003c/svg\u003e\u003cspan class=\"visually-hidden\"\u003e (externer Link)\u003c/span\u003e\u003c/a\u003e\n-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 \u0026ldquo;Handshake\u0026rdquo; in TCP verursacht wird.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eMultiplexing ohne Head-of-Line-Blocking:\u003c/strong\u003e 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.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eBessere Leistung bei Netzwerkproblemen:\u003c/strong\u003e 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.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eAdaptivität:\u003c/strong\u003e 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.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eVerbesserte Sicherheit:\u003c/strong\u003e 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.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eFlexibilität:\u003c/strong\u003e 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.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003eEs 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.\u003c/p\u003e\n\u003ch2 id=\"anpassen-der-traefik-konfiguration\"\u003eAnpassen der traefik Konfiguration\u003ca href=\"#anpassen-der-traefik-konfiguration\" class=\"heading-anchor\" aria-label=\"Diesen Abschnitt verlinken\"\u003e\u003csvg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"\u003e\u003cpath d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\"\u003e\u003c/path\u003e\u003cpath d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eIch verwendet primär die \u003ccode\u003etraefik.yml\u003c/code\u003e 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.\u003c/p\u003e\n\u003cdiv class=\"code-block\"\u003e\n  \u003cdiv class=\"code-block-header\"\u003e\n    \u003cspan class=\"code-lang-label\"\u003eyaml\u003c/span\u003e\n    \u003cbutton class=\"code-copy-btn\" type=\"button\" aria-label=\"Code kopieren\" data-umami-event=\"Code Copy\" data-umami-event-lang=\"yaml\"\u003e\n      \u003csvg 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\"\u003e\u003crect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\"\u003e\u003c/rect\u003e\u003cpath d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\"\u003e\u003c/path\u003e\u003c/svg\u003e\n      \u003csvg 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\"\u003e\u003cpolyline points=\"20 6 9 17 4 12\"\u003e\u003c/polyline\u003e\u003c/svg\u003e\n    \u003c/button\u003e\n  \u003c/div\u003e\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e6edf3;background-color:#0d1117;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-yaml\" data-lang=\"yaml\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#7ee787\"\u003eexperimental\u003c/span\u003e:\u003cspan style=\"color:#6e7681\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#6e7681\"\u003e  \u003c/span\u003e\u003cspan style=\"color:#7ee787\"\u003ehttp3\u003c/span\u003e:\u003cspan style=\"color:#6e7681\"\u003e \u003c/span\u003e\u003cspan style=\"color:#79c0ff\"\u003etrue\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/div\u003e\n\u003cp\u003eNun sind noch die Entrypoints anzupassen. meiner heißt \u003ccode\u003ewebsecure\u003c/code\u003e für die Verbindung von https. Entsprechend brauchen wir hier nur\u003c/p\u003e\n\u003cdiv class=\"code-block\"\u003e\n  \u003cdiv class=\"code-block-header\"\u003e\n    \u003cspan class=\"code-lang-label\"\u003eyaml\u003c/span\u003e\n    \u003cbutton class=\"code-copy-btn\" type=\"button\" aria-label=\"Code kopieren\" data-umami-event=\"Code Copy\" data-umami-event-lang=\"yaml\"\u003e\n      \u003csvg 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\"\u003e\u003crect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\"\u003e\u003c/rect\u003e\u003cpath d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\"\u003e\u003c/path\u003e\u003c/svg\u003e\n      \u003csvg 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\"\u003e\u003cpolyline points=\"20 6 9 17 4 12\"\u003e\u003c/polyline\u003e\u003c/svg\u003e\n    \u003c/button\u003e\n  \u003c/div\u003e\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e6edf3;background-color:#0d1117;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-yaml\" data-lang=\"yaml\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#6e7681\"\u003e    \u003c/span\u003e\u003cspan style=\"color:#7ee787\"\u003ehttp3\u003c/span\u003e:\u003cspan style=\"color:#6e7681\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#6e7681\"\u003e      \u003c/span\u003e\u003cspan style=\"color:#7ee787\"\u003eadvertisedPort\u003c/span\u003e:\u003cspan style=\"color:#6e7681\"\u003e \u003c/span\u003e\u003cspan style=\"color:#a5d6ff\"\u003e\u0026#39;443\u0026#39;\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/div\u003e\n\u003cp\u003ehinzuzufügen. Der vollständigkeit halber sieht mein kompletter Block so aus:\u003c/p\u003e\n\u003cdiv class=\"code-block\"\u003e\n  \u003cdiv class=\"code-block-header\"\u003e\n    \u003cspan class=\"code-lang-label\"\u003eyaml\u003c/span\u003e\n    \u003cbutton class=\"code-copy-btn\" type=\"button\" aria-label=\"Code kopieren\" data-umami-event=\"Code Copy\" data-umami-event-lang=\"yaml\"\u003e\n      \u003csvg 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\"\u003e\u003crect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\"\u003e\u003c/rect\u003e\u003cpath d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\"\u003e\u003c/path\u003e\u003c/svg\u003e\n      \u003csvg 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\"\u003e\u003cpolyline points=\"20 6 9 17 4 12\"\u003e\u003c/polyline\u003e\u003c/svg\u003e\n    \u003c/button\u003e\n  \u003c/div\u003e\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e6edf3;background-color:#0d1117;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-yaml\" data-lang=\"yaml\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#7ee787\"\u003eentryPoints\u003c/span\u003e:\u003cspan style=\"color:#6e7681\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#6e7681\"\u003e  \u003c/span\u003e\u003cspan style=\"color:#7ee787\"\u003eping\u003c/span\u003e:\u003cspan style=\"color:#6e7681\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#6e7681\"\u003e    \u003c/span\u003e\u003cspan style=\"color:#7ee787\"\u003eaddress\u003c/span\u003e:\u003cspan style=\"color:#6e7681\"\u003e \u003c/span\u003e\u003cspan style=\"color:#a5d6ff\"\u003e\u0026#39;:88\u0026#39;\u003c/span\u003e\u003cspan style=\"color:#6e7681\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#6e7681\"\u003e  \u003c/span\u003e\u003cspan style=\"color:#7ee787\"\u003eweb\u003c/span\u003e:\u003cspan style=\"color:#6e7681\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#6e7681\"\u003e    \u003c/span\u003e\u003cspan style=\"color:#7ee787\"\u003eaddress\u003c/span\u003e:\u003cspan style=\"color:#6e7681\"\u003e \u003c/span\u003e\u003cspan style=\"color:#a5d6ff\"\u003e\u0026#39;:80\u0026#39;\u003c/span\u003e\u003cspan style=\"color:#6e7681\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#6e7681\"\u003e    \u003c/span\u003e\u003cspan style=\"color:#7ee787\"\u003ehttp\u003c/span\u003e:\u003cspan style=\"color:#6e7681\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#6e7681\"\u003e      \u003c/span\u003e\u003cspan style=\"color:#7ee787\"\u003eredirections\u003c/span\u003e:\u003cspan style=\"color:#6e7681\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#6e7681\"\u003e        \u003c/span\u003e\u003cspan style=\"color:#7ee787\"\u003eentryPoint\u003c/span\u003e:\u003cspan style=\"color:#6e7681\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#6e7681\"\u003e          \u003c/span\u003e\u003cspan style=\"color:#7ee787\"\u003eto\u003c/span\u003e:\u003cspan style=\"color:#6e7681\"\u003e \u003c/span\u003e\u003cspan style=\"color:#a5d6ff\"\u003ewebsecure\u003c/span\u003e\u003cspan style=\"color:#6e7681\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#6e7681\"\u003e          \u003c/span\u003e\u003cspan style=\"color:#7ee787\"\u003escheme\u003c/span\u003e:\u003cspan style=\"color:#6e7681\"\u003e \u003c/span\u003e\u003cspan style=\"color:#a5d6ff\"\u003ehttps\u003c/span\u003e\u003cspan style=\"color:#6e7681\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#6e7681\"\u003e  \u003c/span\u003e\u003cspan style=\"color:#7ee787\"\u003ewebsecure\u003c/span\u003e:\u003cspan style=\"color:#6e7681\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#6e7681\"\u003e    \u003c/span\u003e\u003cspan style=\"color:#7ee787\"\u003eaddress\u003c/span\u003e:\u003cspan style=\"color:#6e7681\"\u003e \u003c/span\u003e\u003cspan style=\"color:#a5d6ff\"\u003e\u0026#39;:443\u0026#39;\u003c/span\u003e\u003cspan style=\"color:#6e7681\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#6e7681\"\u003e    \u003c/span\u003e\u003cspan style=\"color:#7ee787\"\u003ehttp\u003c/span\u003e:\u003cspan style=\"color:#6e7681\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#6e7681\"\u003e    \u003c/span\u003e\u003cspan style=\"color:#7ee787\"\u003ehttp3\u003c/span\u003e:\u003cspan style=\"color:#6e7681\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#6e7681\"\u003e      \u003c/span\u003e\u003cspan style=\"color:#7ee787\"\u003eadvertisedPort\u003c/span\u003e:\u003cspan style=\"color:#6e7681\"\u003e \u003c/span\u003e\u003cspan style=\"color:#a5d6ff\"\u003e\u0026#39;443\u0026#39;\u003c/span\u003e\u003cspan style=\"color:#6e7681\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#6e7681\"\u003e    \u003c/span\u003e\u003cspan style=\"color:#7ee787\"\u003eproxyProtocol\u003c/span\u003e:\u003cspan style=\"color:#6e7681\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#6e7681\"\u003e      \u003c/span\u003e\u003cspan style=\"color:#7ee787\"\u003etrustedIPs\u003c/span\u003e:\u003cspan style=\"color:#6e7681\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#6e7681\"\u003e       \u003c/span\u003e- \u003cspan style=\"color:#a5d6ff\"\u003e10.0.0.0\u003c/span\u003e\u003cspan style=\"color:#a5d6ff\"\u003e/8\u003c/span\u003e\u003cspan style=\"color:#6e7681\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#6e7681\"\u003e       \u003c/span\u003e- \u003cspan style=\"color:#a5d6ff\"\u003e172.16.0.0\u003c/span\u003e\u003cspan style=\"color:#a5d6ff\"\u003e/12\u003c/span\u003e\u003cspan style=\"color:#6e7681\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#6e7681\"\u003e       \u003c/span\u003e- \u003cspan style=\"color:#a5d6ff\"\u003e192.168.0.0\u003c/span\u003e\u003cspan style=\"color:#a5d6ff\"\u003e/16\u003c/span\u003e\u003cspan style=\"color:#6e7681\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#6e7681\"\u003e    \u003c/span\u003e\u003cspan style=\"color:#7ee787\"\u003eforwardedHeaders\u003c/span\u003e:\u003cspan style=\"color:#6e7681\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#6e7681\"\u003e      \u003c/span\u003e\u003cspan style=\"color:#7ee787\"\u003etrustedIPs\u003c/span\u003e:\u003cspan style=\"color:#6e7681\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#6e7681\"\u003e       \u003c/span\u003e- \u003cspan style=\"color:#a5d6ff\"\u003e10.0.0.0\u003c/span\u003e\u003cspan style=\"color:#a5d6ff\"\u003e/8\u003c/span\u003e\u003cspan style=\"color:#6e7681\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#6e7681\"\u003e       \u003c/span\u003e- \u003cspan style=\"color:#a5d6ff\"\u003e172.16.0.0\u003c/span\u003e\u003cspan style=\"color:#a5d6ff\"\u003e/12\u003c/span\u003e\u003cspan style=\"color:#6e7681\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#6e7681\"\u003e       \u003c/span\u003e- \u003cspan style=\"color:#a5d6ff\"\u003e192.168.0.0\u003c/span\u003e\u003cspan style=\"color:#a5d6ff\"\u003e/16\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/div\u003e\n\u003cp\u003eNatürlich reicht das nicht ganz aus. Wie ihr seht, veröffentliche ich Port \u003ccode\u003e443\u003c/code\u003e um http3 auszuliefern. Da http3 aber via QUIC über UPD kommuniziert, muss auch die \u003ccode\u003edocker-compose.yaml\u003c/code\u003e Datei angepasst werden.\u003c/p\u003e\n\u003cp\u003eDie Portkonfiguration sieht dann entsprechen so aus:\u003c/p\u003e\n\u003cdiv class=\"code-block\"\u003e\n  \u003cdiv class=\"code-block-header\"\u003e\n    \u003cspan class=\"code-lang-label\"\u003eyaml\u003c/span\u003e\n    \u003cbutton class=\"code-copy-btn\" type=\"button\" aria-label=\"Code kopieren\" data-umami-event=\"Code Copy\" data-umami-event-lang=\"yaml\"\u003e\n      \u003csvg 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\"\u003e\u003crect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\"\u003e\u003c/rect\u003e\u003cpath d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\"\u003e\u003c/path\u003e\u003c/svg\u003e\n      \u003csvg 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\"\u003e\u003cpolyline points=\"20 6 9 17 4 12\"\u003e\u003c/polyline\u003e\u003c/svg\u003e\n    \u003c/button\u003e\n  \u003c/div\u003e\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e6edf3;background-color:#0d1117;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-yaml\" data-lang=\"yaml\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#6e7681\"\u003e    \u003c/span\u003e\u003cspan style=\"color:#7ee787\"\u003eports\u003c/span\u003e:\u003cspan style=\"color:#6e7681\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#6e7681\"\u003e      \u003c/span\u003e- \u003cspan style=\"color:#7ee787\"\u003etarget\u003c/span\u003e:\u003cspan style=\"color:#6e7681\"\u003e \u003c/span\u003e\u003cspan style=\"color:#a5d6ff\"\u003e80\u003c/span\u003e\u003cspan style=\"color:#6e7681\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#6e7681\"\u003e        \u003c/span\u003e\u003cspan style=\"color:#7ee787\"\u003epublished\u003c/span\u003e:\u003cspan style=\"color:#6e7681\"\u003e \u003c/span\u003e\u003cspan style=\"color:#a5d6ff\"\u003e80\u003c/span\u003e\u003cspan style=\"color:#6e7681\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#6e7681\"\u003e        \u003c/span\u003e\u003cspan style=\"color:#7ee787\"\u003eprotocol\u003c/span\u003e:\u003cspan style=\"color:#6e7681\"\u003e \u003c/span\u003e\u003cspan style=\"color:#a5d6ff\"\u003etcp\u003c/span\u003e\u003cspan style=\"color:#6e7681\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#6e7681\"\u003e        \u003c/span\u003e\u003cspan style=\"color:#7ee787\"\u003emode\u003c/span\u003e:\u003cspan style=\"color:#6e7681\"\u003e \u003c/span\u003e\u003cspan style=\"color:#a5d6ff\"\u003ehost\u003c/span\u003e\u003cspan style=\"color:#6e7681\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#6e7681\"\u003e      \u003c/span\u003e- \u003cspan style=\"color:#7ee787\"\u003etarget\u003c/span\u003e:\u003cspan style=\"color:#6e7681\"\u003e \u003c/span\u003e\u003cspan style=\"color:#a5d6ff\"\u003e443\u003c/span\u003e\u003cspan style=\"color:#6e7681\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#6e7681\"\u003e        \u003c/span\u003e\u003cspan style=\"color:#7ee787\"\u003epublished\u003c/span\u003e:\u003cspan style=\"color:#6e7681\"\u003e \u003c/span\u003e\u003cspan style=\"color:#a5d6ff\"\u003e443\u003c/span\u003e\u003cspan style=\"color:#6e7681\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#6e7681\"\u003e        \u003c/span\u003e\u003cspan style=\"color:#7ee787\"\u003eprotocol\u003c/span\u003e:\u003cspan style=\"color:#6e7681\"\u003e \u003c/span\u003e\u003cspan style=\"color:#a5d6ff\"\u003etcp\u003c/span\u003e\u003cspan style=\"color:#6e7681\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#6e7681\"\u003e        \u003c/span\u003e\u003cspan style=\"color:#7ee787\"\u003emode\u003c/span\u003e:\u003cspan style=\"color:#6e7681\"\u003e \u003c/span\u003e\u003cspan style=\"color:#a5d6ff\"\u003ehost\u003c/span\u003e\u003cspan style=\"color:#6e7681\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#6e7681\"\u003e      \u003c/span\u003e- \u003cspan style=\"color:#7ee787\"\u003etarget\u003c/span\u003e:\u003cspan style=\"color:#6e7681\"\u003e \u003c/span\u003e\u003cspan style=\"color:#a5d6ff\"\u003e443\u003c/span\u003e\u003cspan style=\"color:#6e7681\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#6e7681\"\u003e        \u003c/span\u003e\u003cspan style=\"color:#7ee787\"\u003epublished\u003c/span\u003e:\u003cspan style=\"color:#6e7681\"\u003e \u003c/span\u003e\u003cspan style=\"color:#a5d6ff\"\u003e443\u003c/span\u003e\u003cspan style=\"color:#6e7681\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#6e7681\"\u003e        \u003c/span\u003e\u003cspan style=\"color:#7ee787\"\u003eprotocol\u003c/span\u003e:\u003cspan style=\"color:#6e7681\"\u003e \u003c/span\u003e\u003cspan style=\"color:#a5d6ff\"\u003eudp\u003c/span\u003e\u003cspan style=\"color:#6e7681\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#6e7681\"\u003e        \u003c/span\u003e\u003cspan style=\"color:#7ee787\"\u003emode\u003c/span\u003e:\u003cspan style=\"color:#6e7681\"\u003e \u003c/span\u003e\u003cspan style=\"color:#a5d6ff\"\u003ehost\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/div\u003e\n\u003cp\u003eDer letzte \u003ccode\u003etarget\u003c/code\u003e Block ist der wichtige. Hier wird Port 443 auf udp ausgeliefert. Abschließend noch den Container neu starten\u003c/p\u003e\n\u003cdiv class=\"code-block\"\u003e\n  \u003cdiv class=\"code-block-header\"\u003e\n    \u003cspan class=\"code-lang-label\"\u003ebash\u003c/span\u003e\n    \u003cbutton class=\"code-copy-btn\" type=\"button\" aria-label=\"Code kopieren\" data-umami-event=\"Code Copy\" data-umami-event-lang=\"bash\"\u003e\n      \u003csvg 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\"\u003e\u003crect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\"\u003e\u003c/rect\u003e\u003cpath d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\"\u003e\u003c/path\u003e\u003c/svg\u003e\n      \u003csvg 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\"\u003e\u003cpolyline points=\"20 6 9 17 4 12\"\u003e\u003c/polyline\u003e\u003c/svg\u003e\n    \u003c/button\u003e\n  \u003c/div\u003e\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e6edf3;background-color:#0d1117;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003edocker compose rm -sf \u003cspan style=\"color:#ff7b72;font-weight:bold\"\u003e\u0026amp;\u0026amp;\u003c/span\u003e docker compose up -d\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/div\u003e\n\u003cp\u003eSolltest du mehr als nur Traefik in der Datei haben, werden diese Services entsprechend auch neu gestartet. Ich empfehle zukünftig traefik zu separieren.\u003c/p\u003e\n","date_published":"2024-02-06T00:00:00Z","date_modified":"2024-02-06T00:00:00Z","tags":["traefik","docker","networking"]},{"id":"https://www.teqqy.de/ipv6-mit-fritzbox-und-opnsense-bei-vodafone/","url":"https://www.teqqy.de/ipv6-mit-fritzbox-und-opnsense-bei-vodafone/","title":"IPv6 mit Fritzbox und OpnSense bei Vodafone","summary":"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.\nWarum ü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.\n","content_html":"\u003cp\u003eKunden 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.\u003c/p\u003e\n\u003ch2 id=\"warum-überhaupt-ipv6\"\u003eWarum überhaupt IPv6?\u003ca href=\"#warum-%c3%bcberhaupt-ipv6\" class=\"heading-anchor\" aria-label=\"Diesen Abschnitt verlinken\"\u003e\u003csvg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"\u003e\u003cpath d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\"\u003e\u003c/path\u003e\u003cpath d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eIPv6 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.\u003c/p\u003e\n\u003ch2 id=\"einstellungen-an-der-fritzbox\"\u003eEinstellungen an der Fritzbox\u003ca href=\"#einstellungen-an-der-fritzbox\" class=\"heading-anchor\" aria-label=\"Diesen Abschnitt verlinken\"\u003e\u003csvg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"\u003e\u003cpath d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\"\u003e\u003c/path\u003e\u003cpath d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eZuerst stellen wir alles bei der Fritzbox ein. Wir navigieren zu \u003cstrong\u003eHeimnetzwerk\u003c/strong\u003e -\u0026gt; \u003cstrong\u003eNetzwerk\u003c/strong\u003e -\u0026gt; \u003cstrong\u003eNetzwerkeinstellungen\u003c/strong\u003e -\u0026gt; \u003cstrong\u003eIPv6-Einstellungen\u003c/strong\u003e.\u003c/p\u003e\n\u003ch3 id=\"router-advertisment-im-lan-aktiv\"\u003eRouter Advertisment im LAN aktiv\u003ca href=\"#router-advertisment-im-lan-aktiv\" class=\"heading-anchor\" aria-label=\"Diesen Abschnitt verlinken\"\u003e\u003csvg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"\u003e\u003cpath d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\"\u003e\u003c/path\u003e\u003cpath d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eDie 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.\u003c/p\u003e\n\u003cp\u003e\u003cimg 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\"\u003e\u003c/p\u003e\n\u003ch3 id=\"dnsv6-server-im-heimnetz\"\u003eDNSv6 Server im Heimnetz\u003ca href=\"#dnsv6-server-im-heimnetz\" class=\"heading-anchor\" aria-label=\"Diesen Abschnitt verlinken\"\u003e\u003csvg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"\u003e\u003cpath d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\"\u003e\u003c/path\u003e\u003cpath d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eIch habe den nicht aktiv. Ich versuche erst mal mein Pi-Hole im Netzwerk zu verwenden. Bisher habe ich noch keine Nachteile dadurch entdeckt.\u003c/p\u003e\n\u003ch3 id=\"dhcp-v6-server-im-heimnetz\"\u003eDHCP-v6 Server im Heimnetz\u003ca href=\"#dhcp-v6-server-im-heimnetz\" class=\"heading-anchor\" aria-label=\"Diesen Abschnitt verlinken\"\u003e\u003csvg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"\u003e\u003cpath d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\"\u003e\u003c/path\u003e\u003cpath d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eHier wird es spannend, weil hier die Zuweisung an die Endgeräte gemacht wird. Entsprechend aktivieren wir die erste Option \u003cstrong\u003eDHCPv6-Server in der FRITZ!Box für das Heimnetz aktivieren\u003c/strong\u003e. Dann möchten wir \u003cstrong\u003eDNS-Server und IPv6-Präfix (IA_PD) zuweisen\u003c/strong\u003e. Den Rest lassen wir auf Standardeinstellung.\u003c/p\u003e\n\u003cp\u003e\u003cimg 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\"\u003e\u003c/p\u003e\n\u003ch2 id=\"einstellungen-an-der-opnsense\"\u003eEinstellungen an der opnSense\u003ca href=\"#einstellungen-an-der-opnsense\" class=\"heading-anchor\" aria-label=\"Diesen Abschnitt verlinken\"\u003e\u003csvg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"\u003e\u003cpath d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\"\u003e\u003c/path\u003e\u003cpath d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eNun 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.\u003c/p\u003e\n\u003ch3 id=\"einstellungen-am-wan-interface\"\u003eEinstellungen am WAN Interface\u003ca href=\"#einstellungen-am-wan-interface\" class=\"heading-anchor\" aria-label=\"Diesen Abschnitt verlinken\"\u003e\u003csvg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"\u003e\u003cpath d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\"\u003e\u003c/path\u003e\u003cpath d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eWir starten mit den Einstellungen am WAN Interface. Also der Port mit dem sich die opnSense zur Fritzbox verbindet. Als erstes stellen wir den \u003cstrong\u003eIPv6 Konfigurationstyp\u003c/strong\u003e auf \u003cstrong\u003eDHCPv6\u003c/strong\u003e. In der \u003cstrong\u003eDHCPv6 Clientkonfiguration\u003c/strong\u003e fordern wir das IPv6 Prefix an und stellen die \u003cstrong\u003ePräfixdelegationsgröße\u003c/strong\u003e auf 63 (also ein bit kleiner als unser Netzwerk groß ist). Zudem senden wir den IPv6 Präfixhinweis.\u003c/p\u003e\n\u003cp\u003e\u003cimg 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\"\u003e\u003c/p\u003e\n\u003ch3 id=\"einstellungen-des-lan-interface\"\u003eEinstellungen des LAN Interface\u003ca href=\"#einstellungen-des-lan-interface\" class=\"heading-anchor\" aria-label=\"Diesen Abschnitt verlinken\"\u003e\u003csvg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"\u003e\u003cpath d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\"\u003e\u003c/path\u003e\u003cpath d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eWir 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.\u003c/p\u003e\n\u003cp\u003eUnter \u003cstrong\u003eSchnittstellen\u003c/strong\u003e -\u0026gt; \u003cstrong\u003eLAN\u003c/strong\u003e möchten wir den \u003cstrong\u003eIPv6 Konfigurationstyp\u003c/strong\u003e ändern. Den müssen wir auf \u003cstrong\u003eSchnittstelle aufzeichnen\u003c/strong\u003e stellen. Ganz unten erscheint dann eine weitere Einstellungsgruppe mit dem Namen \u003cstrong\u003eIPv6-Schnittstelle aufzeichnen\u003c/strong\u003e. Die Schnittstelle setzen wir dann auf \u003cstrong\u003eWAN\u003c/strong\u003e, weil hier ja unsere IPv6 Pakete her kommen. Die Präfix-ID setzen wir auf \u003cstrong\u003e0\u003c/strong\u003e. Solltest du ein weiteres Netz konfigurieren, stellst du die ID dann im anderen Netz auf \u003cstrong\u003e1\u003c/strong\u003e. Wichtig ist unten noch das Häkchen bei \u003cstrong\u003eErmöglichen Sie die manuelle Anpassung von DHCPv6- und Router-Ankündigungen\u003c/strong\u003e* zu setzen!\u003c/p\u003e\n\u003cp\u003eHier das ganze noch mal als Screenshot:\n\u003cimg 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\"\u003e\u003c/p\u003e\n\u003ch3 id=\"router-advertisement\"\u003eRouter Advertisement\u003ca href=\"#router-advertisement\" class=\"heading-anchor\" aria-label=\"Diesen Abschnitt verlinken\"\u003e\u003csvg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"\u003e\u003cpath d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\"\u003e\u003c/path\u003e\u003cpath d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eAls nächstes müssen wir das Router Advertisement einstellen. Dazu auf \u003cstrong\u003eDienste\u003c/strong\u003e -\u0026gt; \u003cstrong\u003eRouter Advertisement\u003c/strong\u003e -\u0026gt; \u003cstrong\u003eLAN\u003c/strong\u003e 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 \u003cstrong\u003eRouter Advertisement\u003c/strong\u003e auf \u003cstrong\u003eNichtVerwaltet\u003c/strong\u003e.\u003c/p\u003e\n\u003ch3 id=\"firewall-einstellungen-überprüfen-optional\"\u003eFirewall Einstellungen überprüfen (optional)\u003ca href=\"#firewall-einstellungen-%c3%bcberpr%c3%bcfen-optional\" class=\"heading-anchor\" aria-label=\"Diesen Abschnitt verlinken\"\u003e\u003csvg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"\u003e\u003cpath d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\"\u003e\u003c/path\u003e\u003cpath d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eIch 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 \u003cstrong\u003eFirewall\u003c/strong\u003e -\u0026gt; \u003cstrong\u003eRegeln\u003c/strong\u003e -\u0026gt; \u003cstrong\u003eLAN\u003c/strong\u003e. Dort bearbeiten wir die \u003cstrong\u003eausgehende\u003c/strong\u003e Regel und klicken hinten auf den Stift. Im sich öffnenden Fenster stellen wir die \u003cstrong\u003eTCP/IP Version\u003c/strong\u003e von \u003cem\u003eIPv4\u003c/em\u003e auf \u003cem\u003eIPv4+IPv6\u003c/em\u003e um. Anschließend auf speichern.\u003c/p\u003e\n\u003ch2 id=\"testen-der-ipv6-verbindung\"\u003eTesten der IPv6 Verbindung\u003ca href=\"#testen-der-ipv6-verbindung\" class=\"heading-anchor\" aria-label=\"Diesen Abschnitt verlinken\"\u003e\u003csvg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"\u003e\u003cpath d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\"\u003e\u003c/path\u003e\u003cpath d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eAls erstes sollten wir gucken ob alle Interfaces auf der opnSense auch eine IPv6 Adresse bekommen haben. Dazu bitte unter \u003cstrong\u003eSchnitstellen\u003c/strong\u003e -\u0026gt; \u003cstrong\u003eÜberblick\u003c/strong\u003e deine WAN Schnittstelle aufklappen. Du solltest unter IPv6-Adresse nun zwei Adressen haben. Einmal aus dem Vodafone Netz und eine die mit \u003cem\u003efd\u003c/em\u003e beginnt. Das ist die Adresse aus dem Bereich das wir bei der Fritzbox unter \u003cstrong\u003eULA Prefix\u003c/strong\u003e eingestellt haben. Unter deinen LAN Interfaces solltest du auch jeweils zwei Adressen haben. Wenn dem nicht so ist, kontrolliere nochmals alle Einstellungen.\u003c/p\u003e\n\u003cp\u003eWenn bis dahin alles korrekt eingestellt wurde, öffnen wir die Seite \u003ca href=\"https://ipv6-test.com\" target=\"_blank\" rel=\"noopener noreferrer\"\u003eipv6-test.com\u003csvg 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\"\u003e\n  \u003cpath d=\"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6\"/\u003e\n  \u003cpolyline points=\"15 3 21 3 21 9\"/\u003e\n  \u003cline x1=\"10\" y1=\"14\" x2=\"21\" y2=\"3\"/\u003e\n\u003c/svg\u003e\u003cspan class=\"visually-hidden\"\u003e (externer Link)\u003c/span\u003e\u003c/a\u003e\n. Diese kontrolliert nun ob ihr mit einer IPv4 und einer IPv6 Adresse ankommt. Entsprechend sollte es ähnlich zu meiner Anzeige sein.\u003c/p\u003e\n\u003cp\u003e\u003cimg 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\"\u003e\u003c/p\u003e\n","date_published":"2024-01-28T13:40:00+02:00","date_modified":"2024-01-28T13:40:00+02:00","tags":["fritzbox","opnsense","networking"]},{"id":"https://www.teqqy.de/freshrss-rss-reader-zum-selber-hosten/","url":"https://www.teqqy.de/freshrss-rss-reader-zum-selber-hosten/","title":"FreshRSS Setup: RSS Reader selbst hosten (Docker Guide 2025)","summary":"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).\nIn 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.\n","content_html":"\u003cp\u003eDu willst deine RSS-Feeds selbst verwalten, ohne auf Drittanbieter angewiesen zu sein? \u003cstrong\u003eFreshRSS ist ein kostenloser, selbst gehosteter RSS-Reader\u003c/strong\u003e, 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).\u003c/p\u003e\n\u003cp\u003eIn 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 \u003cstrong\u003evollständige API-Unterstützung\u003c/strong\u003e, sodass du deine Feeds überall synchronisiert nutzen kannst.\u003c/p\u003e\n\u003cp\u003eFü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.\u003c/p\u003e\n\u003cp\u003eDiejenigen 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.\nFeedreader, 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 \u003ca href=\"https://freshrss.org\" target=\"_blank\" rel=\"noopener noreferrer\"\u003eFreshRSS\u003csvg 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\"\u003e\n  \u003cpath d=\"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6\"/\u003e\n  \u003cpolyline points=\"15 3 21 3 21 9\"/\u003e\n  \u003cline x1=\"10\" y1=\"14\" x2=\"21\" y2=\"3\"/\u003e\n\u003c/svg\u003e\u003cspan class=\"visually-hidden\"\u003e (externer Link)\u003c/span\u003e\u003c/a\u003e\n.\u003c/p\u003e\n\u003cp\u003eIn 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.\u003c/p\u003e\n\u003ch2 id=\"installation-von-freshrss\"\u003eInstallation von FreshRSS\u003ca href=\"#installation-von-freshrss\" class=\"heading-anchor\" aria-label=\"Diesen Abschnitt verlinken\"\u003e\u003csvg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"\u003e\u003cpath d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\"\u003e\u003c/path\u003e\u003cpath d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eWie 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.\u003c/p\u003e\n\u003cp\u003eFü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.\u003c/p\u003e\n\u003ch3 id=\"freshrss-mit-docker-compose\"\u003eFreshRSS mit Docker Compose\u003ca href=\"#freshrss-mit-docker-compose\" class=\"heading-anchor\" aria-label=\"Diesen Abschnitt verlinken\"\u003e\u003csvg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"\u003e\u003cpath d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\"\u003e\u003c/path\u003e\u003cpath d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eIch habe hier mal eine \u003ccode\u003edocker-compose.yaml\u003c/code\u003e 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.\u003c/p\u003e\n\u003cdiv class=\"code-block\"\u003e\n  \u003cdiv class=\"code-block-header\"\u003e\n    \u003cspan class=\"code-lang-label\"\u003eyaml\u003c/span\u003e\n    \u003cbutton class=\"code-copy-btn\" type=\"button\" aria-label=\"Code kopieren\" data-umami-event=\"Code Copy\" data-umami-event-lang=\"yaml\"\u003e\n      \u003csvg 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\"\u003e\u003crect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\"\u003e\u003c/rect\u003e\u003cpath d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\"\u003e\u003c/path\u003e\u003c/svg\u003e\n      \u003csvg 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\"\u003e\u003cpolyline points=\"20 6 9 17 4 12\"\u003e\u003c/polyline\u003e\u003c/svg\u003e\n    \u003c/button\u003e\n  \u003c/div\u003e\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e6edf3;background-color:#0d1117;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-yaml\" data-lang=\"yaml\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#ff7b72\"\u003e---\u003c/span\u003e\u003cspan style=\"color:#6e7681\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#7ee787\"\u003eservices\u003c/span\u003e:\u003cspan style=\"color:#6e7681\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#6e7681\"\u003e  \u003c/span\u003e\u003cspan style=\"color:#7ee787\"\u003efreshrss-db\u003c/span\u003e:\u003cspan style=\"color:#6e7681\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#6e7681\"\u003e    \u003c/span\u003e\u003cspan style=\"color:#7ee787\"\u003eimage\u003c/span\u003e:\u003cspan style=\"color:#6e7681\"\u003e \u003c/span\u003e\u003cspan style=\"color:#a5d6ff\"\u003epostgres:17\u003c/span\u003e\u003cspan style=\"color:#6e7681\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#6e7681\"\u003e    \u003c/span\u003e\u003cspan style=\"color:#7ee787\"\u003econtainer_name\u003c/span\u003e:\u003cspan style=\"color:#6e7681\"\u003e \u003c/span\u003e\u003cspan style=\"color:#a5d6ff\"\u003efressrss-db\u003c/span\u003e\u003cspan style=\"color:#6e7681\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#6e7681\"\u003e    \u003c/span\u003e\u003cspan style=\"color:#7ee787\"\u003erestart\u003c/span\u003e:\u003cspan style=\"color:#6e7681\"\u003e \u003c/span\u003e\u003cspan style=\"color:#a5d6ff\"\u003eunless-stopped\u003c/span\u003e\u003cspan style=\"color:#6e7681\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#6e7681\"\u003e    \u003c/span\u003e\u003cspan style=\"color:#7ee787\"\u003evolumes\u003c/span\u003e:\u003cspan style=\"color:#6e7681\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#6e7681\"\u003e      \u003c/span\u003e- \u003cspan style=\"color:#a5d6ff\"\u003e/etc/localtime:/etc/localtime:ro\u003c/span\u003e\u003cspan style=\"color:#6e7681\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#6e7681\"\u003e      \u003c/span\u003e- \u003cspan style=\"color:#a5d6ff\"\u003e/etc/timezone:/etc/timezone:ro\u003c/span\u003e\u003cspan style=\"color:#6e7681\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#6e7681\"\u003e      \u003c/span\u003e- \u003cspan style=\"color:#a5d6ff\"\u003e/var/docker/freshrss/db:/var/lib/postgresql/data\u003c/span\u003e\u003cspan style=\"color:#6e7681\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#6e7681\"\u003e    \u003c/span\u003e\u003cspan style=\"color:#7ee787\"\u003eenvironment\u003c/span\u003e:\u003cspan style=\"color:#6e7681\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#6e7681\"\u003e      \u003c/span\u003e- \u003cspan style=\"color:#a5d6ff\"\u003ePOSTGRES_USER=freshrss\u003c/span\u003e\u003cspan style=\"color:#6e7681\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#6e7681\"\u003e      \u003c/span\u003e- \u003cspan style=\"color:#a5d6ff\"\u003ePOSTGRES_PASSWORD=${POSTGRES_PASSWORD}\u003c/span\u003e\u003cspan style=\"color:#6e7681\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#6e7681\"\u003e      \u003c/span\u003e- \u003cspan style=\"color:#a5d6ff\"\u003ePOSTGRES_DB=freshrss\u003c/span\u003e\u003cspan style=\"color:#6e7681\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#6e7681\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#6e7681\"\u003e  \u003c/span\u003e\u003cspan style=\"color:#7ee787\"\u003efreshrss-app\u003c/span\u003e:\u003cspan style=\"color:#6e7681\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#6e7681\"\u003e    \u003c/span\u003e\u003cspan style=\"color:#7ee787\"\u003eimage\u003c/span\u003e:\u003cspan style=\"color:#6e7681\"\u003e \u003c/span\u003e\u003cspan style=\"color:#a5d6ff\"\u003efreshrss/freshrss:latest\u003c/span\u003e\u003cspan style=\"color:#6e7681\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#6e7681\"\u003e    \u003c/span\u003e\u003cspan style=\"color:#7ee787\"\u003econtainer_name\u003c/span\u003e:\u003cspan style=\"color:#6e7681\"\u003e \u003c/span\u003e\u003cspan style=\"color:#a5d6ff\"\u003efreshrss-app\u003c/span\u003e\u003cspan style=\"color:#6e7681\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#6e7681\"\u003e    \u003c/span\u003e\u003cspan style=\"color:#7ee787\"\u003erestart\u003c/span\u003e:\u003cspan style=\"color:#6e7681\"\u003e \u003c/span\u003e\u003cspan style=\"color:#a5d6ff\"\u003eunless-stopped\u003c/span\u003e\u003cspan style=\"color:#6e7681\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#6e7681\"\u003e    \u003c/span\u003e\u003cspan style=\"color:#7ee787\"\u003edepends_on\u003c/span\u003e:\u003cspan style=\"color:#6e7681\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#6e7681\"\u003e      \u003c/span\u003e- \u003cspan style=\"color:#a5d6ff\"\u003efreshrss-db\u003c/span\u003e\u003cspan style=\"color:#6e7681\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#6e7681\"\u003e    \u003c/span\u003e\u003cspan style=\"color:#7ee787\"\u003evolumes\u003c/span\u003e:\u003cspan style=\"color:#6e7681\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#6e7681\"\u003e      \u003c/span\u003e- \u003cspan style=\"color:#a5d6ff\"\u003e/etc/localtime:/etc/localtime:ro\u003c/span\u003e\u003cspan style=\"color:#6e7681\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#6e7681\"\u003e      \u003c/span\u003e- \u003cspan style=\"color:#a5d6ff\"\u003e/etc/timezone:/etc/timezone:ro\u003c/span\u003e\u003cspan style=\"color:#6e7681\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#6e7681\"\u003e      \u003c/span\u003e- \u003cspan style=\"color:#a5d6ff\"\u003e/var/docker/freshrss/data:/var/www/FreshRSS/data\u003c/span\u003e\u003cspan style=\"color:#6e7681\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#6e7681\"\u003e      \u003c/span\u003e- \u003cspan style=\"color:#a5d6ff\"\u003e/var/docker/freshrss/extensions:/var/www/FreshRSS/extensions\u003c/span\u003e\u003cspan style=\"color:#6e7681\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#6e7681\"\u003e    \u003c/span\u003e\u003cspan style=\"color:#7ee787\"\u003eenvironment\u003c/span\u003e:\u003cspan style=\"color:#6e7681\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#6e7681\"\u003e      \u003c/span\u003e- \u003cspan style=\"color:#a5d6ff\"\u003eCRON_MIN=*/20\u003c/span\u003e\u003cspan style=\"color:#6e7681\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#6e7681\"\u003e    \u003c/span\u003e\u003cspan style=\"color:#7ee787\"\u003eports\u003c/span\u003e:\u003cspan style=\"color:#6e7681\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#6e7681\"\u003e      \u003c/span\u003e- \u003cspan style=\"color:#a5d6ff\"\u003e80\u003c/span\u003e:\u003cspan style=\"color:#a5d6ff\"\u003e80\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/div\u003e\n\u003cp\u003eWer das ganze mittels Traefik auch sauber mit Zertifikaten etc hosten möchte, verweise ich einfach auf meine \u003ca href=\"https://github.com/cbirkenbeul/docker-homelab/tree/master/compose-files-traefik-predefined/freshrss\" target=\"_blank\" rel=\"noopener noreferrer\"\u003evorbereitete Version auf GitHub\u003csvg 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\"\u003e\n  \u003cpath d=\"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6\"/\u003e\n  \u003cpolyline points=\"15 3 21 3 21 9\"/\u003e\n  \u003cline x1=\"10\" y1=\"14\" x2=\"21\" y2=\"3\"/\u003e\n\u003c/svg\u003e\u003cspan class=\"visually-hidden\"\u003e (externer Link)\u003c/span\u003e\u003c/a\u003e\n.\u003c/p\u003e\n\u003ch3 id=\"webinstallation\"\u003eWebinstallation\u003ca href=\"#webinstallation\" class=\"heading-anchor\" aria-label=\"Diesen Abschnitt verlinken\"\u003e\u003csvg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"\u003e\u003cpath d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\"\u003e\u003c/path\u003e\u003cpath d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eLeider 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.\u003c/p\u003e\n\u003cp\u003eSobald 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.\u003c/p\u003e\n\u003ch3 id=\"erste-schritte-nach-der-installation\"\u003eErste Schritte nach der Installation\u003ca href=\"#erste-schritte-nach-der-installation\" class=\"heading-anchor\" aria-label=\"Diesen Abschnitt verlinken\"\u003e\u003csvg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"\u003e\u003cpath d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\"\u003e\u003c/path\u003e\u003cpath d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eGrundsä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.\nDafü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 \u003cstrong\u003eSpeichern\u003c/strong\u003e\nNun 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 \u003cem\u003eAPI-Verwaltung\u003c/em\u003e tragt ihr einfach ein Passwort ein. Sicherer wäre es, wenn ihr ein anderes verwendet als für euren Login.\u003c/p\u003e\n\u003ch2 id=\"nutzung-von-freshrss\"\u003eNutzung von FreshRSS\u003ca href=\"#nutzung-von-freshrss\" class=\"heading-anchor\" aria-label=\"Diesen Abschnitt verlinken\"\u003e\u003csvg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"\u003e\u003cpath d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\"\u003e\u003c/path\u003e\u003cpath d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/h2\u003e\n\u003ch3 id=\"löschen-des-freshrss-feeds-optional\"\u003eLöschen des FreshRSS Feeds (optional)\u003ca href=\"#l%c3%b6schen-des-freshrss-feeds-optional\" class=\"heading-anchor\" aria-label=\"Diesen Abschnitt verlinken\"\u003e\u003csvg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"\u003e\u003cpath d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\"\u003e\u003c/path\u003e\u003cpath d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eNachdem 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.\u003c/p\u003e\n\u003cp\u003eWenn ihr den Feed nicht benötigt, könnt ihr den natürlich löschen. Mit einem Klick auf das Zahnrad und dann rechts \u003cstrong\u003eEntfernen\u003c/strong\u003e.\u003c/p\u003e\n\u003ch3 id=\"import-von-bestehenden-rss-abonnements-optional\"\u003eImport von bestehenden RSS Abonnements (optional)\u003ca href=\"#import-von-bestehenden-rss-abonnements-optional\" class=\"heading-anchor\" aria-label=\"Diesen Abschnitt verlinken\"\u003e\u003csvg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"\u003e\u003cpath d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\"\u003e\u003c/path\u003e\u003cpath d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eNatü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.\nHierzu klicken wir wieder auf \u003cstrong\u003eAbonnementverwaltung\u003c/strong\u003e und dann auf **Importieren / Exportieren **. Nun können wir rechts eine Datei unter \u003cem\u003eImportieren\u003c/em\u003e auswählen und auf \u003cstrong\u003eImportieren\u003c/strong\u003e klicken.\u003c/p\u003e\n\u003ch3 id=\"feeds-hinzufügen\"\u003eFeeds hinzufügen\u003ca href=\"#feeds-hinzuf%c3%bcgen\" class=\"heading-anchor\" aria-label=\"Diesen Abschnitt verlinken\"\u003e\u003csvg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"\u003e\u003cpath d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\"\u003e\u003c/path\u003e\u003cpath d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eUm neue Feeds hinzuzufügen, wie zum Beispiel den von teqqy.de, klickt man links oben auf das \u003cstrong\u003e+\u003c/strong\u003e Symbol. Anschließend kopiert man die Feed-URL in das Feld und klickt auf \u003cstrong\u003eHinzufügen\u003c/strong\u003e Wer möchte, kann natürlich vorher noch eine \u003cem\u003eKategorie\u003c/em\u003e erstellen um gegebenenfalls eine größere Menge an Feeds besser zu verwalten.\u003c/p\u003e\n\u003ch2 id=\"3rd-party-apps\"\u003e3rd Party Apps\u003ca href=\"#3rd-party-apps\" class=\"heading-anchor\" aria-label=\"Diesen Abschnitt verlinken\"\u003e\u003csvg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"\u003e\u003cpath d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\"\u003e\u003c/path\u003e\u003cpath d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eDa 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.\u003c/p\u003e\n\u003ch3 id=\"macos-und-iosipados\"\u003eMacOS und iOS/iPadOS\u003ca href=\"#macos-und-iosipados\" class=\"heading-anchor\" aria-label=\"Diesen Abschnitt verlinken\"\u003e\u003csvg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"\u003e\u003cpath d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\"\u003e\u003c/path\u003e\u003cpath d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eUnter den Betriebssystemen verwende ich seit Jahren \u003ca href=\"https://reederapp.com\" target=\"_blank\" rel=\"noopener noreferrer\"\u003eReeder\u003csvg 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\"\u003e\n  \u003cpath d=\"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6\"/\u003e\n  \u003cpolyline points=\"15 3 21 3 21 9\"/\u003e\n  \u003cline x1=\"10\" y1=\"14\" x2=\"21\" y2=\"3\"/\u003e\n\u003c/svg\u003e\u003cspan class=\"visually-hidden\"\u003e (externer Link)\u003c/span\u003e\u003c/a\u003e\n als RSS Reader App. Mittlerweile in Version 5 angekommen hatte es mich immer gut begleitet.\nSeit 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.\u003c/p\u003e\n\u003cp\u003e\u003cimg src=\"images/reeder5-freshrss-setup.webp\" alt=\"Reeder5 FreshRSS Setup\" loading=\"eager\" fetchpriority=\"high\" decoding=\"async\"\u003e\u003c/p\u003e\n\u003cp\u003eUm Reeder einzurichten brauchen wir wie \u003ca href=\"/freshrss-rss-reader-zum-selber-hosten/#erste-schritte-nach-der-installation\"\u003eoben beschrieben\u003c/a\u003e\n ein \u003cem\u003eAPI-Passwort\u003c/em\u003e. In Reeder selbst gehen wir dann auf \u003cstrong\u003eAccounts\u003c/strong\u003e und \u003cstrong\u003eAdd Account\u003c/strong\u003e. Ganz unten findet man dann FreshRSS zur Auswahl. Nun tragen wir die benötigten Daten ein und klicken auf \u003cstrong\u003eSign in\u003c/strong\u003e. Anschließend zieht sich Reeder alle Informationen und würde noch ungelesene Artikel anzeigen.\u003c/p\u003e\n\u003ch2 id=\"häufig-gestellte-fragen-zu-freshrss\"\u003eHäufig gestellte Fragen zu FreshRSS\u003ca href=\"#h%c3%a4ufig-gestellte-fragen-zu-freshrss\" class=\"heading-anchor\" aria-label=\"Diesen Abschnitt verlinken\"\u003e\u003csvg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"\u003e\u003cpath d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\"\u003e\u003c/path\u003e\u003cpath d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/h2\u003e\n\u003ch3 id=\"was-ist-freshrss\"\u003eWas ist FreshRSS?\u003ca href=\"#was-ist-freshrss\" class=\"heading-anchor\" aria-label=\"Diesen Abschnitt verlinken\"\u003e\u003csvg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"\u003e\u003cpath d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\"\u003e\u003c/path\u003e\u003cpath d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eFreshRSS 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.\u003c/p\u003e\n\u003ch3 id=\"ist-freshrss-wirklich-kostenlos\"\u003eIst FreshRSS wirklich kostenlos?\u003ca href=\"#ist-freshrss-wirklich-kostenlos\" class=\"heading-anchor\" aria-label=\"Diesen Abschnitt verlinken\"\u003e\u003csvg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"\u003e\u003cpath d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\"\u003e\u003c/path\u003e\u003cpath d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eJa, 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.\u003c/p\u003e\n\u003ch3 id=\"welche-apps-kann-ich-mit-freshrss-nutzen\"\u003eWelche Apps kann ich mit FreshRSS nutzen?\u003ca href=\"#welche-apps-kann-ich-mit-freshrss-nutzen\" class=\"heading-anchor\" aria-label=\"Diesen Abschnitt verlinken\"\u003e\u003csvg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"\u003e\u003cpath d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\"\u003e\u003c/path\u003e\u003cpath d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eFreshRSS 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.\u003c/p\u003e\n\u003ch3 id=\"wie-viel-speicherplatz-benötigt-freshrss\"\u003eWie viel Speicherplatz benötigt FreshRSS?\u003ca href=\"#wie-viel-speicherplatz-ben%c3%b6tigt-freshrss\" class=\"heading-anchor\" aria-label=\"Diesen Abschnitt verlinken\"\u003e\u003csvg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"\u003e\u003cpath d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\"\u003e\u003c/path\u003e\u003cpath d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eDie 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.\u003c/p\u003e\n\u003ch3 id=\"kann-ich-freshrss-ohne-docker-installieren\"\u003eKann ich FreshRSS ohne Docker installieren?\u003ca href=\"#kann-ich-freshrss-ohne-docker-installieren\" class=\"heading-anchor\" aria-label=\"Diesen Abschnitt verlinken\"\u003e\u003csvg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"\u003e\u003cpath d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\"\u003e\u003c/path\u003e\u003cpath d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eJa, 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.\u003c/p\u003e\n","date_published":"2023-08-06T12:05:00+02:00","date_modified":"2023-08-06T12:05:00+02:00","tags":["rss","docker","homelab"]},{"id":"https://www.teqqy.de/2023-07-blogumzug-von-wordpress-zu-jekyll/","url":"https://www.teqqy.de/2023-07-blogumzug-von-wordpress-zu-jekyll/","title":"Blogumzug von Wordpress zu Jekyll","summary":"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.\nWas 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.\n","content_html":"\u003cp\u003eIn 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.\u003c/p\u003e\n\u003ch2 id=\"was-ist-jekyll\"\u003eWas ist Jekyll?\u003ca href=\"#was-ist-jekyll\" class=\"heading-anchor\" aria-label=\"Diesen Abschnitt verlinken\"\u003e\u003csvg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"\u003e\u003cpath d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\"\u003e\u003c/path\u003e\u003cpath d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eJekyll 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.\u003c/p\u003e\n\u003ch2 id=\"gründe-für-meinen-wechsel\"\u003eGründe für meinen Wechsel\u003ca href=\"#gr%c3%bcnde-f%c3%bcr-meinen-wechsel\" class=\"heading-anchor\" aria-label=\"Diesen Abschnitt verlinken\"\u003e\u003csvg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"\u003e\u003cpath d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\"\u003e\u003c/path\u003e\u003cpath d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eGrü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.\nDer 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 \u003ca href=\"https://www.netcup.de/?ref=60644\" target=\"_blank\" rel=\"noopener noreferrer\"\u003eNetcup\u003csvg 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\"\u003e\n  \u003cpath d=\"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6\"/\u003e\n  \u003cpolyline points=\"15 3 21 3 21 9\"/\u003e\n  \u003cline x1=\"10\" y1=\"14\" x2=\"21\" y2=\"3\"/\u003e\n\u003c/svg\u003e\u003cspan class=\"visually-hidden\"\u003e (externer Link)\u003c/span\u003e\u003c/a\u003e\n liegt es nicht, da ich hier auch verschiedene ausprobiert habe.\nZudem bin ich im Moment dabei mich von verschiedenen großen Softwareprodukten zu trennen und auf freiere Software zu setzen.\u003c/p\u003e\n\u003cp\u003eIn der Webentwicklung steht LCP für \u0026ldquo;Largest Contentful Paint\u0026rdquo;. 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.\n{:.note title=\u0026ldquo;Was ist LCP?\u0026rdquo;}\u003c/p\u003e\n\u003ch2 id=\"installation-von-jekyll\"\u003eInstallation von Jekyll\u003ca href=\"#installation-von-jekyll\" class=\"heading-anchor\" aria-label=\"Diesen Abschnitt verlinken\"\u003e\u003csvg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"\u003e\u003cpath d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\"\u003e\u003c/path\u003e\u003cpath d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eDie 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.\nAlternative Installationen finden sich natürlich in der offiziellen Dokumentation. Gern kann dort diese entsprechend verwendet werden.\u003c/p\u003e\n\u003ch3 id=\"installation-unter-macos\"\u003eInstallation unter MacOS\u003ca href=\"#installation-unter-macos\" class=\"heading-anchor\" aria-label=\"Diesen Abschnitt verlinken\"\u003e\u003csvg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"\u003e\u003cpath d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\"\u003e\u003c/path\u003e\u003cpath d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/h3\u003e\n\u003ch4 id=\"installation-des-paketmanagers-brew\"\u003eInstallation des Paketmanagers brew\u003ca href=\"#installation-des-paketmanagers-brew\" class=\"heading-anchor\" aria-label=\"Diesen Abschnitt verlinken\"\u003e\u003csvg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"\u003e\u003cpath d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\"\u003e\u003c/path\u003e\u003cpath d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/h4\u003e\n\u003cp\u003eMacOS Nutzer haben in der Regel schon den Paketmanager \u003ccode\u003ebrew\u003c/code\u003e installiert. Falls du das noch nicht getan hast, lässt sich das mittels\u003c/p\u003e\n\u003cdiv class=\"code-block\"\u003e\n  \u003cdiv class=\"code-block-header\"\u003e\n    \u003cspan class=\"code-lang-label\"\u003ebash\u003c/span\u003e\n    \u003cbutton class=\"code-copy-btn\" type=\"button\" aria-label=\"Code kopieren\" data-umami-event=\"Code Copy\" data-umami-event-lang=\"bash\"\u003e\n      \u003csvg 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\"\u003e\u003crect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\"\u003e\u003c/rect\u003e\u003cpath d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\"\u003e\u003c/path\u003e\u003c/svg\u003e\n      \u003csvg 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\"\u003e\u003cpolyline points=\"20 6 9 17 4 12\"\u003e\u003c/polyline\u003e\u003c/svg\u003e\n    \u003c/button\u003e\n  \u003c/div\u003e\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e6edf3;background-color:#0d1117;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e/bin/bash -c \u003cspan style=\"color:#a5d6ff\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#ff7b72\"\u003e$(\u003c/span\u003ecurl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh\u003cspan style=\"color:#ff7b72\"\u003e)\u003c/span\u003e\u003cspan style=\"color:#a5d6ff\"\u003e\u0026#34;\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/div\u003e\n\u003cp\u003eerledigen. 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.\u003c/p\u003e\n\u003ch4 id=\"installation-von-ruby\"\u003eInstallation von ruby\u003ca href=\"#installation-von-ruby\" class=\"heading-anchor\" aria-label=\"Diesen Abschnitt verlinken\"\u003e\u003csvg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"\u003e\u003cpath d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\"\u003e\u003c/path\u003e\u003cpath d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/h4\u003e\n\u003cdiv class=\"code-block\"\u003e\n  \u003cdiv class=\"code-block-header\"\u003e\n    \u003cspan class=\"code-lang-label\"\u003ebash\u003c/span\u003e\n    \u003cbutton class=\"code-copy-btn\" type=\"button\" aria-label=\"Code kopieren\" data-umami-event=\"Code Copy\" data-umami-event-lang=\"bash\"\u003e\n      \u003csvg 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\"\u003e\u003crect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\"\u003e\u003c/rect\u003e\u003cpath d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\"\u003e\u003c/path\u003e\u003c/svg\u003e\n      \u003csvg 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\"\u003e\u003cpolyline points=\"20 6 9 17 4 12\"\u003e\u003c/polyline\u003e\u003c/svg\u003e\n    \u003c/button\u003e\n  \u003c/div\u003e\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e6edf3;background-color:#0d1117;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ebrew install chruby ruby-install xz\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/div\u003e\n\u003cp\u003eDies kann durchaus ein paar Minuten dauern, das ist nicht ungewöhnlich. Nun installieren wir noch ruby selbst.\u003c/p\u003e\n\u003cdiv class=\"code-block\"\u003e\n  \u003cdiv class=\"code-block-header\"\u003e\n    \u003cspan class=\"code-lang-label\"\u003ebash\u003c/span\u003e\n    \u003cbutton class=\"code-copy-btn\" type=\"button\" aria-label=\"Code kopieren\" data-umami-event=\"Code Copy\" data-umami-event-lang=\"bash\"\u003e\n      \u003csvg 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\"\u003e\u003crect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\"\u003e\u003c/rect\u003e\u003cpath d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\"\u003e\u003c/path\u003e\u003c/svg\u003e\n      \u003csvg 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\"\u003e\u003cpolyline points=\"20 6 9 17 4 12\"\u003e\u003c/polyline\u003e\u003c/svg\u003e\n    \u003c/button\u003e\n  \u003c/div\u003e\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e6edf3;background-color:#0d1117;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eruby-install ruby 3.2.2\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/div\u003e\n\u003cp\u003eBeachte, dass die Version 3.2.2 die zum Zeitpunkt des Artikels die aktuellste Version ist, dass kann zum jetzigen Zeitpunkt anders sein.\nDer nächste Schritt ist, dass wir ruby und die ganzen Environment Variablen noch aktivieren und in die MacOS Konfiguration speichern\u003c/p\u003e\n\u003cdiv class=\"code-block\"\u003e\n  \u003cdiv class=\"code-block-header\"\u003e\n    \u003cspan class=\"code-lang-label\"\u003ebash\u003c/span\u003e\n    \u003cbutton class=\"code-copy-btn\" type=\"button\" aria-label=\"Code kopieren\" data-umami-event=\"Code Copy\" data-umami-event-lang=\"bash\"\u003e\n      \u003csvg 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\"\u003e\u003crect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\"\u003e\u003c/rect\u003e\u003cpath d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\"\u003e\u003c/path\u003e\u003c/svg\u003e\n      \u003csvg 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\"\u003e\u003cpolyline points=\"20 6 9 17 4 12\"\u003e\u003c/polyline\u003e\u003c/svg\u003e\n    \u003c/button\u003e\n  \u003c/div\u003e\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e6edf3;background-color:#0d1117;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eecho \u003cspan style=\"color:#a5d6ff\"\u003e\u0026#34;source \u003c/span\u003e\u003cspan style=\"color:#ff7b72\"\u003e$(\u003c/span\u003ebrew --prefix\u003cspan style=\"color:#ff7b72\"\u003e)\u003c/span\u003e\u003cspan style=\"color:#a5d6ff\"\u003e/opt/chruby/share/chruby/chruby.sh\u0026#34;\u003c/span\u003e \u0026gt;\u0026gt; ~/.zshrc\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eecho \u003cspan style=\"color:#a5d6ff\"\u003e\u0026#34;source \u003c/span\u003e\u003cspan style=\"color:#ff7b72\"\u003e$(\u003c/span\u003ebrew --prefix\u003cspan style=\"color:#ff7b72\"\u003e)\u003c/span\u003e\u003cspan style=\"color:#a5d6ff\"\u003e/opt/chruby/share/chruby/auto.sh\u0026#34;\u003c/span\u003e \u0026gt;\u0026gt; ~/.zshrc\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eecho \u003cspan style=\"color:#a5d6ff\"\u003e\u0026#34;chruby ruby-3.2.2\u0026#34;\u003c/span\u003e \u0026gt;\u0026gt; ~/.zshrc \u003cspan style=\"color:#8b949e;font-style:italic\"\u003e# run \u0026#39;chruby\u0026#39; to see actual version\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/div\u003e\n\u003ch4 id=\"installation-von-jekyll-1\"\u003eInstallation von Jekyll\u003ca href=\"#installation-von-jekyll-1\" class=\"heading-anchor\" aria-label=\"Diesen Abschnitt verlinken\"\u003e\u003csvg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"\u003e\u003cpath d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\"\u003e\u003c/path\u003e\u003cpath d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/h4\u003e\n\u003cp\u003eEndlich kommen wir zu dem Punkt, dass wir Jekyll selbst installieren können.\u003c/p\u003e\n\u003cdiv class=\"code-block\"\u003e\n  \u003cdiv class=\"code-block-header\"\u003e\n    \u003cspan class=\"code-lang-label\"\u003ebash\u003c/span\u003e\n    \u003cbutton class=\"code-copy-btn\" type=\"button\" aria-label=\"Code kopieren\" data-umami-event=\"Code Copy\" data-umami-event-lang=\"bash\"\u003e\n      \u003csvg 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\"\u003e\u003crect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\"\u003e\u003c/rect\u003e\u003cpath d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\"\u003e\u003c/path\u003e\u003c/svg\u003e\n      \u003csvg 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\"\u003e\u003cpolyline points=\"20 6 9 17 4 12\"\u003e\u003c/polyline\u003e\u003c/svg\u003e\n    \u003c/button\u003e\n  \u003c/div\u003e\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e6edf3;background-color:#0d1117;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003egem install jekyll\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/div\u003e\n\u003cp\u003eAuch der Schritt kann einige Zeit lang brauchen. Anschließend haben wir Jekyll installiert.\u003c/p\u003e\n\u003ch2 id=\"jekyll-webseite-anlegen\"\u003eJekyll Webseite anlegen\u003ca href=\"#jekyll-webseite-anlegen\" class=\"heading-anchor\" aria-label=\"Diesen Abschnitt verlinken\"\u003e\u003csvg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"\u003e\u003cpath d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\"\u003e\u003c/path\u003e\u003cpath d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eSobald 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.\u003c/p\u003e\n\u003cdiv class=\"code-block\"\u003e\n  \u003cdiv class=\"code-block-header\"\u003e\n    \u003cspan class=\"code-lang-label\"\u003ebash\u003c/span\u003e\n    \u003cbutton class=\"code-copy-btn\" type=\"button\" aria-label=\"Code kopieren\" data-umami-event=\"Code Copy\" data-umami-event-lang=\"bash\"\u003e\n      \u003csvg 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\"\u003e\u003crect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\"\u003e\u003c/rect\u003e\u003cpath d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\"\u003e\u003c/path\u003e\u003c/svg\u003e\n      \u003csvg 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\"\u003e\u003cpolyline points=\"20 6 9 17 4 12\"\u003e\u003c/polyline\u003e\u003c/svg\u003e\n    \u003c/button\u003e\n  \u003c/div\u003e\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e6edf3;background-color:#0d1117;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ecd ~\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/div\u003e\n\u003cp\u003eDen 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.\u003c/p\u003e\n\u003cdiv class=\"code-block\"\u003e\n  \u003cdiv class=\"code-block-header\"\u003e\n    \u003cspan class=\"code-lang-label\"\u003ebash\u003c/span\u003e\n    \u003cbutton class=\"code-copy-btn\" type=\"button\" aria-label=\"Code kopieren\" data-umami-event=\"Code Copy\" data-umami-event-lang=\"bash\"\u003e\n      \u003csvg 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\"\u003e\u003crect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\"\u003e\u003c/rect\u003e\u003cpath d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\"\u003e\u003c/path\u003e\u003c/svg\u003e\n      \u003csvg 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\"\u003e\u003cpolyline points=\"20 6 9 17 4 12\"\u003e\u003c/polyline\u003e\u003c/svg\u003e\n    \u003c/button\u003e\n  \u003c/div\u003e\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e6edf3;background-color:#0d1117;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ejekyll new blog\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/div\u003e\n\u003cp\u003eEs entsteht dann eine ungefähr solche Ausgabe\u003c/p\u003e\n\u003cdiv class=\"code-block\"\u003e\n  \u003cdiv class=\"code-block-header\"\u003e\n    \u003cspan class=\"code-lang-label\"\u003ebash\u003c/span\u003e\n    \u003cbutton class=\"code-copy-btn\" type=\"button\" aria-label=\"Code kopieren\" data-umami-event=\"Code Copy\" data-umami-event-lang=\"bash\"\u003e\n      \u003csvg 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\"\u003e\u003crect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\"\u003e\u003c/rect\u003e\u003cpath d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\"\u003e\u003c/path\u003e\u003c/svg\u003e\n      \u003csvg 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\"\u003e\u003cpolyline points=\"20 6 9 17 4 12\"\u003e\u003c/polyline\u003e\u003c/svg\u003e\n    \u003c/button\u003e\n  \u003c/div\u003e\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e6edf3;background-color:#0d1117;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eRunning bundle install in /Users/teqqy/blog...\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  Bundler: Fetching gem metadata from https://rubygems.org/............\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  Bundler: Resolving dependencies...\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  Bundler: Fetching rouge 4.1.3\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  Bundler: Installing rouge 4.1.3\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  Bundler: Bundle complete! \u003cspan style=\"color:#a5d6ff\"\u003e7\u003c/span\u003e Gemfile dependencies, \u003cspan style=\"color:#a5d6ff\"\u003e33\u003c/span\u003e gems now installed.\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  Bundler: Use \u003cspan style=\"color:#a5d6ff\"\u003e`\u003c/span\u003ebundle info \u003cspan style=\"color:#ff7b72;font-weight:bold\"\u003e[\u003c/span\u003egemname\u003cspan style=\"color:#ff7b72;font-weight:bold\"\u003e]\u003c/span\u003e\u003cspan style=\"color:#a5d6ff\"\u003e`\u003c/span\u003e to see where a bundled gem is installed.\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eNew jekyll site installed in /Users/teqqy/blog.\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#ff7b72;font-weight:bold\"\u003e[\u003c/span\u003e21:31:33\u003cspan style=\"color:#ff7b72;font-weight:bold\"\u003e]\u003c/span\u003e \u003cspan style=\"color:#ff7b72;font-weight:bold\"\u003e[\u003c/span\u003ecost 3.162s\u003cspan style=\"color:#ff7b72;font-weight:bold\"\u003e]\u003c/span\u003e jekyll new blog\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/div\u003e\n\u003cp\u003eNun wechseln wir in das Verzeichnis und gucken mal was so für Dateien und Ordner dort hinterlegt sind.\u003c/p\u003e\n\u003cdiv class=\"code-block\"\u003e\n  \u003cdiv class=\"code-block-header\"\u003e\n    \u003cspan class=\"code-lang-label\"\u003ebash\u003c/span\u003e\n    \u003cbutton class=\"code-copy-btn\" type=\"button\" aria-label=\"Code kopieren\" data-umami-event=\"Code Copy\" data-umami-event-lang=\"bash\"\u003e\n      \u003csvg 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\"\u003e\u003crect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\"\u003e\u003c/rect\u003e\u003cpath d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\"\u003e\u003c/path\u003e\u003c/svg\u003e\n      \u003csvg 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\"\u003e\u003cpolyline points=\"20 6 9 17 4 12\"\u003e\u003c/polyline\u003e\u003c/svg\u003e\n    \u003c/button\u003e\n  \u003c/div\u003e\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e6edf3;background-color:#0d1117;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#ff7b72;font-weight:bold\"\u003e[\u003c/span\u003e21:32:50\u003cspan style=\"color:#ff7b72;font-weight:bold\"\u003e]\u003c/span\u003e \u003cspan style=\"color:#ff7b72;font-weight:bold\"\u003e[\u003c/span\u003e~/blog\u003cspan style=\"color:#ff7b72;font-weight:bold\"\u003e]\u003c/span\u003e ❱❱❱ ls -l\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003etotal \u003cspan style=\"color:#a5d6ff\"\u003e48\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e-rw-r--r--  \u003cspan style=\"color:#a5d6ff\"\u003e1\u003c/span\u003e teqqy  staff   \u003cspan style=\"color:#a5d6ff\"\u003e419\u003c/span\u003e \u003cspan style=\"color:#a5d6ff\"\u003e31\u003c/span\u003e Jul 21:31 404.html\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e-rw-r--r--  \u003cspan style=\"color:#a5d6ff\"\u003e1\u003c/span\u003e teqqy  staff  \u003cspan style=\"color:#a5d6ff\"\u003e1309\u003c/span\u003e \u003cspan style=\"color:#a5d6ff\"\u003e31\u003c/span\u003e Jul 21:31 Gemfile\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e-rw-r--r--  \u003cspan style=\"color:#a5d6ff\"\u003e1\u003c/span\u003e teqqy  staff  \u003cspan style=\"color:#a5d6ff\"\u003e2052\u003c/span\u003e \u003cspan style=\"color:#a5d6ff\"\u003e31\u003c/span\u003e Jul 21:31 Gemfile.lock\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e-rw-r--r--  \u003cspan style=\"color:#a5d6ff\"\u003e1\u003c/span\u003e teqqy  staff  \u003cspan style=\"color:#a5d6ff\"\u003e2079\u003c/span\u003e \u003cspan style=\"color:#a5d6ff\"\u003e31\u003c/span\u003e Jul 21:31 _config.yml\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003edrwxr-xr-x  \u003cspan style=\"color:#a5d6ff\"\u003e3\u003c/span\u003e teqqy  staff    \u003cspan style=\"color:#a5d6ff\"\u003e96\u003c/span\u003e \u003cspan style=\"color:#a5d6ff\"\u003e31\u003c/span\u003e Jul 21:31 _posts\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e-rw-r--r--  \u003cspan style=\"color:#a5d6ff\"\u003e1\u003c/span\u003e teqqy  staff   \u003cspan style=\"color:#a5d6ff\"\u003e539\u003c/span\u003e \u003cspan style=\"color:#a5d6ff\"\u003e31\u003c/span\u003e Jul 21:31 about.markdown\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e-rw-r--r--  \u003cspan style=\"color:#a5d6ff\"\u003e1\u003c/span\u003e teqqy  staff   \u003cspan style=\"color:#a5d6ff\"\u003e175\u003c/span\u003e \u003cspan style=\"color:#a5d6ff\"\u003e31\u003c/span\u003e Jul 21:31 index.markdown\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/div\u003e\n\u003cp\u003eWie man sieht, sind das nicht viele Dateien. Nun sollten wir die \u003ccode\u003e_config.yml\u003c/code\u003e anpassen. Die Begriffe sollten selbsterklärend sein. Die Werte sind aber erst mal keine Pflicht.\nUm jetzt die HTML Dateien bauen zu lassen verwenden wir folgenden Befehl\u003c/p\u003e\n\u003cdiv class=\"code-block\"\u003e\n  \u003cdiv class=\"code-block-header\"\u003e\n    \u003cspan class=\"code-lang-label\"\u003ebash\u003c/span\u003e\n    \u003cbutton class=\"code-copy-btn\" type=\"button\" aria-label=\"Code kopieren\" data-umami-event=\"Code Copy\" data-umami-event-lang=\"bash\"\u003e\n      \u003csvg 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\"\u003e\u003crect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\"\u003e\u003c/rect\u003e\u003cpath d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\"\u003e\u003c/path\u003e\u003c/svg\u003e\n      \u003csvg 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\"\u003e\u003cpolyline points=\"20 6 9 17 4 12\"\u003e\u003c/polyline\u003e\u003c/svg\u003e\n    \u003c/button\u003e\n  \u003c/div\u003e\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e6edf3;background-color:#0d1117;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ejekyll serve\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/div\u003e\n\u003cp\u003eEs 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\u003c/p\u003e\n\u003cdiv class=\"code-block\"\u003e\n  \u003cdiv class=\"code-block-header\"\u003e\n    \u003cspan class=\"code-lang-label\"\u003ebash\u003c/span\u003e\n    \u003cbutton class=\"code-copy-btn\" type=\"button\" aria-label=\"Code kopieren\" data-umami-event=\"Code Copy\" data-umami-event-lang=\"bash\"\u003e\n      \u003csvg 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\"\u003e\u003crect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\"\u003e\u003c/rect\u003e\u003cpath d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\"\u003e\u003c/path\u003e\u003c/svg\u003e\n      \u003csvg 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\"\u003e\u003cpolyline points=\"20 6 9 17 4 12\"\u003e\u003c/polyline\u003e\u003c/svg\u003e\n    \u003c/button\u003e\n  \u003c/div\u003e\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e6edf3;background-color:#0d1117;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eRun in verbose mode to see all warnings.\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                    \u003cspan style=\"color:#ff7b72\"\u003edone\u003c/span\u003e in 0.401 seconds.\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e Auto-regeneration: enabled \u003cspan style=\"color:#ff7b72\"\u003efor\u003c/span\u003e \u003cspan style=\"color:#a5d6ff\"\u003e\u0026#39;/Users/teqqy/blog\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    Server address: http://127.0.0.1:4000/\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  Server running... press ctrl-c to stop.\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/div\u003e\n\u003cp\u003eEnthalten. Jetzt könnt ihr euren Browser öffnen und die URL \u003ccode\u003ehttp://127.0.0.1:4000\u003c/code\u003e verwenden.\u003c/p\u003e\n\u003cp\u003eWir brechen dann wieder den laufenden Server mit \u003ccode\u003eCTRL-C\u003c/code\u003e ab. Wenn wir jetzt nochmal die Verzeichnisse auflisten sehen wir, dass dort ein neuer Ordner \u003ccode\u003e_site\u003c/code\u003e erstellt worden ist.\u003c/p\u003e\n\u003cdiv class=\"code-block\"\u003e\n  \u003cdiv class=\"code-block-header\"\u003e\n    \u003cspan class=\"code-lang-label\"\u003ebash\u003c/span\u003e\n    \u003cbutton class=\"code-copy-btn\" type=\"button\" aria-label=\"Code kopieren\" data-umami-event=\"Code Copy\" data-umami-event-lang=\"bash\"\u003e\n      \u003csvg 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\"\u003e\u003crect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\"\u003e\u003c/rect\u003e\u003cpath d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\"\u003e\u003c/path\u003e\u003c/svg\u003e\n      \u003csvg 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\"\u003e\u003cpolyline points=\"20 6 9 17 4 12\"\u003e\u003c/polyline\u003e\u003c/svg\u003e\n    \u003c/button\u003e\n  \u003c/div\u003e\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e6edf3;background-color:#0d1117;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#ff7b72;font-weight:bold\"\u003e[\u003c/span\u003e21:40:43\u003cspan style=\"color:#ff7b72;font-weight:bold\"\u003e]\u003c/span\u003e \u003cspan style=\"color:#ff7b72;font-weight:bold\"\u003e[\u003c/span\u003e~/blog\u003cspan style=\"color:#ff7b72;font-weight:bold\"\u003e]\u003c/span\u003e ❱❱❱ ls -l\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003etotal \u003cspan style=\"color:#a5d6ff\"\u003e48\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e-rw-r--r--  \u003cspan style=\"color:#a5d6ff\"\u003e1\u003c/span\u003e teqqy  staff   \u003cspan style=\"color:#a5d6ff\"\u003e419\u003c/span\u003e \u003cspan style=\"color:#a5d6ff\"\u003e31\u003c/span\u003e Jul 21:31 404.html\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e-rw-r--r--  \u003cspan style=\"color:#a5d6ff\"\u003e1\u003c/span\u003e teqqy  staff  \u003cspan style=\"color:#a5d6ff\"\u003e1309\u003c/span\u003e \u003cspan style=\"color:#a5d6ff\"\u003e31\u003c/span\u003e Jul 21:31 Gemfile\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e-rw-r--r--  \u003cspan style=\"color:#a5d6ff\"\u003e1\u003c/span\u003e teqqy  staff  \u003cspan style=\"color:#a5d6ff\"\u003e2052\u003c/span\u003e \u003cspan style=\"color:#a5d6ff\"\u003e31\u003c/span\u003e Jul 21:31 Gemfile.lock\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e-rw-r--r--  \u003cspan style=\"color:#a5d6ff\"\u003e1\u003c/span\u003e teqqy  staff  \u003cspan style=\"color:#a5d6ff\"\u003e2079\u003c/span\u003e \u003cspan style=\"color:#a5d6ff\"\u003e31\u003c/span\u003e Jul 21:31 _config.yml\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003edrwxr-xr-x  \u003cspan style=\"color:#a5d6ff\"\u003e3\u003c/span\u003e teqqy  staff    \u003cspan style=\"color:#a5d6ff\"\u003e96\u003c/span\u003e \u003cspan style=\"color:#a5d6ff\"\u003e31\u003c/span\u003e Jul 21:31 _posts\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003edrwxr-xr-x  \u003cspan style=\"color:#a5d6ff\"\u003e8\u003c/span\u003e teqqy  staff   \u003cspan style=\"color:#a5d6ff\"\u003e256\u003c/span\u003e \u003cspan style=\"color:#a5d6ff\"\u003e31\u003c/span\u003e Jul 21:35 _site\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e-rw-r--r--  \u003cspan style=\"color:#a5d6ff\"\u003e1\u003c/span\u003e teqqy  staff   \u003cspan style=\"color:#a5d6ff\"\u003e539\u003c/span\u003e \u003cspan style=\"color:#a5d6ff\"\u003e31\u003c/span\u003e Jul 21:31 about.markdown\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e-rw-r--r--  \u003cspan style=\"color:#a5d6ff\"\u003e1\u003c/span\u003e teqqy  staff   \u003cspan style=\"color:#a5d6ff\"\u003e175\u003c/span\u003e \u003cspan style=\"color:#a5d6ff\"\u003e31\u003c/span\u003e Jul 21:31 index.markdown\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/div\u003e\n\u003cp\u003eDieser Ordner ist nun schlussendlich das wichtige. Dieser kann auf einen Webserver kopiert und ausgeliefert werden.\u003c/p\u003e\n\u003ch3 id=\"webseite-bereitstellen\"\u003eWebseite bereitstellen\u003ca href=\"#webseite-bereitstellen\" class=\"heading-anchor\" aria-label=\"Diesen Abschnitt verlinken\"\u003e\u003csvg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"\u003e\u003cpath d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\"\u003e\u003c/path\u003e\u003cpath d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eViele Tutorials im Internet verwenden den \u003ccode\u003ejekyll serve\u003c/code\u003e 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.\u003c/p\u003e\n\u003ch4 id=\"nginx-docker-container\"\u003eNginx Docker Container\u003ca href=\"#nginx-docker-container\" class=\"heading-anchor\" aria-label=\"Diesen Abschnitt verlinken\"\u003e\u003csvg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"\u003e\u003cpath d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\"\u003e\u003c/path\u003e\u003cpath d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/h4\u003e\n\u003cp\u003eMeine verwendete \u003ccode\u003edocker-compose.yaml\u003c/code\u003e Datei kannst du natürlich übernehmen wenn du möchtest. Du müsstest nur die Werte entsprechend anpassen.\u003c/p\u003e\n\u003cdiv class=\"code-block\"\u003e\n  \u003cdiv class=\"code-block-header\"\u003e\n    \u003cspan class=\"code-lang-label\"\u003eyaml\u003c/span\u003e\n    \u003cbutton class=\"code-copy-btn\" type=\"button\" aria-label=\"Code kopieren\" data-umami-event=\"Code Copy\" data-umami-event-lang=\"yaml\"\u003e\n      \u003csvg 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\"\u003e\u003crect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\"\u003e\u003c/rect\u003e\u003cpath d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\"\u003e\u003c/path\u003e\u003c/svg\u003e\n      \u003csvg 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\"\u003e\u003cpolyline points=\"20 6 9 17 4 12\"\u003e\u003c/polyline\u003e\u003c/svg\u003e\n    \u003c/button\u003e\n  \u003c/div\u003e\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e6edf3;background-color:#0d1117;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-yaml\" data-lang=\"yaml\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#ff7b72\"\u003e---\u003c/span\u003e\u003cspan style=\"color:#6e7681\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#7ee787\"\u003eversion\u003c/span\u003e:\u003cspan style=\"color:#6e7681\"\u003e \u003c/span\u003e\u003cspan style=\"color:#a5d6ff\"\u003e\u0026#34;3.8\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#6e7681\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#6e7681\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#7ee787\"\u003eservices\u003c/span\u003e:\u003cspan style=\"color:#6e7681\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#6e7681\"\u003e  \u003c/span\u003e\u003cspan style=\"color:#7ee787\"\u003enginx\u003c/span\u003e:\u003cspan style=\"color:#6e7681\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#6e7681\"\u003e    \u003c/span\u003e\u003cspan style=\"color:#7ee787\"\u003eimage\u003c/span\u003e:\u003cspan style=\"color:#6e7681\"\u003e \u003c/span\u003e\u003cspan style=\"color:#a5d6ff\"\u003enginx\u003c/span\u003e\u003cspan style=\"color:#6e7681\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#6e7681\"\u003e    \u003c/span\u003e\u003cspan style=\"color:#7ee787\"\u003econtainer_name\u003c/span\u003e:\u003cspan style=\"color:#6e7681\"\u003e \u003c/span\u003e\u003cspan style=\"color:#a5d6ff\"\u003enginx\u003c/span\u003e\u003cspan style=\"color:#6e7681\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#6e7681\"\u003e    \u003c/span\u003e\u003cspan style=\"color:#7ee787\"\u003evolumes\u003c/span\u003e:\u003cspan style=\"color:#6e7681\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#6e7681\"\u003e      \u003c/span\u003e- \u003cspan style=\"color:#a5d6ff\"\u003e./_site:/usr/share/nginx/html\u003c/span\u003e\u003cspan style=\"color:#6e7681\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#6e7681\"\u003e      \u003c/span\u003e- \u003cspan style=\"color:#a5d6ff\"\u003e./nginx.conf:/etc/nginx/conf.d/www_nginx.conf\u003c/span\u003e\u003cspan style=\"color:#6e7681\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#6e7681\"\u003e    \u003c/span\u003e\u003cspan style=\"color:#7ee787\"\u003elabels\u003c/span\u003e:\u003cspan style=\"color:#6e7681\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#6e7681\"\u003e      \u003c/span\u003e- \u003cspan style=\"color:#a5d6ff\"\u003e\u0026#34;traefik.enable=true\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#6e7681\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#6e7681\"\u003e      \u003c/span\u003e- \u003cspan style=\"color:#a5d6ff\"\u003e\u0026#34;traefik.http.middlewares.nginx-https.redirectscheme.scheme=https\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#6e7681\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#6e7681\"\u003e      \u003c/span\u003e- \u003cspan style=\"color:#a5d6ff\"\u003e\u0026#34;traefik.http.middlewares.nginx-compress.compress=true\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#6e7681\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#6e7681\"\u003e      \u003c/span\u003e- \u003cspan style=\"color:#a5d6ff\"\u003e\u0026#34;traefik.http.routers.nginx-http.entrypoints=web\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#6e7681\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#6e7681\"\u003e      \u003c/span\u003e- \u003cspan style=\"color:#a5d6ff\"\u003e\u0026#34;traefik.http.routers.nginx-http.rule=Host(`www.example.com`) || Host(`example.com`)\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#6e7681\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#6e7681\"\u003e      \u003c/span\u003e- \u003cspan style=\"color:#a5d6ff\"\u003e\u0026#34;traefik.http.routers.nginx-http.middlewares=teqqy-https@docker\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#6e7681\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#6e7681\"\u003e      \u003c/span\u003e- \u003cspan style=\"color:#a5d6ff\"\u003e\u0026#34;traefik.http.routers.nginx.entrypoints=websecure\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#6e7681\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#6e7681\"\u003e      \u003c/span\u003e- \u003cspan style=\"color:#a5d6ff\"\u003e\u0026#34;traefik.http.routers.teqqy.rule=Host(`www.example.com``) || Host(`example.com``)\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#6e7681\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#6e7681\"\u003e      \u003c/span\u003e- \u003cspan style=\"color:#a5d6ff\"\u003e\u0026#34;traefik.http.routers.nginx.tls=true\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#6e7681\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#6e7681\"\u003e      \u003c/span\u003e- \u003cspan style=\"color:#a5d6ff\"\u003e\u0026#34;traefik.http.routers.nginx.tls.certresolver=default\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#6e7681\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#6e7681\"\u003e      \u003c/span\u003e- \u003cspan style=\"color:#a5d6ff\"\u003e\u0026#34;traefik.http.routers.nginx.middlewares=secHeaders@file\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#6e7681\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#6e7681\"\u003e      \u003c/span\u003e- \u003cspan style=\"color:#a5d6ff\"\u003e\u0026#34;traefik.http.routers.nginx.middlewares=teqqy-compress\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#6e7681\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#6e7681\"\u003e      \u003c/span\u003e- \u003cspan style=\"color:#a5d6ff\"\u003e\u0026#34;traefik.http.services.nginx.loadbalancer.server.port=80\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#6e7681\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#6e7681\"\u003e    \u003c/span\u003e\u003cspan style=\"color:#7ee787\"\u003enetworks\u003c/span\u003e:\u003cspan style=\"color:#6e7681\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#6e7681\"\u003e      \u003c/span\u003e- \u003cspan style=\"color:#a5d6ff\"\u003eteqqywp\u003c/span\u003e\u003cspan style=\"color:#6e7681\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#6e7681\"\u003e      \u003c/span\u003e- \u003cspan style=\"color:#a5d6ff\"\u003etraefik_proxy\u003c/span\u003e\u003cspan style=\"color:#6e7681\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#6e7681\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#7ee787\"\u003enetworks\u003c/span\u003e:\u003cspan style=\"color:#6e7681\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#6e7681\"\u003e  \u003c/span\u003e\u003cspan style=\"color:#7ee787\"\u003etraefik_proxy\u003c/span\u003e:\u003cspan style=\"color:#6e7681\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#6e7681\"\u003e    \u003c/span\u003e\u003cspan style=\"color:#7ee787\"\u003eexternal\u003c/span\u003e:\u003cspan style=\"color:#6e7681\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#6e7681\"\u003e      \u003c/span\u003e\u003cspan style=\"color:#7ee787\"\u003ename\u003c/span\u003e:\u003cspan style=\"color:#6e7681\"\u003e \u003c/span\u003e\u003cspan style=\"color:#a5d6ff\"\u003etraefik_proxy\u003c/span\u003e\u003cspan style=\"color:#6e7681\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#6e7681\"\u003e  \u003c/span\u003e\u003cspan style=\"color:#7ee787\"\u003eteqqywp\u003c/span\u003e:\u003cspan style=\"color:#6e7681\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#6e7681\"\u003e    \u003c/span\u003e\u003cspan style=\"color:#7ee787\"\u003edriver\u003c/span\u003e:\u003cspan style=\"color:#6e7681\"\u003e \u003c/span\u003e\u003cspan style=\"color:#a5d6ff\"\u003ebridge\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/div\u003e\n\u003ch4 id=\"nginx-konfiguration\"\u003eNginx Konfiguration\u003ca href=\"#nginx-konfiguration\" class=\"heading-anchor\" aria-label=\"Diesen Abschnitt verlinken\"\u003e\u003csvg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"\u003e\u003cpath d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\"\u003e\u003c/path\u003e\u003cpath d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/h4\u003e\n\u003cp\u003eIch binde noch eine eigene \u003ccode\u003enginx.conf\u003c/code\u003e Datei ein in der ich noch Anpassungen für Caching und anderes mache.\u003c/p\u003e\n\u003cdiv class=\"code-block\"\u003e\n  \u003cdiv class=\"code-block-header\"\u003e\n    \u003cspan class=\"code-lang-label\"\u003econf\u003c/span\u003e\n    \u003cbutton class=\"code-copy-btn\" type=\"button\" aria-label=\"Code kopieren\" data-umami-event=\"Code Copy\" data-umami-event-lang=\"conf\"\u003e\n      \u003csvg 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\"\u003e\u003crect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\"\u003e\u003c/rect\u003e\u003cpath d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\"\u003e\u003c/path\u003e\u003c/svg\u003e\n      \u003csvg 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\"\u003e\u003cpolyline points=\"20 6 9 17 4 12\"\u003e\u003c/polyline\u003e\u003c/svg\u003e\n    \u003c/button\u003e\n  \u003c/div\u003e\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-conf\" data-lang=\"conf\"\u003eserver {\n  listen 80;\n  server_name example.com www.example.com\n\n  root /usr/share/nginx/html;\n  index index.html index.htm;\n\n  if (!-f \u0026#34;${request_filename}index.html\u0026#34;) {\n    rewrite ^/(.*)/$ /$1 permanent;\n  }\n\n  if ($request_uri ~* \u0026#34;/index.html\u0026#34;) {\n    rewrite (?i)^(.*)index\\.html$ $1 permanent;\n  }\n\n  if ($request_uri ~* \u0026#34;.html\u0026#34;) {\n    rewrite (?i)^(.*)/(.*)\\.html $1/$2 permanent;\n  }\n\n  error_page 404 /404.html;\n\n  location / {\n    try_files $uri $uri.html $uri/ =404;\n  }\n  location ~* \\.(?:ico|css|js|gif|jpe?g|png)$ {\n    expires 30d;\n    add_header Pragma public;\n    add_header Cache-Control \u0026#34;public\u0026#34;;\n  }\n\n  # reduce the data that needs to be sent over network -- for testing environment\n  gzip on;\n  # gzip_static on;\n  gzip_min_length 10240;\n  gzip_comp_level 1;\n  gzip_vary on;\n  gzip_disable msie6;\n  gzip_proxied expired no-cache no-store private auth;\n  gzip_types\n    # text/html is always compressed by HttpGzipModule\n    text/css\n    text/javascript\n    text/xml\n    text/plain\n    text/x-component\n    application/javascript\n    application/x-javascript\n    application/json\n    application/xml\n    application/rss+xml\n    application/atom+xml\n    font/truetype\n    font/opentype\n    application/vnd.ms-fontobject\n    image/svg+xml;\n\n  # allow the server to close connection on non responding client, this will free up memory\n  reset_timedout_connection on;\n\n  # request timed out -- default 60\n  client_body_timeout 10;\n\n  # if client stop responding, free up memory -- default 60\n  send_timeout 2;\n\n  # server will close connection after this time -- default 75\n  keepalive_timeout 30;\n\n  # number of requests client can make over keep-alive -- for testing environment\n  keepalive_requests 100000;\n\n}\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cp\u003eNun kann der Container gestartet werden und nach kurzer Zeit könnt ihr die Seite über die angegebene URL aufrufen.\u003c/p\u003e\n\u003ch2 id=\"wordpress-daten-exportieren\"\u003eWordpress Daten exportieren\u003ca href=\"#wordpress-daten-exportieren\" class=\"heading-anchor\" aria-label=\"Diesen Abschnitt verlinken\"\u003e\u003csvg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"\u003e\u003cpath d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\"\u003e\u003c/path\u003e\u003cpath d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eFür den Export habe ich das Wordpress Plugin \u003ca href=\"https://de.wordpress.org/plugins/jekyll-exporter/\" target=\"_blank\" rel=\"noopener noreferrer\"\u003eWordpress to Jekyll Exporter\u003csvg 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\"\u003e\n  \u003cpath d=\"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6\"/\u003e\n  \u003cpolyline points=\"15 3 21 3 21 9\"/\u003e\n  \u003cline x1=\"10\" y1=\"14\" x2=\"21\" y2=\"3\"/\u003e\n\u003c/svg\u003e\u003cspan class=\"visually-hidden\"\u003e (externer Link)\u003c/span\u003e\u003c/a\u003e\n verwendet. Es nicht das beste Plugin aber für mich hat es gereicht. In Wordpress können wir dann unter \u003cstrong\u003eWerkzeuge\u003c/strong\u003e den Export ausführen und bekommen eine ZIP-Datei zum Download.\nDie Inhalte können wir direkt in unser Jekyll Verzeichnis kopieren und die Seiten neu genierieren lassen.\u003c/p\u003e\n\u003cdiv class=\"code-block\"\u003e\n  \u003cdiv class=\"code-block-header\"\u003e\n    \u003cspan class=\"code-lang-label\"\u003ebash\u003c/span\u003e\n    \u003cbutton class=\"code-copy-btn\" type=\"button\" aria-label=\"Code kopieren\" data-umami-event=\"Code Copy\" data-umami-event-lang=\"bash\"\u003e\n      \u003csvg 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\"\u003e\u003crect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\"\u003e\u003c/rect\u003e\u003cpath d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\"\u003e\u003c/path\u003e\u003c/svg\u003e\n      \u003csvg 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\"\u003e\u003cpolyline points=\"20 6 9 17 4 12\"\u003e\u003c/polyline\u003e\u003c/svg\u003e\n    \u003c/button\u003e\n  \u003c/div\u003e\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e6edf3;background-color:#0d1117;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ejekyll serve\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/div\u003e\n\u003cp\u003eNun können wir den Ordner \u003ccode\u003e_site\u003c/code\u003e 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.\u003c/p\u003e\n\u003ch2 id=\"jekyll-anapssen\"\u003eJekyll anapssen\u003ca href=\"#jekyll-anapssen\" class=\"heading-anchor\" aria-label=\"Diesen Abschnitt verlinken\"\u003e\u003csvg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"\u003e\u003cpath d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\"\u003e\u003c/path\u003e\u003cpath d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eJetzt liegt es an euch, Jekyll entsprechend den Bedürfnissen anzu passen. Heißt ein Theme herunter zu laden oder mit Plugins zu erweitern.\u003c/p\u003e\n","date_published":"2023-07-31T22:29:57+02:00","date_modified":"2023-07-31T22:29:57+02:00","tags":["wordpress","jekyll","nginx","docker"]},{"id":"https://www.teqqy.de/teslamate-datenlogger-fur-tesla-fahrzeuge/","url":"https://www.teqqy.de/teslamate-datenlogger-fur-tesla-fahrzeuge/","title":"Teslamate 2025 - Datenlogger für Tesla Fahrzeuge","summary":"Update Dezember 2025: Dieser Artikel wurde überarbeitet und berücksichtigt die wichtigen Änderungen der Tesla Fleet API sowie aktuelle Teslamate-Versionen.\nModerne 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.\nWas hat sich 2025 geändert? Die wichtigsten Updates auf einen Blick:\n","content_html":"\u003cp\u003e\u003cstrong\u003eUpdate Dezember 2025:\u003c/strong\u003e Dieser Artikel wurde überarbeitet und berücksichtigt die wichtigen Änderungen der Tesla Fleet API sowie aktuelle Teslamate-Versionen.\u003c/p\u003e\n\u003cp\u003eModerne 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.\u003c/p\u003e\n\u003ch2 id=\"was-hat-sich-2025-geändert\"\u003eWas hat sich 2025 geändert?\u003ca href=\"#was-hat-sich-2025-ge%c3%a4ndert\" class=\"heading-anchor\" aria-label=\"Diesen Abschnitt verlinken\"\u003e\u003csvg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"\u003e\u003cpath d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\"\u003e\u003c/path\u003e\u003cpath d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eDie wichtigsten Updates auf einen Blick:\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eTesla Fleet API:\u003c/strong\u003e Tesla hat die inoffizielle \u0026ldquo;Owner API\u0026rdquo; 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.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003ePostgreSQL 17:\u003c/strong\u003e Teslamate benötigt nun mindestens PostgreSQL 16.7 oder 17.3. Die Entwickler empfehlen PostgreSQL 17.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eFleet Telemetry:\u003c/strong\u003e 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.\u003c/p\u003e\n\u003ch2 id=\"teslamate--installieren-oder-einkaufen\"\u003eTeslamate – Installieren oder einkaufen?\u003ca href=\"#teslamate--installieren-oder-einkaufen\" class=\"heading-anchor\" aria-label=\"Diesen Abschnitt verlinken\"\u003e\u003csvg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"\u003e\u003cpath d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\"\u003e\u003c/path\u003e\u003cpath d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eTeslamate 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 \u003ca href=\"https://www.netcup.de/?ref=60644\" target=\"_blank\" rel=\"noopener noreferrer\"\u003eNetcup\u003csvg 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\"\u003e\n  \u003cpath d=\"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6\"/\u003e\n  \u003cpolyline points=\"15 3 21 3 21 9\"/\u003e\n  \u003cline x1=\"10\" y1=\"14\" x2=\"21\" y2=\"3\"/\u003e\n\u003c/svg\u003e\u003cspan class=\"visually-hidden\"\u003e (externer Link)\u003c/span\u003e\u003c/a\u003e\n – beides funktioniert. Ich hoste die Software auf meinem eigenen Server im Heimnetzwerk.\u003c/p\u003e\n\u003cp\u003eDie Installation ist mit \u003ca href=\"/wordpress-docker-performance/\"\u003eDocker\u003c/a\u003e\n sehr einfach. Du benötigst eine Datenbank (PostgreSQL) und den Anwendungscontainer. Für die Visualisierung setzt Teslamate auf Grafana mit fertig konfigurierten Dashboards.\u003c/p\u003e\n\u003ch2 id=\"voraussetzungen\"\u003eVoraussetzungen\u003ca href=\"#voraussetzungen\" class=\"heading-anchor\" aria-label=\"Diesen Abschnitt verlinken\"\u003e\u003csvg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"\u003e\u003cpath d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\"\u003e\u003c/path\u003e\u003cpath d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003eHardware \u0026amp; Software:\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eServer mit mindestens 2 GB RAM (Raspberry Pi 4/5, NAS, VPS)\u003c/li\u003e\n\u003cli\u003eDocker und Docker Compose installiert\u003c/li\u003e\n\u003cli\u003eDauerhaft aktive Internetverbindung\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eTesla-Account:\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eTesla-Konto mit Zwei-Faktor-Authentifizierung\u003c/li\u003e\n\u003cli\u003eTesla Developer Account (kostenlos bei \u003ca href=\"https://developer.tesla.com\" target=\"_blank\" rel=\"noopener noreferrer\"\u003edeveloper.tesla.com\u003csvg 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\"\u003e\n  \u003cpath d=\"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6\"/\u003e\n  \u003cpolyline points=\"15 3 21 3 21 9\"/\u003e\n  \u003cline x1=\"10\" y1=\"14\" x2=\"21\" y2=\"3\"/\u003e\n\u003c/svg\u003e\u003cspan class=\"visually-hidden\"\u003e (externer Link)\u003c/span\u003e\u003c/a\u003e\n)\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"tesla-developer-account-einrichten\"\u003eTesla Developer Account einrichten\u003ca href=\"#tesla-developer-account-einrichten\" class=\"heading-anchor\" aria-label=\"Diesen Abschnitt verlinken\"\u003e\u003csvg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"\u003e\u003cpath d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\"\u003e\u003c/path\u003e\u003cpath d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eSeit der Umstellung auf die Fleet API brauchst du einen Developer Account:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003eMelde dich bei \u003ca href=\"https://developer.tesla.com\" target=\"_blank\" rel=\"noopener noreferrer\"\u003edeveloper.tesla.com\u003csvg 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\"\u003e\n  \u003cpath d=\"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6\"/\u003e\n  \u003cpolyline points=\"15 3 21 3 21 9\"/\u003e\n  \u003cline x1=\"10\" y1=\"14\" x2=\"21\" y2=\"3\"/\u003e\n\u003c/svg\u003e\u003cspan class=\"visually-hidden\"\u003e (externer Link)\u003c/span\u003e\u003c/a\u003e\n mit deinem Tesla-Konto an\u003c/li\u003e\n\u003cli\u003eErstelle eine neue Application (z.B. \u0026ldquo;Teslamate Homelab\u0026rdquo;)\u003c/li\u003e\n\u003cli\u003eGib eine kurze Beschreibung an\u003c/li\u003e\n\u003cli\u003eBei lokaler Nutzung kannst du localhost als Domain verwenden\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003eDie 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.\u003c/p\u003e\n\u003ch2 id=\"token-erstellung\"\u003eToken-Erstellung\u003ca href=\"#token-erstellung\" class=\"heading-anchor\" aria-label=\"Diesen Abschnitt verlinken\"\u003e\u003csvg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"\u003e\u003cpath d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\"\u003e\u003c/path\u003e\u003cpath d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eFrüher funktionierte die Anmeldung mit Benutzerdaten. Heute benötigst du einen „Refresh Token\u0026quot; und „Access Token\u0026quot;. Diese generierst du am einfachsten mit Apps:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eiOS:\u003c/strong\u003e \u0026ldquo;Auth for Tesla\u0026rdquo; (Apple AppStore)\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eAndroid:\u003c/strong\u003e \u0026ldquo;Tesla Tokens\u0026rdquo; oder \u0026ldquo;Auth for Tesla\u0026rdquo;\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eWindows/Mac:\u003c/strong\u003e \u0026ldquo;Tesla Auth\u0026rdquo; oder Web-basierte Tools\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eVorgehensweise:\u003c/strong\u003e\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003eApp installieren und mit Tesla-Benutzernamen anmelden\u003c/li\u003e\n\u003cli\u003ePasswort eingeben\u003c/li\u003e\n\u003cli\u003eBeim zweiten Prompt deinen 2FA-Code eingeben (nicht nochmal das Passwort!)\u003c/li\u003e\n\u003cli\u003eApp zeigt Refresh Token und Access Token – beide sicher aufbewahren\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003eDie Tokens bleiben mehrere Monate gültig. Teslamate erneuert den Access Token automatisch.\u003c/p\u003e\n\u003cp\u003e\u003cimg 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\"\u003e\u003c/p\u003e\n\u003ch2 id=\"installation-mit-docker-compose\"\u003eInstallation mit Docker Compose\u003ca href=\"#installation-mit-docker-compose\" class=\"heading-anchor\" aria-label=\"Diesen Abschnitt verlinken\"\u003e\u003csvg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"\u003e\u003cpath d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\"\u003e\u003c/path\u003e\u003cpath d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eDie einfachste Installation erfolgt über Docker Compose. Falls du Docker Compose noch nicht installiert hast:\u003c/p\u003e\n\u003cdiv class=\"code-block\"\u003e\n  \u003cdiv class=\"code-block-header\"\u003e\n    \u003cspan class=\"code-lang-label\"\u003ebash\u003c/span\u003e\n    \u003cbutton class=\"code-copy-btn\" type=\"button\" aria-label=\"Code kopieren\" data-umami-event=\"Code Copy\" data-umami-event-lang=\"bash\"\u003e\n      \u003csvg 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\"\u003e\u003crect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\"\u003e\u003c/rect\u003e\u003cpath d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\"\u003e\u003c/path\u003e\u003c/svg\u003e\n      \u003csvg 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\"\u003e\u003cpolyline points=\"20 6 9 17 4 12\"\u003e\u003c/polyline\u003e\u003c/svg\u003e\n    \u003c/button\u003e\n  \u003c/div\u003e\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e6edf3;background-color:#0d1117;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#8b949e;font-style:italic\"\u003e# Auf Ubuntu/Debian\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003esudo apt install docker-compose-plugin\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003edocker compose version\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/div\u003e\n\u003cp\u003eErstelle ein Arbeitsverzeichnis:\u003c/p\u003e\n\u003cdiv class=\"code-block\"\u003e\n  \u003cdiv class=\"code-block-header\"\u003e\n    \u003cspan class=\"code-lang-label\"\u003ebash\u003c/span\u003e\n    \u003cbutton class=\"code-copy-btn\" type=\"button\" aria-label=\"Code kopieren\" data-umami-event=\"Code Copy\" data-umami-event-lang=\"bash\"\u003e\n      \u003csvg 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\"\u003e\u003crect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\"\u003e\u003c/rect\u003e\u003cpath d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\"\u003e\u003c/path\u003e\u003c/svg\u003e\n      \u003csvg 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\"\u003e\u003cpolyline points=\"20 6 9 17 4 12\"\u003e\u003c/polyline\u003e\u003c/svg\u003e\n    \u003c/button\u003e\n  \u003c/div\u003e\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e6edf3;background-color:#0d1117;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003emkdir ~/teslamate \u003cspan style=\"color:#ff7b72;font-weight:bold\"\u003e\u0026amp;\u0026amp;\u003c/span\u003e cd ~/teslamate\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/div\u003e\n\u003cp\u003eIch verweise auf die \u003ca href=\"https://docs.teslamate.org/docs/installation/docker\" target=\"_blank\" rel=\"noopener noreferrer\"\u003eoffizielle Dokumentation\u003csvg 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\"\u003e\n  \u003cpath d=\"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6\"/\u003e\n  \u003cpolyline points=\"15 3 21 3 21 9\"/\u003e\n  \u003cline x1=\"10\" y1=\"14\" x2=\"21\" y2=\"3\"/\u003e\n\u003c/svg\u003e\u003cspan class=\"visually-hidden\"\u003e (externer Link)\u003c/span\u003e\u003c/a\u003e\n, da sich die Konfiguration regelmäßig ändert.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eWichtige Anpassungen für 2025:\u003c/strong\u003e\u003c/p\u003e\n\u003cdiv class=\"code-block\"\u003e\n  \u003cdiv class=\"code-block-header\"\u003e\n    \u003cspan class=\"code-lang-label\"\u003eyaml\u003c/span\u003e\n    \u003cbutton class=\"code-copy-btn\" type=\"button\" aria-label=\"Code kopieren\" data-umami-event=\"Code Copy\" data-umami-event-lang=\"yaml\"\u003e\n      \u003csvg 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\"\u003e\u003crect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\"\u003e\u003c/rect\u003e\u003cpath d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\"\u003e\u003c/path\u003e\u003c/svg\u003e\n      \u003csvg 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\"\u003e\u003cpolyline points=\"20 6 9 17 4 12\"\u003e\u003c/polyline\u003e\u003c/svg\u003e\n    \u003c/button\u003e\n  \u003c/div\u003e\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e6edf3;background-color:#0d1117;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-yaml\" data-lang=\"yaml\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#7ee787\"\u003eversion\u003c/span\u003e:\u003cspan style=\"color:#6e7681\"\u003e \u003c/span\u003e\u003cspan style=\"color:#a5d6ff\"\u003e\u0026#34;3\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#6e7681\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#7ee787\"\u003eservices\u003c/span\u003e:\u003cspan style=\"color:#6e7681\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#6e7681\"\u003e  \u003c/span\u003e\u003cspan style=\"color:#7ee787\"\u003eteslamate\u003c/span\u003e:\u003cspan style=\"color:#6e7681\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#6e7681\"\u003e    \u003c/span\u003e\u003cspan style=\"color:#7ee787\"\u003eimage\u003c/span\u003e:\u003cspan style=\"color:#6e7681\"\u003e \u003c/span\u003e\u003cspan style=\"color:#a5d6ff\"\u003eteslamate/teslamate:latest\u003c/span\u003e\u003cspan style=\"color:#6e7681\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#6e7681\"\u003e    \u003c/span\u003e\u003cspan style=\"color:#7ee787\"\u003erestart\u003c/span\u003e:\u003cspan style=\"color:#6e7681\"\u003e \u003c/span\u003e\u003cspan style=\"color:#a5d6ff\"\u003ealways\u003c/span\u003e\u003cspan style=\"color:#6e7681\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#6e7681\"\u003e    \u003c/span\u003e\u003cspan style=\"color:#7ee787\"\u003eenvironment\u003c/span\u003e:\u003cspan style=\"color:#6e7681\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#6e7681\"\u003e      \u003c/span\u003e- \u003cspan style=\"color:#a5d6ff\"\u003eENCRYPTION_KEY=dein_sicherer_schluessel\u003c/span\u003e\u003cspan style=\"color:#6e7681\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#6e7681\"\u003e      \u003c/span\u003e- \u003cspan style=\"color:#a5d6ff\"\u003eDATABASE_USER=teslamate\u003c/span\u003e\u003cspan style=\"color:#6e7681\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#6e7681\"\u003e      \u003c/span\u003e- \u003cspan style=\"color:#a5d6ff\"\u003eDATABASE_PASS=sicheres_passwort\u003c/span\u003e\u003cspan style=\"color:#6e7681\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#6e7681\"\u003e      \u003c/span\u003e- \u003cspan style=\"color:#a5d6ff\"\u003eDATABASE_NAME=teslamate\u003c/span\u003e\u003cspan style=\"color:#6e7681\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#6e7681\"\u003e      \u003c/span\u003e- \u003cspan style=\"color:#a5d6ff\"\u003eDATABASE_HOST=database\u003c/span\u003e\u003cspan style=\"color:#6e7681\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#6e7681\"\u003e      \u003c/span\u003e- \u003cspan style=\"color:#a5d6ff\"\u003eTZ=Europe/Berlin \u003c/span\u003e\u003cspan style=\"color:#6e7681\"\u003e \u003c/span\u003e\u003cspan style=\"color:#8b949e;font-style:italic\"\u003e# Deine Zeitzone!\u003c/span\u003e\u003cspan style=\"color:#6e7681\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#6e7681\"\u003e      \u003c/span\u003e- \u003cspan style=\"color:#a5d6ff\"\u003eMQTT_DISABLE=true \u003c/span\u003e\u003cspan style=\"color:#6e7681\"\u003e \u003c/span\u003e\u003cspan style=\"color:#8b949e;font-style:italic\"\u003e# Falls kein MQTT benötigt\u003c/span\u003e\u003cspan style=\"color:#6e7681\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#6e7681\"\u003e    \u003c/span\u003e\u003cspan style=\"color:#7ee787\"\u003eports\u003c/span\u003e:\u003cspan style=\"color:#6e7681\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#6e7681\"\u003e      \u003c/span\u003e- \u003cspan style=\"color:#a5d6ff\"\u003e4000\u003c/span\u003e:\u003cspan style=\"color:#a5d6ff\"\u003e4000\u003c/span\u003e\u003cspan style=\"color:#6e7681\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#6e7681\"\u003e    \u003c/span\u003e\u003cspan style=\"color:#7ee787\"\u003ecap_drop\u003c/span\u003e:\u003cspan style=\"color:#6e7681\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#6e7681\"\u003e      \u003c/span\u003e- \u003cspan style=\"color:#a5d6ff\"\u003eall\u003c/span\u003e\u003cspan style=\"color:#6e7681\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#6e7681\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#6e7681\"\u003e  \u003c/span\u003e\u003cspan style=\"color:#7ee787\"\u003edatabase\u003c/span\u003e:\u003cspan style=\"color:#6e7681\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#6e7681\"\u003e    \u003c/span\u003e\u003cspan style=\"color:#7ee787\"\u003eimage\u003c/span\u003e:\u003cspan style=\"color:#6e7681\"\u003e \u003c/span\u003e\u003cspan style=\"color:#a5d6ff\"\u003epostgres:17 \u003c/span\u003e\u003cspan style=\"color:#6e7681\"\u003e \u003c/span\u003e\u003cspan style=\"color:#8b949e;font-style:italic\"\u003e# Mindestens 16.7 oder 17.3!\u003c/span\u003e\u003cspan style=\"color:#6e7681\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#6e7681\"\u003e    \u003c/span\u003e\u003cspan style=\"color:#7ee787\"\u003erestart\u003c/span\u003e:\u003cspan style=\"color:#6e7681\"\u003e \u003c/span\u003e\u003cspan style=\"color:#a5d6ff\"\u003ealways\u003c/span\u003e\u003cspan style=\"color:#6e7681\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#6e7681\"\u003e    \u003c/span\u003e\u003cspan style=\"color:#7ee787\"\u003eenvironment\u003c/span\u003e:\u003cspan style=\"color:#6e7681\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#6e7681\"\u003e      \u003c/span\u003e- \u003cspan style=\"color:#a5d6ff\"\u003ePOSTGRES_USER=teslamate\u003c/span\u003e\u003cspan style=\"color:#6e7681\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#6e7681\"\u003e      \u003c/span\u003e- \u003cspan style=\"color:#a5d6ff\"\u003ePOSTGRES_PASSWORD=sicheres_passwort\u003c/span\u003e\u003cspan style=\"color:#6e7681\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#6e7681\"\u003e      \u003c/span\u003e- \u003cspan style=\"color:#a5d6ff\"\u003ePOSTGRES_DB=teslamate\u003c/span\u003e\u003cspan style=\"color:#6e7681\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#6e7681\"\u003e    \u003c/span\u003e\u003cspan style=\"color:#7ee787\"\u003evolumes\u003c/span\u003e:\u003cspan style=\"color:#6e7681\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#6e7681\"\u003e      \u003c/span\u003e- \u003cspan style=\"color:#a5d6ff\"\u003eteslamate-db:/var/lib/postgresql/data\u003c/span\u003e\u003cspan style=\"color:#6e7681\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#6e7681\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#6e7681\"\u003e  \u003c/span\u003e\u003cspan style=\"color:#7ee787\"\u003egrafana\u003c/span\u003e:\u003cspan style=\"color:#6e7681\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#6e7681\"\u003e    \u003c/span\u003e\u003cspan style=\"color:#7ee787\"\u003eimage\u003c/span\u003e:\u003cspan style=\"color:#6e7681\"\u003e \u003c/span\u003e\u003cspan style=\"color:#a5d6ff\"\u003eteslamate/grafana:latest\u003c/span\u003e\u003cspan style=\"color:#6e7681\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#6e7681\"\u003e    \u003c/span\u003e\u003cspan style=\"color:#7ee787\"\u003erestart\u003c/span\u003e:\u003cspan style=\"color:#6e7681\"\u003e \u003c/span\u003e\u003cspan style=\"color:#a5d6ff\"\u003ealways\u003c/span\u003e\u003cspan style=\"color:#6e7681\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#6e7681\"\u003e    \u003c/span\u003e\u003cspan style=\"color:#7ee787\"\u003eenvironment\u003c/span\u003e:\u003cspan style=\"color:#6e7681\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#6e7681\"\u003e      \u003c/span\u003e- \u003cspan style=\"color:#a5d6ff\"\u003eDATABASE_USER=teslamate\u003c/span\u003e\u003cspan style=\"color:#6e7681\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#6e7681\"\u003e      \u003c/span\u003e- \u003cspan style=\"color:#a5d6ff\"\u003eDATABASE_PASS=sicheres_passwort\u003c/span\u003e\u003cspan style=\"color:#6e7681\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#6e7681\"\u003e      \u003c/span\u003e- \u003cspan style=\"color:#a5d6ff\"\u003eDATABASE_NAME=teslamate\u003c/span\u003e\u003cspan style=\"color:#6e7681\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#6e7681\"\u003e      \u003c/span\u003e- \u003cspan style=\"color:#a5d6ff\"\u003eDATABASE_HOST=database\u003c/span\u003e\u003cspan style=\"color:#6e7681\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#6e7681\"\u003e    \u003c/span\u003e\u003cspan style=\"color:#7ee787\"\u003eports\u003c/span\u003e:\u003cspan style=\"color:#6e7681\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#6e7681\"\u003e      \u003c/span\u003e- \u003cspan style=\"color:#a5d6ff\"\u003e3000\u003c/span\u003e:\u003cspan style=\"color:#a5d6ff\"\u003e3000\u003c/span\u003e\u003cspan style=\"color:#6e7681\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#6e7681\"\u003e    \u003c/span\u003e\u003cspan style=\"color:#7ee787\"\u003evolumes\u003c/span\u003e:\u003cspan style=\"color:#6e7681\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#6e7681\"\u003e      \u003c/span\u003e- \u003cspan style=\"color:#a5d6ff\"\u003eteslamate-grafana-data:/var/lib/grafana\u003c/span\u003e\u003cspan style=\"color:#6e7681\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#6e7681\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#7ee787\"\u003evolumes\u003c/span\u003e:\u003cspan style=\"color:#6e7681\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#6e7681\"\u003e  \u003c/span\u003e\u003cspan style=\"color:#7ee787\"\u003eteslamate-db\u003c/span\u003e:\u003cspan style=\"color:#6e7681\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#6e7681\"\u003e  \u003c/span\u003e\u003cspan style=\"color:#a5d6ff\"\u003eteslamate-grafana-data:\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/div\u003e\n\u003cp\u003e\u003cstrong\u003eMQTT für Home Assistant:\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eWenn du die Daten an einen MQTT-Server weiterleiten willst (z. B. für \u003ca href=\"/tesla-ueberschussladen-mit-home-assistant/\"\u003eHome-Assistant\u003c/a\u003e\n), ersetze \u003ccode\u003eMQTT_DISABLE=true\u003c/code\u003e durch \u003ccode\u003eMQTT_HOST=mosquitto\u003c/code\u003e und füge einen Mosquitto-Container hinzu.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eContainer starten:\u003c/strong\u003e\u003c/p\u003e\n\u003cdiv class=\"code-block\"\u003e\n  \u003cdiv class=\"code-block-header\"\u003e\n    \u003cspan class=\"code-lang-label\"\u003ebash\u003c/span\u003e\n    \u003cbutton class=\"code-copy-btn\" type=\"button\" aria-label=\"Code kopieren\" data-umami-event=\"Code Copy\" data-umami-event-lang=\"bash\"\u003e\n      \u003csvg 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\"\u003e\u003crect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\"\u003e\u003c/rect\u003e\u003cpath d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\"\u003e\u003c/path\u003e\u003c/svg\u003e\n      \u003csvg 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\"\u003e\u003cpolyline points=\"20 6 9 17 4 12\"\u003e\u003c/polyline\u003e\u003c/svg\u003e\n    \u003c/button\u003e\n  \u003c/div\u003e\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e6edf3;background-color:#0d1117;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003edocker compose up -d\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/div\u003e\n\u003cp\u003eTeslamate ist anschließend unter \u003ccode\u003ehttp://{IP-deines-Servers}:4000\u003c/code\u003e 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.\u003c/p\u003e\n\u003ch2 id=\"auswertung-mit-grafana\"\u003eAuswertung mit Grafana\u003ca href=\"#auswertung-mit-grafana\" class=\"heading-anchor\" aria-label=\"Diesen Abschnitt verlinken\"\u003e\u003csvg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"\u003e\u003cpath d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\"\u003e\u003c/path\u003e\u003cpath d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eEin großer Vorteil der vordefinierten Docker-Compose-Datei: Grafana ist direkt mit dabei. Grafana läuft standardmäßig unter \u003ccode\u003ehttp://{IP-deines-Servers}:3000\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eStandard-Login (sofort ändern!):\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eBenutzername: \u003ccode\u003eadmin\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003ePasswort: \u003ccode\u003eadmin\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003ca href=\"/docker-monitoring-mit-prometheus-und-grafana/\"\u003eGrafana\u003c/a\u003e\n 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 \u003ca href=\"https://www.github.com/cbirkenbeul\" target=\"_blank\" rel=\"noopener noreferrer\"\u003eGitHub\u003csvg 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\"\u003e\n  \u003cpath d=\"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6\"/\u003e\n  \u003cpolyline points=\"15 3 21 3 21 9\"/\u003e\n  \u003cline x1=\"10\" y1=\"14\" x2=\"21\" y2=\"3\"/\u003e\n\u003c/svg\u003e\u003cspan class=\"visually-hidden\"\u003e (externer Link)\u003c/span\u003e\u003c/a\u003e\n Repository manuell importieren.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eWichtige Dashboards:\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eOverview:\u003c/strong\u003e Gesamtübersicht aller Kennzahlen – der perfekte Einstieg\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eDrives:\u003c/strong\u003e Fahrtenauswertung mit interaktiven Karten, zeigt Route, Geschwindigkeit und Verbrauch\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eCharges:\u003c/strong\u003e Detaillierte Ladehistorie mit Kostenanalyse pro Ladevorgang, Vergleich verschiedener Ladestationen\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eBattery Health:\u003c/strong\u003e Langzeitentwicklung der Batteriekapazität, zeigt Degradation über Zeit und Kilometer\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eEfficiency:\u003c/strong\u003e Verbrauchsanalysen nach Geschwindigkeit, Temperatur, Höhenmetern – erkenne was deine Reichweite beeinflusst\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eVampire Drain:\u003c/strong\u003e Standby-Verbrauch im geparkten Zustand, hilft Phantom Drain zu identifizieren\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eLocations:\u003c/strong\u003e Häufige Aufenthaltsorte, automatische Geofencing-Erkennung\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eUpdates:\u003c/strong\u003e Historie aller Software-Updates mit Zeitstempeln\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"langzeitnutzung-und-erkenntnisse\"\u003eLangzeitnutzung und Erkenntnisse\u003ca href=\"#langzeitnutzung-und-erkenntnisse\" class=\"heading-anchor\" aria-label=\"Diesen Abschnitt verlinken\"\u003e\u003csvg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"\u003e\u003cpath d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\"\u003e\u003c/path\u003e\u003cpath d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eDer wahre Wert zeigt sich nach mehreren Monaten. Hier konkrete Beispiele aus meiner Nutzung:\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eBatteriedegradation:\u003c/strong\u003e 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.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eSaisonale Unterschiede:\u003c/strong\u003e 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.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eKostenoptimierung:\u003c/strong\u003e 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: \u003ca href=\"/tesla-ueberschussladen-mit-home-assistant/\"\u003ePV-Überschussladen\u003c/a\u003e\n reduziert die Kosten auf ca. 0,08 €/kWh.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eEffizienz:\u003c/strong\u003e Ü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.\u003c/p\u003e\n\u003ch2 id=\"troubleshooting\"\u003eTroubleshooting\u003ca href=\"#troubleshooting\" class=\"heading-anchor\" aria-label=\"Diesen Abschnitt verlinken\"\u003e\u003csvg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"\u003e\u003cpath d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\"\u003e\u003c/path\u003e\u003cpath d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003eTeslamate zeigt \u0026ldquo;offline\u0026rdquo; statt \u0026ldquo;asleep\u0026rdquo;:\u003c/strong\u003e\nDas ist seit Tesla-Firmware 2024.8+ normal. Tesla hat die API-Rückmeldung geändert – kein Teslamate-Bug.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eToken wird nicht akzeptiert:\u003c/strong\u003e\nVerwende den Refresh Token (der längere der beiden Strings), nicht den Access Token.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eKeine Daten:\u003c/strong\u003e\nPrüfe die Docker-Logs mit \u003ccode\u003edocker compose logs teslamate\u003c/code\u003e. Häufige Ursachen: Fahrzeug im Tiefschlaf, falsche Zeitzone, Netzwerkprobleme.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eHohe API-Kosten:\u003c/strong\u003e\nReduziere die Polling-Frequenz, nutze Fleet Telemetry oder prüfe auf unnötige Wake-Befehle.\u003c/p\u003e\n\u003ch2 id=\"sicherheit-und-backup\"\u003eSicherheit und Backup\u003ca href=\"#sicherheit-und-backup\" class=\"heading-anchor\" aria-label=\"Diesen Abschnitt verlinken\"\u003e\u003csvg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"\u003e\u003cpath d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\"\u003e\u003c/path\u003e\u003cpath d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003eNetzwerk:\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eNicht direkt ins Internet exponieren\u003c/li\u003e\n\u003cli\u003eReverse Proxy mit HTTPS nutzen (Nginx, Caddy, Traefik)\u003c/li\u003e\n\u003cli\u003eFirewall-Regeln aktivieren\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eBackup:\u003c/strong\u003e\u003c/p\u003e\n\u003cdiv class=\"code-block\"\u003e\n  \u003cdiv class=\"code-block-header\"\u003e\n    \u003cspan class=\"code-lang-label\"\u003ebash\u003c/span\u003e\n    \u003cbutton class=\"code-copy-btn\" type=\"button\" aria-label=\"Code kopieren\" data-umami-event=\"Code Copy\" data-umami-event-lang=\"bash\"\u003e\n      \u003csvg 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\"\u003e\u003crect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\"\u003e\u003c/rect\u003e\u003cpath d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\"\u003e\u003c/path\u003e\u003c/svg\u003e\n      \u003csvg 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\"\u003e\u003cpolyline points=\"20 6 9 17 4 12\"\u003e\u003c/polyline\u003e\u003c/svg\u003e\n    \u003c/button\u003e\n  \u003c/div\u003e\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e6edf3;background-color:#0d1117;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003edocker compose exec database pg_dump -U teslamate teslamate \u0026gt; backup.sql\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/div\u003e\n\u003cp\u003e\u003cstrong\u003eUpdates:\u003c/strong\u003e\u003c/p\u003e\n\u003cdiv class=\"code-block\"\u003e\n  \u003cdiv class=\"code-block-header\"\u003e\n    \u003cspan class=\"code-lang-label\"\u003ebash\u003c/span\u003e\n    \u003cbutton class=\"code-copy-btn\" type=\"button\" aria-label=\"Code kopieren\" data-umami-event=\"Code Copy\" data-umami-event-lang=\"bash\"\u003e\n      \u003csvg 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\"\u003e\u003crect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\"\u003e\u003c/rect\u003e\u003cpath d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\"\u003e\u003c/path\u003e\u003c/svg\u003e\n      \u003csvg 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\"\u003e\u003cpolyline points=\"20 6 9 17 4 12\"\u003e\u003c/polyline\u003e\u003c/svg\u003e\n    \u003c/button\u003e\n  \u003c/div\u003e\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e6edf3;background-color:#0d1117;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003edocker compose pull\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003edocker compose up -d\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/div\u003e\n\u003ch2 id=\"häufige-fragen\"\u003eHäufige Fragen\u003ca href=\"#h%c3%a4ufige-fragen\" class=\"heading-anchor\" aria-label=\"Diesen Abschnitt verlinken\"\u003e\u003csvg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"\u003e\u003cpath d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\"\u003e\u003c/path\u003e\u003cpath d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003eKostet Teslamate Geld?\u003c/strong\u003e\nDie 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.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eFunktioniert es mit der neuen Fleet API?\u003c/strong\u003e\nJa, vollständig kompatibel und aktuell gehalten.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eEntlädt es die Batterie?\u003c/strong\u003e\nNein, der Zusatzverbrauch ist vernachlässigbar.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eMehrere Fahrzeuge möglich?\u003c/strong\u003e\nJa, jedes wird separat erfasst.\u003c/p\u003e\n\u003ch2 id=\"fazit\"\u003eFazit\u003ca href=\"#fazit\" class=\"heading-anchor\" aria-label=\"Diesen Abschnitt verlinken\"\u003e\u003csvg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"\u003e\u003cpath d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\"\u003e\u003c/path\u003e\u003cpath d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eTeslamate ist für mich die beste Lösung für umfassende Fahrzeugdatenanalyse. Die Vorteile:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eVolle Datenkontrolle durch Self-Hosting\u003c/li\u003e\n\u003cli\u003eDetaillierte Analysen mit Grafana\u003c/li\u003e\n\u003cli\u003eGeringe Kosten dank Freikontingent\u003c/li\u003e\n\u003cli\u003eAktive Community\u003c/li\u003e\n\u003cli\u003ePerfekt für Home-Assistant-Integration\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eDie Nachteile: Technisches Know-how erforderlich, eigener Server nötig, kein offizieller Support.\u003c/p\u003e\n\u003cp\u003eFü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.\u003c/p\u003e\n\u003ch2 id=\"tipps-für-fortgeschrittene\"\u003eTipps für Fortgeschrittene\u003ca href=\"#tipps-f%c3%bcr-fortgeschrittene\" class=\"heading-anchor\" aria-label=\"Diesen Abschnitt verlinken\"\u003e\u003csvg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"\u003e\u003cpath d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\"\u003e\u003c/path\u003e\u003cpath d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003eReverse Proxy Setup:\u003c/strong\u003e\nFür sicheren Zugriff von unterwegs empfehle ich einen Reverse Proxy mit Let\u0026rsquo;s Encrypt SSL-Zertifikat. Traefik oder Caddy automatisieren den Prozess komplett.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eDatenbank-Optimierung:\u003c/strong\u003e\nBei sehr alten Installationen kann ein manuelles Vacuum der Datenbank helfen:\u003c/p\u003e\n\u003cdiv class=\"code-block\"\u003e\n  \u003cdiv class=\"code-block-header\"\u003e\n    \u003cspan class=\"code-lang-label\"\u003ebash\u003c/span\u003e\n    \u003cbutton class=\"code-copy-btn\" type=\"button\" aria-label=\"Code kopieren\" data-umami-event=\"Code Copy\" data-umami-event-lang=\"bash\"\u003e\n      \u003csvg 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\"\u003e\u003crect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\"\u003e\u003c/rect\u003e\u003cpath d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\"\u003e\u003c/path\u003e\u003c/svg\u003e\n      \u003csvg 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\"\u003e\u003cpolyline points=\"20 6 9 17 4 12\"\u003e\u003c/polyline\u003e\u003c/svg\u003e\n    \u003c/button\u003e\n  \u003c/div\u003e\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e6edf3;background-color:#0d1117;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003edocker compose exec database vacuumdb -U teslamate -d teslamate -z -v\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/div\u003e\n\u003cp\u003e\u003cstrong\u003eCustom Dashboards:\u003c/strong\u003e\nGrafana bietet unendliche Möglichkeiten. Du kannst beispielsweise Vergleiche mit anderen Tesla-Fahrern erstellen oder Korrelationen zwischen Wetter und Verbrauch visualisieren.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eWeiterführende Links:\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://docs.teslamate.org\" target=\"_blank\" rel=\"noopener noreferrer\"\u003eTeslamate Dokumentation\u003csvg 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\"\u003e\n  \u003cpath d=\"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6\"/\u003e\n  \u003cpolyline points=\"15 3 21 3 21 9\"/\u003e\n  \u003cline x1=\"10\" y1=\"14\" x2=\"21\" y2=\"3\"/\u003e\n\u003c/svg\u003e\u003cspan class=\"visually-hidden\"\u003e (externer Link)\u003c/span\u003e\u003c/a\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/teslamate-org/teslamate\" target=\"_blank\" rel=\"noopener noreferrer\"\u003eGitHub Repository\u003csvg 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\"\u003e\n  \u003cpath d=\"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6\"/\u003e\n  \u003cpolyline points=\"15 3 21 3 21 9\"/\u003e\n  \u003cline x1=\"10\" y1=\"14\" x2=\"21\" y2=\"3\"/\u003e\n\u003c/svg\u003e\u003cspan class=\"visually-hidden\"\u003e (externer Link)\u003c/span\u003e\u003c/a\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/teslamate-org/teslamate/discussions\" target=\"_blank\" rel=\"noopener noreferrer\"\u003eCommunity Forum\u003csvg 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\"\u003e\n  \u003cpath d=\"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6\"/\u003e\n  \u003cpolyline points=\"15 3 21 3 21 9\"/\u003e\n  \u003cline x1=\"10\" y1=\"14\" x2=\"21\" y2=\"3\"/\u003e\n\u003c/svg\u003e\u003cspan class=\"visually-hidden\"\u003e (externer Link)\u003c/span\u003e\u003c/a\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n","date_published":"2023-03-27T20:19:57+02:00","date_modified":"2023-03-27T20:19:57+02:00","tags":["tesla","docker","grafana","homelab"]},{"id":"https://www.teqqy.de/proxmox-strom-sparen-4-tipps-von-mir/","url":"https://www.teqqy.de/proxmox-strom-sparen-4-tipps-von-mir/","title":"Proxmox: Stromverbrauch senken mit 4 praxisbewährten Tipps","summary":"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.\n","content_html":"\u003cp\u003eIn 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.\u003c/p\u003e\n\u003cp\u003eIn 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!\u003c/p\u003e\n\u003ch2 id=\"vorab-stromverbrauch-messen\"\u003eVorab: Stromverbrauch messen\u003ca href=\"#vorab-stromverbrauch-messen\" class=\"heading-anchor\" aria-label=\"Diesen Abschnitt verlinken\"\u003e\u003csvg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"\u003e\u003cpath d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\"\u003e\u003c/path\u003e\u003cpath d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eUm ü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 \u003ca href=\"https://amzn.to/3mQVYy9\" target=\"_blank\" rel=\"noopener noreferrer\"\u003egünstiges Strommessgerät\u003csvg 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\"\u003e\n  \u003cpath d=\"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6\"/\u003e\n  \u003cpolyline points=\"15 3 21 3 21 9\"/\u003e\n  \u003cline x1=\"10\" y1=\"14\" x2=\"21\" y2=\"3\"/\u003e\n\u003c/svg\u003e\u003cspan class=\"visually-hidden\"\u003e (externer Link)\u003c/span\u003e\u003c/a\u003e\n 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.\u003c/p\u003e\n\u003ch2 id=\"auf-die-richtige-hardware-achten\"\u003eAuf die richtige Hardware achten\u003ca href=\"#auf-die-richtige-hardware-achten\" class=\"heading-anchor\" aria-label=\"Diesen Abschnitt verlinken\"\u003e\u003csvg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"\u003e\u003cpath d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\"\u003e\u003c/path\u003e\u003cpath d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eNatü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.\u003c/p\u003e\n\u003cp\u003eZudem kann man auch mit den richtigen Komponenten im Selbstbau einen guten Server zusammen stellen. Im \u003ca href=\"https://www.hardwareluxx.de/community/threads/die-sparsamsten-systeme-30w-idle.1007101/page-86#post-29774572\" target=\"_blank\" rel=\"noopener noreferrer\"\u003eHardwareluxx Forum\u003csvg 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\"\u003e\n  \u003cpath d=\"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6\"/\u003e\n  \u003cpolyline points=\"15 3 21 3 21 9\"/\u003e\n  \u003cline x1=\"10\" y1=\"14\" x2=\"21\" y2=\"3\"/\u003e\n\u003c/svg\u003e\u003cspan class=\"visually-hidden\"\u003e (externer Link)\u003c/span\u003e\u003c/a\u003e\n gibt es eine verlinkte Google Sheets Datei die Systeme unter 30 Watt idle Verbrauch auflistet.\u003c/p\u003e\n\u003cp\u003eWichtig 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 \u0026ldquo;T\u0026rdquo; 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\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eGrafikkarten\u003c/li\u003e\n\u003cli\u003eRAID Controller / HBAs\u003c/li\u003e\n\u003cli\u003eNetzwerkkarten mit mehr als 10 GBit Geschwindigkeit\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eWeiter 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.\u003c/p\u003e\n\u003ch2 id=\"bios-einstellungen-richtig-setzen\"\u003eBIOS Einstellungen richtig setzen\u003ca href=\"#bios-einstellungen-richtig-setzen\" class=\"heading-anchor\" aria-label=\"Diesen Abschnitt verlinken\"\u003e\u003csvg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"\u003e\u003cpath d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\"\u003e\u003c/path\u003e\u003cpath d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/h2\u003e\n\u003ch3 id=\"unnötige-hardware-deaktivieren\"\u003eUnnötige Hardware deaktivieren\u003ca href=\"#unn%c3%b6tige-hardware-deaktivieren\" class=\"heading-anchor\" aria-label=\"Diesen Abschnitt verlinken\"\u003e\u003csvg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"\u003e\u003cpath d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\"\u003e\u003c/path\u003e\u003cpath d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eDie 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.\u003c/p\u003e\n\u003ch3 id=\"aspm-aktivieren\"\u003eASPM aktivieren\u003ca href=\"#aspm-aktivieren\" class=\"heading-anchor\" aria-label=\"Diesen Abschnitt verlinken\"\u003e\u003csvg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"\u003e\u003cpath d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\"\u003e\u003c/path\u003e\u003cpath d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eASPM 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.\u003c/p\u003e\n\u003ch3 id=\"cpu-stromsparfunktionen-aktivieren\"\u003eCPU Stromsparfunktionen aktivieren\u003ca href=\"#cpu-stromsparfunktionen-aktivieren\" class=\"heading-anchor\" aria-label=\"Diesen Abschnitt verlinken\"\u003e\u003csvg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"\u003e\u003cpath d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\"\u003e\u003c/path\u003e\u003cpath d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eAktiviere 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.\u003c/p\u003e\n\u003ch2 id=\"c-states\"\u003eC-States\u003ca href=\"#c-states\" class=\"heading-anchor\" aria-label=\"Diesen Abschnitt verlinken\"\u003e\u003csvg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"\u003e\u003cpath d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\"\u003e\u003c/path\u003e\u003cpath d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/h2\u003e\n\u003ch3 id=\"was-sind-c-states\"\u003eWas sind C-States\u003ca href=\"#was-sind-c-states\" class=\"heading-anchor\" aria-label=\"Diesen Abschnitt verlinken\"\u003e\u003csvg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"\u003e\u003cpath d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\"\u003e\u003c/path\u003e\u003cpath d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eC-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.\u003c/p\u003e\n\u003cp\u003eEs gibt verschiedene C-States, von C0 bis Cn (wobei n je nach Prozessor variiert). Hier sind einige der häufigsten:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eC0: Dies ist der Zustand, in dem die CPU aktiv ist und Aufgaben ausführt.\u003c/li\u003e\n\u003cli\u003eC1: 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.\u003c/li\u003e\n\u003cli\u003eC3: 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.\u003c/li\u003e\n\u003cli\u003eC6: 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.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eDer Wechsel zwischen diesen Zuständen wird automatisch vom Betriebssystem und der Hardware gesteuert, basierend auf der aktuellen CPU-Last und den Energieeinstellungen des Systems.\u003c/p\u003e\n\u003cp\u003eAnstreben 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.\u003c/p\u003e\n\u003ch3 id=\"mit-powertop-die-c-states-überprüfen\"\u003eMit powertop die C-States überprüfen\u003ca href=\"#mit-powertop-die-c-states-%c3%bcberpr%c3%bcfen\" class=\"heading-anchor\" aria-label=\"Diesen Abschnitt verlinken\"\u003e\u003csvg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"\u003e\u003cpath d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\"\u003e\u003c/path\u003e\u003cpath d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003e„powertop“ ist ein großartiges \u003ca href=\"/linux-am-desktop-ein-kurzes-experiment/\"\u003eLinux\u003c/a\u003e\n 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.\u003c/p\u003e\n\u003cp\u003e\u003cimg 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\"\u003e\u003c/p\u003e\n\u003cp\u003eHäufig sind es PCI-Express Gerät die weitere C-States nicht erlauben. Mit dem Befehl\u003c/p\u003e\n\u003cdiv class=\"code-block\"\u003e\n  \u003cdiv class=\"code-block-header\"\u003e\n    \u003cspan class=\"code-lang-label\"\u003e\u003c/span\u003e\n    \u003cbutton class=\"code-copy-btn\" type=\"button\" aria-label=\"Code kopieren\" data-umami-event=\"Code Copy\" data-umami-event-lang=\"\"\u003e\n      \u003csvg 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\"\u003e\u003crect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\"\u003e\u003c/rect\u003e\u003cpath d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\"\u003e\u003c/path\u003e\u003c/svg\u003e\n      \u003csvg 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\"\u003e\u003cpolyline points=\"20 6 9 17 4 12\"\u003e\u003c/polyline\u003e\u003c/svg\u003e\n    \u003c/button\u003e\n  \u003c/div\u003e\u003cpre tabindex=\"0\"\u003e\u003ccode\u003elspci -vv | awk \u0026#39;/ASPM/{print $0}\u0026#39; RS= | grep --color -P \u0026#39;(^[a-z0-9:.]+|ASPM )\u0026#39;\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cp\u003ekannst 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.\u003c/p\u003e\n\u003cp\u003e\u003cimg 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\"\u003e\u003c/p\u003e\n\u003ch2 id=\"cpu-runter-takten-lassen-um-proxmox-strom-sparen-zu-lassen\"\u003eCPU runter Takten lassen um Proxmox Strom sparen zu lassen\u003ca href=\"#cpu-runter-takten-lassen-um-proxmox-strom-sparen-zu-lassen\" class=\"heading-anchor\" aria-label=\"Diesen Abschnitt verlinken\"\u003e\u003csvg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"\u003e\u003cpath d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\"\u003e\u003c/path\u003e\u003cpath d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003e\u003ca href=\"/proxmox-cluster-im-homelab-mit-thinclients/\"\u003eProxmox\u003c/a\u003e\n 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.\u003c/p\u003e\n\u003cp\u003eUm zu überprüfen auf welchen Modus die CPU steht, kannst du folgenden Befehl nutzen:\u003c/p\u003e\n\u003cdiv class=\"code-block\"\u003e\n  \u003cdiv class=\"code-block-header\"\u003e\n    \u003cspan class=\"code-lang-label\"\u003e\u003c/span\u003e\n    \u003cbutton class=\"code-copy-btn\" type=\"button\" aria-label=\"Code kopieren\" data-umami-event=\"Code Copy\" data-umami-event-lang=\"\"\u003e\n      \u003csvg 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\"\u003e\u003crect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\"\u003e\u003c/rect\u003e\u003cpath d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\"\u003e\u003c/path\u003e\u003c/svg\u003e\n      \u003csvg 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\"\u003e\u003cpolyline points=\"20 6 9 17 4 12\"\u003e\u003c/polyline\u003e\u003c/svg\u003e\n    \u003c/button\u003e\n  \u003c/div\u003e\u003cpre tabindex=\"0\"\u003e\u003ccode\u003ecat /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cp\u003eHier bekommst du für jeden CPU-Kern eine Zeile zurück geliefert. Im Standard steht hier überall „performance“. Wenn du jetzt\u003c/p\u003e\n\u003cdiv class=\"code-block\"\u003e\n  \u003cdiv class=\"code-block-header\"\u003e\n    \u003cspan class=\"code-lang-label\"\u003e\u003c/span\u003e\n    \u003cbutton class=\"code-copy-btn\" type=\"button\" aria-label=\"Code kopieren\" data-umami-event=\"Code Copy\" data-umami-event-lang=\"\"\u003e\n      \u003csvg 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\"\u003e\u003crect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\"\u003e\u003c/rect\u003e\u003cpath d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\"\u003e\u003c/path\u003e\u003c/svg\u003e\n      \u003csvg 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\"\u003e\u003cpolyline points=\"20 6 9 17 4 12\"\u003e\u003c/polyline\u003e\u003c/svg\u003e\n    \u003c/button\u003e\n  \u003c/div\u003e\u003cpre tabindex=\"0\"\u003e\u003ccode\u003ecat /sys/devices/system/cpu/cpu*/cpufreq/scaling_cur_freq\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cp\u003everwendet, 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\u003c/p\u003e\n\u003cdiv class=\"code-block\"\u003e\n  \u003cdiv class=\"code-block-header\"\u003e\n    \u003cspan class=\"code-lang-label\"\u003e\u003c/span\u003e\n    \u003cbutton class=\"code-copy-btn\" type=\"button\" aria-label=\"Code kopieren\" data-umami-event=\"Code Copy\" data-umami-event-lang=\"\"\u003e\n      \u003csvg 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\"\u003e\u003crect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\"\u003e\u003c/rect\u003e\u003cpath d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\"\u003e\u003c/path\u003e\u003c/svg\u003e\n      \u003csvg 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\"\u003e\u003cpolyline points=\"20 6 9 17 4 12\"\u003e\u003c/polyline\u003e\u003c/svg\u003e\n    \u003c/button\u003e\n  \u003c/div\u003e\u003cpre tabindex=\"0\"\u003e\u003ccode\u003eecho \u0026#34;powersave\u0026#34; | tee /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cp\u003edurchfü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.\u003c/p\u003e\n\u003cp\u003eDazu gehst du mit\u003c/p\u003e\n\u003cdiv class=\"code-block\"\u003e\n  \u003cdiv class=\"code-block-header\"\u003e\n    \u003cspan class=\"code-lang-label\"\u003e\u003c/span\u003e\n    \u003cbutton class=\"code-copy-btn\" type=\"button\" aria-label=\"Code kopieren\" data-umami-event=\"Code Copy\" data-umami-event-lang=\"\"\u003e\n      \u003csvg 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\"\u003e\u003crect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\"\u003e\u003c/rect\u003e\u003cpath d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\"\u003e\u003c/path\u003e\u003c/svg\u003e\n      \u003csvg 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\"\u003e\u003cpolyline points=\"20 6 9 17 4 12\"\u003e\u003c/polyline\u003e\u003c/svg\u003e\n    \u003c/button\u003e\n  \u003c/div\u003e\u003cpre tabindex=\"0\"\u003e\u003ccode\u003ecrontab -e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cp\u003ein die Crontab Datei. Ggf. wirst du gefragt mit welchem Editor du diese öffnen möchtest. Ich empfehle dir hier „nano“.\u003c/p\u003e\n\u003cp\u003eAnschließend trägst du ganz unten folgendes ein\u003c/p\u003e\n\u003cdiv class=\"code-block\"\u003e\n  \u003cdiv class=\"code-block-header\"\u003e\n    \u003cspan class=\"code-lang-label\"\u003e\u003c/span\u003e\n    \u003cbutton class=\"code-copy-btn\" type=\"button\" aria-label=\"Code kopieren\" data-umami-event=\"Code Copy\" data-umami-event-lang=\"\"\u003e\n      \u003csvg 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\"\u003e\u003crect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\"\u003e\u003c/rect\u003e\u003cpath d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\"\u003e\u003c/path\u003e\u003c/svg\u003e\n      \u003csvg 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\"\u003e\u003cpolyline points=\"20 6 9 17 4 12\"\u003e\u003c/polyline\u003e\u003c/svg\u003e\n    \u003c/button\u003e\n  \u003c/div\u003e\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e@reboot echo \u0026#34;powersave\u0026#34; | tee /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cp\u003eDie Datei kannst du dann mit STRG+X beenden. Bei Nachfrage ob du speichern möchtest, solltest du das natürlich bestätigen.\u003c/p\u003e\n\u003cp\u003eAnschließend kannst du mit den oben genannten Befehlen deine Eingaben überprüfen. Bei mir sieht das zur Zeit so aus:\u003c/p\u003e\n\u003cp\u003e\u003cimg 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\"\u003e\nMeine derzeitigen Einstellungen des CPU govenor und scaling\n{:.figcaption}\u003c/p\u003e\n\u003ch2 id=\"zusatztipp\"\u003eZusatztipp\u003ca href=\"#zusatztipp\" class=\"heading-anchor\" aria-label=\"Diesen Abschnitt verlinken\"\u003e\u003csvg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"\u003e\u003cpath d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\"\u003e\u003c/path\u003e\u003cpath d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eVersuche 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.\u003c/p\u003e\n\u003ch2 id=\"fazit\"\u003eFazit\u003ca href=\"#fazit\" class=\"heading-anchor\" aria-label=\"Diesen Abschnitt verlinken\"\u003e\u003csvg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"\u003e\u003cpath d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\"\u003e\u003c/path\u003e\u003cpath d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eIch 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.\u003c/p\u003e\n\u003cp\u003eDie 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.\u003c/p\u003e\n","date_published":"2023-03-14T21:17:37+01:00","date_modified":"2023-03-14T21:17:37+01:00","tags":["proxmox","hardware","homelab"]},{"id":"https://www.teqqy.de/proxmox-cluster-im-homelab-mit-thinclients/","url":"https://www.teqqy.de/proxmox-cluster-im-homelab-mit-thinclients/","title":"Proxmox Cluster im Homelab mit Thinclients","summary":"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.\n","content_html":"\u003cp\u003eWer meinen Blog verfolgt weiß, dass ich seit einiger Zeit einen \u003ca href=\"/status-meines-k3s-homelab-stand-10-2021/\"\u003eKubernetes Cluster\u003c/a\u003e\n verwendet habe. Dieser hat meine ganzen Anwendungen die man so im Homelab braucht gehostet. Nun bin ich auf ein \u003ca href=\"https://proxmox.com\" target=\"_blank\" rel=\"noopener noreferrer\"\u003eProxmox\u003csvg 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\"\u003e\n  \u003cpath d=\"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6\"/\u003e\n  \u003cpolyline points=\"15 3 21 3 21 9\"/\u003e\n  \u003cline x1=\"10\" y1=\"14\" x2=\"21\" y2=\"3\"/\u003e\n\u003c/svg\u003e\u003cspan class=\"visually-hidden\"\u003e (externer Link)\u003c/span\u003e\u003c/a\u003e\n Cluster im Homelab mit Thinclients als Hardware umgestiegen.\u003c/p\u003e\n\u003cp\u003eZum 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.\u003c/p\u003e\n\u003cdiv class=\"video-embed\" data-src=\"https://www.youtube-nocookie.com/embed/AqLqKMTtbWA?autoplay=1\u0026rel=0\"\u003e\n  \u003cbutton class=\"video-embed-trigger\" type=\"button\" data-umami-event=\"Video Load\" data-umami-event-provider=\"YouTube\" data-umami-event-id=\"AqLqKMTtbWA\"\u003e\n    \u003csvg 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\"\u003e\u003ccircle cx=\"12\" cy=\"12\" r=\"12\" fill=\"rgba(0,0,0,0.6)\"/\u003e\u003cpath d=\"M9.5 7.5l7 4.5-7 4.5V7.5z\" fill=\"white\"/\u003e\u003c/svg\u003e\n    \u003cspan class=\"video-embed-title\"\u003eYouTube Video\u003c/span\u003e\n    \u003cspan class=\"video-embed-note\"\u003eYouTube \u0026middot; Klicken zum Laden\u003c/span\u003e\n  \u003c/button\u003e\n\u003c/div\u003e\n\n\u003ch2 id=\"grundsätzlicher-aufbau-des-proxmox-clusters-im-homelab\"\u003eGrundsätzlicher Aufbau des Proxmox Clusters im Homelab\u003ca href=\"#grunds%c3%a4tzlicher-aufbau-des-proxmox-clusters-im-homelab\" class=\"heading-anchor\" aria-label=\"Diesen Abschnitt verlinken\"\u003e\u003csvg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"\u003e\u003cpath d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\"\u003e\u003c/path\u003e\u003cpath d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eMittlerweile nutze ich einen \u003ca href=\"/proxmox-backup-server/\"\u003eProxmox\u003c/a\u003e\n Cluster über drei physische Nodes. Die Hardware ist zwar leicht unterschiedlich, aber als Gesamtcluster stehen mir damit genug Ressourcen zur Verfügung.\u003c/p\u003e\n\u003cp\u003e\u003cimg 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\"\u003e\nDas Widget für Storage täuscht leider bei Proxmox immer gewaltig. Daruch, dass NFS-Freigaben eingebunden sind, werden diese mitgezählt.\u003c/p\u003e\n\u003cp\u003eAls 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 \u003ca href=\"/mein-homelab-dashboard-2022/\"\u003eUnRaid\u003c/a\u003e\n Server aus bereit gestellt.\u003c/p\u003e\n\u003cp\u003e\u003cimg 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\"\u003e\nEin weiteres System dient als \u003ca href=\"/proxmox-backup-server/\"\u003eProxmox Backup Server\u003c/a\u003e\n und soll sich hier nur um entsprechend dieses kümmern.\u003c/p\u003e\n\u003ch2 id=\"welche-hardware-verwende-ich\"\u003eWelche Hardware verwende ich?\u003ca href=\"#welche-hardware-verwende-ich\" class=\"heading-anchor\" aria-label=\"Diesen Abschnitt verlinken\"\u003e\u003csvg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"\u003e\u003cpath d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\"\u003e\u003c/path\u003e\u003cpath d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eFassen wir erst mal die Hardware des neuen Cluster zusammen, damit du schon mal eine Vorstellung des ganzen hast:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e2 x Lenovo M900 mit Core i3-6100t, 24 GB RAM\u003c/li\u003e\n\u003cli\u003e2 x Lenovo M910 mit Core i5-6500t, 24 GB RAM\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eAlle vier Systeme sind mit einer 120 GB SATA SSD ausgestattet. Ein i3 sowie beide i5 Systeme haben zusätzlich eine \u003ca href=\"https://amzn.to/3i35I6o\" target=\"_blank\" rel=\"noopener noreferrer\"\u003e500 GB NVMe SSD\u003csvg 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\"\u003e\n  \u003cpath d=\"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6\"/\u003e\n  \u003cpolyline points=\"15 3 21 3 21 9\"/\u003e\n  \u003cline x1=\"10\" y1=\"14\" x2=\"21\" y2=\"3\"/\u003e\n\u003c/svg\u003e\u003cspan class=\"visually-hidden\"\u003e (externer Link)\u003c/span\u003e\u003c/a\u003e\n eingebaut.\u003c/p\u003e\n\u003ch2 id=\"die-verwendeten-netzwerkkomponenten\"\u003eDie verwendeten Netzwerkkomponenten\u003ca href=\"#die-verwendeten-netzwerkkomponenten\" class=\"heading-anchor\" aria-label=\"Diesen Abschnitt verlinken\"\u003e\u003csvg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"\u003e\u003cpath d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\"\u003e\u003c/path\u003e\u003cpath d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/h2\u003e\n\u003ch3 id=\"netzwerkkarten\"\u003eNetzwerkkarten\u003ca href=\"#netzwerkkarten\" class=\"heading-anchor\" aria-label=\"Diesen Abschnitt verlinken\"\u003e\u003csvg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"\u003e\u003cpath d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\"\u003e\u003c/path\u003e\u003cpath d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eIch verwende die eingebaute Netzwerkschnittstelle für das normale Management und VM-Netzwerk. Hierauf liegt, wie bei Proxmox üblich, eine Linux Bridge.\u003c/p\u003e\n\u003cp\u003eZusätzlich habe ich mir insgesamt sechs \u003ca href=\"https://amzn.to/3WYekdr\" target=\"_blank\" rel=\"noopener noreferrer\"\u003eUSB-Netzwerkkarten\u003csvg 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\"\u003e\n  \u003cpath d=\"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6\"/\u003e\n  \u003cpolyline points=\"15 3 21 3 21 9\"/\u003e\n  \u003cline x1=\"10\" y1=\"14\" x2=\"21\" y2=\"3\"/\u003e\n\u003c/svg\u003e\u003cspan class=\"visually-hidden\"\u003e (externer Link)\u003c/span\u003e\u003c/a\u003e\n gekauft die mir in meiner \u003ca href=\"https://s.teqqy.de/discord\" target=\"_blank\" rel=\"noopener noreferrer\"\u003eDiscord Community\u003csvg 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\"\u003e\n  \u003cpath d=\"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6\"/\u003e\n  \u003cpolyline points=\"15 3 21 3 21 9\"/\u003e\n  \u003cline x1=\"10\" y1=\"14\" x2=\"21\" y2=\"3\"/\u003e\n\u003c/svg\u003e\u003cspan class=\"visually-hidden\"\u003e (externer Link)\u003c/span\u003e\u003c/a\u003e\n empfohlen wurden. Jeweils zwei USB-Karten pro System, eine für das Cluster-Netzwerk und eine für Ceph.\u003c/p\u003e\n\u003cp\u003e\u003cimg 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\"\u003e\u003c/p\u003e\n\u003ch3 id=\"switch-und-vlans\"\u003eSwitch und VLANs\u003ca href=\"#switch-und-vlans\" class=\"heading-anchor\" aria-label=\"Diesen Abschnitt verlinken\"\u003e\u003csvg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"\u003e\u003cpath d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\"\u003e\u003c/path\u003e\u003cpath d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eAlle drei Netzwerkports hängen an einem \u003ca href=\"https://www.amazon.de/shop/teqqyde/list/3M2TIB7XEB7CS?ref_=aip_sf_list_spv_ons_mixed_d\" target=\"_blank\" rel=\"noopener noreferrer\"\u003eUniFi\u003csvg 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\"\u003e\n  \u003cpath d=\"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6\"/\u003e\n  \u003cpolyline points=\"15 3 21 3 21 9\"/\u003e\n  \u003cline x1=\"10\" y1=\"14\" x2=\"21\" y2=\"3\"/\u003e\n\u003c/svg\u003e\u003cspan class=\"visually-hidden\"\u003e (externer Link)\u003c/span\u003e\u003c/a\u003e\n 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.\u003c/p\u003e\n\u003cp\u003e\u003cimg 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\"\u003e\u003c/p\u003e\n\u003ch2 id=\"backup-mittels-proxmox-backup-server\"\u003eBackup mittels Proxmox Backup Server\u003ca href=\"#backup-mittels-proxmox-backup-server\" class=\"heading-anchor\" aria-label=\"Diesen Abschnitt verlinken\"\u003e\u003csvg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"\u003e\u003cpath d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\"\u003e\u003c/path\u003e\u003cpath d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eWie oben bereits erwähnt verwende ich den \u003ca href=\"https://www.proxmox.com/de/proxmox-backup-server\" target=\"_blank\" rel=\"noopener noreferrer\"\u003eProxmox Backup Server\u003csvg 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\"\u003e\n  \u003cpath d=\"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6\"/\u003e\n  \u003cpolyline points=\"15 3 21 3 21 9\"/\u003e\n  \u003cline x1=\"10\" y1=\"14\" x2=\"21\" y2=\"3\"/\u003e\n\u003c/svg\u003e\u003cspan class=\"visually-hidden\"\u003e (externer Link)\u003c/span\u003e\u003c/a\u003e\n 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.\u003c/p\u003e\n\u003cp\u003e\u003cimg 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\"\u003e\nAls retention policy verwende ich im privaten Bereich eigentlich fast immer\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e7 tägliche Sicherungen\u003c/li\u003e\n\u003cli\u003e4 wöchentliche Sicherungen\u003c/li\u003e\n\u003cli\u003e12 monatliche Sicherungen\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eAuf Sicherungen stündlich oder jährlich verzichte ich meist. Lediglich bei ZFS-Snapshots habe ich in der Vergangenheit auf stündliche „Sicherungen“ gesetzt.\u003c/p\u003e\n\u003ch2 id=\"fazit\"\u003eFazit\u003ca href=\"#fazit\" class=\"heading-anchor\" aria-label=\"Diesen Abschnitt verlinken\"\u003e\u003csvg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"\u003e\u003cpath d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\"\u003e\u003c/path\u003e\u003cpath d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eDer Cluster läuft noch nicht so lange. Allerdings habe ich auf ein paar Screenshots auf \u003ca href=\"https://teqqy.social/@me\" target=\"_blank\" rel=\"noopener noreferrer\"\u003eMastodon\u003csvg 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\"\u003e\n  \u003cpath d=\"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6\"/\u003e\n  \u003cpolyline points=\"15 3 21 3 21 9\"/\u003e\n  \u003cline x1=\"10\" y1=\"14\" x2=\"21\" y2=\"3\"/\u003e\n\u003c/svg\u003e\u003cspan class=\"visually-hidden\"\u003e (externer Link)\u003c/span\u003e\u003c/a\u003e\n 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.\u003c/p\u003e\n","date_published":"2022-12-30T14:41:14+01:00","date_modified":"2022-12-30T14:41:14+01:00","tags":["proxmox","homelab","unifi","backup"]},{"id":"https://www.teqqy.de/aqara-e1-smartes-heizkoerperthermostat-mit-zigbee/","url":"https://www.teqqy.de/aqara-e1-smartes-heizkoerperthermostat-mit-zigbee/","title":"Aqara E1 - Smartes Heizkörperthermostat mit ZigBee","summary":"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.\n","content_html":"\u003cp\u003eVor einiger Zeit sind die neuen Heizkörperthermostate von Aqara auf den Markt gekommen: Die \u003ca href=\"https://amzn.to/3AGZSgS\" target=\"_blank\" rel=\"noopener noreferrer\"\u003eAqara E1\u003csvg 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\"\u003e\n  \u003cpath d=\"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6\"/\u003e\n  \u003cpolyline points=\"15 3 21 3 21 9\"/\u003e\n  \u003cline x1=\"10\" y1=\"14\" x2=\"21\" y2=\"3\"/\u003e\n\u003c/svg\u003e\u003cspan class=\"visually-hidden\"\u003e (externer Link)\u003c/span\u003e\u003c/a\u003e\n. Diese verwenden das ZigBee Protokoll und können so mit vielen verschiedenen Smart-Home Gateways verbunden werden, nicht nur mit dem Aqara eigenen.\u003c/p\u003e\n\u003cp\u003e\u003cimg 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\"\u003e\nIch 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.\u003c/p\u003e\n\u003cp\u003eAls die \u003ca href=\"https://amzn.to/3AGZSgS\" target=\"_blank\" rel=\"noopener noreferrer\"\u003eAqara E1\u003csvg 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\"\u003e\n  \u003cpath d=\"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6\"/\u003e\n  \u003cpolyline points=\"15 3 21 3 21 9\"/\u003e\n  \u003cline x1=\"10\" y1=\"14\" x2=\"21\" y2=\"3\"/\u003e\n\u003c/svg\u003e\u003cspan class=\"visually-hidden\"\u003e (externer Link)\u003c/span\u003e\u003c/a\u003e\n 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.\u003c/p\u003e\n\u003ch2 id=\"lieferumfang-der-aqara-e1\"\u003eLieferumfang der Aqara E1\u003ca href=\"#lieferumfang-der-aqara-e1\" class=\"heading-anchor\" aria-label=\"Diesen Abschnitt verlinken\"\u003e\u003csvg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"\u003e\u003cpath d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\"\u003e\u003c/path\u003e\u003cpath d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eIm Lieferumfang befinden sich\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eDas Heizkörperthermostat\u003c/li\u003e\n\u003cli\u003edrei Adapterringe\u003c/li\u003e\n\u003cli\u003eAnleitung\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eDie Anleitung ist natürlich in den gängigen Sprachen incl. Deutsch vorhanden.\u003c/p\u003e\n\u003cp\u003e\u003cimg 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\"\u003e\u003c/p\u003e\n\u003ch2 id=\"verbindung-mit-einem-gateway\"\u003eVerbindung mit einem Gateway\u003ca href=\"#verbindung-mit-einem-gateway\" class=\"heading-anchor\" aria-label=\"Diesen Abschnitt verlinken\"\u003e\u003csvg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"\u003e\u003cpath d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\"\u003e\u003c/path\u003e\u003cpath d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eIn meinem Smart-Home werden die \u003ca href=\"https://amzn.to/3AGZSgS\" target=\"_blank\" rel=\"noopener noreferrer\"\u003eAqara E1\u003csvg 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\"\u003e\n  \u003cpath d=\"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6\"/\u003e\n  \u003cpolyline points=\"15 3 21 3 21 9\"/\u003e\n  \u003cline x1=\"10\" y1=\"14\" x2=\"21\" y2=\"3\"/\u003e\n\u003c/svg\u003e\u003cspan class=\"visually-hidden\"\u003e (externer Link)\u003c/span\u003e\u003c/a\u003e\n mit \u003ca href=\"https://www.zigbee2mqtt.io\" target=\"_blank\" rel=\"noopener noreferrer\"\u003ezigbee2mqtt\u003csvg 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\"\u003e\n  \u003cpath d=\"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6\"/\u003e\n  \u003cpolyline points=\"15 3 21 3 21 9\"/\u003e\n  \u003cline x1=\"10\" y1=\"14\" x2=\"21\" y2=\"3\"/\u003e\n\u003c/svg\u003e\u003cspan class=\"visually-hidden\"\u003e (externer Link)\u003c/span\u003e\u003c/a\u003e\n verbunden. Ich verwende dieses Gateway schon lange und ist nicht direkt mit meiner \u003ca href=\"/tesla-ueberschussladen-mit-home-assistant/\"\u003eHome Assistant\u003c/a\u003e\n 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.\u003c/p\u003e\n\u003cp\u003eEs werden Stand jetzt aber noch nicht alle Funktionen unterstützt die mit dem \u003ca href=\"https://amzn.to/3tV0hsn\" target=\"_blank\" rel=\"noopener noreferrer\"\u003eAqara Hub E2\u003csvg 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\"\u003e\n  \u003cpath d=\"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6\"/\u003e\n  \u003cpolyline points=\"15 3 21 3 21 9\"/\u003e\n  \u003cline x1=\"10\" y1=\"14\" x2=\"21\" y2=\"3\"/\u003e\n\u003c/svg\u003e\u003cspan class=\"visually-hidden\"\u003e (externer Link)\u003c/span\u003e\u003c/a\u003e\n möglich wären. Hier können nämlich externe \u003ca href=\"https://amzn.to/3ECPx75\" target=\"_blank\" rel=\"noopener noreferrer\"\u003eTemperatursensoren wie die von Aqara\u003csvg 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\"\u003e\n  \u003cpath d=\"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6\"/\u003e\n  \u003cpolyline points=\"15 3 21 3 21 9\"/\u003e\n  \u003cline x1=\"10\" y1=\"14\" x2=\"21\" y2=\"3\"/\u003e\n\u003c/svg\u003e\u003cspan class=\"visually-hidden\"\u003e (externer Link)\u003c/span\u003e\u003c/a\u003e\n 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 \u003ca href=\"https://www.github.com/cbirkenbeul\" target=\"_blank\" rel=\"noopener noreferrer\"\u003eGitHub\u003csvg 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\"\u003e\n  \u003cpath d=\"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6\"/\u003e\n  \u003cpolyline points=\"15 3 21 3 21 9\"/\u003e\n  \u003cline x1=\"10\" y1=\"14\" x2=\"21\" y2=\"3\"/\u003e\n\u003c/svg\u003e\u003cspan class=\"visually-hidden\"\u003e (externer Link)\u003c/span\u003e\u003c/a\u003e\n gibt.\u003c/p\u003e\n\u003cp\u003e\u003cimg 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\"\u003e\nIm 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.\u003c/p\u003e\n\u003cp\u003eZum 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.\u003c/p\u003e\n\u003cp\u003eIn 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.\u003c/p\u003e\n","date_published":"2022-11-24T11:41:50+01:00","date_modified":"2022-11-24T11:41:50+01:00","tags":["smart-home","zigbee","home-assistant","iot"]},{"id":"https://www.teqqy.de/wechsel-von-twitter-von-mastodon/","url":"https://www.teqqy.de/wechsel-von-twitter-von-mastodon/","title":"Wechsel von Twitter von Mastodon?!","summary":"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.\nSeit 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.\nIch 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.\n","content_html":"\u003cp\u003eWer 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.\u003c/p\u003e\n\u003cp\u003eSeit 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.\u003c/p\u003e\n\u003cp\u003eIch 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.\u003c/p\u003e\n\u003cp\u003eDie Standardinstallation von tootsuite benötigt\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eElasticsearch\u003c/li\u003e\n\u003cli\u003ePostgres Datenbank\u003c/li\u003e\n\u003cli\u003eS3 Storage\u003c/li\u003e\n\u003cli\u003eRedis\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eund natürlich die normalen Container für die Software an sich.\u003c/p\u003e\n\u003cp\u003eOb 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 \u003ca href=\"https://www.netcup.de/?ref=60644\" target=\"_blank\" rel=\"noopener noreferrer\"\u003eNetcup\u003csvg 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\"\u003e\n  \u003cpath d=\"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6\"/\u003e\n  \u003cpolyline points=\"15 3 21 3 21 9\"/\u003e\n  \u003cline x1=\"10\" y1=\"14\" x2=\"21\" y2=\"3\"/\u003e\n\u003c/svg\u003e\u003cspan class=\"visually-hidden\"\u003e (externer Link)\u003c/span\u003e\u003c/a\u003e\n umziehen.\u003c/p\u003e\n","date_published":"2022-11-21T22:38:19+01:00","date_modified":"2022-11-21T22:38:19+01:00","tags":["mastodon","fediverse","twitter","homelab"]},{"id":"https://www.teqqy.de/modulare-wlan-wetterstation-fuer-dein-garten/","url":"https://www.teqqy.de/modulare-wlan-wetterstation-fuer-dein-garten/","title":"Modulare WLAN Wetterstation für dein Garten","summary":"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.\n","content_html":"\u003cp\u003eWenn man auf den gängigen Shop-Seiten nach einer WLAN \u003ca href=\"https://www.amazon.de/shop/teqqyde/list/28WUZEF8NCNN8?ref_=aip_sf_list_spv_ons_mixed_d\" target=\"_blank\" rel=\"noopener noreferrer\"\u003eWetterstation\u003csvg 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\"\u003e\n  \u003cpath d=\"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6\"/\u003e\n  \u003cpolyline points=\"15 3 21 3 21 9\"/\u003e\n  \u003cline x1=\"10\" y1=\"14\" x2=\"21\" y2=\"3\"/\u003e\n\u003c/svg\u003e\u003cspan class=\"visually-hidden\"\u003e (externer Link)\u003c/span\u003e\u003c/a\u003e\n 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.\u003c/p\u003e\n\u003cp\u003eWie du vielleicht weißt, betreiben wir schon seit einigen Jahren eine eigene \u003ca href=\"/wetterstation-mit-dem-raspberry-pi/\"\u003ekleine Wetterstation\u003c/a\u003e\n 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 \u003ca href=\"https://amzn.to/3C3tfeS\" target=\"_blank\" rel=\"noopener noreferrer\"\u003eRaspberry Pi\u003csvg 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\"\u003e\n  \u003cpath d=\"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6\"/\u003e\n  \u003cpolyline points=\"15 3 21 3 21 9\"/\u003e\n  \u003cline x1=\"10\" y1=\"14\" x2=\"21\" y2=\"3\"/\u003e\n\u003c/svg\u003e\u003cspan class=\"visually-hidden\"\u003e (externer Link)\u003c/span\u003e\u003c/a\u003e\n per USB ausgelesen. Die Wettersoftware weewx hat dann unsere Wetter-Webseite erstellt.\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"images/wetter-ockenheim.webp\"\u003eScreenshot unserer Wetter Webseite\u003c/a\u003e\n\nIch musste nun eine neue \u003ca href=\"https://www.amazon.de/shop/teqqyde/list/28WUZEF8NCNN8?ref_=aip_sf_list_spv_ons_mixed_d\" target=\"_blank\" rel=\"noopener noreferrer\"\u003eWetterstation\u003csvg 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\"\u003e\n  \u003cpath d=\"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6\"/\u003e\n  \u003cpolyline points=\"15 3 21 3 21 9\"/\u003e\n  \u003cline x1=\"10\" y1=\"14\" x2=\"21\" y2=\"3\"/\u003e\n\u003c/svg\u003e\u003cspan class=\"visually-hidden\"\u003e (externer Link)\u003c/span\u003e\u003c/a\u003e\n 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.\u003c/p\u003e\n\u003cp\u003eNach 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.\u003c/p\u003e\n\u003ch2 id=\"komponenten\"\u003eKomponenten\u003ca href=\"#komponenten\" class=\"heading-anchor\" aria-label=\"Diesen Abschnitt verlinken\"\u003e\u003csvg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"\u003e\u003cpath d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\"\u003e\u003c/path\u003e\u003cpath d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/h2\u003e\n\u003ch3 id=\"wlan-wetterstation-empfänger\"\u003eWLAN Wetterstation Empfänger\u003ca href=\"#wlan-wetterstation-empf%c3%a4nger\" class=\"heading-anchor\" aria-label=\"Diesen Abschnitt verlinken\"\u003e\u003csvg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"\u003e\u003cpath d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\"\u003e\u003c/path\u003e\u003cpath d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eDas Herz ist der Empfänger \u003ca href=\"https://amzn.to/3JCfeaq\" target=\"_blank\" rel=\"noopener noreferrer\"\u003eGW1100\u003csvg 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\"\u003e\n  \u003cpath d=\"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6\"/\u003e\n  \u003cpolyline points=\"15 3 21 3 21 9\"/\u003e\n  \u003cline x1=\"10\" y1=\"14\" x2=\"21\" y2=\"3\"/\u003e\n\u003c/svg\u003e\u003cspan class=\"visually-hidden\"\u003e (externer Link)\u003c/span\u003e\u003c/a\u003e\n 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.\u003c/p\u003e\n\u003ch3 id=\"außensensor-temperatur\"\u003eAußensensor Temperatur\u003ca href=\"#au%c3%9fensensor-temperatur\" class=\"heading-anchor\" aria-label=\"Diesen Abschnitt verlinken\"\u003e\u003csvg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"\u003e\u003cpath d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\"\u003e\u003c/path\u003e\u003cpath d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eDer 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 \u003ca href=\"https://www.ecowitt.com/shop/goodsDetail/193\" target=\"_blank\" rel=\"noopener noreferrer\"\u003eWH32\u003csvg 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\"\u003e\n  \u003cpath d=\"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6\"/\u003e\n  \u003cpolyline points=\"15 3 21 3 21 9\"/\u003e\n  \u003cline x1=\"10\" y1=\"14\" x2=\"21\" y2=\"3\"/\u003e\n\u003c/svg\u003e\u003cspan class=\"visually-hidden\"\u003e (externer Link)\u003c/span\u003e\u003c/a\u003e\n nun an die Ostseite des Hauses hängen. Allerdings auch so, dass er keine direkte Sonnenstrahlung abbekommt.\u003c/p\u003e\n\u003cp\u003eOffiziell soll ein Temperatursensor zwei Meter über den Boden in einer aktiv belüfteten Wetterhütte stehen.\u003c/p\u003e\n\u003ch3 id=\"außensensor-windrichtung-und--geschwindigkeit\"\u003eAußensensor Windrichtung und -geschwindigkeit\u003ca href=\"#au%c3%9fensensor-windrichtung-und--geschwindigkeit\" class=\"heading-anchor\" aria-label=\"Diesen Abschnitt verlinken\"\u003e\u003csvg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"\u003e\u003cpath d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\"\u003e\u003c/path\u003e\u003cpath d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eDer Windsensor \u003ca href=\"https://www.ecowitt.com/shop/goodsDetail/43\" target=\"_blank\" rel=\"noopener noreferrer\"\u003eWS68\u003csvg 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\"\u003e\n  \u003cpath d=\"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6\"/\u003e\n  \u003cpolyline points=\"15 3 21 3 21 9\"/\u003e\n  \u003cline x1=\"10\" y1=\"14\" x2=\"21\" y2=\"3\"/\u003e\n\u003c/svg\u003e\u003cspan class=\"visually-hidden\"\u003e (externer Link)\u003c/span\u003e\u003c/a\u003e\n 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.\u003c/p\u003e\n\u003cp\u003e\u003cimg 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\"\u003e\nDer 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.\u003c/p\u003e\n\u003ch3 id=\"außensensor-regenmesser\"\u003eAußensensor Regenmesser\u003ca href=\"#au%c3%9fensensor-regenmesser\" class=\"heading-anchor\" aria-label=\"Diesen Abschnitt verlinken\"\u003e\u003csvg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"\u003e\u003cpath d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\"\u003e\u003c/path\u003e\u003cpath d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eDer 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.\u003c/p\u003e\n\u003cp\u003eLeider war der Trichter der alten Station sehr klein, sodass kaum Regen direkt hinein regnete. Der neue Sensor \u003ca href=\"https://amzn.to/3JB5tsU\" target=\"_blank\" rel=\"noopener noreferrer\"\u003eWH40\u003csvg 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\"\u003e\n  \u003cpath d=\"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6\"/\u003e\n  \u003cpolyline points=\"15 3 21 3 21 9\"/\u003e\n  \u003cline x1=\"10\" y1=\"14\" x2=\"21\" y2=\"3\"/\u003e\n\u003c/svg\u003e\u003cspan class=\"visually-hidden\"\u003e (externer Link)\u003c/span\u003e\u003c/a\u003e\n ist deutlich größer und kann nun Regenstärken ab 0,1 mm messen. Der alte hatte lediglich eine Genauigkeit von 0,3 mm.\u003c/p\u003e\n\u003cp\u003e\u003cimg 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\"\u003e\nDie 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.\u003c/p\u003e\n\u003ch2 id=\"anbindung-an-weewx\"\u003eAnbindung an weewx\u003ca href=\"#anbindung-an-weewx\" class=\"heading-anchor\" aria-label=\"Diesen Abschnitt verlinken\"\u003e\u003csvg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"\u003e\u003cpath d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\"\u003e\u003c/path\u003e\u003cpath d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eDas Gateway GW1100 wird ins heimische WLAN integriert (sonst wäre es ja auch keine WLAN Wetterstation 😉) und kann dann mit weewx ausgelesen werden.\u003c/p\u003e\n\u003cp\u003eOffiziell werden die Ecowitt gateways von Haus aus unterstützt. Die Community empfehlt aber einen \u003ca href=\"https://github.com/gjr80/weewx-gw1000\" target=\"_blank\" rel=\"noopener noreferrer\"\u003ealternativen Treiber\u003csvg 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\"\u003e\n  \u003cpath d=\"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6\"/\u003e\n  \u003cpolyline points=\"15 3 21 3 21 9\"/\u003e\n  \u003cline x1=\"10\" y1=\"14\" x2=\"21\" y2=\"3\"/\u003e\n\u003c/svg\u003e\u003cspan class=\"visually-hidden\"\u003e (externer Link)\u003c/span\u003e\u003c/a\u003e\n zu verwenden er die Sensoren besser ausliest.\u003c/p\u003e\n\u003cp\u003eSobald der Treiber installiert ist, kann die Wetterstation einfach in der weewx.conf Datei hinzufügt werden und die Daten werden ausgelesen.\u003c/p\u003e\n\u003ch2 id=\"youtube-video\"\u003eYouTube Video\u003ca href=\"#youtube-video\" class=\"heading-anchor\" aria-label=\"Diesen Abschnitt verlinken\"\u003e\u003csvg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"\u003e\u003cpath d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\"\u003e\u003c/path\u003e\u003cpath d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eMöchtest du noch ein paar mehr Worte zu unserer WLAN Wetterstation wissen, kannst du dir gerne dieses YouTube Video auf meinem Kanal anschauen.\u003c/p\u003e\n\u003cdiv class=\"video-embed\" data-src=\"https://www.youtube-nocookie.com/embed/jgyqSV-op9M?autoplay=1\u0026rel=0\"\u003e\n  \u003cbutton class=\"video-embed-trigger\" type=\"button\" data-umami-event=\"Video Load\" data-umami-event-provider=\"YouTube\" data-umami-event-id=\"jgyqSV-op9M\"\u003e\n    \u003csvg 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\"\u003e\u003ccircle cx=\"12\" cy=\"12\" r=\"12\" fill=\"rgba(0,0,0,0.6)\"/\u003e\u003cpath d=\"M9.5 7.5l7 4.5-7 4.5V7.5z\" fill=\"white\"/\u003e\u003c/svg\u003e\n    \u003cspan class=\"video-embed-title\"\u003eYouTube Video\u003c/span\u003e\n    \u003cspan class=\"video-embed-note\"\u003eYouTube \u0026middot; Klicken zum Laden\u003c/span\u003e\n  \u003c/button\u003e\n\u003c/div\u003e\n\n","date_published":"2022-08-14T16:14:20+02:00","date_modified":"2022-08-14T16:14:20+02:00","tags":["iot","raspberry-pi","hardware"]}]}