Создание собственного репозитория

Материал из ALT Linux Wiki
(перенаправлено с «Ownrepo»)
Примечание: Данная статья создана для организаций, которые хотят создать собственный репозиторий с ПО для ALT Linux, совместимый с APT-RPM, который используется в данной системе.
Примечание: Короткая ссылка сюда - https://www.altlinux.org/Ownrepo


Состав

Репозиторий ALT Linux состоит из трех компонентов:

  • индексов - где описаны все пакеты, ссылки на них и их версии
  • самих пакетов (в формате *.rpm)
  • подписи индексов

Структура

Базовый каталог

Базовый каталог html:

/var/www/html/

Создаем каталог для репозитория:

# mkdir -p /var/www/html/extra

Создаем каталог branch:

# mkdir -p /var/www/html/extra/branch/p11/
# chown apache:apache -R /var/www/html
# systemctl restart httpd2.service

Корневой каталог Apache2

Отредактируйте файл:

# mcedit /etc/httpd2/conf/httpd2.conf

Исправьте корневой каталог:

DocumentRoot /var/www/html

Конфигурационный файл сайта

Создайте файл, в котором, кроме прочего, будут описаны:

  • каталог сайта на диске
  • разрешение на отображение его содержимого по http
  • разрешение на открытый доступ по http
mcedit /etc/httpd2/conf/sites-available/apt-repo.conf
<VirtualHost *:80>
    ServerName your-server-domain
    DocumentRoot /var/www/html/extra
    
    <Directory /var/www/html/extra>
        Options Indexes FollowSymLinks
        AllowOverride None
        Require all granted
        IndexOptions FancyIndexing NameWidth=*
    </Directory>
    
    # Включение листинга каталогов
    IndexOptions FancyIndexing NameWidth=* DescriptionWidth=*
</VirtualHost>

Включаем конфиг:

# a2ensite apt-repo
# systemctl restart httpd2.service
# systemctl reload apache2
# chown -R apache:apache /var/www/html/extra
# chmod -R 755 /var/www/html/extra
# systemctl reload httpd2.service

Создание собственного репозитория

Задача: создать собственный репозиторий со своими пакетами.

Добавляем свой компонент

Новый компонент будет называться extra.

Репозиторий будет находится в каталоге /var/www/html/extra/branch/p11/. Создадим необходимую структуру для нового компонента:

# mkdir -p /var/www/html/extra/branch/p11/x86_64/RPMS.extra

где:

  • x86_64 — архитектура компонента;
  • extra — суффикс компонента.

Наполнение компонента и создание индексов

Установим apt-repo-tools:

# apt-get install apt-repo-tools

Скопируем пакеты RPM в каталог /var/www/html/extra/branch/p11/x86_64/RPMS.extra:

# cp -v *.rpm /var/www/html/extra/branch/p11/x86_64/RPMS.extra

Создание ключей GPG

Создаем пару ключей GPG:

# gpg --gen-key
Выберите тип ключа:
   (1) RSA и RSA (по умолчанию)
   (2) DSA и Elgamal
   (3) DSA (только для подписи)
   (4) RSA (только для подписи)
Ваш выбор?

// Пишем 1. Так как нам необходим тип ключа RSA и RSA

длина ключей RSA может быть от 1024 до 4096 бит.
Какой размер ключа Вам необходим? (2048)

// Пишем размер ключа 2048

Запрошенный размер ключа - 2048 бит
Выберите срок действия ключа.
         0 = без ограничения срока действия
      <n>  = срок действия - n дней
      <n>w = срок действия - n недель
      <n>m = срок действия - n месяцев
      <n>y = срок действия - n лет
Срок действия ключа? (0)

// Ставим 0 без ограничения срока действия.

Срок действия ключа не ограничен
Все верно? (y/N)

// Ставим y

Для идентификации Вашего ключа необходим ID пользователя. Программа создаст его
из Вашего имени, комментария и адреса электронной почты в виде:
    "Baba Yaga (pensioner) <yaga@deepforest.ru>"

Ваше настоящее имя: (Пишем наше настоящее имя)
Адрес электронной почты: (Пишем адрес электронной почты)
Комментарий: 
Вы выбрали следующий ID пользователя:
    "Repo Signer <admin@company.net>"

Сменить (N)Имя, (C)Комментарий, (E)адрес или (O)Принять/(Q)Выход?

// Пишем O (Принять)

Для защиты секретного ключа необходима фраза-пароль.

Далее, система предложит сгенерировать случайные числа. Для этого нужно следовать инструкции, которая будет написана в нашем терминале (движение мышкой, набор текста и т.д).

В конце, когда сформируется отпечаток ключа GPG, можно увидеть сформированный ID. Пример:

pub   2048R/AE3F8179 2022-04-20
      Отпечаток ключа = 5C1D 67E3 F163 EC94 A1BC  202B 68E6 302C AE3F 8179

где, AE3F8179 — ID GPG ключа

Создание индексов и подписи

Теперь необходимо применить наш ID GPG ключа для создания и подписи индексов:

# genbasedir --create --bloat --progress --sign --default-key=AE3F8179 --topdir=/var/www/repo/extra x86_64 extra
Внимание! Обратите внимание, что в поле --default-key нужно использовать наш ID (в данном случае AE3F8179).


Далее, вводим фразу-пароль для доступа к секретному ключу пользователя.

