Настройка и управление репозиторием 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

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

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

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

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

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

Публикация

Для публикации нам потребуется ключ 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, который позволит нам не удалять пакеты, а вывести на экран список того, что будет удалено, для окончательного удаления пишем команду без данного флага.

# Linux # Операционные системы # Серверы
Дмитрий Моск — частный мастер
Была ли полезна вам эта инструкция?

Да            Нет