Перейти к содержанию

Self-hosted GitHub Actions runner — Arkhyz.CLUB

Адаптированный под наш стек вариант инструкции (оригинал — для проекта Зелёный ГОСТ).

Особенности Arkhyz: - Сервер использует podman (а не docker), но docker compose plugin работает через emulation. - Запуск идёт через docker-compose.yml + docker-compose.prod.yml + infra/compose/docker-compose.services.yml. - Используем существующий SSH-ключ /root/.ssh/id_ed25519 (уже в github_deploy через Settings → Deploy keys). - arkhyz-deploy.sh поддерживает таргеты: all / backend / frontend / monitoring / marker.

Что уже сделано на 85.239.53.191

# 1. Пользователь
sudo useradd -m -s /bin/bash github-runner
sudo usermod -aG docker github-runner

# 2. sudoers (только разрешённые скрипты)
cat /etc/sudoers.d/github-runner
# → github-runner ALL=(root) NOPASSWD: /usr/local/bin/arkhyz-deploy.sh, /usr/bin/docker, /usr/bin/podman, /usr/local/lib/docker/cli-plugins/docker-compose

# 3. Runner binary в /opt/actions-runner (v2.328.0)

# 4. SSH ключ github_deploy скопирован в /home/github-runner/.ssh/
sudo -u github-runner ssh -T git@github.com
# → "Hi andis777/arkhyz-admin-main!"

# 5. /usr/local/bin/arkhyz-deploy.sh с таргетами:
sudo -u github-runner sudo -n /usr/local/bin/arkhyz-deploy.sh marker
# → ok без пароля

Что осталось (требует registration token)

# 1. Получи token: https://github.com/andis777/arkhyz-admin-main/settings/actions/runners/new
# (живёт 1 час)

cd /opt/actions-runner
sudo -u github-runner ./config.sh \
  --url https://github.com/andis777/arkhyz-admin-main \
  --token <TOKEN> \
  --name "arkhyz-stage" \
  --labels "self-hosted,linux,x64,arkhyz,stage" \
  --work _work \
  --unattended --replace

# 2. systemd сервис для автостарта
sudo ./svc.sh install github-runner
sudo ./svc.sh start
sudo ./svc.sh status

arkhyz-deploy.sh — таргеты

Таргет Что делает Время
all git pull + build backend + build frontend + reload Caddy если изменился + marker ~10 мин
backend git pull + build 12 svc + hotel_api_v2 + recreate + marker ~5 мин
frontend git pull + vite build admin + tourist-app + copy в nginx ~3 мин
monitoring restart prometheus + grafana ~10 сек
marker только grafana annotation (без rebuild) ~5 сек

Если git pull не принёс новых коммитов — скрипт ранний exit (no-op), кроме marker/all которые всё равно ставят аннотацию.

Workflow examples

Auto-deploy backend on push

# .github/workflows/auto-deploy.yml
name: Auto-deploy to stage
on:
  push:
    branches: [main]
    paths:
      - 'services/**'
      - 'api-admin/**'
      - 'packages/arkhyz-shared/**'
      - 'docker-compose*.yml'
      - 'infra/compose/**'
      - 'monitoring/**'

concurrency:
  group: stage-deploy
  cancel-in-progress: false

jobs:
  deploy:
    runs-on: [self-hosted, arkhyz, stage]
    timeout-minutes: 15
    steps:
      - name: Deploy backend
        run: sudo /usr/local/bin/arkhyz-deploy.sh backend

      - name: Smoke test API
        run: |
          for i in 1 2 3 4 5; do
            code=$(curl -sk -o /dev/null -w "%{http_code}" --max-time 10 https://admin.arkhyz-club.ru/admin-health/auth-svc)
            echo "attempt $i: HTTP $code"
            [ "$code" = "200" ] && exit 0
            sleep 5
          done
          exit 1

Auto-deploy frontend on src/** changes

# .github/workflows/auto-deploy-frontend.yml
name: Auto-deploy frontend
on:
  push:
    branches: [main]
    paths:
      - 'src/**'
      - 'tourist-app/src/**'
      - 'public/**'

jobs:
  deploy:
    runs-on: [self-hosted, arkhyz, stage]
    timeout-minutes: 15
    steps:
      - name: Deploy frontend
        run: sudo /usr/local/bin/arkhyz-deploy.sh frontend

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

  • sudoers разрешает только конкретные пути: arkhyz-deploy.sh, docker, podman, docker-compose. Нет ALL.
  • Deploy key (SSH) read-only — не может пушить в репо.
  • Concurrency cancel-in-progress: false для prod-деплоя чтобы случайный новый push не убил текущий rebuild.
  • PR-workflow'ы из форков должны быть запрещены в Settings → Actions → General → Fork pull requests → Require approval for all.

Диагностика

# Логи runner'а
sudo journalctl -u actions.runner.andis777-arkhyz-admin-main.arkhyz-stage -f

# Логи deploy
tail -f /var/log/arkhyz-deploy.log

# Статус runner в GitHub
curl -s https://api.github.com/repos/andis777/arkhyz-admin-main/actions/runners \
  -H "Authorization: Bearer <PAT_with_repo_admin_scope>"

# Запустить deploy вручную (от root)
sudo -u github-runner sudo /usr/local/bin/arkhyz-deploy.sh backend

Лимиты этой установки

  • 1 job одновременно. Если нужны параллельные jobs — поставить вторую копию runner'а (/opt/actions-runner-2).
  • Disk: на момент установки 8.5GB свободно из 96GB. Docker build кэш быстро забивает. Рекомендую периодически: docker system prune -af --volumes (но осторожно с volumes мониторинга).
  • Память: 11GB RAM, при rebuild всех 13 контейнеров одновременно может прыгать к 6-7GB. Если станет тесно — --parallel 4 в docker compose build.

Откат

Если runner начал ломать — выключи systemd-сервис, всё деплоится обратно через ручной SSH:

sudo systemctl stop actions.runner.*
# Откатывает к pre-runner состоянию. Деплой делается руками.

Удалить полностью:

cd /opt/actions-runner
sudo ./svc.sh stop && sudo ./svc.sh uninstall
sudo -u github-runner ./config.sh remove --token <REMOVAL_TOKEN>
sudo rm -rf /opt/actions-runner
sudo userdel -r github-runner
sudo rm /etc/sudoers.d/github-runner