Перейти к содержанию

Forgejo: Git, Docker и реестры пакетов

Forgejo — э��о не только Git-хостинг. Встроенный Package Registry поддерживает Docker/OCI, PyPI, Maven, npm, NuGet, Cargo и другие форматы. Всё через один домен, один Access Token, без отдельных сервисов.

Предполагаемый адрес: git.dix.su (замени на свой, если другой)


Установщик: начальная конфигурация

При первом открытии https://ваш-слаг.dix.su Forgejo показывает страницу «Initial configuration» — это одноразовый мастер настройки. Он запускается автоматически, если app.ini ещё не создан.

Большинство полей уже заполнены

Стек dixsu-git передаёт ключевые параметры через переменные окружения (FORGEJO__server__DOMAIN, ROOT_URL и др.). Форма уже покажет правильные значения — трогать их не нужно, если не знаешь зачем.

Раздел Database settings

Поле Что выбрать Почему
Database type SQLite3 Стек уже настроен на SQLite — отдельный сервер БД не нужен
Path оставить по умолчанию Данные хранятся в Docker volume /data, менять не нужно

PostgreSQL/MySQL подойдут для больших инсталляций с тысячами пользователей, для личного/командного использования SQLite оптимален.

Раздел General settings

Поле Что делать Примечание
Instance title Заполни — название твоего сервера Например: Мой Git, Dev Hub, Team Forge
Instance slogan Необязательно, можно оставить пустым Подзаголовок на главной странице
Repository root path Оставить по умолчанию /data/git/repositories — папка в volume
Git LFS root path Оставить по умолчанию LFS нужен для больших бинарных файлов (модели, видео)
User to run as Оставить git Системный пользователь внутри контейнера
Server domain Не трогать — уже заполнен из env ваш-слаг.dix.su
SSH server port Не трогать 2222 — настроен в docker-compose
HTTP listen port Не трогать 3000 — внутренний порт контейнера
Base URL Не трогать — уже заполнен из env https://ваш-слаг.dix.su
Log path Оставить по умолчанию /data/forgejo/log

Чекбокс «Only instance administrators can create accounts»

Рядом с настройками сервера есть чекбокс: Only instance administrators will be able to create new user accounts.

  • Отмечен = регистрация закрыта с первой секунды. Новых пользователей создаёт только администратор через панель. Рекомендуется для личного или командного сервера.
  • Снят = любой зашедший на сайт может зарегистрироваться (публичная инсталляция).

Это то же самое, что DISABLE_REGISTRATION в .env — просто через UI.

Раздел Optional settings (Email, Services)

Все необязательны при первом запуске. Можно настроить позже в Site Administration → Configuration.

  • Email settings — нужны только если хочешь слать уведомления пользователям (потребует SMTP-сервер).
  • Server and third-party service settings — авторизация через GitHub/Google и т.п., для личного сервера не нужно.

Раздел Administrator account settings

Это главное, что нужно заполнить:

Поле Что ввести
Username Логин администратора (латиница, например admin или своё имя)
Email Твой email
Password Надёжный пароль (минимум 8 символов)

Warning

Пароль нигде не сохраняется и показывается только тут. Если забудешь — восстановить можно только через CLI (forgejo admin user change-password).

Итог: что реально заполнять

  1. Instance title — название сервера (любое)
  2. Опционально — чекбокс «только администратор создаёт аккаунты»
  3. Administrator account — логин, email, пароль
  4. Нажать Install Forgejo

Через несколько секунд откроется страница входа. Войди с указанными данными — ты уже администратор.


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

Что делает DISABLE_REGISTRATION

В .env стека dixsu-git есть переменная:

# false — любой может зарегистрироваться
# true  — только администратор создаёт аккаунты
DISABLE_REGISTRATION=false

Она управляет тем, кто может создавать аккаунты через веб-интерфейс Forgejo.

Значение Кто может зарегистрироваться
false Любой посетитель git.dix.su
true Никто через форму — только администратор через CLI

Откуда берётся первый администратор

Первый пользователь, зарегистрировавшийся через веб-форму, автоматически получает права администратора — это встроенное поведение Forgejo (унаследовано от Gitea).

Рекомендуемый порядок при первом запуске:

  1. Поставь DISABLE_REGISTRATION=false в .env
  2. Подними стек: docker compose up -d
  3. Зайди на git.dix.su → зарегистрируй аккаунт первым
  4. Убедись, что ты администратор: Site Administration должен быть виден в меню аватара
  5. Переключи DISABLE_REGISTRATION=true в .env, перезапусти: docker compose up -d
  6. Теперь регистрация через форму закрыта — новых пользователей создаёшь ты сам через Site Administration → Users → Create User

Если сразу выставил DISABLE_REGISTRATION=true

Если при первом запуске регистрация была уже отключена, войти через веб-форму невозможно. Создай первого администратора через CLI:

