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

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?

Serwery w chmurze od 15 €/mies.
  • Rozliczenie miesięczne
  • Bez opłaty aktywacyjnej
  • Bez umowy na czas określony