Добавляем свой ключ, использованный для подписанного репозитория:

  1. Создаем файл:
    # nano /etc/apt/vendors.list.d/own.list
    
  2. И в этом файле (own.list) прописываем отпечаток ключа (fingerprint) и имя:
    simple-key "own" {
           Fingerprint "5C1D67E3F163EC94A1BC202B68E6302CAE3F8179";
           Name "Ваше имя <ваша электронная почта>";
    }
    
Внимание! Не забудьте поставить ; после поля Fingerprint и name.


Внимание! Отпечаток (Fingerprint) необходимо указать без пробелов.


Создание собственного репозитория подписанного ключами вендоров

В октябре 2025 года в Сизиф был отправлен пакет apt-gpgkeys-pki.

Исходный код компонента опубликован на altlinux.space - https://altlinux.space/ALTLinux/apt-gpgkeys-pki.

Утилита пакета

В пакете имеется утилита apt-gpgkeys, у которой имеется две команды:

  • list
  • update

Технические тонкости

Источники ключей располагаются в каталоге /usr/lib/alt-gpgkeys/, к которому доимпортируются ключи из /usr/share/pki/apt-gpg/sources/ и /etc/pki/apt-gpg/sources.

Принцип реализации аналогичен ca-trust.

Будущий функционал

Обработка каталогов blacklist заложено, но пока не реализовано.

Как теперь "распространять" свой репозиторий

Теперь, опубликовав и подписав свой репозиторий с пакетами, провайдер может "упаковать конфиги в пакет":

  • /etc/apt/sources.list.d/ИМЯ.list
  • публичную часть ключа в /usr/share/pki/apt-gpg/sources/
  • fingerprint ключа в /etc/apt/vendors.list.d/ИМЯ.list

Необходимый триггер выполняется apt при установке пакета автоматически.

Пример репозитория

list-файл

Путь: /apt/sources.list.d/max.list

rpm [max] https://download.max.ru/linux/alt/ x86_64 max
Публичная часть

Путь: /etc/apt/vendors.list.d/max.list

simple-key "max" {
        Fingerprint "0C3FC2C2020604050F7D3692982759A166E39A11";
        Name "MAX Linux Repo <help@max.ru>";
}
Открытый ключ

Путь: /etc/pki/apt-gpg/sources/max.asc

-----BEGIN PGP PUBLIC KEY BLOCK-----

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
=D/BV
-----END PGP PUBLIC KEY BLOCK-----

Создание пакета с репозиторием

По статье Сборка пакетов start:

  • Генерируем ключи
  • Устанавливаем и настраиваем пакеты для сборки
  • Делаем вариант "пакет с нуля" с некоторыми аспектами
Структура
home
└── apt-conf-max
    |  ├── apt-conf-max.spec
    |  ├── max.asc
    |  ├── max.list
    |  └── max-vendors.list
    ├── .gear
    │   └── rules
    └── .git
Файл gear/rules
tar: .
Файл спека
Name: apt-conf-max
Summary: Official repository of MAX
Version: 1.0
Release: alt1

License: Public-Domain
Group: System/Base
URL: https://www.max.ru/

ExclusiveArch: x86_64

Source: %name-%version.tar

Requires: apt-https
Requires: apt-gpgkeys-pki

%description
%{summary}.

%prep
%setup

%install
install -Dpm0644 max.list %buildroot%_sysconfdir/apt/sources.list.d/max.list
install -Dpm0644 max-vendors.list %buildroot%_sysconfdir/apt/vendors.list.d/max.list
install -Dpm0644 max.asc %buildroot%_datadir/pki/apt-gpg/sources/max.asc

%files
%config(noreplace) %_sysconfdir/apt/sources.list.d/max.list
%_sysconfdir/apt/vendors.list.d/max.list
%_datadir/pki/apt-gpg/sources/max.asc

%changelog
* Tue Jan 27 2026 Andrey Cherepanov <cas@altlinux.org> 1.0-alt1
- Initial build for Sisyphus.
Как упаковать конфигурацию репозитория

Конфигурацию репозитория можно, как и любой файл, упаковать в пакет и предоставить пользователю, вместо скачивания ключей, правки конфигов и пр.

В данном разделе мы рассмотрим создание такого пакета.

НО,

Во-первых, вы должны обладать базовыми знаниями по сборке пакетов. Если вы не умеете собирать пакеты, прямо совсем-совсем, никто не хочет становиться вашим ментором и учить и пр, не переживайте, на нашей вики есть статья по сборке пакетов для начинающих.

Итак, вы более-менее знаете, как собирать пакеты.

Рассмотрим, как должен выглядеть gear-репозиторий, спек и пр. у пакета с репозиторием.

Смотрим спек:

  • Имя, описание, версия, релиз, исходники — все как обычно.
  • Лицензия — Public Domain
  • Группа — System/Base
  • Ссылка — как обычно
  • ExclusiveArch — архитектура, для которой предназначены файлы репозитория
  • В качестве зависимости указано apt-https — т.к.используется https

Примеры пакетов

Ссылка на ваш репозиторий может быть опакечена в основной репозиторий любым маинтейнером.

  1. Вариант по последней версии инструкции: https://git.altlinux.org/people/cas/packages/apt-conf-max.git
  2. Только ссылка на репозиторий: https://git.altlinux.org/gears/a/akvis-repo.git
  3. Ссылка с GPG-подписью: https://git.altlinux.org/gears/a/angie-pro-repo.git
  4. Ещё вариант с GPG: https://git.altlinux.org/gears/a/ascon-repo.git