docker exec -it dixsu-forgejo-1 \
  forgejo admin user create \
    --username admin \
    --password "ВашПароль" \
    --email admin@example.com \
    --admin

Имя контейнера

Имя контейнера зависит от стека. Проверь актуальное через docker ps | grep forgejo.

После этого зайди в веб-интерфейс с указанными учётными данными — смена пароля при первом входе не обязательна, но рекомендуется через Settings → Password.

Создать дополнительного пользователя (при закрытой регистрации)

Через веб: Site Administration → Users → Create User Account.

Через CLI:

docker exec -it dixsu-forgejo-1 \
  forgejo admin user create \
    --username newuser \
    --password "ПарольПользователя" \
    --email newuser@example.com

Флаг --admin — только если нужен ещё один администратор.


Общее: Access Token

Один токен работает для всего — Git по HTTPS, Docker login, pip, mvn, npm.

Forgejo → Settings → Applications → Generate Token. Нужные разрешения зависят от задачи:

Что делаешь Разрешения токена
Только читаешь (clone, pull, install) read:repository, package:read
Пишешь код и пакеты write:repository, package:write
CI/CD (всё) write:repository, package:write, read:user

Токен показывается один раз — сохрани сразу.


1. Git-репозиторий — хранение кода

Создать репозиторий

В Forgejo: +New Repository → выбрать видимость (Public / Private).

Клонировать по HTTPS

git clone https://git.dix.su/myuser/myrepo.git
# При запросе пароля — введи Access Token, не пароль от аккаунта

Чтобы не вводить токен каждый раз — встроить в URL (только на доверенной машине):

git clone https://myuser:MY_TOKEN@git.dix.su/myuser/myrepo.git

Или сохранить через credential helper:

git config --global credential.helper store
git clone https://git.dix.su/myuser/myrepo.git
# Один раз введи логин + токен — запомнится

SSH-доступ через dixsu-туннель

Forgejo SSH в стеке dixsu-git доступен через dixsu на порту 2222.

Шаг 1 — добавить SSH-ключ в Forgejo:

# Сгенерировать ключ (если нет)
ssh-keygen -t ed25519 -C "myhost"

# Скопировать публичный ключ
cat ~/.ssh/id_ed25519.pub

Forgejo → Settings → SSH / GPG Keys → Add Key → вставить содержимое .pub.

Шаг 2 — добавить в ~/.ssh/config:

Host git.dix.su
    HostName     git.dix.su
    Port         2222
    User         git
    IdentityFile ~/.ssh/id_ed25519
    ProxyCommand bash -c 'S=$(echo %h | cut -d. -f1); { echo "DIXSU:$S"; cat; } | nc %h %p'

Порт 2222

dixsu туннелирует SSH Forgejo на порт 2222 — тот же, что и для обычного SSH на устройство. User git — стандартный git-пользователь Forgejo, не твой логин.

Шаг 3 — клонировать по SSH:

git clone git@git.dix.su:myuser/myrepo.git

Первый пуш существующего проекта

cd myproject
git init
git add .
git commit -m "Initial commit"

# HTTPS
git remote add origin https://git.dix.su/myuser/myrepo.git

# или SSH
git remote add origin git@git.dix.su:myuser/myrepo.git

git push -u origin main

Проверить соединение (SSH)

ssh -T git@git.dix.su -p 2222
# Ответ: Hi myuser! You've successfully authenticated...

2. Docker / OCI реестр

На стеке dixsu-git работает сразу, без настройки

Package Registry Forgejo (образ ghcr.io/forgejo/forgejo:11 из stacks/dixsu-git) включён по умолчанию — трогать app.ini не нужно. TLS и проксирование берёт на себя dix.su-туннель: сертификат для *.dix.su валидный, поэтому не требуется ни поднимать свой nginx перед Forgejo, ни прописывать insecure-registries в daemon.json на клиентских машинах. Проверить, что реестр отвечает: curl -I https://ваш-слаг.dix.su/v2/ — в ответе будет docker-distribution-api-version: registry/2.0.

Если вы разворачиваете Forgejo отдельно от dix.su (свой сервер, свой домен, свой reverse-proxy) — включите [packages] ENABLED = true в app.ini и поставьте перед контейнером nginx (или аналог) с client_max_body_size 0, иначе будут рваться пуши больших слоёв образа.

Создать токен доступа

Forgejo → Settings → Applications → Generate New Token. Нужные scope: write:package (для push), read:package (для pull).

Войти и пушить

docker login ваш-слаг.dix.su
# Username: логин Forgejo  /  Password: токен из шага выше

docker tag myimage:latest ваш-слаг.dix.su/myuser/myimage:latest
docker push ваш-слаг.dix.su/myuser/myimage:latest
docker pull ваш-слаг.dix.su/myuser/myimage:latest

myuser — имя пользователя или организации в Forgejo (не обязательно совпадает со слагом dix.su). Репозиторий/пакет создаётся автоматически при первом push — заранее ничего заводить не нужно.

