Создание собственного репозитория
Состав
Репозиторий 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
Далее, вводим фразу-пароль для доступа к секретному ключу пользователя.
Добавляем свой ключ, использованный для подписанного репозитория:
- Создаем файл:
# nano /etc/apt/vendors.list.d/own.list
- И в этом файле (own.list) прописываем отпечаток ключа (fingerprint) и имя:
simple-key "own" { Fingerprint "5C1D67E3F163EC94A1BC202B68E6302CAE3F8179"; Name "Ваше имя <ваша электронная почта>"; }
Создание собственного репозитория подписанного ключами вендоров
В октябре 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
Примеры пакетов
Ссылка на ваш репозиторий может быть опакечена в основной репозиторий любым маинтейнером.
- Вариант по последней версии инструкции: https://git.altlinux.org/people/cas/packages/apt-conf-max.git
- Только ссылка на репозиторий: https://git.altlinux.org/gears/a/akvis-repo.git
- Ссылка с GPG-подписью: https://git.altlinux.org/gears/a/angie-pro-repo.git
- Ещё вариант с GPG: https://git.altlinux.org/gears/a/ascon-repo.git