Хостинг GitLab Runner на машине, которая принадлежит вам

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

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

Для кого это

Команда, покупающая вычислительные минуты

Набор тестов вырос, конвейер стал длиннее, счёт пошёл вверх - и единственный рычаг, который предлагает тариф, это купить ещё больше точно тех же минут.

Конвейер, которому нужна одна и та же машина дважды

Каждая задача стартует с пустого диска. Базовый образ скачивается заново, зависимости тянутся заново, а выгрузка кеша занимает больше времени, чем шаг, который он должен был сэкономить.

Репозиторий под требованием резидентности

Код, артефакты и ключи развёртывания проходят через runner, а "общий парк машин где-то там" - это ответ, который ваш аудитор раз за разом обводит красным.

Что возвращает вам самоуправляемый runner

  • Тёплый кеш слоёв Docker на локальном NVMe, чтобы второй конвейер за день начинался там, где закончился первый, а не с пустого диска.
  • Любой executor на выбор - docker, shell, docker-autoscaler, instance или kubernetes - выбираемый для каждого runner, а не выданный тарифом.
  • Собственная параллельность, заданная числом в config.toml, а не купленная как следующая ступень.
  • Привилегированный режим, когда вам действительно нужен Docker-in-Docker, чего ни один общий парк машин вам никогда не даст.
  • Статический исходящий IPv4 из AS204057, чтобы цель развёртывания, зеркало пакетов или файрвол базы данных мог разрешить runner по адресу.
  • То, что сборке действительно нужно на хосте: старый набор инструментов, лицензированный SDK или набор тестовых данных, который никто не хочет качать на каждую задачу.

Размер по тому, что конвейер делает на самом деле

GitLab не публикует требований к железу для самого runner, и это не упущение: процесс runner мал, а сборка - нет. Значение имеет задача. Возьмите самую тяжёлую задачу, которую выполняете сегодня, умножьте на нужную параллельность и не жалейте диска - его заполняют кеш слоёв и рабочий каталог, а полный диск валит конвейер так, что это выглядит как сломанный тест. Одного фиксированный месячный хост не делает: он не исчезает в спокойную неделю. Минуты у провайдера не стоят ничего, когда никто не пушит, а это стоит столько же. Оно окупается с момента, когда конвейер работает почти каждый день.

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

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

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

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

Как установить GitLab Runner на новом хосте

Debian или Ubuntu, с чистого сервера, в том порядке, который документирует GitLab. Всё ниже - их последовательность, не наша.

  1. Добавьте официальный репозиторий пакетов

    curl -L "https://packages.gitlab.com/install/repositories/runner/gitlab-runner/script.deb.sh" -o script.deb.sh
    less script.deb.sh
    sudo bash script.deb.sh

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

  2. Установите runner

    sudo apt install gitlab-runner

    Пакет создаёт системного пользователя gitlab-runner, домашний каталог которого создаётся пустым, без файлов-шаблонов. Чтобы зафиксировать версию, установите gitlab-runner и gitlab-runner-helper-images вместе одной версии - с 17.7.1 они идут парой, и упоминание только одного завершается ошибкой зависимостей.

  3. Установите Docker, если задачи выполняются в контейнерах

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

    Executor docker общается с локальным Docker Engine через API v1.25, поэтому демон должен быть на самом хосте runner. Пакета из дистрибутива достаточно для начала; собственный репозиторий Docker содержит более новые выпуски, если какой-то сборке они нужны.

  4. Зарегистрируйте runner

    sudo gitlab-runner register \
      --non-interactive \
      --url "https://gitlab.com/" \
      --token "$RUNNER_TOKEN" \
      --executor "docker" \
      --docker-image alpine:latest \
      --docker-pull-policy "if-not-present" \
      --description "docker-runner"

    Сначала создайте runner в GitLab, в Settings, затем CI/CD, затем Runners - он вернёт токен аутентификации, начинающийся с glrt-, который идёт в --token. Теги задач и параметр для задач без тегов задайте в той же форме: с токенами аутентификации они принадлежат runner, а не команде register. Более старый путь с --registration-token устарел и запланирован к удалению в GitLab 20.0.

  5. Задайте параллельность и запустите

    sudo sed -i "s/^concurrent = .*/concurrent = 4/" /etc/gitlab-runner/config.toml
    sudo gitlab-runner restart
    sudo gitlab-runner status

    config.toml лежит в /etc/gitlab-runner, когда runner работает от root. concurrent - это потолок для всех runner, зарегистрированных на этом хосте, а не настройка для каждого по отдельности, и каждый runner может нести под ней собственный, меньший лимит.

  6. Проверьте это одной задачей

    stages: [test]
    
    smoke:
      stage: test
      tags: [docker-runner]
      script:
        - cat /etc/os-release
        - echo "built on $CI_RUNNER_DESCRIPTION"

    Закоммитьте это как .gitlab-ci.yml, сделайте push, и задача должна попасть на ваш хост за несколько секунд. Если она остаётся в очереди, теги не совпадают с теми, что вы задали в интерфейсе, или runner привязан к другому проекту.