Посмотреть загруженные образы: вкладка Packages в профиле пользователя или организации в веб-интерфейсе Forgejo.

В Forgejo Actions

- uses: docker/login-action@v3
  with:
    registry: git.dix.su
    username: ${{ github.actor }}
    password: ${{ secrets.FORGEJO_TOKEN }}

- uses: docker/build-push-action@v5
  with:
    push: true
    tags: git.dix.su/${{ github.repository }}:latest

3. PyPI — Python-пакеты

URL реестра: https://git.dix.su/api/packages/myuser/pypi

Установка пакетов

pip install \
  --index-url https://git.dix.su/api/packages/myuser/pypi/simple/ \
  mypackage

Или добавить в pip.conf / ~/.pip/pip.conf:

[global]
index-url = https://myuser:MY_TOKEN@git.dix.su/api/packages/myuser/pypi/simple/

Публикация пакета

pip install twine build

# Собрать
python -m build

# Загрузить
twine upload \
  --repository-url https://git.dix.su/api/packages/myuser/pypi/ \
  --username myuser \
  --password MY_TOKEN \
  dist/*

Или через ~/.pypirc:

[distutils]
index-servers = forgejo

[forgejo]
repository = https://git.dix.su/api/packages/myuser/pypi/
username   = myuser
password   = MY_TOKEN
twine upload --repository forgejo dist/*

pyproject.toml (Poetry)

[[tool.poetry.source]]
name     = "forgejo"
url      = "https://git.dix.su/api/packages/myuser/pypi/simple/"
priority = "primary"
poetry config http-basic.forgejo myuser MY_TOKEN
poetry publish --repository forgejo

4. Maven — Java/Kotlin-пакеты

URL реестра: https://git.dix.su/api/packages/myuser/maven

~/.m2/settings.xml

<settings>
  <servers>
    <server>
      <id>forgejo</id>
      <username>myuser</username>
      <password>MY_TOKEN</password>
    </server>
  </servers>
</settings>

pom.xml — публикация

<distributionManagement>
  <repository>
    <id>forgejo</id>
    <url>https://git.dix.su/api/packages/myuser/maven</url>
  </repository>
  <snapshotRepository>
    <id>forgejo</id>
    <url>https://git.dix.su/api/packages/myuser/maven</url>
  </snapshotRepository>
</distributionManagement>
mvn deploy

pom.xml — использование зависимости

<repositories>
  <repository>
    <id>forgejo</id>
    <url>https://git.dix.su/api/packages/myuser/maven</url>
  </repository>
</repositories>

<dependencies>
  <dependency>
    <groupId>com.example</groupId>
    <artifactId>mylib</artifactId>
    <version>1.0.0</version>
  </dependency>
</dependencies>

Gradle (build.gradle.kts)

repositories {
    maven {
        url = uri("https://git.dix.su/api/packages/myuser/maven")
        credentials {
            username = "myuser"
            password = "MY_TOKEN"   // лучше вынести в gradle.properties
        }
    }
}

5. npm — Node.js-пакеты

URL реестра: https://git.dix.su/api/packages/myuser/npm/

Настройка .npmrc

@myuser:registry=https://git.dix.su/api/packages/myuser/npm/
//git.dix.su/api/packages/myuser/npm/:_authToken=MY_TOKEN

Или глобально:

npm config set @myuser:registry https://git.dix.su/api/packages/myuser/npm/
npm config set //git.dix.su/api/packages/myuser/npm/:_authToken MY_TOKEN

Публикация

В package.json имя пакета должно начинаться с @myuser/:

{
  "name": "@myuser/mypackage",
  "version": "1.0.0",
  "publishConfig": {
    "registry": "https://git.dix.su/api/packages/myuser/npm/"
  }
}
npm publish

Установка

npm install @myuser/mypackage

6. Другие форматы

Forgejo поддерживает ещё несколько форматов — все по той же схеме:

Формат Экосистема URL реестра
NuGet .NET / C# /api/packages/myuser/nuget/index.json
Cargo Rust /api/packages/myuser/cargo/
Composer PHP /api/packages/myuser/composer/packages.json
RubyGems Ruby /api/packages/myuser/rubygems/
Generic любые файлы /api/packages/myuser/generic/

Детали конфигурации — в официальной документации Forgejo.

Generic — произвольные файлы

Полезен для бинарников, архивов, артефактов сборки:

# Загрузить
curl --user myuser:MY_TOKEN \
     --upload-file myfile.tar.gz \
     https://git.dix.su/api/packages/myuser/generic/myproject/1.0.0/myfile.tar.gz

# Скачать
curl -O \
     https://git.dix.su/api/packages/myuser/generic/myproject/1.0.0/myfile.tar.gz

Видимость пакетов

Приватность наследуется от репозитория:

  • Публичный репо → пакет доступен без авторизации
  • Приватный репо → только с токеном

Связать пакет с репозиторием: Package → Settings → Link to repository.