Woodpecker CI, bez żadnego SaaS po drodze
Serwer i agenci na jednej małej maszynie w Pradze lub Covilhã, podłączeni do Twojej własnej kuźni - wersja CI, w której nic z potoku nie opuszcza infrastruktury, którą potrafisz nazwać.
Dla kogo to jest
Zespół, który i tak hostuje u siebie całą resztę
Kuźnia jest Twoja, rejestr jest Twój, cel wdrożenia jest Twój - a CI to jedyny skok, który wciąż wychodzi poza budynek, akurat ten skok, który trzyma kod źródłowy.
Instalacja Drone, która stanęła w miejscu
Woodpecker to fork, który poszedł dalej i został przy Apache-2.0. Migracja jest niewielka; pytanie brzmi, na czym to uruchomić.
Mały zespół, który chce, żeby CI było nudne
Dwa kontenery, jeden plik YAML na repozytorium, żadnej warstwy sterowania do nauczenia i żadnego licznika minut do pilnowania. Potrzebuje tylko miejsca, w którym może mieszkać.
Co daje ten układ
- Serwer i agent jako dwa kontenery na jednym hoście, na tyle małym, że CI przestaje być projektem infrastrukturalnym.
- Dowolna kuźnia wspierana przez Woodpeckera - GitHub, GitLab, Gitea, Forgejo albo Bitbucket - w tym taka, którą sam hostujesz w tej samej sieci.
- Agenci dodawani później jako osobne hosty, wszyscy uwierzytelniani na tym samym serwerze, kiedy jedna maszyna przestaje wystarczać.
- Apache-2.0 od początku do końca, więc nic w potoku nie zależy od tego, czy dostawca zdecyduje się utrzymać darmowy plan.
- Statyczny IPv4 z AS204057, dzięki czemu webhook kuźni i cel wdrożenia mają jeden adres, któremu mogą ufać.
- Lokalne NVMe na katalog roboczy i pamięć podręczną warstw Dockera, ciepłą między potokami.
Dobrane do tego, co potok naprawdę robi
Sam Woodpecker jest lekki: serwer to mały proces w Go z wbudowaną bazą danych, dopóki nie skierujesz go na Postgresa, a agent to nadzorca uruchamiający kontenery. Host zużywa kompilacja, dokładnie jak przy każdym innym runnerze - dobierz więc maszynę pod najcięższe zadanie i daj dyskowi miejsce na pamięć podręczną warstw, która przyspiesza drugi potok. Rozmiar wejściowy poniżej z zapasem unosi serwer i agenta razem dla małego zespołu. Jedno uczciwe zastrzeżenie: stały miesięczny host kosztuje tyle samo w tygodniu bez wypchnięć, gdzie hostowane minuty CI nie kosztują nic.
Jak zainstalować Woodpecker CI z Docker Compose
Serwer i agent na jednym hoście, w tym przykładzie podłączeni do GitHuba. Podmień blok kuźni na zmienne Gitea, Forgejo, GitLaba albo Bitbucketa, jeśli Twoja kuźnia jest jedną z nich.
-
Zainstaluj Dockera i Compose
sudo apt install docker.io docker-compose-v2 sudo systemctl enable --now dockerOba kontenery i każdy krok potoku działają na tym demonie, więc to jedyna zależność, jakiej host potrzebuje.
-
Zarejestruj aplikację OAuth w swojej kuźni
# GitHub: Settings -> Developer settings -> OAuth Apps -> New OAuth App # Homepage URL: https://ci.example.com # Authorization callback: https://ci.example.com/authorizeWoodpecker loguje użytkowników przez kuźnię i z tym uprawnieniem czyta repozytoria, więc identyfikator klienta i sekret, które zwraca, są tym, czego potrzebuje serwer. Każda wspierana kuźnia ma odpowiedni formularz.
-
Wygeneruj wspólny sekret agenta
openssl rand -hex 32Serwer i agenci uwierzytelniają się wzajemnie tym ciągiem, a dokumentacja Woodpeckera wskazuje dokładnie to polecenie do jego wytworzenia. Trzymaj go poza plikiem compose - umieść go w pliku .env obok.
-
Napisz plik compose
services: woodpecker-server: image: woodpeckerci/woodpecker-server:v3 ports: - 8000:8000 volumes: - woodpecker-server-data:/var/lib/woodpecker/ environment: - WOODPECKER_OPEN=true - WOODPECKER_HOST=${WOODPECKER_HOST} - WOODPECKER_GITHUB=true - WOODPECKER_GITHUB_CLIENT=${WOODPECKER_GITHUB_CLIENT} - WOODPECKER_GITHUB_SECRET=${WOODPECKER_GITHUB_SECRET} - WOODPECKER_AGENT_SECRET=${WOODPECKER_AGENT_SECRET} woodpecker-agent: image: woodpeckerci/woodpecker-agent:v3 command: agent restart: always depends_on: - woodpecker-server volumes: - woodpecker-agent-config:/etc/woodpecker - /var/run/docker.sock:/var/run/docker.sock environment: - WOODPECKER_SERVER=woodpecker-server:9000 - WOODPECKER_AGENT_SECRET=${WOODPECKER_AGENT_SECRET} volumes: woodpecker-server-data: woodpecker-agent-config:To przykład od twórców. WOODPECKER_HOST to publiczny adres, pod który trafiają użytkownicy i webhooki, port 8000 to interfejs webowy, a 9000 to port gRPC, na którym łączą się agenci. WOODPECKER_OPEN=true wpuszcza każdego, kto ma konto w kuźni - wyłącz to, gdy Twój zespół będzie już zarejestrowany.
-
Uruchom
docker compose up -d docker compose logs -f woodpecker-agentAgent łączy się z serwerem wspólnym sekretem i sam się rejestruje przy pierwszym kontakcie. Jeśli zapętla się na błędzie uwierzytelniania, oba sekrety się nie zgadzają - najczęściej dlatego, że plik .env nie został wczytany.
-
Dodaj potok
when: - event: push steps: - name: smoke image: alpine:latest commands: - cat /etc/os-release - echo "built on $CI_MACHINE"Zatwierdź to jako .woodpecker.yaml, włącz repozytorium w interfejsie webowym, żeby powstał webhook, i wypchnij zmiany. Każdy krok jest kontenerem, i właśnie dlatego agent potrzebuje gniazda Dockera.
Sprawdzone z oficjalną dokumentacją dnia 2026-08-15 — przeczytaj źródło
Czym nie jesteśmy
- Nie jesteśmy projektem Woodpecker. Woodpecker CI to niezależny projekt na licencji Apache-2.0 i nic tutaj nie jest przez niego firmowane. Sprzedajemy maszynę, na której działa.
- Na tej stronie nie hostujemy Twojej kuźni. Gitea, Forgejo albo samodzielnie zarządzany GitLab obok to prosty drugi serwer, ale to inny rozmiar i inna wycena.
- Nie piszemy Twoich potoków. YAML jest Twój; host, sieć i adres są nasze.
- Woodpecker nie jest domyślnie zarządzany za Ciebie. Oba kontenery uruchamiasz sam albo dokładasz naszą usługę administracji, a my trzymamy je aktualne i zabezpieczone kopią.
- Podmontowanie gniazda Dockera do agenta daje krokom potoku bardzo dużą władzę nad hostem. Tak działa ten projekt i to jest powód, żeby trzymać agenta na maszynie, która nie robi nic innego.
Elementy, które zespoły odkrywają za późno
- WOODPECKER_AGENT_SECRET ma dwa tryby. Ta sama wartość na serwerze i wszystkich agentach to token systemowy; token per agent bierze się z wcześniejszego zarejestrowania agenta w interfejsie, czego chcesz, gdy tylko więcej niż jeden zespół może dosięgnąć hosta.
- Każda wrażliwa zmienna ma też postać _FILE, dzięki czemu sekret można wczytać z podmontowanego pliku, zamiast trzymać go w pliku compose albo w środowisku.
- Wbudowana baza danych jest w porządku na początek i mimo to jest pierwszą rzeczą do przeniesienia. Skieruj serwer na Postgresa, zanim instalacja zacznie dla kogokolwiek mieć znaczenie.
- WOODPECKER_OPEN=true oznacza, że każde konto w podłączonej kuźni może się zalogować. Wygodne pierwszego dnia i błędne trzydziestego.
- Agent potrzebuje gniazda Dockera, bo każdy krok jest kontenerem, co faktycznie daje potokowi roota na tym hoście. Trzymaj host agenta nudnym i osobnym.
- WOODPECKER_HOST musi być adresem, pod który kuźnia naprawdę może się dostać, a nie wewnętrznym - webhook powstaje właśnie na jego podstawie, a adres prywatny w tym miejscu daje potoki, które nigdy się nie uruchamiają.
Minuty CI u dostawcy kontra własny runner
| Minuty CI hostowane przez dostawcę | Runner w DCXV | |
|---|---|---|
| Za co płacisz | Za każdą minutę każdego zadania, tak długo jak projekt istnieje | Za stały miesięczny host, cokolwiek potok robi w danym miesiącu |
| Kompilacja, która zwalnia | Kosztuje więcej w każdym miesiącu, w którym pozostaje wolna | Nie kosztuje nic więcej - maszyna jest już opłacona |
| Pamięć podręczna warstw Dockera | Zimna przy każdym zadaniu, o ile sam jej nie wyślesz i nie pobierzesz | Ciepła na lokalnym NVMe, między zadaniami i między dniami |
| Równoległość | Próg planu, który się podnosi | Liczba, którą ustawiasz we własnym pliku konfiguracyjnym |
| Gdzie ląduje checkout | Na współdzielonej flocie, często w regionie, którego nie da się wskazać | Na jednej maszynie w Pradze lub Covilhã, na umowie cypryjskiej |
| Adres wychodzący | Wielki współdzielony zakres, którego nic nie dopuści | Jeden statyczny IPv4 z AS204057, Twój do dopuszczenia |
| Co maszyna może pomieścić | To, co akurat niesie obraz runnera | Dowolny łańcuch narzędzi, licencję albo zestaw danych zainstalowany raz |
Jak to rusza na Twoim hoście
Powiedz, co robi potok
Najcięższe zadanie, jakie dziś uruchamiasz, ile ich ma iść naraz i czy buduje obrazy kontenerów. To wystarczy, żeby dobrać host bez zgadywania.
Przekazujemy maszynę
Praga albo Covilhã, dostęp root i statyczny IPv4, w niecałe dziesięć minut. Przynieś własny obraz, jeśli runner już w nim siedzi.
Wykonaj instrukcję z tej strony
To sekwencja producenta, wzięta z jego aktualnej dokumentacji, a nie z wpisu na blogu, i na czystym hoście zajmuje kilka minut.
Zrób migawkę, potem dołóż drugi
Zrób migawkę, gdy pierwszy potok świeci na zielono, żeby kolejna maszyna była odtworzeniem, a nie budową od zera. Pula rośnie przez dokładanie hostów, a nie przez rozdymanie jednego.
Dlaczego nas wybrać
- Obiekty certyfikowane Tier III, SLA obiektu 99,982 %
- Własna sieć, AS204057, IPv4 i IPv6
- Wsparcie 24/7/365 ze średnim czasem odpowiedzi około 10 minut
- Spółka cypryjska, jurysdykcja UE, zgodność z RODO od 2007 roku
FAQ
- Czym jest Woodpecker CI?
Lekkim silnikiem CI na licencji Apache-2.0, forkiem Drone, działającym jako serwer plus jeden albo więcej agentów. Każdy krok potoku jest kontenerem, potoki to plik YAML w repozytorium, a logowanie idzie przez Twoją kuźnię. Wspiera GitHuba, GitLaba, Gitea, Forgejo i Bitbucketa, w tym instancje, które hostujesz sam
- Jak zainstalować Woodpecker CI?
Docker Compose to udokumentowana droga: jeden kontener woodpecker-server wystawiający port 8000 i jeden kontener woodpecker-agent z podmontowanym gniazdem Dockera, dzielące sekret wygenerowany poleceniem openssl rand -hex 32, plus identyfikator klienta i sekret OAuth Twojej kuźni. Plik compose od twórców i kroki wokół niego są na tej stronie
- Czym jest WOODPECKER_AGENT_SECRET i jak go wygenerować?
To wspólny sekret, którym uwierzytelniają się serwer i agenci, a dokumentacja Woodpeckera wskazuje do jego wytworzenia openssl rand -hex 32. Ustawienie tej samej wartości wszędzie czyni z niego token systemowy; wcześniejsze zarejestrowanie agenta w interfejsie daje temu agentowi własny token, czego chcesz, gdy tylko więcej niż jeden zespół może dosięgnąć hosta. Każda wrażliwa zmienna ma też postać _FILE, żeby wczytać wartość z podmontowanego pliku
- Jakiego rozmiaru serwera potrzebuje Woodpecker?
Samo oprogramowanie jest lekkie - serwer to mały proces w Go z wbudowaną bazą danych, dopóki nie skierujesz go na Postgresa, a agent to nadzorca uruchamiający kontenery. Maszynę zużywa kompilacja. 2 vCPU, 4 GB i 64 GB NVMe unoszą serwer i agenta razem dla małego zespołu; przejdź na dedykowany host agenta, gdy tylko potoki zaczną się ustawiać w kolejce
- Dlaczego agent potrzebuje gniazda Dockera?
Bo każdy krok potoku jest kontenerem, który agent uruchamia na demonie hosta. To faktycznie daje krokom potoku roota na tej maszynie, co jest założeniem projektu, a nie błędem konfiguracji - i jest powodem, żeby trzymać agenta na hoście, który nie robi nic innego, co jest tanie, gdy druga maszyna kosztuje 15 EUR miesięcznie
- Moje potoki nigdy się nie uruchamiają. Co jest nie tak?
W dziewięciu przypadkach na dziesięć chodzi o WOODPECKER_HOST. Ta wartość to publiczny adres, którego kuźnia używa przy tworzeniu webhooka, więc adres wewnętrzny w tym miejscu daje instalację, która wygląda zdrowo i nigdy nie dostaje wypchnięcia. Drugi częsty przypadek to WOODPECKER_OPEN=true, co nie jest problemem z uruchamianiem, ale oznacza, że każde konto w Twojej kuźni może się zalogować - wygodne pierwszego dnia, błędne trzydziestego
Jeśli potrzebujesz pomocy lub masz dodatkowe pytania, skontaktuj się z menedżerami lub napisz do zespołu wsparcia pod adresem support@dcxv.com
Gotowy na rozpoczęcie?
Rozliczenie miesięczne, bez opłaty aktywacyjnej, bez umowy na czas określony