Установка и настройка Forgejo на VPS: создание собственного Git-хостинга с Docker Registry и CI/CD
TL;DR
В данном руководстве мы развернем Forgejo — легковесный, полностью открытый форк Gitea — на собственном VPS. Мы настроим полноценную экосистему для разработки: безопасное хранилище кода, встроенный реестр Docker-контейнеров и систему автоматизации Forgejo Actions (аналог GitHub Actions). К концу туториала у вас будет профессиональный self-hosted Git-сервис с автоматическим SSL-сертификатом и настроенной системой бэкапов.
- Стек: Docker Compose, Forgejo 10.x, PostgreSQL 16+, Caddy (Reverse Proxy), Forgejo Runner.
- Безопасность: SSH-ключи, Fail2Ban, Firewall (UFW), изоляция контейнеров.
- CI/CD: Полная поддержка GitHub Actions-подобных воркфлоу внутри вашего сервера.
- Реестр: Хранение Docker-образов и пакетов (npm, PyPI, Go) без сторонних сервисов.
- Срок настройки: 40-60 минут при следовании инструкции.
1. Что такое Forgejo и почему это лучший выбор в 2026 году
Схема: 1. Что такое Forgejo и почему это лучший выбор в 2026 году
Forgejo (произносится как «фор-джей-о») — это форк Gitea, созданный сообществом в ответ на коммерциализацию оригинального проекта. В 2026 году Forgejo стал стандартом де-факто для тех, кто ищет «золотую середину» между тяжеловесным GitLab и слишком аскетичными решениями вроде SourceHut.
Основная философия Forgejo — "Liberated Software". Это означает, что все функции, включая продвинутый CI/CD и реестр пакетов, доступны бесплатно и с открытым исходным кодом. В отличие от Gitea, где некоторые корпоративные функции могут быть ограничены или ориентированы на платных клиентов, Forgejo развивается как проект, принадлежащий сообществу.
Ключевые преимущества для владельца VPS:
- Низкое потребление ресурсов: В режиме ожидания Forgejo потребляет менее 200 МБ оперативной памяти.
- Бинарная совместимость: Если вы раньше использовали Gitea, переход на Forgejo занимает 5 минут без потери данных.
- Встроенный CI/CD: Больше не нужно настраивать сложные связки с Jenkins или Drone CI. Forgejo Actions понимает синтаксис YAML-файлов GitHub Actions.
- Единый инструмент: Код, тикеты (issues), канбан-доски, вики и реестр контейнеров находятся в одном интерфейсе.
2. Сравнение Forgejo с альтернативами (GitLab, Gitea, GitHub)
Схема: 2. Сравнение Forgejo с альтернативами (GitLab, Gitea, GitHub)
При выборе Git-платформы для хостинга на собственном сервере важно понимать разницу в ресурсозатратах и функционале. Ниже приведена сравнительная таблица актуальных решений на 2026 год.
| Характеристика |
Forgejo |
GitLab CE |
Gitea |
GitHub (Cloud) |
| Мин. RAM |
1 ГБ (комфортно 2 ГБ) |
4 ГБ (комфортно 8 ГБ) |
1 ГБ |
N/A |
| CI/CD |
Встроено (Actions) |
Встроено (Runner) |
Встроено (Actions) |
GitHub Actions |
| Лицензия |
GPLv3+ (Community) |
MIT (Open Core) |
MIT (Commercial focus) |
Proprietary |
| Реестр пакетов |
Да (Docker, npm, etc) |
Да (Advanced) |
Да |
Да |
| Сложность установки |
Низкая (1 контейнер) |
Высокая (много компонентов) |
Низкая |
N/A |
GitLab является мощным комбайном, но его установка на дешевый VPS часто приводит к "зависаниям" из-за нехватки памяти. Forgejo же идеально подходит для индивидуальных разработчиков и команд до 50 человек, работающих на бюджетном железе.
3. Какой VPS-конфиг нужен под эту задачу
Схема: 3. Какой VPS-конфиг нужен под эту задачу
Хотя Forgejo крайне нетребователен, производительность вашего Git-хостинга будет напрямую зависеть от скорости дисковой подсистемы и объема оперативной памяти для кэширования Git-объектов.
Минимальные требования (1-3 пользователя, маленькие проекты):
- CPU: 1 ядро
- RAM: 1 ГБ
- Disk: 20 ГБ SSD/NVMe
- OS: Ubuntu 24.04 LTS или Debian 13
Рекомендуемые требования (команда, CI/CD, Docker Registry):
- CPU: 2-4 ядра (важно для быстрой сборки контейнеров в CI/CD)
- RAM: 4 ГБ (позволяет держать в кэше БД и эффективно работать раннерам)
- Disk: 50+ ГБ NVMe (объем зависит от количества хранимых Docker-образов)
- Сеть: 1 Гбит/с (для быстрой загрузки/выгрузки крупных репозиториев)
Для стабильной работы системы, особенно если вы планируете активно использовать Forgejo Actions для сборки проектов, лучше всего подойдет подходящий VPS с выделенными ресурсами, чтобы процессы сборки не замедляли работу веб-интерфейса.
Локация сервера также имеет значение: выбирайте дата-центр с минимальным пингом до ваших разработчиков, так как протоколы Git (SSH/HTTPS) чувствительны к задержкам при передаче множества мелких файлов.
4. Подготовка сервера: базовая безопасность и системные утилиты
Схема: 4. Подготовка сервера: базовая безопасность и системные утилиты
Прежде чем устанавливать Docker, необходимо обезопасить сервер. Мы настроим брандмауэр, создадим отдельного пользователя и установим защиту от брутфорса.
Обновите список пакетов и систему до актуального состояния:
sudo apt update && sudo apt upgrade -y
Установите необходимые базовые инструменты:
sudo apt install -y curl wget git vim ufw fail2ban software-properties-common
Настройте брандмауэр UFW. Нам понадобятся порты 22 (SSH), 80 (HTTP), 443 (HTTPS) и порт 2222 для Git через SSH (чтобы не конфликтовать с основным SSH-сервером системы):
sudo ufw allow 22/tcp
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw allow 2222/tcp
sudo ufw enable
Настройка Fail2Ban поможет защитить SSH от подбора паролей. Создайте локальный конфиг:
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
sudo systemctl enable fail2ban
sudo systemctl start fail2ban
Создайте системного пользователя, от имени которого будет работать Forgejo (для безопасности не рекомендуется запускать сервис от root, даже внутри контейнера):
sudo adduser --disabled-password --gecos "" git
5. Установка Docker и Docker Compose
Схема: 5. Установка Docker и Docker Compose
В 2026 году использование Docker является стандартом для self-hosted сервисов. Это упрощает обновление и перенос Forgejo на другой сервер.
Установите официальный репозиторий Docker:
install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
$(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
Установите Docker Engine и Docker Compose Plugin:
sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
Добавьте текущего пользователя в группу docker, чтобы запускать команды без sudo:
sudo usermod -aG docker $USER
Примечание: после этой команды нужно перелогиниться в терминале.
6. Развертывание Forgejo: Docker Compose и база данных
Схема: 6. Развертывание Forgejo: Docker Compose и база данных
Мы будем использовать PostgreSQL в качестве базы данных, так как она надежнее SQLite при росте количества репозиториев и активном использовании CI/CD.
Создайте рабочую директорию:
mkdir -p ~/forgejo && cd ~/forgejo
Создайте файл docker-compose.yml со следующей конфигурацией:
services:
server:
image: codeberg.org/forgejo/forgejo:10
container_name: forgejo
restart: always
environment:
- USER_UID=1001
- USER_GID=1001
- FORGEJO__database__DB_TYPE=postgres
- FORGEJO__database__HOST=db:5432
- FORGEJO__database__NAME=forgejo
- FORGEJO__database__USER=forgejo
- FORGEJO__database__PASSWD=your_strong_password
volumes:
- ./data:/data
- /etc/timezone:/etc/timezone:ro
- /etc/localtime:/etc/localtime:ro
ports:
- "127.0.0.1:3000:3000"
- "2222:22"
depends_on:
- db
db:
image: postgres:16-alpine
restart: always
environment:
- POSTGRES_USER=forgejo
- POSTGRES_PASSWORD=your_strong_password
- POSTGRES_DB=forgejo
volumes:
- ./postgres:/var/lib/postgresql/data
Важно: Замените your_strong_password на реальный пароль. Обратите внимание, что веб-интерфейс Forgejo мы пробрасываем на 127.0.0.1:3000. Это делается для того, чтобы он не был доступен снаружи напрямую, а только через наш Reverse Proxy (Caddy).
Запустите контейнеры:
docker compose up -d
7. Настройка Reverse Proxy и автоматического HTTPS через Caddy
Схема: 7. Настройка Reverse Proxy и автоматического HTTPS через Caddy
Caddy — это современный веб-сервер, который автоматически получает и обновляет SSL-сертификаты от Let's Encrypt. Это гораздо проще, чем настраивать Nginx с Certbot.
Установите Caddy:
sudo apt install -y debian-keyring debian-archive-keyring apt-transport-https
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' | sudo gpg --dearmor -o /usr/share/keyrings/caddy-stable-archive-keyring.gpg
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt' | sudo tee /etc/apt/sources.list.d/caddy-stable.list
sudo apt update
sudo apt install caddy
Отредактируйте /etc/caddy/Caddyfile:
git.yourdomain.com {
reverse_proxy localhost:3000
header {
# Настройки безопасности
Strict-Transport-Security "max-age=31536000;"
X-Content-Type-Options nosniff
X-Frame-Options DENY
Referrer-Policy no-referrer-when-downgrade
}
}
Замените git.yourdomain.com на ваш реальный домен, который должен быть направлен на IP вашего VPS (A-запись). Перезапустите Caddy:
sudo systemctl restart caddy
Теперь вы можете открыть https://git.yourdomain.com в браузере и завершить установку Forgejo через веб-интерфейс. Первый зарегистрированный пользователь автоматически станет администратором.
8. Настройка Forgejo Actions: запуск CI/CD раннера
Схема: 8. Настройка Forgejo Actions: запуск CI/CD раннера
Forgejo Actions — это мощная встроенная система автоматизации. Для её работы нужен отдельный компонент — Runner, который будет выполнять команды сборки.
Сначала включите поддержку Actions в Forgejo. Откройте файл конфигурации внутри контейнера или добавьте переменную окружения в docker-compose.yml:
# Добавьте в секцию environment сервиса server в docker-compose.yml:
- FORGEJO__actions__ENABLED=true
Теперь добавим сервис раннера в наш docker-compose.yml:
runner:
image: codeberg.org/forgejo/runner:6.0
container_name: forgejo-runner
restart: always
depends_on:
- server
volumes:
- ./runner-data:/data
- /var/run/docker.sock:/var/run/docker.sock
environment:
- FORGEJO_INSTANCE_URL=https://git.yourdomain.com
- FORGEJO_RUNNER_REGISTRATION_TOKEN=ВАШ_ТОКЕН_ИЗ_АДМИНКИ
- FORGEJO_RUNNER_NAME=vps-runner
- FORGEJO_RUNNER_LABELS=ubuntu-latest:docker://node:20-bullseye,debian-latest:docker://debian:bookworm
Чтобы получить FORGEJO_RUNNER_REGISTRATION_TOKEN, зайдите в панель управления Forgejo: Site Administration -> Actions -> Runners -> Create new Runner.
Запустите раннер:
docker compose up -d runner
Теперь любой репозиторий, в котором есть файл .forgejo/workflows/build.yml, будет автоматически запускать сборку на вашем VPS.
9. Настройка встроенного Docker Registry
Forgejo позволяет хранить Docker-образы прямо в репозитории проекта. Это избавляет от необходимости использовать Docker Hub или платные аналоги.
По умолчанию реестр пакетов включен. Чтобы авторизоваться в нем с локальной машины, используйте стандартную команду docker login:
docker login git.yourdomain.com
Используйте ваше имя пользователя и пароль (или Personal Access Token, что безопаснее). Пример тегирования и пуша образа:
docker tag my-app:latest git.yourdomain.com/username/my-app:latest
docker push git.yourdomain.com/username/my-app:latest
Все образы хранятся в папке /data/packages внутри контейнера Forgejo, что позволяет легко управлять дисковым пространством.
10. Бэкапы и регламент обслуживания
Отсутствие бэкапов — главная ошибка при self-хостинге. В Forgejo нужно бэкапить три вещи: базу данных, конфигурационные файлы (app.ini) и сами репозитории.
Создайте простой скрипт бэкапа backup.sh:
#!/bin/bash
BACKUP_DIR="/home/user/backups"
TIMESTAMP=$(date +"%Y%m%d_%H%M%S")
mkdir -p $BACKUP_DIR
# Бэкап базы данных
docker exec forgejo-db-1 pg_dump -U forgejo forgejo > $BACKUP_DIR/db_$TIMESTAMP.sql
# Бэкап данных Forgejo (конфиги и репозитории)
tar -czf $BACKUP_DIR/data_$TIMESTAMP.tar.gz ./data
# Удаление старых бэкапов (старше 7 дней)
find $BACKUP_DIR -type f -mtime +7 -delete
Добавьте выполнение скрипта в crontab (crontab -e), чтобы он запускался каждую ночь в 3:00:
0 3 * /bin/bash /home/user/forgejo/backup.sh
Обновление Forgejo: Процесс обновления крайне прост благодаря Docker. Достаточно изменить версию образа в docker-compose.yml и выполнить:
docker compose pull
docker compose up -d
11. Troubleshooting + FAQ
Ошибка: "SSH connection refused" при попытке git push
Проверьте, что вы используете правильный порт. По умолчанию SSH в нашем конфиге работает на порту 2222. Ваш URL репозитория должен выглядеть так: ssh://[email protected]:2222/user/repo.git. Также убедитесь, что ваш публичный SSH-ключ добавлен в профиль Forgejo.
Какой VPS-конфиг минимально подойдёт для Forgejo?
Для комфортной работы одного разработчика достаточно 1 ГБ RAM и 1 ядра CPU. Однако, если вы включите Forgejo Actions (CI/CD), при запуске компиляции (например, на Go или Rust) потребление памяти может мгновенно подскочить до 2-4 ГБ. Для таких задач лучше брать тариф с 4 ГБ оперативной памяти.
Что выбрать — VPS или dedicated для этой задачи?
Для большинства команд до 20 человек VPS — идеальный выбор. Dedicated-сервер стоит рассматривать только в двух случаях: если объем вашего кода и артефактов (Docker Registry) превышает 1-2 ТБ, или если вам нужна абсолютная изоляция ресурсов для тяжелых CI/CD процессов, которые не должны влиять на отзывчивость интерфейса Git.
Как ограничить регистрацию новых пользователей?
После создания своего аккаунта администратора, зайдите в Site Administration -> Configuration и установите DISABLE_REGISTRATION = true. Это предотвратит создание аккаунтов посторонними людьми на вашем публичном сервере.
Forgejo потребляет слишком много места на диске, что делать?
Основными потребителями места обычно являются Docker Registry и логи билдов. Регулярно очищайте старые образы и настройте политику удержания (Retention Policy) в настройках пакетов Forgejo. Также проверьте папку /data/tmp, иногда там могут скапливаться временные файлы после неудачных импортов.
Можно ли перенести данные из GitHub?
Да, Forgejo имеет встроенный инструмент миграции. Он позволяет импортировать не только код, но и Issues, Pull Requests, Wiki и даже Milestone. Для этого достаточно указать URL репозитория GitHub и ваш Personal Access Token.
12. Выводы и следующие шаги
Мы успешно развернули профессиональную среду разработки на собственном VPS. Теперь у вас есть полный контроль над своим кодом, образами контейнеров и процессами автоматизации, без зависимости от политики сторонних облачных провайдеров.
Что мы получили:
- Приватный Git-хостинг с высокой производительностью.
- Автоматический SSL через Caddy.
- Собственную систему CI/CD, совместимую с GitHub Actions.
- Docker Registry для хранения приватных образов.
Куда двигаться дальше:
- Мониторинг: Настройте экспорт метрик Forgejo в Prometheus и визуализируйте их в Grafana, чтобы отслеживать нагрузку на сервер.
- Безопасность: Настройте двухфакторную аутентификацию (2FA) для своего аккаунта.
- Внешнее хранилище: Если планируете хранить терабайты данных, настройте хранение объектов (LFS и пакеты) в S3-совместимом хранилище.
Self-hosting — это не только экономия средств, но и важный шаг к цифровому суверенитету вашей команды или проекта. Forgejo предоставляет для этого все необходимые инструменты, оставаясь простым и надежным решением.