Forgejo — самостоятельный Git-сервер с веб-интерфейсом, который закрывает повседневные задачи небольшой команды: репозитории, issues, pull requests, wiki и CI. Это форк Gitea, развиваемый сообществом Codeberg, поэтому установка и конфигурация остаются знакомыми, а зависимость от одного вендора меньше. Ниже — развёртывание на своём сервере с HTTPS, SSH-доступом и резервным копированием.
Что даёт Forgejo и чего он не делает
Forgejo хранит Git-репозитории на диске, предоставляет веб-интерфейс и API, умеет работать с базами SQLite, PostgreSQL и MySQL. Для домашней лаборатории достаточно SQLite и одного процессора, для команды из десятков человек лучше PostgreSQL и отдельный том под данные. Сервер не заменяет резервное копирование: если каталог с репозиториями потерян, веб-интерфейс не поможет.
Установка: пакет или контейнер
Самый предсказуемый способ — официальный бинарный файл или пакет из репозитория проекта. В примере ниже предполагается Debian-подобная система; кодовое имя дистрибутива узнайте из /etc/os-release.
sudo apt install -y git curl
curl -fsSL https://deb.forgejo.org/keyrings/forgejo.asc | sudo gpg --dearmor -o /etc/apt/keyrings/forgejo.asc
echo "deb [signed-by=/etc/apt/keyrings/forgejo.asc] https://deb.forgejo.org bookworm forgejo" | sudo tee /etc/apt/sources.list.d/forgejo.list
sudo apt update && sudo apt install -y forgejo
Пакет создаёт пользователя git, каталог данных и юнит forgejo.service. Если вы ставите вручную из архива, создайте пользователя без оболочки, распакуйте бинарник в /usr/local/bin/forgejo и возьмите unit-файл из каталога contrib/systemd.
sudo adduser --system --shell /bin/bash --gecos 'Git' --group --disabled-password --home /var/lib/forgejo git
sudo mkdir -p /etc/forgejo /var/lib/forgejo
sudo chown -R git:git /var/lib/forgejo
sudo systemctl enable --now forgejo
Для домашней лаборатории удобен Docker: один контейнер, два порта и том с данными; SSH внутри контейнера слушает 22-й порт, наружу он проброшен как 2222. Не публикуйте порт 3000 в интернет напрямую — перед ним должен стоять reverse proxy с HTTPS.
docker run -d --name forgejo --restart unless-stopped \
-p 127.0.0.1:3000:3000 -p 2222:22 \
-v /srv/forgejo:/data -v /etc/timezone:/etc/timezone:ro \
codeberg.org/forgejo/forgejo:latest
Настройка app.ini
Основной файл конфигурации — /etc/forgejo/app.ini. Пакет создаёт его при первом запуске; правьте аккуратно и делайте копию перед изменением. Минимальный набор для публичного сервера выглядит так:
[server]
DOMAIN = git.example.com
ROOT_URL = https://git.example.com/
HTTP_PORT = 3000
SSH_PORT = 2222
SSH_LISTEN_PORT = 2222
DISABLE_HTTP_GIT = false
[database]
DB_TYPE = sqlite3
PATH = /var/lib/forgejo/data/forgejo.db
[service]
DISABLE_REGISTRATION = true
REQUIRE_SIGNIN_VIEW = true
DEFAULT_ALLOW_CREATE_ORGANIZATION = false
[security]
INSTALL_LOCK = true
INSTALL_LOCK отключает веб-установщик после первичной настройки — это обязательный шаг для сервера в интернете. SSH_PORT — порт, который сервер сообщает пользователям в инструкциях клонирования, а SSH_LISTEN_PORT — реальный порт прослушивания. Если вы используете системный OpenSSH на 22-м порту, встроенный SSH можно отключить через START_SSH_SERVER = false и настроить AuthorizedKeysCommand.
После правки файла перезапустите службу и проверьте журнал: sudo systemctl restart forgejo && journalctl -u forgejo -n 50 --no-pager. Ошибка прав на /var/lib/forgejo — самая частая причина, по которой сервис не стартует.
Первый администратор и вход
Регистрация закрыта, поэтому первого пользователя создают из CLI. Пароль задайте длинный и сразу смените его в интерфейсе, если передавали коллеге.
sudo -u git forgejo admin user create --admin \
--username root --email root@example.com \
--password 'ZamEniEtotParol1' --must-change-password=false
sudo -u git forgejo admin user list
Дальше откройте https://git.example.com/, войдите и создайте организацию или сразу репозиторий. Для импорта существующего проекта используйте кнопку «Новый репозиторий → Импорт» или зеркало: Forgejo умеет периодически подтягивать изменения из внешнего Git-адреса.
Reverse proxy с HTTPS
Forgejo не должен сам заниматься сертификатами: эту работу лучше отдать nginx. Важно поднять лимит размера тела запроса, иначе большие push и загрузка релизов будут обрываться с ошибкой 413.
server {
listen 443 ssl http2;
server_name git.example.com;
ssl_certificate /etc/letsencrypt/live/git.example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/git.example.com/privkey.pem;
client_max_body_size 512m;
location / {
proxy_pass http://127.0.0.1:3000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
Если SSH работает на порту 2222, добавьте запись в ~/.ssh/config, чтобы не указывать порт каждый раз. Пользователи клонируют репозитории по адресу вида ssh://git@git.example.com:2222/user/repo.git.
Host git.example.com
HostName git.example.com
Port 2222
User git
IdentityFile ~/.ssh/id_ed25519
Резервное копирование и обновление
Команда forgejo dump собирает базу, конфигурацию и репозитории в один архив. Это удобно для переноса, но для регулярного бэкапа лучше делать дамп и отдельно копировать каталог данных инкрементальным инструментом.
sudo -u git forgejo dump --config /etc/forgejo/app.ini \
--file /var/backups/forgejo-$(date +%F).zip
sudo tar -czf /var/backups/forgejo-data-$(date +%F).tar.gz -C /var/lib forgejo
Проверяйте восстановление на тестовой машине раз в квартал: архив, который ни разу не разворачивали, нельзя считать копией. Перед обновлением читайте примечания к релизу — миграции базы выполняются при старте.
Безопасность и обслуживание
- Включите двухфакторную аутентификацию для администраторов.
- Закройте регистрацию и создание организаций, если сервер приватный.
- Ограничьте доступ к
app.ini: там лежат секреты и строка подключения к базе. - Настройте fail2ban на журнал nginx и SSH, чтобы ограничить перебор паролей.
- Обновляйте сервер раз в месяц и держите две последние резервные копии.
Итог
Forgejo даёт полноценный Git-сервер без облачной зависимости: установка занимает полчаса, конфигурация помещается в один файл, а данные остаются под вашим контролем. Начните с SQLite и обратного прокси, включите HTTPS и резервное копирование, а затем добавляйте CI-раннеры и интеграции. Главное — не оставлять сервер без бэкапа и обновлений, иначе удобство обернётся потерей истории проектов.