Пост

Forgejo. Runner в отдельном LXC, бэкапы и уведомления

Настраиваем выделенный CI-runner в Proxmox контейнере, организуем резервное копирование и подключаем уведомления через внешние сервисы

Третья часть разбора особенностей работы с Forgejo на собственном сервере.

CI-runner в отдельном LXC

Ранее мы разместили runner в отдельном Docker-контейнере прямо рядом с Forgejo, на одном LXC. Для тестов вполне сгодится, но в рабочей ситуации это избыточная нагрузка. Избавляемся путём выноса на самостоятельную виртуальную машину или другой LXC.

Готовим LXC

  • Создаём новый контейнер в Proxmox (пока не запускаем)
    • Шаблон debian-12-standard_12.12-1_amd64.tar.zst
    • 2 cpu, 1Gb ram, 8Gb диск

forgejo-3-screenshot-1

  • Прописываем дополнительные параметры в конфигурационном файле контейнера для включения возможности работать с виртуальными сетевыми интерфейсами

pve -> shell

1
2
3
4
5
6
7
8
9
10
# вносим изменения в конфигурационный файл контейнера
# 104 - id контейнера
vi /etc/pve/lxc/104.conf

# вставляем в конец файла две строки и сохраняем
lxc.cgroup2.devices.allow: c 10:200 rwm
lxc.mount.entry: /dev/net/tun dev/net/tun none bind,create=file

# запускаем контейнер
pct start 104

Docker и Runner

  • Подключаемся к контейнеру из pve -> shell
1
pct exec 104 bash
  • Обновляемся
1
apt update && apt upgrade
  • Docker
1
2
3
apt install curl jq -y

curl -fsSL https://get.docker.com | sh
  • Устанавливаем runner
1
2
3
4
5
6
7
8
9
mkdir -p /opt/forgejo-runner && cd /opt/forgejo-runner

