Woodpecker CI, без жодного SaaS у ланцюжку
Сервер і агенти на одній невеликій машині в Празі чи Ковільяні, під'єднані до вашої власної кузні, - версія CI, у якій ніщо з конвеєра не залишає інфраструктури, яку ви можете назвати.
Для кого це
Команда, яка вже розміщує в себе все інше
Кузня ваша, реєстр ваш, ціль розгортання ваша - а CI лишається єдиним переходом, що досі виходить за межі будівлі, саме тим переходом, який тримає код.
Інсталяція Drone, що зупинилася
Woodpecker - це форк, який пішов далі й лишився під Apache-2.0. Міграція невелика; питання в тому, на чому це запускати.
Невелика команда, яка хоче, щоб CI було нудним
Два контейнери, файл YAML на репозиторій, жодної площини керування, яку треба вивчати, і жодного лічильника хвилин, за яким треба стежити. Йому потрібне лише місце, де жити.
Що дає ця форма
- Сервер і агент як два контейнери на одному хості, достатньо малому, щоб CI перестало бути інфраструктурним проєктом.
- Будь-яка кузня, яку підтримує Woodpecker - GitHub, GitLab, Gitea, Forgejo чи Bitbucket, - зокрема й та, що ви розмістили самі в тій самій мережі.
- Агенти, додані згодом як окремі хости, усі автентифіковані на тому самому сервері, коли однієї машини вже замало.
- Apache-2.0 наскрізь, тож ніщо в конвеєрі не залежить від рішення постачальника зберігати безкоштовний тариф.
- Статична IPv4 з AS204057, щоб вебхук кузні й ціль розгортання мали одну адресу, якій можна довіряти.
- Локальний NVMe для робочого каталогу й кешу шарів Docker, теплий між конвеєрами.
Розмір за тим, що конвеєр робить насправді
Сам Woodpecker легкий: сервер - невеликий процес на Go з вбудованою базою даних, доки ви не спрямуєте його на Postgres, а агент - наглядач, що запускає контейнери. Хост споживає збірка, точно як із будь-яким іншим runner, - тож підбирайте машину за найважчим завданням і дайте диску місце під кеш шарів, який робить другий конвеєр швидким. Початковий розмір нижче з запасом тримає сервер і агента разом для невеликої команди. Єдине чесне застереження: фіксований місячний хост коштує так само у тиждень без пушів, коли розміщені хвилини CI не коштують нічого.
Як встановити Woodpecker CI з Docker Compose
Сервер і агент на одному хості, у цьому прикладі під'єднані до GitHub. Замініть блок кузні на змінні Gitea, Forgejo, GitLab чи Bitbucket, якщо ваша кузня одна з них.
-
Встановіть Docker і Compose
sudo apt install docker.io docker-compose-v2 sudo systemctl enable --now dockerОбидва контейнери й кожен крок конвеєра працюють на цьому демоні, тож це єдина залежність, потрібна хосту.
-
Зареєструйте застосунок OAuth у вашій кузні
# GitHub: Settings -> Developer settings -> OAuth Apps -> New OAuth App # Homepage URL: https://ci.example.com # Authorization callback: https://ci.example.com/authorizeWoodpecker автентифікує користувачів через кузню і з цим дозволом читає репозиторії, тож ідентифікатор клієнта й секрет, які вона повертає, - це те, що потрібне серверу. Кожна підтримувана кузня має відповідну форму.
-
Згенеруйте спільний секрет агента
openssl rand -hex 32Сервер і агенти автентифікують одне одного цим рядком, а документація Woodpecker називає саме цю команду для його створення. Тримайте його поза файлом compose - покладіть у файл .env поруч.
-
Напишіть файл 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:Це приклад від розробників. WOODPECKER_HOST - публічна URL-адреса, до якої звертаються користувачі й вебхуки, порт 8000 - вебінтерфейс, а 9000 - порт gRPC, до якого під'єднуються агенти. WOODPECKER_OPEN=true впускає будь-кого з обліковим записом у кузні - вимкніть це, щойно ваша команда зареєструється.
-
Запустіть
docker compose up -d docker compose logs -f woodpecker-agentАгент під'єднується до сервера зі спільним секретом і сам реєструється при першому контакті. Якщо він зациклюється на помилці автентифікації, два секрети не збігаються - найчастіше тому, що файл .env не було прочитано.
-
Додайте конвеєр
when: - event: push steps: - name: smoke image: alpine:latest commands: - cat /etc/os-release - echo "built on $CI_MACHINE"Закомітьте це як .woodpecker.yaml, увімкніть репозиторій у вебінтерфейсі, щоб створився вебхук, і запуште. Кожен крок - це контейнер, і саме тому агенту потрібен сокет Docker.
Звірено з офіційною документацією 2026-08-15 — читати першоджерело
Чим ми не є
- Ми не проєкт Woodpecker. Woodpecker CI - незалежний проєкт під Apache-2.0, і ніщо тут ним не схвалене. Ми продаємо машину, на якій він працює.
- На цій сторінці ми не розміщуємо вашу кузню. Gitea, Forgejo чи самокерований GitLab поруч - це нескладний другий сервер, але інший розмір і інша пропозиція.
- Ми не пишемо ваші конвеєри. YAML ваш; хост, мережа й адреса - наші.
- Woodpecker типово не обслуговується за вас. Два контейнери запускаєте ви або додаєте нашу послугу адміністрування, і ми тримаємо їх оновленими та з резервними копіями.
- Монтування сокета Docker в агента дає крокам конвеєра дуже велику владу над хостом. Саме так працює цей задум, і це причина тримати агента на машині, яка більше нічого не робить.
Частини, які команди виявляють запізно
- WOODPECKER_AGENT_SECRET має два режими. Однакове значення на сервері й усіх агентах - це системний токен; токен на кожного агента з'являється, якщо спершу зареєструвати агента в інтерфейсі, чого ви й хочете, щойно до хоста може дістатися більш ніж одна команда.
- Кожна чутлива змінна має також форму _FILE, тож секрет можна прочитати зі змонтованого файлу, а не тримати у файлі compose чи в середовищі.
- Вбудована база даних годиться для початку і все одно є першим, що варто перенести. Спрямуйте сервер на Postgres, перш ніж інсталяція почне для когось важити.
- WOODPECKER_OPEN=true означає, що будь-який обліковий запис у під'єднаній кузні може увійти. Зручно першого дня і хибно тридцятого.
- Агенту потрібен сокет Docker, бо кожен крок - це контейнер, що фактично дає конвеєру root на цьому хості. Тримайте хост агента нудним і окремим.
- WOODPECKER_HOST має бути тією URL-адресою, до якої кузня справді може дістатися, а не внутрішньою: вебхук створюється саме на неї, і приватна адреса тут дає конвеєри, які ніколи не спрацьовують.
Хвилини CI у провайдера проти власного runner
| Хвилини CI на боці провайдера | Раннер на DCXV | |
|---|---|---|
| За що ви платите | За кожну хвилину кожного завдання, доки існує проєкт | За фіксований місячний хост, хоч би що конвеєр робив того місяця |
| Збірка, що сповільнюється | Коштує більше кожного місяця, поки лишається повільною | Не коштує нічого більше - машина вже оплачена |
| Кеш шарів Docker | Холодний на кожному завданні, якщо ви самі його не вивантажите й не завантажите | Теплий на локальному NVMe, між завданнями і між днями |
| Паралельність | Щабель тарифу, який підвищують | Число, яке ви задаєте у власному файлі конфігурації |
| Куди потрапляє checkout | На спільний парк машин, часто в регіоні, який неможливо зафіксувати | На одну машину в Празі чи Ковільяні, за кіпрським договором |
| Вихідна адреса | Величезний спільний діапазон, який нічим не дозволити | Одна статична IPv4 з AS204057, ваша, щоб її дозволяти |
| Що може вмістити машина | Те, що випадково несе образ runner | Будь-який набір інструментів, ліцензію чи набір тестових даних, встановлений один раз |
Як це запускається на вашому хості
Скажіть, що робить конвеєр
Найважче завдання, яке ви виконуєте сьогодні, скільки їх має йти одночасно і чи збирає воно образи контейнерів. Цього досить, щоб підібрати хост без здогадок.
Ми передаємо машину
Прага чи Ковільян, доступ root і статична IPv4, менш ніж за десять хвилин. Принесіть власний образ, якщо runner уже всередині нього.
Виконайте покрокову інструкцію з цієї сторінки
Це послідовність від виробника, взята з його чинної документації, а не з допису в блозі, і на чистому хості вона займає кілька хвилин.
Зробіть знімок, а тоді додайте другий
Зробіть знімок, щойно перший конвеєр стане зеленим, щоб наступна машина була відновленням, а не побудовою з нуля. Пул росте додаванням хостів, а не роздуванням одного.
Чому обирають нас
- Сертифіковані об'єкти Tier III, SLA об'єкта 99.982%
- Власна мережа, AS204057, IPv4 та IPv6
- Підтримка 24/7/365 із середнім часом відповіді близько 10 хвилин
- Компанія на Кіпрі, юрисдикція ЄС, відповідність GDPR з 2007 року
FAQ
- Що таке Woodpecker CI?
Легкий рушій CI під Apache-2.0, форк Drone, що працює як сервер плюс один або кілька агентів. Кожен крок конвеєра - контейнер, конвеєри описані файлом YAML у репозиторії, а вхід іде через вашу кузню. Підтримуються GitHub, GitLab, Gitea, Forgejo і Bitbucket, зокрема екземпляри, які ви розміщуєте самі
- Як встановити Woodpecker CI?
Docker Compose - задокументований шлях: один контейнер woodpecker-server із портом 8000 і один контейнер woodpecker-agent зі змонтованим сокетом Docker, які поділяють секрет, згенерований командою openssl rand -hex 32, плюс ідентифікатор клієнта й секрет OAuth вашої кузні. Файл compose від розробників і кроки навколо нього є на цій сторінці
- Що таке WOODPECKER_AGENT_SECRET і як його згенерувати?
Це спільний секрет, яким автентифікуються сервер і агенти, і документація Woodpecker називає для його створення openssl rand -hex 32. Однакове значення всюди робить із нього системний токен; попередня реєстрація агента в інтерфейсі дає цьому агенту власний токен, чого ви й хочете, щойно до хоста може дістатися більш ніж одна команда. Кожна чутлива змінна має також форму _FILE, щоб читати значення зі змонтованого файлу
- Якого розміру сервер потрібен Woodpecker?
Саме програмне забезпечення легке - сервер є невеликим процесом на Go з вбудованою базою даних, доки ви не спрямуєте його на Postgres, а агент є наглядачем, що запускає контейнери. Машину споживає збірка. 2 vCPU, 4 ГБ і 64 ГБ NVMe тримають сервер і агента разом для невеликої команди; переходьте на виділений хост агента, щойно конвеєри почнуть ставати в чергу
- Навіщо агенту сокет Docker?
Бо кожен крок конвеєра - це контейнер, який агент запускає на демоні хоста. Це фактично дає крокам конвеєра root на цій машині, що є задумом, а не хибним налаштуванням, - і це причина тримати агента на хості, який більше нічого не робить, що недорого, коли друга машина коштує 15 EUR на місяць
- Мої конвеєри ніколи не спрацьовують. У чому річ?
У дев'яти випадках із десяти річ у WOODPECKER_HOST. Це значення є публічною URL-адресою, яку кузня використовує, створюючи вебхук, тож внутрішня адреса тут дає інсталяцію, що виглядає здоровою і ніколи не отримує пушу. Другий поширений випадок - WOODPECKER_OPEN=true: це не проблема спрацьовування, але означає, що будь-який обліковий запис у вашій кузні може увійти - зручно першого дня, хибно тридцятого
Якщо вам потрібна допомога або у вас виникли додаткові питання, будь ласка, звертайтеся до менеджерів або напишіть у службу підтримки за адресою support@dcxv.com
Готові розпочати?
Оплата щомісяця, без плати за підключення, без прив'язки