GitLab Runner на VPS: свой CI/CD pipeline — иллюстрация к статье Storm Cloud Blog, категория DevOps
GitLab Runner на VPS: свой CI/CD pipeline — иллюстрация к статье Storm Cloud Blog, категория DevOps
DevOps·3 мин··

GitLab Runner на VPS: свой CI/CD pipeline

Настройка GitLab Runner на VPS: shell и Docker executor, .gitlab-ci.yml, деплой на staging/production. Альтернатива GitHub Actions на своём железе.

Краткий ответ: GitLab Runner на VPS выполняет CI/CD jobs: тесты, сборка, деплой. Зарегистрируйте runner в GitLab, выберите Docker executor, опишите pipeline в .gitlab-ci.yml.

Self-hosted CI/CD — когда GitHub Actions минут не хватает, нужны приватные runners или деплой во внутреннюю сеть.


GitLab Runner vs GitHub Actions

GitLab Runner (VPS) GitHub Actions
Хостинг Ваш VPS GitHub
Стоимость VPS + время Free tier / pay per minute
Доступ к internal network Прямой Через self-hosted runner
Экосистема GitLab-centric GitHub-centric

Требования к VPS

Нагрузка RAM Диск
Малые проекты 2 GB 40 GB
Docker builds 4 GB 80 GB
Несколько проектов 8 GB 100 GB+

Docker executor съедает RAM при параллельных jobs.


Установка Runner

curl -L https://packages.gitlab.com/install/repositories/runner/gitlab-runner/script.deb.sh | sudo bash
sudo apt install gitlab-runner -y

Регистрация:

sudo gitlab-runner register
# URL: https://gitlab.com
# Token: из Settings → CI/CD → Runners
# Executor: docker
# Image: docker:24

Docker executor config

# /etc/gitlab-runner/config.toml
[[runners]]
  name = "vps-runner"
  executor = "docker"
  [runners.docker]
    image = "node:20"
    privileged = false
    volumes = ["/cache"]
sudo gitlab-runner restart

Пример .gitlab-ci.yml

stages:
  - test
  - build
  - deploy

variables:
  NODE_VERSION: "20"

test:
  stage: test
  image: node:${NODE_VERSION}
  script:
    - npm ci
    - npm test

build:
  stage: build
  image: node:${NODE_VERSION}
  script:
    - npm ci
    - npm run build
  artifacts:
    paths:
      - dist/

deploy_production:
  stage: deploy
  script:
    - rsync -avz dist/ deploy@VPS:/var/www/app/
    - ssh deploy@VPS 'pm2 reload app'
  only:
    - main

Деплой Next.js или Node.js — аналогично.


Shell executor (проще, но менее изолирован)

Runner выполняет команды напрямую на VPS — быстрее, но job’ы видят всю систему. Только для доверенных репозиториев.


Безопасность

  • Отдельный VPS для runner, не production
  • privileged = false в Docker executor
  • Protected branches + manual deploy
  • SSH deploy keys с ограниченными правами
  • Fail2ban + UFW

Кэш и ускорение

cache:
  key: ${CI_COMMIT_REF_SLUG}
  paths:
    - node_modules/

Docker layer cache — mount /var/run/docker.sock (осторожно с безопасностью).


Мониторинг pipeline

  • GitLab CI/CD analytics
  • Алерты при failed pipeline → Telegram
  • Runner health — Uptime Kuma

Итог

GitLab Runner на VPS — полный контроль над CI/CD. Docker executor для изоляции, rsync/ssh для деплоя на production VPS.

VPS для runner — StormNet Cloud. IaC — Terraform + Ansible.

Частые вопросы

Можно ли ставить GitLab Runner на production VPS?

Не рекомендуется. Runner выполняет произвольный код из CI — выделите отдельный VPS для сборок.

Docker или shell executor для GitLab Runner?

Docker — изоляция и воспроизводимость. Shell — быстрее, но job видит всю систему. Для production — Docker.