Настройка и управление репозиторием Debian с помощью Aptly

Используемые термины: Aptly , Linux .

В инструкции мы рассмотрим основные моменты для создания и управления репозиторием для пакетов Deb с помощью инструмента Aptly.

Установка Aptly

Инструкцию по установке мы можем найти на официальном сайте . Давайте ее рассмотрим на примере Ubuntu и Rocky Linux.

Ubuntu / Debian / Astra

Установку Aptly на Deb-системы выполнить, довольно, просто. Необходимо подключить репозиторий разработчика и выполнить установку.

echo «deb http://repo.aptly.info/release $(lsb_release -cs) main» > /etc/apt/sources.list.d/aptly.list

Для систем на базе Astra Linux, вместо $(lsb_release -cs) , мы должны указать точную редакцию, которой соответствует дистрибутив. Например, для Astra SE 1.7:

echo «deb http://repo.aptly.info/release buster main» > /etc/apt/sources.list.d/aptly.list

Импортируем GPG ключ репозитория:

apt install curl gnupg2

curl -fsS https://www.aptly.info/pubkey.txt | gpg2 —dearmor -o /etc/apt/trusted.gpg.d/aptly.gpg

После чего обновляем список пакетов:

apt update

Выполним установку:

apt install aptly

Для проверки введем команду:

aptly version

Мы должны увидеть что-то на подобие:

aptly version: 1.6.1

Rocky Linux (RPM)

Для дистрибутивов на базе пакетов RPM предлагается для установки скачать и распаковать бинарник.

Для начала, нам понадобятся wget и tar:

yum install wget unzip

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

Копируем ссылку на архив aptly

Используя ссылку, скачиваем на наш компьютер архив:

wget https://github.com/aptly-dev/aptly/releases/download/v1.6.1/aptly_1.6.1_linux_amd64.zip

Распакуем архив:

unzip aptly_*_linux_amd64.zip

Раскидаем полученные файлы по своим местам:

mv aptly_*_linux_amd64/aptly /usr/bin/

mv aptly_*_linux_amd64/man/aptly.1.gz /usr/share/man/man1/

mkdir /usr/share/doc/aptly

mv aptly_*_linux_amd64/{AUTHORS,LICENSE,README.rst} /usr/share/doc/aptly/

Удаляем исходник:

rm -rf aptly_*_linux_amd64; rm -f aptly_*_linux_amd64.zip

Для проверки введем команду:

aptly version

Мы должны увидеть что-то на подобие:

aptly version: 1.6.1

Начальная настройка

Прежде чем начать работать с репозиторием, создадим конфигурационный файл:

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. Создадим новый репозиторий.
  2. Добавим в него пакеты.

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.

Начнем с публикации.

Публикация

Для начала установим:

yum install rng-tools bzip2

* где:

  • rng-tools — набор утилит для генерации случайных чисел в ядре.
  • bzip2 — утилита командной строки для сжатия данных.

Для публикации нам потребуется ключ gpg. Запускаем утилиту:

rngd -r /dev/urandom

Откроем файл:

vi ~/.gnupg/gpg.conf

Добавим строки:

use-agent
pinentry-mode loopback

Создаем ключ:

gpg —default-new-key-algo rsa4096 —gen-key —keyring pubring

Система запросит ввести имя и email. Как минимум, вводим имя:

Real name: pubtest

* данное имя может быть любым, поэтому лучше указать более понятное название для ключа aptly.

После появится окно ввода пароля для закрытого ключа. Придумываем новый и вводим его дважды.

Ключ создан, его можно увидеть командой:

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.remontka.com/test focal main

Импортируем в систему ключ, который мы публиковали в предыдущем разделе:

wget —quiet -O — https://repo.remontka.com/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 , который позволит нам не удалять пакеты, а вывести на экран список того, что будет удалено, для окончательного удаления пишем команду без данного флага.

EnglishRussianUkrainian