Настройка и управление репозиторием Debian с помощью Aptly
Используемые термины: Aptly, Linux.
В инструкции мы рассмотрим основные моменты для создания и управления репозиторием для пакетов Deb с помощью инструмента Aptly.
Установка программного обеспечения
Базовая настройка
Работаем с репозиторием
Работа с публикациями
Подключение к репозиторию
Поиск и работа с пакетами
Установка Aptly
Инструкцию по установке мы можем найти на официальном сайте. Давайте ее рассмотрим на примере Ubuntu и Rocky Linux.
Ubuntu (Debian)
Установку Aptly на Deb-системы выполнить, довольно, просто. Необходимо подключить репозиторий разработчика и выполнить установку.
Выполним импорт ключа репозитория:
wget -qO - https://www.aptly.info/pubkey.txt | apt-key add -
Добавим репозиторий:
vi /etc/apt/sources.list.d/aptly.list
deb http://repo.aptly.info/ squeeze main
Обновим список пакетов и выполним установку:
apt update
apt install aptly
Для проверки введем команду:
aptly version
Мы должны увидеть что-то на подобие:
aptly version: 1.4.0
Rocky Linux (RPM)
Для дистрибутивов на базе пакетов RPM предлагается для установки скачать и распаковать бинарник.
Для начала, нам понадобятся wget и tar:
yum install wget tar
Переходим на страницу последнего релиза и копируем ссылку для загрузки архива:
Используя ссылку, скачиваем на наш компьютер архив:
wget https://github.com/aptly-dev/aptly/releases/download/v1.4.0/aptly_1.4.0_linux_amd64.tar.gz
Распакуем архив:
tar zxf aptly*tar.gz
Раскидаем полученные файлы по своим местам:
mv aptly_*_linux_amd64/aptly /usr/local/bin/
gzip -c aptly_*_linux_amd64/man/aptly.1 > /usr/share/man/man1/aptly.1.gz
mkdir /usr/share/doc/aptly
mv aptly_*_linux_amd64/{AUTHORS,LICENSE,README.rst} /usr/share/doc/aptly/
Для проверки введем команду:
aptly version
Мы должны увидеть что-то на подобие:
aptly version: 1.4.0
Начальная настройка
Прежде чем начать работать с репозиторием, создадим конфигурационный файл:
vi /etc/aptly.conf
{
"rootDir": "/opt/aptly",
"downloadConcurrency": 4,
"downloadSpeedLimit": 0,
"architectures": [],
"dependencyFollowSuggests": false,
"dependencyFollowRecommends": false,
"dependencyFollowAllVariants": false,
"dependencyFollowSource": false,
"dependencyVerboseResolve": false,
"gpgDisableSign": false,
"gpgDisableVerify": false,
"gpgProvider": "gpg",
"downloadSourcePackages": false,
"skipLegacyPool": true,
"ppaDistributorID": "ubuntu",
"ppaCodename": "",
"FileSystemPublishEndpoints": {
"pubtest": {
"rootDir": "/var/www/aptly",
"linkMethod": "symlink",
"verifyMethod": "md5"
}
},
"enableMetricsEndpoint": false
}
* для нас важны опции:
- rootDir — базовая директория для приложения, где будет храниться база репозиториев.
- FileSystemPublishEndpoints — точка публикации для репозитория. Данную опцию мы рассмотрим подробнее ниже.
- pubtest — название для точки публикации.
- rootDir — каталог, в котором должны находить файлы опубликованного репозитория.
- linkMethod — способ создания копии. Возможны варианты: symlink, copy, hardlink. У каждого метода свои плюсы и минусы. Решение на усмотрение администратора репозитория.
Мы готовы начать работать с aptly.
Работа с репозиторием
Рассмотрим несколько действий:
- Создадим новый репозиторий.
- Добавим в него пакеты.
1. И так, создадим репозиторий командой:
aptly repo create -comment="Testing first repo" -component="main" -distribution="focal" test
* в данном примере будет создан новый репозиторий test.
** а также:
- comment — произвольный комментарий.
- component — компонент по умолчанию, который будет использоваться при публикации. Обычно указываются:
- main — DFSG-пакеты (соответствуют критериям Debian по определению свободного ПО), которым не требуются другие пакеты из других зон.
- contrib — DFSG-пакеты с зависимостями из зоны main.
- non-free — пакеты, которое не соответствует DFSG.
- distribution — указать на название дистрибутива. Например, кодовое имя или класс релиза:
- jessie/stretch/buster/sid.
- stable/oldstable/testing/unstable.
При необходимости, можно отредактировать параметры нашего репозитория командой:
aptly repo edit -comment="New comment" test
Переименовать:
aptly repo rename test test-new-name
Удалить:
aptly repo drop test
Посмотреть список репозиториев можно командой:
aptly repo list
Ну и, более подробная информация о репозитории:
aptly repo show test
2. Добавление пакета в созданный ранее репозиторий:
aptly repo add test /tmp/deb/package-name_1.2.3_amd64.deb
* это простой вариант добавления пакета в репозиторий с именем test; сам же пакет в нашем примере будет загружен из /tmp/deb/package-name_1.2.3_amd64.deb.
Мы должны будем увидеть что-то на подобие:
Loading packages...
[+] package-name_1.2.3_amd64 added
Посмотреть информацию о репозитории вместе со списком добавленных в него пакетов:
aptly repo show -with-packages test
Подробная информация о пакете:
aptly package show package-name_1.2.3_amd64
Но в данной информации сильно не хватает репозитория, в котором опубликован конкретный пакет. Ее можно увидеть, добавив опцию -with-references:
aptly package show -with-references package-name_1.2.3_amd64
Удалить пакет из репозитория можно командой:
aptly repo remove test package-name_1.2.3_amd64
* ниже мы рассмотрим способ поиска и удаления пакетов по параметрам.
Мы должны будем увидеть что-то на подобие:
Loading packages...
[-] package-name_1.2.3_amd64 removed
Публикация репозиториев
При работе с базой aptly мы просто добавляем в нее пакеты, но они не будут доступны при подключении к нашему репозиторию. Нам необходимо выполнить публикацию и предоставить веб-доступ. В данном разделе мы рассмотрим, как:
- Выполнить публикацию репозитория.
- Обновить данные в публикации.
- Настроить веб-сервер nginx.
Начнем с публикации.
Публикация
Для публикации нам потребуется ключ gpg. Для начала установим набор утилит для генерации случайных чисел в ядре:
yum install rng-tools
И запускаем саму утилиту:
rngd -r /dev/urandom
Создаем ключ:
gpg --default-new-key-algo rsa4096 --gen-key --keyring pubring
Система запросит ввести имя и email. Как минимум, вводим имя:
Real name: pubtest
После появится окно ввода пароля для закрытого ключа. Придумываем новый и вводим его дважды.
Ключ создан, его можно увидеть командой:
gpg --list-keys
Теперь сделаем первую публикацию:
aptly publish repo test filesystem:pubtest:test
Система запросит пароль для GPG-ключа в отдельном окне.
Для успешного выполнения команды нужно, чтобы в репозитории был добавлен, хотя бы, один пакет.
После публикации в каталоге /var/www/aptly/test мы должны увидеть:
ls /var/www/aptly/test
dists pool
В папке dists метаданные для опубликованных дистрибутивах, pool — загруженные пакеты (в нашем примере симлинки на пул в основном каталоге — /opt/aptly).
Для удобства работы с нашим репозиторием можно опубликовать открытый ключ GPG — он будет необходим для подключения к репозиторию со стороны клиентов. Вводим:
gpg --export --armor > /var/www/aptly/test/pubtest.asc
Мы вернемся к данному ключу, когда будет настраивать подключение к репозиторию.
Обновление публикации
После изменений в основной базе пакетов, нам нужно обновлять настройки публикации. Это приводит к обновлению метаданных и актуализации пакетов в каталогах pool.
Синтаксис такой:
aptly publish update <дистрибутив> [<точка входа>]
Например:
aptly publish update focal filesystem:pubtest:test
Система должна запросить пароль для нашего GPG-ключа.
Также полезно запускать команду со следующими опциями:
aptly publish update -batch -force-overwrite -gpg-key="${gpgkey}" -passphrase="${gpgpass}" focal filesystem:pubtest:test
* где:
- batch — запуск команды без привязки к tty. Нужно для работы команды вне интерактивного контекста.
- force-overwrite — перезаписать пакеты, при необходимости.
- gpg-key — идентификатор нашего ключа (смотрим командой gpg --list-keys).
- passphrase — парольная фраза для gpg-ключа.
Мы теперь можем опубликовать репозиторий и обновить в нем данные. Но для получения доступа по веб, нам нужен веб-сервер.
Настройка NGINX
Для получения доступа к репозиторию по http(s) нам нужно установить и настроить веб-сервер. В данном примере мы рассмотрим простой способ настройки NGINX.
Установка будет немного отличаться для Linux DEB и RPM. Рассмотрим процесс по-отдельности.
а) DEB:
apt update
apt install nginx
б) RPM:
yum install nginx
Если система вернет ошибку, что не может найти данный пакет, ставим:
yum install epel-release
NGINX установлен.
После установки веб-сервера, немного сконфигурируем его. Тут тоже процесс отличается для DEB и RPM.
Открываем файл:
а) на deb:
vi /etc/nginx/sites-enabled/default
б) на rpm:
vi /etc/nginx/nginx.conf
Далее процесс схож.
Находим и редактируем строку с директивой root:
root /var/www/aptly;
* в нашем примере мы определили корневую директорию для веб-публикаций /var/www/aptly.
Перезапускаем сервис и разрешаем автозапуск nginx:
systemctl restart nginx
systemctl enable nginx
Веб-сервер сконфигурирован.
В нашем примере мы не стали рассматривать процесс настройки https. Но в продуктивной среде правильнее настроить веб-доступ к репозиторию по защищенному каналу. Читайте дополнительно про получение бесплатного сертификата.
Настраиваем брандмауэр, если в нашей системе он используется. Нам нужно открыть порт 80 (и 443, если работаем по https). В зависимости от используемой утилиты управления netfilter, наши действия будут отличаться. Рассмотрим наиболее популярные инструменты — iptables и firewalld.
а) для iptables (как правило, на DEB):
iptables -I INPUT -p tcp --dport 80 -j ACCEPT
iptables -I INPUT -p tcp --dport 443 -j ACCEPT
Для сохранения правил вводим:
apt install iptables-persistent
netfilter-persistent save
б) для firewalld (как правило, на RPM):
firewall-cmd --permanent --add-port=80/tcp
firewall-cmd --permanent --add-port=443/tcp
И для сохранения:
firewall-cmd --reload
Наш сервер готов принимать запросы по http(s). Для проверки открываем браузер и вводим http://<IP-адрес нашего сервер>. Мы должны увидеть список каталогов (или один каталог).
Удаление публикации
Синтаксис для удаления публикации:
aptly publish drop <distribution> [[<endpoint>:]<prefix>]
Предположим, у нас была публикация дистрибуци focal в filesystem:pubtest:test. Тогда можно удалить ее командой:
aptly publish drop focal filesystem:pubtest:test
Настройка клиента (работа с репозиторием)
Рассмотрим кратко процесс настройки подключения к репозиторию и установки с него пакетов.
На системе, где планируем подключиться к репозиторию, создаем файл с настройками:
vi /etc/apt/sources.list.d/own_repo.list
* где own_repo — произвольное название для репозитория.
Добавляем строку следующего вида:
deb http(s)://<IP-адрес или hostname до нашего репозитория/точка входа> <distribution> <component>
Например:
deb https://repo.dmosk.ru/test focal main
Импортируем в систему ключ, который мы публиковали в предыдущем разделе:
wget --quiet -O - https://repo.dmosk.ru/test/pubtest.asc | apt-key add -
* скорректируйте полный путь на ваш.
Мы должны увидеть:
OK
Можно обновить список пакетов:
apt update
И пользоваться репозиторием.
Поиск и работа с пакетами
Стоит обсудить еще одну важную для работы функцию — поиск пакетов. Осуществляется с помощью package query. Более подробнее про данный формат стоит почитать на официальной странице. Мы же рассмотрим несколько запросов для примера и способы их применения.
1. Поиск пакетов.
Синтаксис:
aptly package search [<package-query>]
Найти по версии:
aptly package search 'Version (>>8.0.0-20220413)'
* в данном примере система выведет список пакетов, версия которых старше 8.0.0-20220413.
По имени и версии:
aptly package search 'Name (% *-dev), Version (>>8.0.0-20220413)'
* в этом примере будут найдены все пакеты, в имени которых на конце есть -dev и версия выше 8.0.0-20220413.
2. Удаление пакетов.
Также с использованием package query мы можем находить и удалять из базы пакеты.
Синтаксис:
aptly repo remove <имя репозитория> <package-query>
Например, удалим пакеты, версия которых начинается на 8.
aptly repo remove -dry-run test 'Version (% 8*)'
* обратите внимание, что мы используем флаг -dry-run, который позволит нам не удалять пакеты, а вывести на экран список того, что будет удалено, для окончательного удаления пишем команду без данного флага.