MAATRIX / Блог / Forgejo в Docker Compose: готовый файл

Forgejo в Docker Compose: готовый файл

MAATRIX

Если вы искали self-hosted Git после того, как в 2024 году управление Gitea перешло к коммерческой структуре Gitea Ltd, и часть сообщества и мейнтейнеров начала беспокоиться о будущем проекта под некоммерческим брендом — вы, скорее всего, уже слышали про Forgejo. Это жёсткий форк Gitea, который развивается под эгидой некоммерческой ассоциации Codeberg с открытым, распределённым управлением. Ниже — рабочий docker-compose.yml, с которым Forgejo поднимается на чистом VPS за 15 минут, плюс всё, что вокруг него обычно ломается: SSH-доступ, HTTPS через обратный прокси, бэкапы и обновления.

Обсудить статью, задать вопрос или начать новую тему

Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.

Перейти в сообщество →

Почему Forgejo, а не Gitea или GitLab

Forgejo (произносится «фор-джей-о», от итальянского «кузница») ответвился от Gitea в октябре 2022 года — сначала как страховка на случай проблем с governance апстрима, а после того как в феврале 2024 года Gitea объявила о создании коммерческой Gitea Ltd, часть сообщества окончательно перешла на форк. Кодовая база у обоих проектов на момент разделения была общей, поэтому Forgejo умеет всё то же, что Gitea: issues, pull request'ы, wiki, пакетный реестр, миграцию репозиториев из GitHub/GitLab и собственный движок CI — Forgejo Actions, совместимый по синтаксису workflow-файлов с GitHub Actions.

Ключевое отличие от GitLab CE — вес. GitLab тянет за собой Rails-монолит, Redis, Sidekiq и рекомендует от 4 ГБ RAM даже для маленькой команды. Forgejo/Gitea — это один бинарник на Go плюс база данных, который спокойно работает на 1 vCPU / 1 ГБ RAM для команды из 3-5 человек.

РешениеМинимум RAMСтекCI из коробки
Forgejo~512 МБ-1 ГБGo + PostgreSQL/SQLiteForgejo Actions
Gitea~512 МБ-1 ГБGo + PostgreSQL/SQLiteGitea Actions
GitLab CEот 4 ГБRuby on Rails + Redis + PostgreSQLGitLab CI/CD

Цифры ориентировочные — реальное потребление зависит от числа пользователей, репозиториев и того, включены ли CI-раннеры на том же сервере. Если сравниваете именно Gitea и GitLab по функциональности, у нас есть отдельный разбор: Gitea против GitLab: что выгоднее и когда — почти всё оттуда верно и для Forgejo, разница в governance, а не в возможностях.

Что понадобится перед стартом

  • VPS с Ubuntu 24.04 или Debian 12, минимум 1 vCPU / 2 ГБ RAM (с запасом под CI-раннер лучше 2 vCPU / 4 ГБ).
  • Установленный Docker и Docker Compose plugin — если ещё не ставили, пошагово это описано в установке Docker на Ubuntu 24.04.
  • Домен или поддомен (например, git.вашдомен.ru), указывающий A-записью на IP сервера.
  • Открытые порты 80 и 443 (для HTTP/HTTPS) и порт для SSH-доступа к git — в этой статье используем 2222, чтобы не конфликтовать со штатным SSH сервера.
  • Доступ по SSH-ключу к самому серверу (не путать с SSH-портом Forgejo) — если ещё работаете по паролю, стоит сначала настроить SSH-ключи вместо пароля.

Нужен сервер под эту задачу?

Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK, США, Франция и РФ. Оплата картой РФ и по СБП.

Арендовать сервер

Готовый docker-compose.yml для Forgejo с PostgreSQL

Создаём рабочую директорию и структуру:

mkdir -p /opt/forgejo/{data,postgres}
cd /opt/forgejo

Файл .env рядом с compose-файлом:

DOMAIN=git.вашдомен.ru
DB_PASSWORD=замените-на-длинный-случайный-пароль

Сам docker-compose.yml:

services:
  forgejo-db:
    image: postgres:16-alpine
    container_name: forgejo-db
    restart: unless-stopped
    environment:
      - POSTGRES_USER=forgejo
      - POSTGRES_PASSWORD=${DB_PASSWORD}
      - POSTGRES_DB=forgejo
    volumes:
      - ./postgres:/var/lib/postgresql/data
    networks:
      - forgejo

  forgejo:
    image: codeberg.org/forgejo/forgejo:10
    container_name: forgejo
    restart: unless-stopped
    depends_on:
      - forgejo-db
    environment:
      - USER_UID=1000
      - USER_GID=1000
      - FORGEJO__database__DB_TYPE=postgres
      - FORGEJO__database__HOST=forgejo-db:5432
      - FORGEJO__database__NAME=forgejo
      - FORGEJO__database__USER=forgejo
      - FORGEJO__database__PASSWD=${DB_PASSWORD}
      - FORGEJO__server__DOMAIN=${DOMAIN}
      - FORGEJO__server__ROOT_URL=https://${DOMAIN}/
      - FORGEJO__server__SSH_PORT=2222
      - FORGEJO__service__DISABLE_REGISTRATION=true
    volumes:
      - ./data:/data
      - /etc/timezone:/etc/timezone:ro
      - /etc/localtime:/etc/localtime:ro
    ports:
      - "127.0.0.1:3000:3000"
      - "2222:22"
    networks:
      - forgejo

networks:
  forgejo:

Веб-порт 3000 намеренно привязан только к 127.0.0.1 — наружу его отдаёт обратный прокси с HTTPS (ниже). SSH-порт для git-операций, наоборот, торчит наружу напрямую на 2222, потому что через прокси SSH не проксируется. DISABLE_REGISTRATION=true закрывает самостоятельную регистрацию — первого и всех последующих пользователей заводит администратор вручную, что для корпоративного/командного Git-хостинга обычно и нужно.

Первый запуск и настройка администратора

docker compose up -d
docker compose logs -f forgejo

Дождитесь строки о том, что сервер слушает порт 3000, и остановите просмотр логов (Ctrl+C, контейнер продолжит работать в фоне). Поскольку регистрация отключена, первого администратора создаём из консоли:

docker exec -u git forgejo forgejo admin user create \
  --username admin \
  --password 'сложный-пароль' \
  --email admin@вашдомен.ru \
  --admin

Нюанс, о котором стоит знать заранее: внутри контейнера Forgejo хранит данные в путях, унаследованных от Gitea (/data/gitea/conf/app.ini, /data/gitea/gitea-repositories и т.д.) — это сделано для совместимости и упрощения миграции, а не баг. Если открывали конфиг Gitea раньше, ориентироваться будет легко.

Если решите не отключать регистрацию, а пройти веб-установщик — он откроется на http://127.0.0.1:3000 (доступен только с самого сервера или через SSH-туннель ssh -L 3000:127.0.0.1:3000 user@server), и все переменные окружения выше в нём будут уже подставлены.

HTTPS через Caddy и SSH-доступ по git@

Для HTTPS проще всего поднять Caddy — он сам получает и продлевает сертификат Let's Encrypt. Подробная установка описана в статье Caddy с авто-SSL на Ubuntu 24.04, здесь только конфиг под Forgejo:

git.вашдомен.ru {
    reverse_proxy 127.0.0.1:3000
}

После systemctl reload caddy сайт откроется по https://git.вашдомен.ru с уже валидным сертификатом.

Клонирование по SSH идёт через выделенный порт 2222 (не забудьте открыть его в firewall, ufw allow 2222/tcp):

git clone ssh://git@git.вашдомен.ru:2222/username/repo.git

