Создание отдельной группы проектов с отдельным runner.
Инструкция создана на примере web-studio и сайта fuza
sudo adduser --system --group --home /home/gitlab-webstudio gitlab-webstudio id gitlab-webstudiosudo mkdir -p /var/www/web-studio-sitessudo mkdir -p /var/www/web-studio-sites/fuza.likhvatov-projects.rusudo chown -R gitlab-webstudio:gitlab-webstudio /var/www/web-studio-sitessudo chmod -R 755 /var/www/web-studio-sites/var/www/web-studio-sites/fuza.likhvatov-projects.rusudo mkdir -p /etc/gitlab-runner-webstudiosudo chown -R gitlab-webstudio:gitlab-webstudio /etc/gitlab-runner-webstudiosudo chmod 700 /etc/gitlab-runner-webstudioВ UI группы web-studio: Build → Runners → New group runner;
Заполнять так:
Tags: web-studio-shell
Run untagged jobs: выключено
Protected: пока выключено
Description: web-studio-shell
Нажимаешь Create runner.
После этого GitLab покажет токен и команду регистрации. Токен понадобится на сервере.
6. Зарегистрировать runner не в общий конфиг а в отдельный
Выполнить команду:sudo -u gitlab-webstudio /usr/bin/gitlab-runner register --config /etc/gitlab-runner-webstudio/config.toml
Во время регистрации отвечать:
URL: https://gitlab.likhvatov-projects.ru
token: тот, что дал GitLab для group runner
name: web-studio-shell
description: web-studio-shell
tags: web-studio-shell
executor: shell
после этого новый runner запишется в:/etc/gitlab-runner-webstudio/config.toml
а не в существующий /etc/gitlab-runner/config.toml.
проверка:sudo cat /etc/gitlab-runner-webstudio/config.toml
7. Поднять отдельный systemd service под gitlab-webstudio
Создай unit:sudo nano /etc/systemd/system/gitlab-runner-webstudio.service
Содержимое:
[Unit]
Description=GitLab Runner for web-studio
After=network.target
[Service]
User=gitlab-webstudio
Group=gitlab-webstudio
ExecStart=/usr/bin/gitlab-runner run --working-directory /home/gitlab-webstudio --config /etc/gitlab-runner-webstudio/config.toml --service gitlab-runner-webstudio
Restart=always
RestartSec=3
[Install]
WantedBy=multi-user.target
Применяем:sudo systemctl daemon-reloadsudo systemctl enable --now gitlab-runner-webstudiosudo systemctl status gitlab-runner-webstudio
Проверить, что сервис реально стартовал:ps -ef | grep gitlab-runner
Ты должен увидеть отдельный процесс с --config /etc/gitlab-runner-webstudio/config.toml.
8. Сделать разрешенную deploy команду обертку:
Вместо того чтобы разрешать CI вызывать rsync и systemctl напрямую, делаем root-скрипт.
Создай файл:sudo nano /usr/local/bin/webstudio-deploy-site
Содержимое:
#!/usr/bin/env bash
set -euo pipefail
DOMAIN="${1:-}"
SOURCE_DIR="${2:-}"
if [[ -z "$DOMAIN" || -z "$SOURCE_DIR" ]]; then
echo "Usage: webstudio-deploy-site <domain> <source_dir>"
exit 1
fi
case "$DOMAIN" in
*.likhvatov-projects.ru) ;;
*)
echo "Invalid domain: $DOMAIN"
exit 1
;;
esac
TARGET_BASE="/var/www/web-studio-sites"
TARGET_DIR="$TARGET_BASE/$DOMAIN"
if [[ ! -d "$SOURCE_DIR" ]]; then
echo "Source dir does not exist: $SOURCE_DIR"
exit 1
fi
mkdir -p "$TARGET_DIR"
rsync -a --delete \
--exclude ".git" \
--exclude ".gitlab-ci.yml" \
--exclude ".idea" \
"$SOURCE_DIR"/ "$TARGET_DIR"/
chown -R gitlab-webstudio:gitlab-webstudio "$TARGET_DIR"
find "$TARGET_DIR" -type d -exec chmod 755 {} \;
find "$TARGET_DIR" -type f -exec chmod 644 {} \;
systemctl reload nginx
echo "Deploy completed to $TARGET_DIR"
Права:sudo chown root:root /usr/local/bin/webstudio-deploy-sitesudo chmod 750 /usr/local/bin/webstudio-deploy-site
9. Разрешить sudo только на этот скрипт
Открываешь sudoers:sudo visudo -f /etc/sudoers.d/gitlab-webstudio
Содержимое:gitlab-webstudio ALL=(root) NOPASSWD: /usr/local/bin/webstudio-deploy-site *
Проверка:sudo visudo -c
Это означает:
пользователь gitlab-webstudio может через sudo запустить только /usr/local/bin/webstudio-deploy-site;
sudo bash, sudo rm, sudo rsync, sudo systemctl напрямую — не сможет.
10. Проверить sudo от имени gitlab-webstudio
Проверка списка разрешённых sudo-команд:sudo -u gitlab-webstudio sudo -l
Там должна быть только одна команда.
11. Настраиваем руками nginx
Для fuza.likhvatov-projects.ru делай отдельный конфиг руками.
Например:sudo nano /etc/nginx/sites-available/fuza.likhvatov-projects.ru
Содержимое:
server {
listen 80;
server_name fuza.likhvatov-projects.ru;
root /var/www/web-studio-sites/fuza.likhvatov-projects.ru;
index index.html;
location / {
try_files $uri $uri/ /index.html;
}
access_log /var/log/nginx/fuza.access.log;
error_log /var/log/nginx/fuza.error.log;
}
Активировать:sudo ln -s /etc/nginx/sites-available/fuza.likhvatov-projects.ru /etc/nginx/sites-enabled/fuza.likhvatov-projects.rusudo nginx -tsudo systemctl reload nginx
Потом сертификат:sudo certbot --nginx -d fuza.likhvatov-projects.ru
12. gitlab-ci для проекта web-studio/fuza
Пока только deploy, без управления nginx из CI.
stages:
- deploy
variables:
SITE_DOMAIN: "fuza.likhvatov-projects.ru"
DEPLOY_SOURCE_DIR: "."
deploy_prod:
stage: deploy
tags:
- web-studio-shell
only:
- main
script:
- set -euo pipefail
- sudo /usr/local/bin/webstudio-deploy-site "$SITE_DOMAIN" "$CI_PROJECT_DIR/$DEPLOY_SOURCE_DIR"
Если сайт собирается в dist, тогда:
variables:
SITE_DOMAIN: "fuza.likhvatov-projects.ru"
DEPLOY_SOURCE_DIR: "dist"