ARCH=$(uname -m | sed 's/x86_64/amd64/;s/aarch64/arm64/')
VER=$(curl -s https://data.forgejo.org/api/v1/repos/forgejo/runner/releases/latest | jq -r .name | cut -c 2-)

wget "https://code.forgejo.org/forgejo/runner/releases/download/v${VER}/forgejo-runner-${VER}-linux-${ARCH}" -O forgejo-runner

chmod +x forgejo-runner
cp forgejo-runner /usr/local/bin/
  • Создаём новый глобальный runner в веб интерфейсе Forgejo

Панель управления -> Действия -> Исполнители -> Добавить нового исполнителя

Имя: runner-lxc-02

Описание: оставить пустым

После создания видим uuid и токен runner’а, однако с этим токеном зарегистрировать runner не получилось. На той же странице Исполнители есть вкладка Показать токен регистрации, вот его и запоминаем.

forgejo-2-screenshot-8

  • Регистрируем runner

В LXC runner’а

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
useradd --create-home runner
usermod -aG docker runner
su - runner
cd ~
# убеждаемся что в /home/runner
pwd

/usr/local/bin/forgejo-runner register
# Instance URL: http://IP_основного_LXC:3000
# Token: <токен регистрации из админки>
# Name: runner-lxc-02
# Labels: оставляем пустым (Enter)

INFO Registering runner, name=runner-lxc-02, instance=http://10.60.60.101:3000, labels=[docker:docker://data.forgejo.org/oci/node:lts].
DEBU Successfully pinged the Forgejo instance server
INFO Runner registered successfully.

exit
  • Systemd
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
cat > /etc/systemd/system/forgejo-runner.service << 'EOF'
[Unit]
Description=Forgejo Runner
After=network.target docker.service
Requires=docker.service

[Service]
User=runner
WorkingDirectory=/home/runner
ExecStart=/usr/local/bin/forgejo-runner daemon
Restart=always

[Install]
WantedBy=multi-user.target
EOF

systemctl daemon-reload
systemctl enable --now forgejo-runner
journalctl -u forgejo-runner -f

forgejo-3-screenshot-2

На основном LXC с Forgejo можно отключить и удалить контейнеры dind и runner.

Бэкапы

Поскольку к тестовому серверу далее будет подключен Proxmox Backup Server, то его использование для резервирования всего контейнера с git целиком было бы вариантом по умолчанию. Но пока это не сделано, а также для формирования запасного канала резервного копирования, рассмотрим два сценария - логический для переноса данных и инфраструктурный средствами Proxmox.

Логический бэкап через cli

Встроенный инструмент forgejo dump создаёт архив со всеми репозиториями, БД, аватарами и настройками. Выполняется внутри контейнера Forgejo (pct exec 103 bash).

1
2
3
4
5
# делаем dump от пользователя 1000, под которым работает forgejo
docker exec -u 1000 forgejo bash -c "forgejo dump -c /data/gitea/conf/app.ini -w /tmp -f /tmp/forgejo-dump.zip"

# копируем dump на подключенное внешнее хранилище
docker cp forgejo:/tmp/forgejo-dump.zip /mnt/backups/forgejo-$(date +%Y%m%d_%H%M%S).zip
  • Пример простой автоматизации через sh + cron
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# создаем скрипт автоматического снятия dump
cat > /opt/backup-forgejo.sh << 'EOF'
#!/bin/bash
DIR="/mnt/backups/forgejo"
mkdir -p "$DIR"
TS=$(date +%Y%m%d_%H%M%S)
docker exec -u 1000 forgejo bash -c "forgejo dump -c /data/gitea/conf/app.ini -w /tmp -f /tmp/forgejo-dump.zip"
docker cp forgejo:/tmp/forgejo-dump.zip "$DIR/forgejo_${TS}.zip"
ls -1t "$DIR"/forgejo_*.zip | tail -n +8 | xargs -r rm
EOF

chmod +x /opt/backup-forgejo.sh

# добавляем в cron
crontab -e

0 6 * * * /opt/backup-forgejo.sh >> /var/log/forgejo-backup.log 2>&1
  • Восстановление из dump
1
2
# копируем архив на новое место и выполняем команду
forgejo restore -f forgejo-dump.zip -c /data/gitea/conf/app.ini

Инфраструктурный бэкап (Proxmox)

Используем встроенную утилиту vzdump в режиме snapshot для сохранения состояния LXC на случай отката.

1
2
3
4
5
6
7
8
# снимаем snapshot с контейнера
vzdump <LXC ID> --mode snapshot --compress zstd --storage local

# восстанавливаем контейнер на новый id
pct restore <NEW LXC ID> /var/lib/vz/dump/vzdump-lxc-<LXC ID>-<timestamp>.tar.zst --storage local-lvm

# восстанавливаем контейнер на тот же id с перезаписью
pct restore <LXC ID> /var/lib/vz/dump/vzdump-lxc-<LXC ID>-<timestamp>.tar.zst --force --storage local-lvm

Уведомления

SMTP

В LXC Forgejo

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
docker exec -it forgejo sh
vi /data/gitea/conf/app.ini

# добавляем или меняем параметры в секции mailer
[mailer]
ENABLED = true
SMTP_ADDR = <smtp.yourhoster.ru>
SMTP_PORT = 465
FROM = <forgejo@yourdomain.ru>
USER = <forgejo@yourdomain.ru>
PASSWD = <password>
PROTOCOL = smtps # или smtps+starttls

# перезапускаем контейнер
docker restart forgejo

После перезапуска идём в админку и проверяем подключенный сервер, здесь же можно отправить тестовое письмо.

Панель управления -> Конфигурация -> Сводка -> Конфигурация почтового сервера

Telegram

Forgejo поддерживает нативную интеграцию с Telegram при подключении веб-хуков.

Панель управления -> Интеграции -> Веб-хуки -> Добавить веб-хук -> Telegram

forgejo-3-screenshot-3

Заполняем

  • Токен бота
  • Id чата (групповой чат, где бот добавлен с правами на отправку сообщений или личный чат)
  • Фильтр веток (опционально)
  • Фильтр событий (опционально)

Делаем тестовую отправку из интерфейса админки.

Заключение

В этой части удалось разгрузить сервер Forgejo выносом runner’а в отдельный LXC; настроить бэкапы встроенной утилитой dump от forgejo для данных и dzdump от Proxmox для инфраструктуры; подключить оповещения через SMTP и Telegram

Таким образом, подводя итог трёх публикаций на тему Forgejo, вся цепочка - код, сборка, registry, бэкапы и алерты - работает под личным контролем на собственном железе как полноценная замена облачным платформам.

Больше полезной информации в Telegram-канале