Если не хочется каждый раз писать нестандартный порт, добавьте алиас в ~/.ssh/config на своей машине:

Host git.вашдомен.ru
    Port 2222
    User git

Тогда git clone git@git.вашдомен.ru:username/repo.git заработает как обычно.

Бэкапы, обновление и перенос

Всё состояние Forgejo — репозитории, база данных, конфиг, вложения issues — лежит в двух volume: ./data и ./postgres. Если пока не разбирались, чем bind mount отличается от named volume и когда что удобнее, это разобрано в статье про типы Docker volumes.

Встроенный дамп (без остановки сервиса, но лучше делать в тихие часы):

docker exec -u git forgejo forgejo dump -c /data/gitea/conf/app.ini
docker cp forgejo:/data/gitea-dump-*.zip ./backups/

Для регулярных автоматических бэкапов на внешнее хранилище логично завернуть это в cron и BorgBackup — как настроить, описано в установке BorgBackup на VPS.

Обновление — обычный для docker compose путь:

docker compose pull
docker compose up -d

Перед обновлением на мажорную версию стоит заглянуть в changelog на codeberg.org/forgejo/forgejo — проект ведёт собственную нумерацию версий, синхронизированную с Gitea лишь частично, и иногда мажорные релизы несут миграции схемы БД, которые лучше сначала прогнать на копии, а не на боевом сервере.

Нужен сервер под эту задачу?

Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK, США, Франция и РФ. Оплата картой РФ и по СБП.

Арендовать сервер

Нужны сами нейросети для контента?

Генерируйте изображения, видео и озвучку нейросетями на falapi.io — десятки моделей в одном окне. Оплата картой РФ и по СБП.

Частые вопросы

Можно ли просто заменить образ Gitea на Forgejo в существующем compose-файле и мигрировать данные?

Да, благодаря общей истокам схема базы данных и структура /data совместимы. На практике: остановить Gitea, сделать бэкап volume, заменить образ в compose на codeberg.org/forgejo/forgejo, поднять заново — Forgejo подхватит существующую БД. Перед этим стоит свериться с текущей версией Gitea в release notes Forgejo, чтобы не перескочить несколько миграций сразу.

Forgejo Actions действительно совместимы с GitHub Actions?

Синтаксис workflow-файлов (.forgejo/workflows/*.yml или .gitea/workflows/*.yml) в основном совместим, многие action с GitHub Marketplace работают без изменений через прокси-реестр. Но раннер — отдельный компонент (forgejo-runner), в этом compose-файле его нет, поднимается дополнительным контейнером и регистрируется токеном из веб-интерфейса.

Стоит ли использовать SQLite вместо PostgreSQL?

Для одного-двух пользователей и нескольких мелких репозиториев SQLite избавляет от лишнего контейнера. Но при росте команды или если планируете регулярные бэкапы «на горячую», PostgreSQL надёжнее и проще восстанавливать — миграция с SQLite на PostgreSQL позже возможна, но добавляет лишний шаг, поэтому если не уверены — сразу берите Postgres.

Нужен ли отдельный сервер под Forgejo, или можно на одном VPS с другими сервисами?

Можно на одном — Forgejo лёгкий. Ограничение обычно не CPU/RAM самого Git-сервера, а CI-раннеры: если планируете гонять сборки контейнеров или тесты прямо на нём, закладывайте отдельные ресурсы под раннер, иначе он будет конкурировать с самим Forgejo за CPU в момент пуша.

Что будет с моими issues и pull request'ами, если позже решу вернуться на Gitea?

Обратная миграция технически возможна тем же способом (замена образа), пока схемы БД не разошлись слишком сильно. Чем дольше проекты развиваются раздельно, тем выше риск, что часть новых полей одного форка не будет понятна другому — это стоит иметь в виду как долгосрочный риск, а не сиюминутную проблему.

Обсудить статью, задать вопрос или начать новую тему

Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.

Перейти в сообщество →