Woodpecker CI, без единого SaaS в цепочке

Сервер и агенты на одной небольшой машине в Праге или Ковильяне, подключённые к вашей собственной кузнице, - версия CI, в которой ничто из конвейера не покидает инфраструктуру, которую вы можете назвать.

Сертифицировано по Tier III ISO 9001 ISO/IEC 27001 ISO 14001 Соответствует GDPR

Для кого это

Команда, которая уже размещает у себя всё остальное

Кузница ваша, реестр ваш, цель развёртывания ваша - а 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 не стоят ничего.

Первый раннер
15.00
в месяц

Заказать
сервер и один агент вместе
2 vCPU
4 GB RAM
64 GB NVMe
1 статический IPv4
1 еженедельная резервная копия включена
Раннер для команды
19.96
в месяц

Заказать
сервер плюс пара параллельных workflow
4 vCPU
8 GB RAM
120 GB NVMe
1 статический IPv4
1 еженедельная резервная копия включена
Нагруженный пул
39.90
в месяц

Заказать
выделенный хост агента рядом с сервером
8 vCPU
16 GB RAM
240 GB NVMe
1 статический IPv4
1 еженедельная резервная копия включена

Как установить Woodpecker CI с Docker Compose

Сервер и агент на одном хосте, в этом примере подключённые к GitHub. Замените блок кузницы на переменные Gitea, Forgejo, GitLab или Bitbucket, если ваша кузница одна из них.

  1. Установите Docker и Compose

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

    Оба контейнера и каждый шаг конвейера работают на этом демоне, поэтому это единственная зависимость, нужная хосту.

  2. Зарегистрируйте приложение OAuth в вашей кузнице

    # GitHub: Settings -> Developer settings -> OAuth Apps -> New OAuth App
    # Homepage URL:     https://ci.example.com
    # Authorization callback: https://ci.example.com/authorize

    Woodpecker аутентифицирует пользователей через кузницу и с этим разрешением читает репозитории, поэтому идентификатор клиента и секрет, которые она возвращает, - это то, что нужно серверу. У каждой поддерживаемой кузницы есть соответствующая форма.

  3. Сгенерируйте общий секрет агента

    openssl rand -hex 32

    Сервер и агенты аутентифицируют друг друга этой строкой, а документация Woodpecker называет именно эту команду для её создания. Держите её вне файла compose - положите в файл .env рядом.

  4. Напишите файл 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 впускает любого, у кого есть учётная запись в кузнице - выключите это, как только ваша команда зарегистрируется.

  5. Запустите

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

    Агент подключается к серверу с общим секретом и сам регистрируется при первом контакте. Если он зацикливается на ошибке аутентификации, два секрета не совпадают - чаще всего потому, что файл .env не был прочитан.

  6. Добавьте конвейер

    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Любой набор инструментов, лицензию или набор тестовых данных, установленный один раз

Как это запускается на вашем хосте

1

Скажите, что делает конвейер

Самая тяжёлая задача, которую вы выполняете сегодня, сколько их должно идти одновременно и собирает ли она образы контейнеров. Этого достаточно, чтобы подобрать хост без догадок.

2

Мы передаём машину

Прага или Ковильян, доступ root и статический IPv4, менее чем за десять минут. Принесите собственный образ, если runner уже внутри него.

3

Выполните пошаговую инструкцию с этой страницы

Это последовательность производителя, взятая из его текущей документации, а не из записи в блоге, и на чистом хосте она занимает несколько минут.

4

Сделайте снимок, а потом добавьте второй

Сделайте снимок, как только первый конвейер станет зелёным, чтобы следующая машина была восстановлением, а не сборкой с нуля. Пул растёт добавлением хостов, а не раздуванием одного.

Почему выбирают нас

  • Сертифицированные объекты 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

Готовы начать?

Облачные серверы от 15 €/мес
  • Оплата ежемесячно
  • Без платы за подключение
  • Без привязки