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, включите репозиторий в веб-интерфейсе, чтобы создался вебхук, и сделайте push. Каждый шаг - это контейнер, и именно поэтому агенту нужен сокет 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, который кузница использует при создании вебхука, поэтому внутренний адрес здесь даёт инсталляцию, выглядящую здоровой и никогда не получающую push. Второй частый случай - WOODPECKER_OPEN=true: это не проблема срабатывания, но означает, что любая учётная запись в вашей кузнице может войти - удобно в первый день, неверно в тридцатый
Если вам нужна помощь или у вас возникли дополнительные вопросы, пожалуйста, обращайтесь к менеджерам или напишите в службу поддержки по адресу support@dcxv.com
Готовы начать?
- Оплата ежемесячно
- Без платы за подключение
- Без привязки