{"id":431,"date":"2026-08-31T16:20:00","date_gmt":"2026-08-31T14:20:00","guid":{"rendered":"https:\/\/www.lukaswojcik.com\/?p=431"},"modified":"2026-10-24T01:39:04","modified_gmt":"2026-10-23T23:39:04","slug":"lokalny-ci-cd-dla-raspberry-pi-automatyzacja-wdrozen-docker-compose","status":"publish","type":"post","link":"https:\/\/www.lukaswojcik.com\/blog\/pl\/raspberry-pi-pl\/lokalny-ci-cd-dla-raspberry-pi-automatyzacja-wdrozen-docker-compose\/","title":{"rendered":"Lokalny CI\/CD dla Raspberry Pi: Automatyzacja wdro\u017ce\u0144 Docker Compose"},"content":{"rendered":"<p>Lokalny potok CI\/CD mo\u017ce sprawdza\u0107 zmiany i wdra\u017ca\u0107 us\u0142ugi Docker Compose na Raspberry Pi bez osobnej sesji SSH przy ka\u017cdej aktualizacji. Git przechowuje definicj\u0119 wdro\u017cenia, a lokalny proces wykonawczy stosuje zatwierdzon\u0105 wersj\u0119. Nadal potrzebne s\u0105 kopie zapasowe, monitoring i procedura odtwarzania.<\/p>\n<h2>1. Powtarzalna wersja wdro\u017cenia<\/h2>\n<p>CI oznacza automatyczne sprawdzanie integracji, a CD dostarczanie lub wdra\u017canie zmian. Webhook jedynie uruchamia zadanie. W podej\u015bciu GitOps repozytorium opisuje stan docelowy, a proces automatyczny uzgadnia dzia\u0142aj\u0105ce us\u0142ugi z tym opisem.<\/p>\n<ul>\n<li><strong>Konfiguracja:<\/strong> Compose definiuje us\u0142ugi, sieci i montowanie wolumen\u00f3w. Zawarto\u015b\u0107 wolumen\u00f3w i rekordy bazy danych nie znajduj\u0105 si\u0119 w pliku YAML. Sekrety wymagaj\u0105 przechowywania poza zwyk\u0142ym repozytorium Git.<\/li>\n<li><strong>Identyfikacja wersji:<\/strong> Konkretny commit i digesty obraz\u00f3w okre\u015blaj\u0105 zatwierdzony stan. Zmienny tag, np. <code>:latest<\/code>, nie wystarcza do odtworzenia wdro\u017cenia.<\/li>\n<li><strong>Odtwarzanie:<\/strong> Historia Git u\u0142atwia \u015bledzenie zmian, ale nie jest z definicji niezmienna. Starsza konfiguracja nie cofa migracji bazy ani usuni\u0119cia plik\u00f3w. Potrzebne s\u0105 osobne kopie zapasowe i sprawdzona procedura odzyskiwania.<\/li>\n<\/ul>\n<figure class=\"lw-diagram\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/diagrams\/dia-431-cicd-20261024.png\" width=\"1120\" height=\"580\" alt=\"Sprawdzone wdro\u017cenie na Raspberry Pi\"><figcaption>Weryfikacja \u017c\u0105dania i celu, wdro\u017cenie konkretnej wersji oraz test dzia\u0142ania aplikacji.<\/figcaption><\/figure>\n<h2>2. Weryfikacja webhooka i wykonanie zadania<\/h2>\n<p>Us\u0142uga nas\u0142uchuj\u0105ca, np. <code>adnanh\/webhook<\/code>, odbiera zdarzenie z repozytorium. Dla GitHub weryfikacja <code>X-Hub-Signature-256<\/code> wykorzystuje niezmienion\u0105 tre\u015b\u0107 \u017c\u0105dania, sekret webhooka i por\u00f3wnanie w sta\u0142ym czasie. HMAC potwierdza podpisan\u0105 tre\u015b\u0107; osobno trzeba sprawdzi\u0107 dozwolone zdarzenie, repozytorium i ga\u0142\u0105\u017a.<\/p>\n<ol>\n<li>Odrzuci\u0107 niepoprawne i niedozwolone \u017c\u0105dania. Zapisywa\u0107 identyfikatory dostarczenia, aby wykrywa\u0107 duplikaty i zapobiega\u0107 ponownemu wykonaniu.<\/li>\n<li>Umie\u015bci\u0107 zatwierdzone zadanie w kolejce bez dost\u0119pu do Dockera. Dowolne pola \u017c\u0105dania nie mog\u0105 stawa\u0107 si\u0119 poleceniami pow\u0142oki.<\/li>\n<li>Osobny proces wykonawczy pobiera zatwierdzony commit do kontrolowanego katalogu wydania. Blokada zapobiega r\u00f3wnoczesnym wdro\u017ceniom tego samego stosu.<\/li>\n<li>Sprawdzi\u0107 pe\u0142n\u0105 konfiguracj\u0119 Compose, jawnie pobra\u0107 lub zbudowa\u0107 obrazy, a nast\u0119pnie uruchomi\u0107 wydanie.<\/li>\n<\/ol>\n<p>Samo <code>docker compose up -d --remove-orphans<\/code> nie tworzy kompletnego potoku. Zmiana obrazu lub konfiguracji powoduje odtworzenie istniej\u0105cego kontenera. Nowsza zawarto\u015b\u0107 niezmienionego tagu w rejestrze nie musi zosta\u0107 pobrana przez to polecenie. Potrzebna jest \u015bwiadomie ustawiona polityka pobierania lub osobny krok pull. Nazwa projektu i zestaw plik\u00f3w Compose musz\u0105 by\u0107 sp\u00f3jne.<\/p>\n<h2>3. Kontrola dzia\u0142ania i obs\u0142uga b\u0142\u0119d\u00f3w<\/h2>\n<p><code>docker compose up --wait --wait-timeout 120<\/code> czeka na stan running lub healthy i w\u0142\u0105cza prac\u0119 w tle. Limit 120 sekund jest przyk\u0142adem. Bez testu zdrowia sprawdzany jest tylko stan uruchomienia us\u0142ugi.<\/p>\n<p>Docker <code>HEALTHCHECK<\/code> okre\u015bla stan po skonfigurowanych odst\u0119pach i nieudanych pr\u00f3bach. Sam status <code>unhealthy<\/code> w zwyk\u0142ym Docker Compose nie wywo\u0142uje restartu ani wycofania wersji. Proces wdro\u017ceniowy wymaga osobnej obs\u0142ugi b\u0142\u0119d\u00f3w, test\u00f3w funkcji aplikacji i u\u017cytecznych log\u00f3w. Dzia\u0142aj\u0105cy proces nie potwierdza poprawnego logowania ani dost\u0119pu do bazy.<\/p>\n<p>Lokalne budowanie na ARM mo\u017ce zast\u0105pi\u0107 kompilacj\u0119 skro\u015bn\u0105, je\u015bli obrazy bazowe i zale\u017cno\u015bci obs\u0142uguj\u0105 docelow\u0105 architektur\u0119. Budowanie obci\u0105\u017ca jednak procesor, pami\u0119\u0107 i no\u015bnik Raspberry Pi.<\/p>\n<h2>4. Oddzielenie dost\u0119pu sieciowego od uprawnie\u0144<\/h2>\n<p>Us\u0142uga odbieraj\u0105ca webhooki powinna dzia\u0142a\u0107 bez uprawnie\u0144 root i bez dost\u0119pu do gniazda Dockera. Grupa <code>docker<\/code> daje uprawnienia na poziomie roota przy zwyk\u0142ym demonie dzia\u0142aj\u0105cym jako root. Proxy tylko do odczytu pozwala sprawdza\u0107 stan, lecz nie wdra\u017ca\u0107 zmian kontener\u00f3w.<\/p>\n<p>Ma\u0142y uprzywilejowany proces wykonawczy mo\u017ce przyjmowa\u0107 wy\u0142\u0105cznie sprawdzone zadania dla ustalonych repozytori\u00f3w i cel\u00f3w. Pliki Compose mog\u0105 \u017c\u0105da\u0107 szerokich uprawnie\u0144 lub montowania plik\u00f3w hosta, dlatego konfiguracja i kod musz\u0105 pochodzi\u0107 z zaufanego \u017ar\u00f3d\u0142a. VLAN zarz\u0105dzaj\u0105cy z regu\u0142ami zapory ogranicza dost\u0119pne \u015bcie\u017cki, ale nie gwarantuje ochrony przed przej\u0119tym urz\u0105dzeniem w dozwolonej sieci.<\/p>\n<h2>5. GitHub Actions i ograniczony klucz SSH<\/h2>\n<p>Runner hostowany przez GitHub mo\u017ce \u0142\u0105czy\u0107 si\u0119 z Pi przez SSH w uwierzytelnionej sieci prywatnej lub VPN. Publiczny port SSH nie jest bezwzgl\u0119dnie wymagany. Runner self-hosted pobiera zadania z GitHub. Aktualna dokumentacja wymienia Linux ARM64, ale nie wymienia ju\u017c ARM32. Przed instalacj\u0105 potrzebna jest weryfikacja systemu, architektury i zgodno\u015bci poszczeg\u00f3lnych Actions.<\/p>\n<p>Runner potrzebuje wychodz\u0105cego HTTPS na porcie 443 do GitHub. Zadania mog\u0105 wymaga\u0107 dodatkowych po\u0142\u0105cze\u0144 z Git, rejestrem obraz\u00f3w lub aplikacjami. Odbieranie zada\u0144 nie wymaga portu przychodz\u0105cego. Prywatne repozytorium nie czyni dowolnego kodu workflow bezpiecznym. Niezaufany kod pull request\u00f3w nie mo\u017ce otrzymywa\u0107 sekret\u00f3w wdro\u017ceniowych ani dost\u0119pu do produkcyjnego Dockera.<\/p>\n<p>Odr\u0119bny klucz wdro\u017ceniowy mo\u017ce mie\u0107 poni\u017cszy wpis w <code>authorized_keys<\/code>. <code>AAAA\u2026<\/code> jest miejscem na pe\u0142ny klucz publiczny:<\/p>\n<pre><code>restrict,command=\"\/usr\/local\/bin\/deploy-stack\" ssh-ed25519 AAAA\u2026 ci-deploy<\/code><\/pre>\n<p><code>command=<\/code> wymusza zapisane polecenie, a <code>restrict<\/code> wy\u0142\u0105cza przekierowania, PTY i <code>~\/.ssh\/rc<\/code>. Skrypt musi odrzuca\u0107 niedozwolone dane, w tym <code>SSH_ORIGINAL_COMMAND<\/code>; zale\u017cno\u015bci i konfiguracja nie mog\u0105 by\u0107 modyfikowane przez wywo\u0142uj\u0105cego. Skradziony klucz nadal umo\u017cliwia wielokrotne wywo\u0142anie dozwolonej operacji. Sam sta\u0142y rozkaz nie stanowi pe\u0142nej granicy bezpiecze\u0144stwa.<\/p>\n<h2>6. Harmonogram aktualizacji obraz\u00f3w<\/h2>\n<p>Pierwotne repozytorium <code>containrrr\/watchtower<\/code> zarchiwizowano 17 grudnia 2025 r. Przed przej\u015bciem na fork spo\u0142eczno\u015bciowy, np. <code>nickfedor\/watchtower<\/code>, trzeba osobno sprawdzi\u0107 wersj\u0119 i zgodno\u015b\u0107 z API Dockera. Sprawdzanie obraz\u00f3w prowadzi do wymiany kontener\u00f3w, ale nie testuje zgodno\u015bci aplikacji.<\/p>\n<p>Podlinkowana dokumentacja Watchtower v1.14.3 podaje domy\u015blny interwa\u0142 86 400 sekund i sze\u015bciopolowy <code>WATCHTOWER_SCHEDULE<\/code>. <code>0 0 4 * * *<\/code> oznacza godzin\u0119 4:00. Jawne <code>TZ=Europe\/Warsaw<\/code> okre\u015bla oczekiwany czas lokalny; udokumentowana strefa domy\u015blna to UTC. Harmonogram i <code>WATCHTOWER_POLL_INTERVAL<\/code> s\u0105 alternatywami.<\/p>\n<p><code>WATCHTOWER_LABEL_ENABLE=true<\/code> wybiera kontenery z etykiet\u0105 <code>com.centurylinklabs.watchtower.enable=true<\/code>. <code>WATCHTOWER_CLEANUP=true<\/code> usuwa stare obrazy po aktualizacji, ale nie zarz\u0105dza wszystkimi logami i danymi wolumen\u00f3w. Mo\u017ce te\u017c usun\u0105\u0107 lokalny obraz potrzebny do wycofania. Dla ka\u017cdej us\u0142ugi powinien dzia\u0142a\u0107 jeden mechanizm aktualizacji, aby GitOps i Watchtower nie tworzy\u0142y niezale\u017cnie sprzecznych stan\u00f3w.<\/p>\n<div class=\"lw-faq\">\n<h2>Pytania i odpowiedzi<\/h2>\n<h3>Jak wycofa\u0107 nieudane wdro\u017cenie?<\/h3>\n<p>Kontrolowane wycofanie przywraca komplet znanego wydania: konfiguracj\u0119, zgodne pliki dodatkowe i konkretne digesty obraz\u00f3w. Cofni\u0119cie tylko jednego pliku Compose mo\u017ce utworzy\u0107 mieszank\u0119 wersji. Zmiana musi r\u00f3wnie\u017c trafi\u0107 do repozytorium, aby nast\u0119pne wdro\u017cenie nie odtworzy\u0142o awarii.<\/p>\n<p>Starszy obraz nie odwraca migracji bazy. Przed wycofaniem potrzebna jest ocena zgodno\u015bci danych oraz, w razie potrzeby, odtworzenie sprawdzonej kopii. Procedura wymaga testu poza produkcj\u0105 i uwzgl\u0119dnienia danych powsta\u0142ych po aktualizacji.<\/p>\n<\/div>\n<div class=\"lw-quellen\">\n<h2>\u0179r\u00f3d\u0142a<\/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<li><a href=\"https:\/\/docs.docker.com\/reference\/cli\/docker\/compose\/up\/\" target=\"_blank\" rel=\"noopener noreferrer\">Recreate, volumes, pull policy, wait and remove-orphans<\/a><\/li>\n<li><a href=\"https:\/\/docs.docker.com\/reference\/dockerfile\/#healthcheck\" target=\"_blank\" rel=\"noopener noreferrer\">Health status, intervals and retries<\/a><\/li>\n<li><a href=\"https:\/\/docs.docker.com\/engine\/containers\/start-containers-automatically\/\" target=\"_blank\" rel=\"noopener noreferrer\">Restart policy operates on process exit<\/a><\/li>\n<li><a href=\"https:\/\/docs.github.com\/en\/webhooks\/using-webhooks\/validating-webhook-deliveries\" target=\"_blank\" rel=\"noopener noreferrer\">HMAC SHA256 and constant-time comparison<\/a><\/li>\n<li><a href=\"https:\/\/docs.github.com\/en\/webhooks\/using-webhooks\/best-practices-for-using-webhooks\" target=\"_blank\" rel=\"noopener noreferrer\">Event checks, queue, delivery IDs<\/a><\/li>\n<li><a href=\"https:\/\/docs.github.com\/en\/actions\/concepts\/runners\/private-networking\" target=\"_blank\" rel=\"noopener noreferrer\">Private network access from hosted runners<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/containrrr\/watchtower\" target=\"_blank\" rel=\"noopener noreferrer\">Original project archived December17,2025<\/a><\/li>\n<\/ul>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>Zarz\u0105dzanie stosem kontener\u00f3w (Home Assistant, Nextcloud, skrypty Python) za pomoc\u0105 metodologii GitOps, Webhook\u00f3w i lokalnych agent\u00f3w bez r\u0119cznego logowania przez SSH.<\/p>\n","protected":false},"author":1,"featured_media":13991,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[23],"tags":[92061,92229,92232,92220,92223,92226],"class_list":["post-431","post","type-post","status-publish","format-standard","hentry","category-raspberry-pi-pl","tag-automation-pl","tag-devops-pl","tag-docker-pl","tag-homelab-pl","tag-raspberry-pi-pl","tag-self-hosting-pl"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.1 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Lokalny CI\/CD dla Raspberry Pi: Automatyzacja wdro\u017ce\u0144 Docker Compose | Lukas Wojcik<\/title>\n<meta name=\"description\" content=\"Automatyczne wdro\u017cenia Docker Compose na Raspberry Pi: GitOps, webhooki, lokalni agenci i zabezpieczenie pipeline CI\/CD.\" \/>\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\/pl\/raspberry-pi-pl\/lokalny-ci-cd-dla-raspberry-pi-automatyzacja-wdrozen-docker-compose\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Lokalny CI\/CD dla Raspberry Pi: Automatyzacja wdro\u017ce\u0144 Docker Compose | Lukas Wojcik\" \/>\n<meta property=\"og:description\" content=\"Automatyczne wdro\u017cenia Docker Compose na Raspberry Pi: GitOps, webhooki, lokalni agenci i zabezpieczenie pipeline CI\/CD.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.lukaswojcik.com\/blog\/pl\/raspberry-pi-pl\/lokalny-ci-cd-dla-raspberry-pi-automatyzacja-wdrozen-docker-compose\/\" \/>\n<meta property=\"og:site_name\" content=\"Lukas Wojcik - Blog\" \/>\n<meta property=\"article:published_time\" content=\"2026-08-31T14:20:00+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-10-23T23:39:04+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/09\/hero-431-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\\\/pl\\\/raspberry-pi-pl\\\/lokalny-ci-cd-dla-raspberry-pi-automatyzacja-wdrozen-docker-compose\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/raspberry-pi-pl\\\/lokalny-ci-cd-dla-raspberry-pi-automatyzacja-wdrozen-docker-compose\\\/\"},\"author\":{\"name\":\"Lukas Wojcik\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#\\\/schema\\\/person\\\/895f7604f9b6b71aad9bba33af28d0f9\"},\"headline\":\"Lokalny CI\\\/CD dla Raspberry Pi: Automatyzacja wdro\u017ce\u0144 Docker Compose\",\"datePublished\":\"2026-08-31T14:20:00+00:00\",\"dateModified\":\"2026-10-23T23:39:04+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/raspberry-pi-pl\\\/lokalny-ci-cd-dla-raspberry-pi-automatyzacja-wdrozen-docker-compose\\\/\"},\"wordCount\":1073,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#\\\/schema\\\/person\\\/895f7604f9b6b71aad9bba33af28d0f9\"},\"image\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/raspberry-pi-pl\\\/lokalny-ci-cd-dla-raspberry-pi-automatyzacja-wdrozen-docker-compose\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/09\\\/hero-431-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\\\/pl\\\/raspberry-pi-pl\\\/lokalny-ci-cd-dla-raspberry-pi-automatyzacja-wdrozen-docker-compose\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/raspberry-pi-pl\\\/lokalny-ci-cd-dla-raspberry-pi-automatyzacja-wdrozen-docker-compose\\\/\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/raspberry-pi-pl\\\/lokalny-ci-cd-dla-raspberry-pi-automatyzacja-wdrozen-docker-compose\\\/\",\"name\":\"Lokalny CI\\\/CD dla Raspberry Pi: Automatyzacja wdro\u017ce\u0144 Docker Compose | Lukas Wojcik\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/raspberry-pi-pl\\\/lokalny-ci-cd-dla-raspberry-pi-automatyzacja-wdrozen-docker-compose\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/raspberry-pi-pl\\\/lokalny-ci-cd-dla-raspberry-pi-automatyzacja-wdrozen-docker-compose\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/09\\\/hero-431-local-ci-cd-raspberry-pi-automating--g.png\",\"datePublished\":\"2026-08-31T14:20:00+00:00\",\"dateModified\":\"2026-10-23T23:39:04+00:00\",\"description\":\"Automatyczne wdro\u017cenia Docker Compose na Raspberry Pi: GitOps, webhooki, lokalni agenci i zabezpieczenie pipeline CI\\\/CD.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/raspberry-pi-pl\\\/lokalny-ci-cd-dla-raspberry-pi-automatyzacja-wdrozen-docker-compose\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/raspberry-pi-pl\\\/lokalny-ci-cd-dla-raspberry-pi-automatyzacja-wdrozen-docker-compose\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/raspberry-pi-pl\\\/lokalny-ci-cd-dla-raspberry-pi-automatyzacja-wdrozen-docker-compose\\\/#primaryimage\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/09\\\/hero-431-local-ci-cd-raspberry-pi-automating--g.png\",\"contentUrl\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/09\\\/hero-431-local-ci-cd-raspberry-pi-automating--g.png\",\"width\":1200,\"height\":630,\"caption\":\"Lokalny CI\\\/CD dla Raspberry Pi: Automatyzacja wdro\u017ce\u0144 Docker Compose\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/raspberry-pi-pl\\\/lokalny-ci-cd-dla-raspberry-pi-automatyzacja-wdrozen-docker-compose\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Lokalny CI\\\/CD dla Raspberry Pi: Automatyzacja wdro\u017ce\u0144 Docker Compose\"}]},{\"@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":"Lokalny CI\/CD dla Raspberry Pi: Automatyzacja wdro\u017ce\u0144 Docker Compose | Lukas Wojcik","description":"Automatyczne wdro\u017cenia Docker Compose na Raspberry Pi: GitOps, webhooki, lokalni agenci i zabezpieczenie pipeline CI\/CD.","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\/pl\/raspberry-pi-pl\/lokalny-ci-cd-dla-raspberry-pi-automatyzacja-wdrozen-docker-compose\/","og_locale":"en_US","og_type":"article","og_title":"Lokalny CI\/CD dla Raspberry Pi: Automatyzacja wdro\u017ce\u0144 Docker Compose | Lukas Wojcik","og_description":"Automatyczne wdro\u017cenia Docker Compose na Raspberry Pi: GitOps, webhooki, lokalni agenci i zabezpieczenie pipeline CI\/CD.","og_url":"https:\/\/www.lukaswojcik.com\/blog\/pl\/raspberry-pi-pl\/lokalny-ci-cd-dla-raspberry-pi-automatyzacja-wdrozen-docker-compose\/","og_site_name":"Lukas Wojcik - Blog","article_published_time":"2026-08-31T14:20:00+00:00","article_modified_time":"2026-10-23T23:39:04+00:00","og_image":[{"width":1200,"height":630,"url":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/09\/hero-431-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\/pl\/raspberry-pi-pl\/lokalny-ci-cd-dla-raspberry-pi-automatyzacja-wdrozen-docker-compose\/#article","isPartOf":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/pl\/raspberry-pi-pl\/lokalny-ci-cd-dla-raspberry-pi-automatyzacja-wdrozen-docker-compose\/"},"author":{"name":"Lukas Wojcik","@id":"https:\/\/www.lukaswojcik.com\/blog\/#\/schema\/person\/895f7604f9b6b71aad9bba33af28d0f9"},"headline":"Lokalny CI\/CD dla Raspberry Pi: Automatyzacja wdro\u017ce\u0144 Docker Compose","datePublished":"2026-08-31T14:20:00+00:00","dateModified":"2026-10-23T23:39:04+00:00","mainEntityOfPage":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/pl\/raspberry-pi-pl\/lokalny-ci-cd-dla-raspberry-pi-automatyzacja-wdrozen-docker-compose\/"},"wordCount":1073,"commentCount":0,"publisher":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/#\/schema\/person\/895f7604f9b6b71aad9bba33af28d0f9"},"image":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/pl\/raspberry-pi-pl\/lokalny-ci-cd-dla-raspberry-pi-automatyzacja-wdrozen-docker-compose\/#primaryimage"},"thumbnailUrl":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/09\/hero-431-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\/pl\/raspberry-pi-pl\/lokalny-ci-cd-dla-raspberry-pi-automatyzacja-wdrozen-docker-compose\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.lukaswojcik.com\/blog\/pl\/raspberry-pi-pl\/lokalny-ci-cd-dla-raspberry-pi-automatyzacja-wdrozen-docker-compose\/","url":"https:\/\/www.lukaswojcik.com\/blog\/pl\/raspberry-pi-pl\/lokalny-ci-cd-dla-raspberry-pi-automatyzacja-wdrozen-docker-compose\/","name":"Lokalny CI\/CD dla Raspberry Pi: Automatyzacja wdro\u017ce\u0144 Docker Compose | Lukas Wojcik","isPartOf":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/pl\/raspberry-pi-pl\/lokalny-ci-cd-dla-raspberry-pi-automatyzacja-wdrozen-docker-compose\/#primaryimage"},"image":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/pl\/raspberry-pi-pl\/lokalny-ci-cd-dla-raspberry-pi-automatyzacja-wdrozen-docker-compose\/#primaryimage"},"thumbnailUrl":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/09\/hero-431-local-ci-cd-raspberry-pi-automating--g.png","datePublished":"2026-08-31T14:20:00+00:00","dateModified":"2026-10-23T23:39:04+00:00","description":"Automatyczne wdro\u017cenia Docker Compose na Raspberry Pi: GitOps, webhooki, lokalni agenci i zabezpieczenie pipeline CI\/CD.","breadcrumb":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/pl\/raspberry-pi-pl\/lokalny-ci-cd-dla-raspberry-pi-automatyzacja-wdrozen-docker-compose\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.lukaswojcik.com\/blog\/pl\/raspberry-pi-pl\/lokalny-ci-cd-dla-raspberry-pi-automatyzacja-wdrozen-docker-compose\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.lukaswojcik.com\/blog\/pl\/raspberry-pi-pl\/lokalny-ci-cd-dla-raspberry-pi-automatyzacja-wdrozen-docker-compose\/#primaryimage","url":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/09\/hero-431-local-ci-cd-raspberry-pi-automating--g.png","contentUrl":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/09\/hero-431-local-ci-cd-raspberry-pi-automating--g.png","width":1200,"height":630,"caption":"Lokalny CI\/CD dla Raspberry Pi: Automatyzacja wdro\u017ce\u0144 Docker Compose"},{"@type":"BreadcrumbList","@id":"https:\/\/www.lukaswojcik.com\/blog\/pl\/raspberry-pi-pl\/lokalny-ci-cd-dla-raspberry-pi-automatyzacja-wdrozen-docker-compose\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.lukaswojcik.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Lokalny CI\/CD dla Raspberry Pi: Automatyzacja wdro\u017ce\u0144 Docker Compose"}]},{"@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\/431","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=431"}],"version-history":[{"count":8,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/posts\/431\/revisions"}],"predecessor-version":[{"id":23029,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/posts\/431\/revisions\/23029"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/media\/13991"}],"wp:attachment":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/media?parent=431"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/categories?post=431"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/tags?post=431"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}