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