Пост

Forgejo. Поднимаем Git сервер в Proxmox LXC

Заменяем GitHub на собственный сервер и создаём туннель для внешнего доступ на локальную машину: быстро, приватно и под полным контролем.

После того, как Gitea свернула на путь коммерции, появился её форк на полностью некоммерческих началах - Forgejo.

Некоторые особенности:

  • Self-hosted альтернатива GitHub. Для тех кто привык работать с GitHub переход будет максимально комфортным.
  • Система управления репозиториями, issues и pull requests, управление пользователями, проекты и реестры пакетов.
  • Forgejo Actions на базе GitHub Actions.
  • Лёгкий и производительный.
  • Быстрый старт практически на любой системе.
  • Бесплатное решение - без подписок, ограничений по функциональности, телеметрии и необходимости создавать аккаунт.

В данной статье я буду запускать Forgejo в LXC контейнере в Proxmox и пробрасывать к нему доступ извне с помощью Pangolin, которая предоставляет туннелирование и обратный прокси с простой и удобной настройкой в веб интерфейсе.

Вводные данные

  • Имеем Proxmox сервер на своём железе в закрытой сети (локальный homelab). Машина выделена специально для организации окружения разработки, включая систему контроля версий, тасктрекер, базы данных, файловое хранилище и тестовые виртуалки.

Домашнему серверу посвящен ряд публикаций в моих каналах Telegram, МАКС, ВК.

  • На внешнем VPS с публичным ip и доменом развёрнута платформа Pangolin.

Про Pangolin есть хорошая статья и видео по настройке на Prohomelab, поэтому здесь подробно останавливаться на первоначальном запуске системы не буду.

Готовим LXC для Forgejo

  • Создаём новый контейнер (не запускаем после создания)

    • Шаблон debian-12-standard_12.12-1_amd64.tar.zst
    • 2 cpu, 2Gb ram, 50Gb диск

forgejo-screenshot-1

  • Прописываем дополнительные параметры в конфигурационный файл контейнера

Чтобы у LXC была возможность создавать и использовать виртуальные сетевые интерфейсы (в нашем случае для туннелирования), нужно прописать доступ к драйверу TUN/TAP хоста.

pve -> shell

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

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

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

Настраиваем LXC

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

curl -fsSL https://get.docker.com | sh
  • Создаём нового пользователя
1
2
3
4
5
6
7
8
9
10
11
# создаём
useradd -m -s /bin/bash forgejo

# добавляем в группу docker
usermod -aG docker forgejo

# заходим под пользователем, проверяем uid/gid и группы
su forgejo
id

uid=1000(forgejo) gid=1000(forgejo) groups=1000(forgejo),100(users),996(docker)

Организуем связь с Pangolin и запускаем Forgejo сервер

1) Для доступа к контейнеру извне в панели управления Pangolin создаём новый site (Sites -> + Add Site) и сохраняем credentials (Endpoint, ID, Secret).

forgejo-screenshot-2

2) Здесь же создаём публичный ресурс (Resources -> Public -> + Add Resource), указываем поддомен и локальный ip адрес LXC в Proxmox.

forgejo-screenshot-3

3) Возвращаемся в контейнер

pve -> shell

1
2
3
4
5
6
7
8
# подключаемся
pct exec 103 bash

# переходим на пользователя
su forgejo

# создаём compose файл
vi compose.yaml

В compose.yaml у нас будет два сервиса:

  • newt - сетевой коннектор для Pangolin, в переменных окружения которого мы указываем те самые credentials, которые сохранили во время создания site.
  • forgejo - собственно сам сервер forgejo.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
networks:
  forgejo:
    external: false

services:
  newt:
    image: fosrl/newt
    container_name: newt
    restart: unless-stopped
    networks:
      - forgejo
    environment:
      - PANGOLIN_ENDPOINT=https://<your pangoline host domain>
      - NEWT_ID=<site ID>
      - NEWT_SECRET=<site Secret>

  forgejo:
    image: codeberg.org/forgejo/forgejo:15
    container_name: forgejo
    environment:
      - USER_UID=1000
      - USER_GID=1000
    restart: unless-stopped
    networks:
      - forgejo
    volumes:
      - ./forgejo/data:/data
      - /etc/localtime:/etc/localtime:ro
    ports:
      - '3000:3000'
      - '222:22'

Запускаем

1
docker compose -up -d

4) Идём в панель Pangolin

  • Проверяем, что образовалась связь между Pangolin и контейнером на вкладках Sites и Resources -> Public.

forgejo-screenshot-4 forgejo-screenshot-5

  • По адресу ресурса (forgejo.<your domain>) попадаем на страницу начальной конфигурации Forgejo.

forgejo-screenshot-6

P. S. Если хотим открыть доступ к ресурсу для любых пользователей - отключаем Use Platform SSO флаг на вкладке Authentication в Pangolin (Resources -> Public -> Edit -> Authentication - Access Controls). По умолчанию доступ только у разрешенных пользователей, управляемых Pangolin, т.е. нужно создать пользователя в системе, выдать ему разрешение на ресурс, поставить себе клиентское приложение, подключиться к endpoint от этого пользователя, и иможно работать - вполне логичный вариант для изоляции окружения.

В итоге получаем свой собственный git сервер на homelab машине с защищенным доступом откуда угодно. В следующей части разберём работу самого сервиса, его основные преимущества и недостатки, а также ci/cd возможности.

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