Сверено с официальной документацией 2026-08-15 — читать первоисточник

Чем мы не являемся

  • Мы не GitLab. GitLab, GitLab CI/CD и GitLab Runner принадлежат им, и ничто на этой странице ими не одобрено. Мы продаём машину, на которой работает runner.
  • Эта страница не о хостинге самого GitLab. Самоуправляемый экземпляр GitLab - это машина побольше и другой разговор; спросите, и мы её подберём, но здесь оценена не она.
  • Мы не пишем ваш .gitlab-ci.yml. Конвейер ваш; хост, сеть и адрес - наши.
  • Runner не обслуживается за вас, если вы об этом не попросите. Вы устанавливаете его сами или добавляете нашу услугу администрирования, и мы держим его обновлённым, зарегистрированным и под наблюдением.
  • Ваша подписка GitLab остаётся у GitLab. Самоуправляемый runner не расходует их вычислительные минуты, в этом и смысл, но и лицензии пользователей он не заменяет.

Части, которые команды обнаруживают поздно

  • Путь с регистрационным токеном уходит в прошлое. Runner, созданный в интерфейсе, возвращает токен аутентификации glrt-, который gitlab-runner register принимает как --token, а --registration-token запланирован к удалению в GitLab 20.0.
  • Теги ушли вместе с ним. С токеном аутентификации теги задач, параметр без тегов и привязка принадлежат объекту runner, созданному в интерфейсе, поэтому флаги, которые раньше задавали их в командной строке, больше ничего не решают.
  • Зафиксировать версию значит зафиксировать два пакета. С 17.7.1 явная версия gitlab-runner требует ещё и gitlab-runner-helper-images той же версии, иначе apt отказывает в установке.
  • check_interval по умолчанию равен 3 секундам. На хосте со множеством зарегистрированных runner это очень много опросов; поднимите значение, прежде чем винить сеть.
  • Docker-in-Docker требует привилегированного режима, что фактически даёт задаче root на хосте. Если конвейер только собирает образы, безрутовый сборщик вроде Kaniko или Buildah - более выгодный обмен.
  • Артефакты и кеши по-прежнему путешествуют в GitLab, пока вы не направите кеш в собственный S3-совместимый бакет. На runner, который вы намеренно перенесли в ЕС, это обычно последний переход, оставшийся перенести.

Минуты 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

- Чем общий runner отличается от самоуправляемого?

Общий runner - это машина GitLab, и вы платите за минуты, которые она тратит на вашу задачу. Самоуправляемый runner - это ваша машина: вы устанавливаете на неё gitlab-runner, регистрируете её для своего проекта, группы или экземпляра, и она не расходует вычислительные минуты вовсе. Пространства имён на бесплатном тарифе GitLab получают 400 вычислительных минут в месяц, и оживлённый конвейер проходит их за дни

- Как установить и зарегистрировать GitLab Runner?

Добавьте их репозиторий apt из сценария установки на packages.gitlab.com, установите пакет gitlab-runner, а затем запустите gitlab-runner register в неинтерактивном режиме с токеном аутентификации, который GitLab выдаёт при создании runner в интерфейсе. Полная последовательность с точными командами есть на этой странице, взятая из их документации, а не из записи в блоге

- Регистрируют ли runner до сих пор регистрационным токеном?

Нет, и именно это изменение ломает большинство старых руководств. Сначала создайте runner в интерфейсе GitLab, и он вернёт токен аутентификации, начинающийся с glrt-, который gitlab-runner register принимает как --token. Старый путь с --registration-token устарел и запланирован к удалению в GitLab 20.0. Теги задач, параметр без тегов и привязка теперь принадлежат объекту runner, созданному в интерфейсе, а не команде register

- Какого размера сервер нужен GitLab Runner?

GitLab не публикует требований к железу для самого runner, потому что процесс runner мал, а ваша сборка - нет. Подбирайте по самой тяжёлой задаче, умноженной на нужную параллельность. На практике 4 vCPU, 8 ГБ и 120 ГБ NVMe тянут две-три задачи одновременно; 8 vCPU, 16 ГБ и 240 ГБ тянут от шести до восьми. Не жалейте диска - его заполняют кеш слоёв Docker и рабочий каталог

- Нужен ли Docker на хосте runner?

Только если вы пользуетесь executor docker, а так делает большинство. Он общается с локальным Docker Engine через API v1.25, поэтому демон должен быть установлен на самом хосте runner. Executor shell не требует Docker вовсе, а executor instance и docker-autoscaler создают машины в другом месте

- Могут ли несколько runner делить один хост?

Да, и это обычная форма. Регистрируйте сколько угодно на одной инсталляции; настройка concurrent в /etc/gitlab-runner/config.toml является потолком для них всех, и каждый runner может нести под ней собственный, меньший лимит. Следите за check_interval, по умолчанию 3 секунды, который превращается в очень много опросов, как только хост несёт десяток runner

Если вам нужна помощь или у вас возникли дополнительные вопросы, пожалуйста, обращайтесь к менеджерам или напишите в службу поддержки по адресу support@dcxv.com

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

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