Forgejo на Ubuntu 24.04: пошаговая установка
Если вы держите свой Git-хостинг на Gitea, но не в восторге от того, куда движется проект после смены владельца и модели управления, — логичный шаг перейти на Forgejo. Это форк Gitea, который community-driven команда подняла именно как ответ на непрозрачные решения апстрима: без корпоративного контроля, с открытым процессом принятия решений и полной совместимостью базы данных и репозиториев. В этой статье — рабочая установка Forgejo на чистой Ubuntu 24.04: от системного пользователя до HTTPS через Nginx, без Docker, бинарником напрямую в systemd.
Содержание
Обсудить статью, задать вопрос или начать новую тему
Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.
Перейти в сообщество →Почему Forgejo, а не Gitea
Летом 2022 года часть команды Gitea без предупреждения сообщества передала контроль над проектом в частную компанию — Gitea Ltd. Часть контрибьюторов не согласилась с этим решением и форкнула проект под эгидой Codeberg e.V. (некоммерческая организация), назвав его Forgejo (от древнеанглийского «forge» — кузница). С тех пор оба проекта развиваются параллельно, но с разной философией: Gitea всё активнее превращается в продукт с коммерческой поддержкой, Forgejo остаётся под управлением сообщества и следует модели "soft fork" — старается сохранять совместимость на уровне БД и API, но добавляет свои фичи (federation через ActivityPub, встроенные Actions с самого начала, более консервативный подход к телеметрии).
Для тех, кто разворачивает self-hosted Git ради независимости от чужих облаков, второй виток той же зависимости — от решений одной компании внутри опенсорсного проекта — выглядит немного иронично. Отсюда и растущий интерес к Forgejo как к "тому самому Gitea, только без сюрпризов".
Важный практический момент: если у вас уже стоит Gitea, миграция на Forgejo обычно сводится к замене бинарника — база данных, структура репозиториев и конфиг совместимы (с оговорками по версиям, о них ниже). Но в этой статье разберём установку с нуля.
Требования к серверу и подготовка
Для команды из 5-15 человек с несколькими десятками репозиториев хватает скромной конфигурации:
| Ресурс | Минимум | Комфортно |
|---|---|---|
| CPU | 1 vCPU | 2 vCPU |
| RAM | 1 GB | 2-4 GB |
| Диск | 20 GB SSD | 40+ GB SSD (зависит от размера репозиториев) |
| ОС | Ubuntu 24.04 LTS | Ubuntu 24.04 LTS |
Если планируете гонять Forgejo Actions (встроенный CI/CD, аналог GitHub Actions) на том же сервере — закладывайте RAM с запасом, сборки docker-образов и тесты быстро съедают память. Для рантаймеров лучше вынести на отдельную VM или хотя бы отдельный раннер.
Первым делом — обновление системы и создание системного пользователя, под которым будет работать сервис:
sudo apt update && sudo apt upgrade -y
sudo apt install -y git wget curl
sudo adduser \
--system \
--shell /bin/bash \
--gecos 'Git Version Control' \
--group \
--disabled-password \
--home /home/git \
git
Пользователь git — стандартная практика для форджей: под ним будут жить репозитории и SSH-ключи для клонирования по git@.
Нужен сервер под эту задачу?
Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK, США, Франция и РФ. Оплата картой РФ и по СБП.
Арендовать серверУстановка PostgreSQL
Forgejo поддерживает SQLite, MySQL/MariaDB и PostgreSQL. Для продакшена рекомендую PostgreSQL — стабильнее под нагрузкой, проще бэкапить логически через pg_dump. Если у вас уже есть отдельная статья на эту тему — вот она: установка PostgreSQL на Ubuntu 24.04 с более подробным разбором тюнинга.
sudo apt install -y postgresql postgresql-contrib
sudo systemctl enable --now postgresql
Создаём базу и пользователя:
sudo -u postgres psql -c "CREATE USER forgejo WITH PASSWORD 'замените-на-длинный-пароль';"
sudo -u postgres psql -c "CREATE DATABASE forgejo OWNER forgejo;"
Пароль сгенерируйте нормально, не «forgejo123»:
openssl rand -base64 24
Проверить, что подключение работает:
psql -h 127.0.0.1 -U forgejo -d forgejo -c "SELECT version();"
Если PostgreSQL слушает только localhost (по умолчанию так и есть) — это нормально и безопасно, наружу базу открывать не нужно.
Скачивание и установка бинарника Forgejo
Официальные релизы лежат на codeberg.org. Актуальную версию на конец августа 2026 года уточните на странице релизов — здесь ориентируюсь на общий подход, конкретный номер версии на момент вашей установки может отличаться:
# узнаём архитектуру
uname -m
Для x86_64-сервера (большинство VPS):
cd /tmp
wget https://codeberg.org/forgejo/forgejo/releases/download/v10.0.0/forgejo-10.0.0-linux-amd64
Замените версию в URL на актуальную с страницы релизов Forgejo — точный номер стабильного релиза на момент вашей установки я гарантировать не могу, проверяйте перед скачиванием. Там же лежит файл с контрольной суммой (.sha256) — сверьте её обязательно:
wget https://codeberg.org/forgejo/forgejo/releases/download/v10.0.0/forgejo-10.0.0-linux-amd64.sha256
sha256sum -c forgejo-10.0.0-linux-amd64.sha256
Если сумма совпала — переносим бинарник и делаем исполняемым:
sudo cp forgejo-10.0.0-linux-amd64 /usr/local/bin/forgejo
sudo chmod +x /usr/local/bin/forgejo
sudo chown root:root /usr/local/bin/forgejo
Создаём структуру каталогов:
sudo mkdir -p /var/lib/forgejo
sudo chown git:git /var/lib/forgejo
sudo chmod 750 /var/lib/forgejo
sudo mkdir -p /etc/forgejo
sudo chown root:git /etc/forgejo
sudo chmod 770 /etc/forgejo
sudo mkdir -p /var/log/forgejo
sudo chown git:git /var/log/forgejo
sudo chmod 750 /var/log/forgejo
Настройка systemd-сервиса
Создаём unit-файл:
sudo nano /etc/systemd/system/forgejo.service
Содержимое:
[Unit]
Description=Forgejo (Git with a cup of tea)
After=syslog.target network.target postgresql.service
Requires=postgresql.service
[Service]
RestartSec=2s
Type=simple
User=git
Group=git
WorkingDirectory=/var/lib/forgejo/
ExecStart=/usr/local/bin/forgejo web --config /etc/forgejo/app.ini
Restart=always
Environment=USER=git HOME=/home/git GITEA_WORK_DIR=/var/lib/forgejo
# Ограничения безопасности
NoNewPrivileges=true
ProtectSystem=strict
ReadWritePaths=/var/lib/forgejo /etc/forgejo /var/log/forgejo
PrivateTmp=true
[Install]
WantedBy=multi-user.target
Обратите внимание: переменная окружения и внутренние пути до сих пор называются GITEA_* и gitea в некоторых местах — это наследие форка, Forgejo сохраняет их для совместимости конфигов и не спешит переименовывать всё подряд, чтобы не ломать существующие установки при апгрейде с Gitea.
Пока не запускаем — сначала конфиг. Перезагружаем systemd, чтобы юнит подхватился:
sudo systemctl daemon-reload
Первичная настройка через веб-мастер
Запускаем сервис первый раз без готового app.ini — Forgejo сам создаст минимальный конфиг и откроет веб-установщик:
sudo systemctl start forgejo
sudo systemctl status forgejo
Если сервис не поднялся — смотрите журнал:
sudo journalctl -u forgejo -n 50 --no-pager
По умолчанию Forgejo слушает 0.0.0.0:3000. Временно откройте порт для доступа с вашего IP (если фаервол уже настроен) или используйте SSH-туннель, чтобы не светить панель установки наружу:
ssh -L 3000:localhost:3000 user@ваш-сервер
Дальше откройте http://localhost:3000 в браузере — увидите форму установки. Заполните:
- Тип БД: PostgreSQL
- Хост:
127.0.0.1:5432 - Имя БД:
forgejo - Пользователь/пароль: те, что создали на шаге с PostgreSQL
- Домен приложения: ваш домен, например
git.example.com - SSH-порт: 22 (или другой, если меняли)
- HTTP-порт: 3000
- Base URL:
https://git.example.com/
После сохранения Forgejo запишет полноценный app.ini в /etc/forgejo/app.ini и перезапустится с новыми настройками. Первый созданный вами через веб-интерфейс аккаунт станет администратором — сделайте это сразу, не откладывая.
Nginx как reverse proxy и SSL
Открывать порт 3000 наружу постоянно — плохая идея. Ставим Nginx перед Forgejo и закрываем прямой доступ к порту приложения фаерволом (если у вас ещё не настроен UFW, вот пошаговая настройка фаервола UFW на Ubuntu 24.04).
sudo apt install -y nginx
Конфиг сайта:
sudo nano /etc/nginx/sites-available/forgejo
server {
listen 80;
server_name git.example.com;
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;
proxy_redirect off;
}
}
client_max_body_size увеличен намеренно — иначе крупные пуши с большими файлами (LFS, бинарники) будут обрываться ошибкой 413.
sudo ln -s /etc/nginx/sites-available/forgejo /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx
Перед выпуском сертификата убедитесь, что A-запись домена уже указывает на IP сервера — если DNS ещё не настроен, сначала настройте домен и DNS для Ubuntu 24.04. Дальше — Certbot:
sudo apt install -y certbot python3-certbot-nginx
sudo certbot --nginx -d git.example.com
Certbot сам допишет блок listen 443 ssl и настроит редирект с 80 на 443. Проверьте автопродление:
sudo certbot renew --dry-run
Теперь закрываем прямой доступ к порту 3000 из интернета — либо биндим Forgejo только на 127.0.0.1 в app.ini (секция [server], параметр HTTP_ADDR = 127.0.0.1), либо блокируем порт в UFW:
sudo ufw deny 3000/tcp
Первый вариант надёжнее — порт вообще не слушает внешний интерфейс.
SSH-доступ к репозиториям и первые шаги
Клонирование по SSH требует, чтобы пользователь git мог принимать подключения с ключами пользователей. Forgejo по умолчанию использует встроенный SSH-сервер на порту 22 (или отдельный, если вы его меняли в настройке), проксируя команды через authorized_keys пользователя git.
Добавить SSH-ключ можно через веб-интерфейс: Settings → SSH / GPG Keys. После этого клонирование работает стандартно:
git clone git@git.example.com:username/repo.git
Если у вас ещё нет привычки работать с ключами вместо паролей на самом сервере — вот отдельный разбор: SSH-ключи вместо пароля на Ubuntu 24.04.
Что стоит настроить сразу после установки:
- Отключить регистрацию (если это внутренний хостинг):
Site Administration → Configuration → Disable self-registration. - Включить Forgejo Actions, если планируете CI/CD прямо на сервере — они встроены и не требуют отдельного GitHub Actions Runner, но раннер (агент, исполняющий джобы) всё равно нужно установить отдельно.
- Настроить бэкапы — встроенная команда
forgejo dumpсобирает базу, репозитории и конфиг в один архив:
sudo -u git forgejo dump --config /etc/forgejo/app.ini --file /var/backups/forgejo-dump-$(date +%F).zip
Автоматизируйте это через cron и выгружайте архив за пределы сервера — локальный бэкап на том же диске не спасёт при отказе диска.
Обновление и переход с Gitea
Обновление Forgejo — замена бинарника с остановкой и запуском сервиса:
sudo systemctl stop forgejo
sudo cp forgejo-НОВАЯ-ВЕРСИЯ-linux-amd64 /usr/local/bin/forgejo
sudo chmod +x /usr/local/bin/forgejo
sudo systemctl start forgejo
Перед мажорным апгрейдом всегда снимайте дамп через forgejo dump — миграции схемы БД необратимы без отката из бэкапа.
Если переходите с существующей Gitea, общая идея такая: останавливаете Gitea, кладёте бинарник Forgejo вместо gitea, указываете тот же app.ini и тот же путь к данным, запускаете. Forgejo при первом старте применит нужные миграции поверх существующей схемы. Но здесь важна совместимость версий — слишком старая Gitea или слишком новая Forgejo может не совпасть по миграциям, поэтому перед переходом сверьтесь с таблицей совместимости в официальной документации Forgejo и сначала обновите Gitea до последней версии, с которой заявлена поддержка миграции.
Нужен сервер под эту задачу?
Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK, США, Франция и РФ. Оплата картой РФ и по СБП.
Арендовать серверНужны сами нейросети для контента?
Генерируйте изображения, видео и озвучку нейросетями на falapi.io — десятки моделей в одном окне. Оплата картой РФ и по СБП.
Частые вопросы
Чем Forgejo принципиально отличается от Gitea, если код почти общий?
Управлением проектом (некоммерческая организация Codeberg e.V. вместо частной компании) и вектором развития: Forgejo делает акцент на федерации (ActivityPub), встроенных Actions с первого дня и меньшей телеметрии по умолчанию. Ядро действительно долго было близким, но разработка идёт независимо, и со временем расхождение в фичах растёт.
Можно ли поставить Forgejo через Docker вместо бинарника?
Да, официальный образ есть, и для многих это удобнее — не нужно вручную настраивать systemd и пользователя. Бинарник в статье выбран ради прозрачности процесса и меньшего оверхеда на слабых VPS, где каждый лишний слой Docker ощутим по памяти.
Нужен ли отдельный сервер для CI/CD (Forgejo Actions)?
Не обязательно для небольших проектов, но раннер стоит вынести на отдельную машину или хотя бы ограничить его ресурсами через cgroups, если сборки тяжёлые — иначе CI может забрать всю память у самого Git-сервера в момент пиковой нагрузки.
Что будет с моими данными, если Forgejo как проект закроется?
База и репозитории лежат у вас на сервере в открытом формате (PostgreSQL + голые git-репозитории на диске), это не проприетарный формат — в худшем случае миграция на другой форк или обратно на Gitea технически возможна, хотя и потребует ручной сверки схемы.
Как ограничить размер репозитория или квоту на пользователя?
В app.ini есть секция [repository] и связанные параметры лимитов, но встроенных жёстких квот на пользователя в базовой поставке немного — для строгого контроля дискового пространства проще мониторить /var/lib/forgejo/repositories на уровне ОС и предупреждать администратора при приближении к лимиту диска.
Обсудить статью, задать вопрос или начать новую тему
Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.
Перейти в сообщество →