{"id":430,"date":"2026-08-31T11:30:00","date_gmt":"2026-08-31T09:30:00","guid":{"rendered":"https:\/\/www.lukaswojcik.com\/?p=430"},"modified":"2026-10-09T23:14:42","modified_gmt":"2026-10-09T21:14:42","slug":"lokales-ci-cd-fur-den-raspberry-pi-automatisierung-von-docker-compose","status":"publish","type":"post","link":"https:\/\/www.lukaswojcik.com\/blog\/de\/raspberry-pi-de\/lokales-ci-cd-fur-den-raspberry-pi-automatisierung-von-docker-compose\/","title":{"rendered":"Lokales CI\/CD f\u00fcr den Raspberry Pi: Automatisierung von Docker-Compose-Deployments"},"content":{"rendered":"\r\n<p class=\"wp-block-paragraph\">Die Verwaltung von Container-Infrastrukturen auf Edge-Ger\u00e4ten wie einem Raspberry Pi ist im Alltag oft mit wiederholten manuellen SSH-Sitzungen, h\u00e4ndischen Image-Downloads und dem direkten Ausf\u00fchren von Docker-Compose-Befehlen verbunden. Der Wechsel zu einer lokalen CI\/CD-Pipeline automatisiert den gesamten Lebenszyklus selbstgehosteter Anwendungen \u2013 darunter Home Assistant, Nextcloud und ma\u00dfgeschneiderte Python-Skripte \u2013 mit Git-Repositories, Webhook-Listenern und lokalen Deploy-Agenten.<\/p>\r\n\r\n\r\n\r\n<h2 class=\"wp-block-heading\">1. Architektur von lokalem GitOps auf Edge-Hardware<\/h2>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">Bei GitOps ist das zentrale Git-Repository f\u00fcr die gesamte Infrastrukturkonfiguration ma\u00dfgeblich. Die Bereitstellungsdefinitionen werden in der Versionskontrolle gepflegt, statt YAML-Dateien direkt auf dem Server zu \u00e4ndern.<\/p>\r\n\r\n\r\n\r\n<ul class=\"wp-block-list\">\r\n<li><strong>Deklarative Konfiguration:<\/strong> S\u00e4mtliche Dienste, Netzwerkdefinitionen und persistenten Speicherinhalte werden klar strukturiert in <code>docker-compose.yml<\/code>-Dateien innerhalb eines Git-Repositories abgebildet.<\/li>\r\n<li><strong>Nachvollziehbarkeit &amp; Rollbacks:<\/strong> Die Versionskontrolle bietet eine l\u00fcckenlose Historie aller Konfigurations\u00e4nderungen, was im Fehlerfall ein sofortiges Zur\u00fccksetzen auf einen stabilen vorherigen Zustand erm\u00f6glicht.<\/li>\r\n<li><strong>Wartungsfreier Betrieb:<\/strong> Der Edge-Server \u00fcbernimmt den Stand des Repositorys automatisch. Bei normalen Updates sind deshalb keine interaktiven Shell-Eingriffe n\u00f6tig.<\/li>\r\n<\/ul>\r\n\r\n\r\n\r\n<figure class=\"lw-diagram\">\n<img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/diagrams\/raspberry-pi-lokale-cicd-pipeline-de.png\" width=\"1120\" height=\"620\" alt=\"Senkrechte CI\/CD-Pipeline vom git push \u00fcber HMAC-gepr\u00fcften Webhook und git pull bis zu docker compose und Health-Checks\">\n<figcaption>Das Edge-Ger\u00e4t ist Konsument, nicht Ziel: Es zieht den Repository-Zustand selbst und bringt seinen Stack in Deckung. Die HMAC-Pr\u00fcfung ist das Tor \u2014 ein nicht verifizierter Webhook erreicht den Pull nie.<\/figcaption>\n<\/figure>\r\n\r\n\r\n\r\n<h2 class=\"wp-block-heading\">2. Automatisierte Deployments \u00fcber Webhook-Listener<\/h2>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">Um manuelle SSH-Befehle vollst\u00e4ndig abzul\u00f6sen, k\u00f6nnen ressourcenschonende Webhook-Server (wie <code>adnanh\/webhook<\/code> oder spezialisierte Automatisierungsdienstprogramme) direkt auf dem Raspberry Pi installiert werden. Diese Dienste empfangen eingehende HTTP-POST-Signale, die durch Push-Ereignisse im Code-Repository oder durch externe CI\/CD-Systeme ausgel\u00f6st werden.<\/p>\r\n\r\n\r\n\r\n<h3 class=\"wp-block-heading\">Ablauf der Webhook-Ausf\u00fchrung<\/h3>\r\n\r\n\r\n\r\n<ul class=\"wp-block-list\">\r\n<li><strong>Validierung der Anfragen:<\/strong> Eingehende Webhook-Aufrufe werden kryptografisch \u00fcber HMAC-Schl\u00fcssel auf Authentizit\u00e4t gepr\u00fcft, um unbefugten Zugriff zu verhindern.<\/li>\r\n<li><strong>Automatischer Git-Abruf:<\/strong> Nach erfolgreicher Pr\u00fcfung startet der Hintergrunddienst einen Aktualisierungsprozess, um das lokale Arbeitsverzeichnis auf den Stand des externen Hauptbranches zu bringen.<\/li>\r\n<li><strong>Rekonvergenz der Container:<\/strong> Der Ausf\u00fchrungsdienst startet den Befehl <code>docker compose up -d --remove-orphans<\/code>, sodass ausschlie\u00dflich ver\u00e4nderte Container-Images oder angepasste Konfigurationen neu erstellt werden.<\/li>\r\n<\/ul>\r\n\r\n\r\n\r\n<h2 class=\"wp-block-heading\">3. Lebenszyklus-Management ohne SSH<\/h2>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">Architekturen f\u00fcr die kontinuierliche Bereitstellung im Self-Hosting-Bereich profitieren von lokalen Agenten, die Container-Registries \u00fcberwachen und die Erneuerung von Containern vollautomatisch durchf\u00fchren.<\/p>\r\n\r\n\r\n\r\n<ul class=\"wp-block-list\">\r\n<li><strong>Automatisierte \u00dcberwachung von Image-Registries:<\/strong> Werkzeuge aus der Watchtower-Familie pr\u00fcfen regelm\u00e4\u00dfig Image-Digests aktiver Container und starten Dienste automatisch neu, sobald aktuelle Builds bereitstehen. Das urspr\u00fcngliche Repository <code>containrrr\/watchtower<\/code> wurde im Dezember 2025 archiviert, das \u00e4ltere Projekt Ouroboros wird nicht mehr entwickelt; gepflegte Community-Forks wie <code>nickfedor\/watchtower<\/code> lassen sich als direkter Ersatz einsetzen.<\/li>\r\n<li><strong>Lokale Build-Automatisierung:<\/strong> F\u00fcr eigene Python-Anwendungen oder Mikroservices k\u00f6nnen Build-Prozesse per Dockerfile direkt auf der ARM-Architektur ausgef\u00fchrt werden, um komplexe Cross-Compilation-Schritte zu vermeiden.<\/li>\r\n<li><strong>Health Checks &amp; automatische Wiederherstellung:<\/strong> Die Integration nativer Docker-Health-Checks stellt sicher, dass fehlerhafte Aktualisierungen umgehend identifiziert werden, ohne dass manuelle Log-Analysen erforderlich sind.<\/li>\r\n<\/ul>\r\n\r\n\r\n\r\n<h2 class=\"wp-block-heading\">4. Sicherheitsaspekte f\u00fcr lokale CI\/CD-Pipelines<\/h2>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">Die Bereitstellung automatisierter Endpunkte im lokalen Netzwerk erfordert eine strikte Rechteentflechtung. Webhook-Dienste sollten niemals mit Root-Berechtigungen ausgef\u00fchrt werden; stattdessen ist der Zugriff auf den Docker-Socket \u00fcber dedizierte Gruppenrechte oder schreibgesch\u00fctzte Socket-Proxys zu reglementieren. Zudem sch\u00fctzt ein restriktives Management-VLAN die Automatisierungs-Dienste vor unautorisierten Zugriffen aus anderen Subnetzen.<\/p>\r\n\n\n<h2>5. Push statt Pull: GitHub Actions und zeitgesteuerte Image-Updates<\/h2>\n<p>Beim Webhook-Muster holt sich der Raspberry Pi seinen Stand selbst. Die Gegenrichtung, bei der ein CI-Workflow das Deployment anst\u00f6\u00dft, ist mit GitHub Actions verbreitet und kommt in zwei Varianten vor. Die beiden unterscheiden sich vor allem darin, wie erreichbar das Ger\u00e4t sein muss.<\/p>\n<ul>\n<li><strong>Von GitHub gehosteter Runner \u00fcber SSH:<\/strong> Der Workflow l\u00e4uft in der Cloud von GitHub und baut eine SSH-Verbindung zum Pi auf. Dazu muss der SSH-Port des Pi aus dem Internet erreichbar sein, was einem rein lokalen Aufbau widerspricht.<\/li>\n<li><strong>Selbst gehosteter Runner auf dem Pi:<\/strong> GitHub unterst\u00fctzt selbst gehostete Runner unter Linux f\u00fcr ARM64 und ARM32. Der Runner braucht nur ausgehende HTTPS-Verbindungen \u00fcber Port 443, ein eingehender Port muss nicht ge\u00f6ffnet werden. GitHub empfiehlt selbst gehostete Runner nur f\u00fcr private Repositories, weil ein Pull Request aus dem Fork eines \u00f6ffentlichen Repositorys seinen Code auf dem Runner ausf\u00fchren kann.<\/li>\n<\/ul>\n<h3>Den Deployment-Schl\u00fcssel beschr\u00e4nken<\/h3>\n<p>Bleibt die SSH-Variante im Einsatz, l\u00e4sst sich der als Repository-Secret hinterlegte Schl\u00fcssel in der Datei <code>~\/.ssh\/authorized_keys<\/code> eines eigenen Deployment-Benutzers auf eine einzige Aktion festlegen:<\/p>\n<figure style=\"--cbb-digits:1\" class=\"cbb cbb--wrap wp-block-code-beautifier-block-code\" data-lang=\"plain\"><figcaption class=\"cbb-head\"><span class=\"cbb-lang\">Text<\/span><span class=\"cbb-actions\"><button type=\"button\" class=\"cbb-button cbb-button--wrap\" data-cbb-action=\"wrap\" aria-pressed=\"true\" title=\"Wrap long lines\"><svg aria-hidden=\"true\" focusable=\"false\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"><path d=\"M2 4h12M2 8h9.5a2.5 2.5 0 0 1 0 5H8m0 0 1.5-1.5M8 13l1.5 1.5M2 12h3\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\/><\/svg><span class=\"cbb-sr\">Wrap long lines<\/span><\/button><button type=\"button\" class=\"cbb-button cbb-button--copy\" data-cbb-action=\"copy\" data-cbb-done=\"Copied\" data-cbb-failed=\"Press Ctrl+C to copy\"><svg aria-hidden=\"true\" focusable=\"false\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"><rect x=\"5.5\" y=\"5.5\" width=\"8\" height=\"8.5\" rx=\"1.5\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"\/><path d=\"M10.5 3.5V3A1.5 1.5 0 0 0 9 1.5H4A1.5 1.5 0 0 0 2.5 3v6.5A1.5 1.5 0 0 0 4 11h.5\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"\/><\/svg><span class=\"cbb-button-label\" aria-live=\"polite\">Copy<\/span><\/button><\/span><\/figcaption><pre class=\"cbb-pre\" tabindex=\"0\"><code class=\"cbb-code language-plain\" style=\"counter-reset:cbb-line 0;\"><span class=\"cbb-line\">restrict,command=\"\/usr\/local\/bin\/deploy-stack\" ssh-ed25519 AAAA\u2026 ci-deploy<\/span><\/code><\/pre><\/figure>\n<p><code>command=<\/code> f\u00fchrt bei jeder Anmeldung mit diesem Schl\u00fcssel das hinterlegte Skript aus und ignoriert den Befehl, den der Client mitschickt; die urspr\u00fcngliche Anfrage erreicht das Skript nur \u00fcber die Umgebungsvariable <code>SSH_ORIGINAL_COMMAND<\/code>. <code>restrict<\/code> schaltet Port-, Agent- und X11-Weiterleitung ab, ebenso die PTY-Zuteilung und die Ausf\u00fchrung von <code>~\/.ssh\/rc<\/code>. Ein abgeflossenes Secret kann dann ein Deployment ausl\u00f6sen und sonst nichts. Die Mitgliedschaft in der Gruppe <code>docker<\/code> ist dabei keine Beschr\u00e4nkung: Laut Docker-Dokumentation verleiht diese Gruppe Rechte auf Root-Niveau.<\/p>\n<h3>Watchtower-Updates zeitlich festlegen<\/h3>\n<p>Ohne weitere Angabe sucht Watchtower alle 86.400 Sekunden (24 Stunden) nach neuen Images. Ein festes Wartungsfenster setzt <code>WATCHTOWER_SCHEDULE<\/code>, ein Cron-Ausdruck mit sechs Feldern, dessen erstes Feld die Sekunden angibt; <code>0 0 4 * * *<\/code> l\u00e4uft t\u00e4glich um 4:00 Uhr. Der Zeitplan braucht eine Zeitzone \u00fcber <code>TZ<\/code> oder eine eingebundene <code>\/etc\/localtime<\/code> und l\u00e4sst sich nicht mit <code>WATCHTOWER_POLL_INTERVAL<\/code> kombinieren. <code>WATCHTOWER_CLEANUP=true<\/code> entfernt nach einem Update die alten Images, damit SD-Karte oder SSD nicht mit der Zeit volllaufen. Mit <code>WATCHTOWER_LABEL_ENABLE=true<\/code> aktualisiert Watchtower nur Container mit dem Label <code>com.centurylinklabs.watchtower.enable=true<\/code>; damit entscheidet die Compose-Datei, welche Dienste Watchtower \u00fcberhaupt anfasst.<\/p>\n\n<div class=\"lw-faq\">\n<h2>Fragen und Antworten<\/h2>\n\n<h3>Was macht docker compose up -d &#8211;remove-orphans mit Containern, deren Image sich nicht ge\u00e4ndert hat, und mit den Volumes?<\/h3>\n<p>Compose vergleicht die gew\u00fcnschte Beschreibung mit dem laufenden Zustand und fasst nur an, was abweicht. Gleiches Image und gleiche Definition hei\u00dft: Der Container l\u00e4uft weiter, ohne Neustart. Volumes bleiben ohnehin bestehen, weil sie nicht Teil des Container-Lebenszyklus sind; entfernt werden sie nur auf ausdr\u00fccklichen Befehl, etwa mit <code>docker compose down --volumes<\/code>, und der kommt in diesem Ablauf nicht vor.<\/p>\n<p>Aufmerksamkeit verdient <code>--remove-orphans<\/code>. Es entfernt Container, die dieses Compose-Projekt einmal angelegt hat und die in der Datei nicht mehr stehen. Das ist gewollt, solange der Projektname stabil ist. \u00c4ndert er sich \u2013 ein umbenanntes Verzeichnis gen\u00fcgt \u2013, gelten die alten Container als fremd und bleiben stehen, w\u00e4hrend die neuen daneben starten.<\/p>\n<p>Der umgekehrte Fall ist der teurere: Liegen zwei Projekte im selben Verzeichnis oder teilen sie sich versehentlich einen Namen, r\u00e4umt der Lauf die Container des jeweils anderen ab. Deshalb ist der Projektname ausdr\u00fccklich zu setzen (<code>name:<\/code> in der Compose-Datei oder <code>-p<\/code> im Aufruf) und nicht dem Verzeichnisnamen zu \u00fcberlassen.<\/p>\n<\/div>\n\n<div class=\"lw-quellen\">\n<h2>Quellen<\/h2>\n<ul>\n<li><a href=\"https:\/\/docs.docker.com\/compose\/\" target=\"_blank\" rel=\"noopener noreferrer\">Docker Compose documentation<\/a><\/li>\n<li><a href=\"https:\/\/docs.github.com\/en\/actions\/reference\/runners\/self-hosted-runners\" target=\"_blank\" rel=\"noopener noreferrer\">GitHub Docs: Self-hosted runners reference<\/a><\/li>\n<li><a href=\"https:\/\/docs.github.com\/en\/actions\/how-tos\/manage-runners\/self-hosted-runners\/add-runners\" target=\"_blank\" rel=\"noopener noreferrer\">GitHub Docs: Adding self-hosted runners<\/a><\/li>\n<li><a href=\"https:\/\/man.openbsd.org\/sshd.8\" target=\"_blank\" rel=\"noopener noreferrer\">OpenBSD manual: sshd(8), AUTHORIZED_KEYS FILE FORMAT<\/a><\/li>\n<li><a href=\"https:\/\/docs.docker.com\/engine\/install\/linux-postinstall\/\" target=\"_blank\" rel=\"noopener noreferrer\">Docker: Linux post-installation steps for Docker Engine<\/a><\/li>\n<li><a href=\"https:\/\/watchtower.nickfedor.com\/v1.14.3\/configuration\/arguments\/\" target=\"_blank\" rel=\"noopener noreferrer\">Watchtower (nicholas-fedor): Arguments<\/a><\/li>\n<li><a href=\"https:\/\/pkg.go.dev\/github.com\/robfig\/cron@v1.2.0\" target=\"_blank\" rel=\"noopener noreferrer\">robfig\/cron v1.2.0: CRON Expression Format<\/a><\/li>\n<\/ul>\n<\/div>","protected":false},"excerpt":{"rendered":"<p>Verwaltung von Container-Stacks (Home Assistant, Nextcloud, Python-Skripte) auf einem lokalen Server mittels GitOps, Webhooks und lokalen Agenten komplett ohne manuellen SSH-Login.<\/p>\n","protected":false},"author":1,"featured_media":13990,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[22],"tags":[92055,92214,92217,92205,92208,92211],"class_list":["post-430","post","type-post","status-publish","format-standard","hentry","category-raspberry-pi-de","tag-automation-de","tag-devops-de","tag-docker-de","tag-homelab-de","tag-raspberry-pi-de","tag-self-hosting-de"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.1 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Lokales CI\/CD f\u00fcr den Raspberry Pi: Automatisierung von Docker-Compose-Deployments | Lukas Wojcik<\/title>\n<meta name=\"description\" content=\"Docker-Compose-Deployments auf Raspberry Pi automatisieren: GitOps, Webhooks, lokale Agenten und Absicherung der CI\/CD-Pipeline.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.lukaswojcik.com\/blog\/de\/raspberry-pi-de\/lokales-ci-cd-fur-den-raspberry-pi-automatisierung-von-docker-compose\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Lokales CI\/CD f\u00fcr den Raspberry Pi: Automatisierung von Docker-Compose-Deployments | Lukas Wojcik\" \/>\n<meta property=\"og:description\" content=\"Docker-Compose-Deployments auf Raspberry Pi automatisieren: GitOps, Webhooks, lokale Agenten und Absicherung der CI\/CD-Pipeline.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.lukaswojcik.com\/blog\/de\/raspberry-pi-de\/lokales-ci-cd-fur-den-raspberry-pi-automatisierung-von-docker-compose\/\" \/>\n<meta property=\"og:site_name\" content=\"Lukas Wojcik - Blog\" \/>\n<meta property=\"article:published_time\" content=\"2026-08-31T09:30:00+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-10-09T21:14:42+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/09\/hero-430-local-ci-cd-raspberry-pi-automating--g.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1200\" \/>\n\t<meta property=\"og:image:height\" content=\"630\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Lukas Wojcik\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Lukas Wojcik\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"2 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/de\\\/raspberry-pi-de\\\/lokales-ci-cd-fur-den-raspberry-pi-automatisierung-von-docker-compose\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/de\\\/raspberry-pi-de\\\/lokales-ci-cd-fur-den-raspberry-pi-automatisierung-von-docker-compose\\\/\"},\"author\":{\"name\":\"Lukas Wojcik\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#\\\/schema\\\/person\\\/895f7604f9b6b71aad9bba33af28d0f9\"},\"headline\":\"Lokales CI\\\/CD f\u00fcr den Raspberry Pi: Automatisierung von Docker-Compose-Deployments\",\"datePublished\":\"2026-08-31T09:30:00+00:00\",\"dateModified\":\"2026-10-09T21:14:42+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/de\\\/raspberry-pi-de\\\/lokales-ci-cd-fur-den-raspberry-pi-automatisierung-von-docker-compose\\\/\"},\"wordCount\":1053,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#\\\/schema\\\/person\\\/895f7604f9b6b71aad9bba33af28d0f9\"},\"image\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/de\\\/raspberry-pi-de\\\/lokales-ci-cd-fur-den-raspberry-pi-automatisierung-von-docker-compose\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/09\\\/hero-430-local-ci-cd-raspberry-pi-automating--g.png\",\"keywords\":[\"Automation\",\"DevOps\",\"Docker\",\"Homelab\",\"Raspberry Pi\",\"Self-Hosting\"],\"articleSection\":[\"Raspberry Pi\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/de\\\/raspberry-pi-de\\\/lokales-ci-cd-fur-den-raspberry-pi-automatisierung-von-docker-compose\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/de\\\/raspberry-pi-de\\\/lokales-ci-cd-fur-den-raspberry-pi-automatisierung-von-docker-compose\\\/\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/de\\\/raspberry-pi-de\\\/lokales-ci-cd-fur-den-raspberry-pi-automatisierung-von-docker-compose\\\/\",\"name\":\"Lokales CI\\\/CD f\u00fcr den Raspberry Pi: Automatisierung von Docker-Compose-Deployments | Lukas Wojcik\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/de\\\/raspberry-pi-de\\\/lokales-ci-cd-fur-den-raspberry-pi-automatisierung-von-docker-compose\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/de\\\/raspberry-pi-de\\\/lokales-ci-cd-fur-den-raspberry-pi-automatisierung-von-docker-compose\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/09\\\/hero-430-local-ci-cd-raspberry-pi-automating--g.png\",\"datePublished\":\"2026-08-31T09:30:00+00:00\",\"dateModified\":\"2026-10-09T21:14:42+00:00\",\"description\":\"Docker-Compose-Deployments auf Raspberry Pi automatisieren: GitOps, Webhooks, lokale Agenten und Absicherung der CI\\\/CD-Pipeline.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/de\\\/raspberry-pi-de\\\/lokales-ci-cd-fur-den-raspberry-pi-automatisierung-von-docker-compose\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/de\\\/raspberry-pi-de\\\/lokales-ci-cd-fur-den-raspberry-pi-automatisierung-von-docker-compose\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/de\\\/raspberry-pi-de\\\/lokales-ci-cd-fur-den-raspberry-pi-automatisierung-von-docker-compose\\\/#primaryimage\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/09\\\/hero-430-local-ci-cd-raspberry-pi-automating--g.png\",\"contentUrl\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/09\\\/hero-430-local-ci-cd-raspberry-pi-automating--g.png\",\"width\":1200,\"height\":630,\"caption\":\"Lokales CI\\\/CD f\u00fcr den Raspberry Pi: Automatisierung von Docker-Compose-Deployments\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/de\\\/raspberry-pi-de\\\/lokales-ci-cd-fur-den-raspberry-pi-automatisierung-von-docker-compose\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Lokales CI\\\/CD f\u00fcr den Raspberry Pi: Automatisierung von Docker-Compose-Deployments\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/\",\"name\":\"Lukas Wojcik - Blog\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#\\\/schema\\\/person\\\/895f7604f9b6b71aad9bba33af28d0f9\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#\\\/schema\\\/person\\\/895f7604f9b6b71aad9bba33af28d0f9\",\"name\":\"Lukas Wojcik\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\",\"contentUrl\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\",\"width\":424,\"height\":636,\"caption\":\"Lukas Wojcik\"},\"logo\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\"},\"sameAs\":[\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Lokales CI\/CD f\u00fcr den Raspberry Pi: Automatisierung von Docker-Compose-Deployments | Lukas Wojcik","description":"Docker-Compose-Deployments auf Raspberry Pi automatisieren: GitOps, Webhooks, lokale Agenten und Absicherung der CI\/CD-Pipeline.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.lukaswojcik.com\/blog\/de\/raspberry-pi-de\/lokales-ci-cd-fur-den-raspberry-pi-automatisierung-von-docker-compose\/","og_locale":"en_US","og_type":"article","og_title":"Lokales CI\/CD f\u00fcr den Raspberry Pi: Automatisierung von Docker-Compose-Deployments | Lukas Wojcik","og_description":"Docker-Compose-Deployments auf Raspberry Pi automatisieren: GitOps, Webhooks, lokale Agenten und Absicherung der CI\/CD-Pipeline.","og_url":"https:\/\/www.lukaswojcik.com\/blog\/de\/raspberry-pi-de\/lokales-ci-cd-fur-den-raspberry-pi-automatisierung-von-docker-compose\/","og_site_name":"Lukas Wojcik - Blog","article_published_time":"2026-08-31T09:30:00+00:00","article_modified_time":"2026-10-09T21:14:42+00:00","og_image":[{"width":1200,"height":630,"url":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/09\/hero-430-local-ci-cd-raspberry-pi-automating--g.png","type":"image\/png"}],"author":"Lukas Wojcik","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Lukas Wojcik","Est. reading time":"2 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.lukaswojcik.com\/blog\/de\/raspberry-pi-de\/lokales-ci-cd-fur-den-raspberry-pi-automatisierung-von-docker-compose\/#article","isPartOf":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/de\/raspberry-pi-de\/lokales-ci-cd-fur-den-raspberry-pi-automatisierung-von-docker-compose\/"},"author":{"name":"Lukas Wojcik","@id":"https:\/\/www.lukaswojcik.com\/blog\/#\/schema\/person\/895f7604f9b6b71aad9bba33af28d0f9"},"headline":"Lokales CI\/CD f\u00fcr den Raspberry Pi: Automatisierung von Docker-Compose-Deployments","datePublished":"2026-08-31T09:30:00+00:00","dateModified":"2026-10-09T21:14:42+00:00","mainEntityOfPage":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/de\/raspberry-pi-de\/lokales-ci-cd-fur-den-raspberry-pi-automatisierung-von-docker-compose\/"},"wordCount":1053,"commentCount":0,"publisher":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/#\/schema\/person\/895f7604f9b6b71aad9bba33af28d0f9"},"image":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/de\/raspberry-pi-de\/lokales-ci-cd-fur-den-raspberry-pi-automatisierung-von-docker-compose\/#primaryimage"},"thumbnailUrl":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/09\/hero-430-local-ci-cd-raspberry-pi-automating--g.png","keywords":["Automation","DevOps","Docker","Homelab","Raspberry Pi","Self-Hosting"],"articleSection":["Raspberry Pi"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.lukaswojcik.com\/blog\/de\/raspberry-pi-de\/lokales-ci-cd-fur-den-raspberry-pi-automatisierung-von-docker-compose\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.lukaswojcik.com\/blog\/de\/raspberry-pi-de\/lokales-ci-cd-fur-den-raspberry-pi-automatisierung-von-docker-compose\/","url":"https:\/\/www.lukaswojcik.com\/blog\/de\/raspberry-pi-de\/lokales-ci-cd-fur-den-raspberry-pi-automatisierung-von-docker-compose\/","name":"Lokales CI\/CD f\u00fcr den Raspberry Pi: Automatisierung von Docker-Compose-Deployments | Lukas Wojcik","isPartOf":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/de\/raspberry-pi-de\/lokales-ci-cd-fur-den-raspberry-pi-automatisierung-von-docker-compose\/#primaryimage"},"image":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/de\/raspberry-pi-de\/lokales-ci-cd-fur-den-raspberry-pi-automatisierung-von-docker-compose\/#primaryimage"},"thumbnailUrl":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/09\/hero-430-local-ci-cd-raspberry-pi-automating--g.png","datePublished":"2026-08-31T09:30:00+00:00","dateModified":"2026-10-09T21:14:42+00:00","description":"Docker-Compose-Deployments auf Raspberry Pi automatisieren: GitOps, Webhooks, lokale Agenten und Absicherung der CI\/CD-Pipeline.","breadcrumb":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/de\/raspberry-pi-de\/lokales-ci-cd-fur-den-raspberry-pi-automatisierung-von-docker-compose\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.lukaswojcik.com\/blog\/de\/raspberry-pi-de\/lokales-ci-cd-fur-den-raspberry-pi-automatisierung-von-docker-compose\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.lukaswojcik.com\/blog\/de\/raspberry-pi-de\/lokales-ci-cd-fur-den-raspberry-pi-automatisierung-von-docker-compose\/#primaryimage","url":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/09\/hero-430-local-ci-cd-raspberry-pi-automating--g.png","contentUrl":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/09\/hero-430-local-ci-cd-raspberry-pi-automating--g.png","width":1200,"height":630,"caption":"Lokales CI\/CD f\u00fcr den Raspberry Pi: Automatisierung von Docker-Compose-Deployments"},{"@type":"BreadcrumbList","@id":"https:\/\/www.lukaswojcik.com\/blog\/de\/raspberry-pi-de\/lokales-ci-cd-fur-den-raspberry-pi-automatisierung-von-docker-compose\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.lukaswojcik.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Lokales CI\/CD f\u00fcr den Raspberry Pi: Automatisierung von Docker-Compose-Deployments"}]},{"@type":"WebSite","@id":"https:\/\/www.lukaswojcik.com\/blog\/#website","url":"https:\/\/www.lukaswojcik.com\/blog\/","name":"Lukas Wojcik - Blog","description":"","publisher":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/#\/schema\/person\/895f7604f9b6b71aad9bba33af28d0f9"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.lukaswojcik.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":["Person","Organization"],"@id":"https:\/\/www.lukaswojcik.com\/blog\/#\/schema\/person\/895f7604f9b6b71aad9bba33af28d0f9","name":"Lukas Wojcik","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg","url":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg","contentUrl":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg","width":424,"height":636,"caption":"Lukas Wojcik"},"logo":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg"},"sameAs":["https:\/\/www.lukaswojcik.com\/blog"]}]}},"_links":{"self":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/posts\/430","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/comments?post=430"}],"version-history":[{"count":7,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/posts\/430\/revisions"}],"predecessor-version":[{"id":22203,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/posts\/430\/revisions\/22203"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/media\/13990"}],"wp:attachment":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/media?parent=430"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/categories?post=430"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/tags?post=430"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}