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ć.

Certyfikat Tier III ISO 9001 ISO/IEC 27001 ISO 14001 Zgodność z RODO

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.

Pierwszy runner
15.00
miesięcznie

Zamów teraz
serwer i jeden agent razem
2 vCPU
4 GB RAM
64 GB NVMe
1 statyczny IPv4
1 tygodniowa kopia zapasowa w cenie
Runner dla zespołu
19.96
miesięcznie

Zamów teraz
serwer plus kilka równoległych workflow
4 vCPU
8 GB RAM
120 GB NVMe
1 statyczny IPv4
1 tygodniowa kopia zapasowa w cenie
Obciążona pula
39.90
miesięcznie

Zamów teraz
dedykowany host agenta obok serwera
8 vCPU
16 GB RAM
240 GB NVMe
1 statyczny IPv4
1 tygodniowa kopia zapasowa w cenie

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.

  1. Zainstaluj Dockera i Compose

    sudo apt install docker.io docker-compose-v2
    sudo systemctl enable --now docker

    Oba kontenery i każdy krok potoku działają na tym demonie, więc to jedyna zależność, jakiej host potrzebuje.

  2. 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/authorize

    Woodpecker 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.

  3. Wygeneruj wspólny sekret agenta

    openssl rand -hex 32

    Serwer 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.

  4. 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.

  5. Uruchom

    docker compose up -d
    docker compose logs -f woodpecker-agent

    Agent łą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.

  6. 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łaciszZa każdą minutę każdego zadania, tak długo jak projekt istniejeZa stały miesięczny host, cokolwiek potok robi w danym miesiącu
Kompilacja, która zwalniaKosztuje więcej w każdym miesiącu, w którym pozostaje wolnaNie kosztuje nic więcej - maszyna jest już opłacona
Pamięć podręczna warstw DockeraZimna przy każdym zadaniu, o ile sam jej nie wyślesz i nie pobierzeszCiepła na lokalnym NVMe, między zadaniami i między dniami
RównoległośćPróg planu, który się podnosiLiczba, którą ustawiasz we własnym pliku konfiguracyjnym
Gdzie ląduje checkoutNa 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ącyWielki współdzielony zakres, którego nic nie dopuściJeden statyczny IPv4 z AS204057, Twój do dopuszczenia
Co maszyna może pomieścićTo, co akurat niesie obraz runneraDowolny łańcuch narzędzi, licencję albo zestaw danych zainstalowany raz

Jak to rusza na Twoim hoście

1

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.

2

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.

3

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.

4

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

Serwery w chmurze od 15 €/mies.