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
Często zadawane pytania
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