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 диск
- Шаблон
- Прописываем дополнительные параметры в конфигурационном файле контейнера для включения возможности работать с виртуальными сетевыми интерфейсами
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 не получилось. На той же странице Исполнители есть вкладка Показать токен регистрации, вот его и запоминаем.
- Регистрируем 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
На основном 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
Заполняем
- Токен бота
- Id чата (групповой чат, где бот добавлен с правами на отправку сообщений или личный чат)
- Фильтр веток (опционально)
- Фильтр событий (опционально)
Делаем тестовую отправку из интерфейса админки.
Заключение
В этой части удалось разгрузить сервер Forgejo выносом runner’а в отдельный LXC; настроить бэкапы встроенной утилитой dump от forgejo для данных и dzdump от Proxmox для инфраструктуры; подключить оповещения через SMTP и Telegram
Таким образом, подводя итог трёх публикаций на тему Forgejo, вся цепочка - код, сборка, registry, бэкапы и алерты - работает под личным контролем на собственном железе как полноценная замена облачным платформам.




