Олег Букатчук

Делаем Linux репозиторий с помощью Aptly

Авг
19

Работая в компании, в которой ведется разработка ПО, столкнулся с потребностью в собственном репозитории для семейства Debian Linux: у reprepro нет хранилища предыдущих версий пакетов и его функционал очень примитивен, apt-mirror умеет только создавать зеркала уже имеющихся репозиторий, а mini-dinstall перестал развиваться.
В поисках лучшего решения нашел утилиту aptly, имеющую следующие возможности:

  • создание зеркала удаленного хранилища;
  • управление локальными репозиториями;
  • снапшоты;
  • управление версиями пакетов, в т.ч. подтягивание всех зависимости;
  • публикация репозиториев;

И так, приступим:

Установка Aptly

$ sudo apt-get update
$ sudo apt-get install aptly

Настройка Aptly

При первом запуске Aptly, в домашнем каталоге пользователя появится конфигурационный файл .aptly.conf, его необходимо привести к подобному виду:

{
"rootDir": "/home/repo/.aptly", 
"downloadConcurrency": 4,
"downloadSpeedLimit": 0,
"architectures": ["i386","amd64"],
"dependencyFollowSuggests": false, 
"dependencyFollowRecommends": false, 
"dependencyFollowAllVariants": false,
"dependencyFollowSource": false,
"gpgDisableSign": false,
"gpgDisableVerify": false,
"downloadSourcePackages": false,
"ppaDistributorID": "ubuntu",
"ppaCodename": "",
"S3PublishEndpoints": {},
"SwiftPublishEndpoints": {}
}

Работа с репозиториями

Для создания репозитория пакетов с именем stable и комментарием Stable repository выполним:

$ aptly repo create -comment="Stable repository" stable

Для удаления репозитория необходимо выполнить следующее:

$ aptly repo drop <name>

Добавляем один пакет/директорию в репозиторий:

$ aptly repo add stable /patch_to_package/package.deb

Чтобы добавить всю директорию:

$ aptly repo add stable /patch_to_package/*.deb

Копирования пакета из одного в другой репозиторий:

$ aptly repo copy <src-name> <dst-name> <package-spec>

Перемещение пакета из одного в другой репозиторий:

$ aptly repo move <src-name> <dst-name> <package-spec>

Удаление пакета из репозитория:

$ aptly repo remove <src-name> <dst-name> <package-spec>

Снапшоты

Cнапшоты необходимы для фиксирования пакетов и версий пакетов, зеркал или репозитория целиком.
Создание снапшота для зеркала:

$ aptly snapshot create <name> from mirror <mirror-name>

Создание снапшота для репозитория:

$ aptly snapshot create <name> from repo <repo-name>

где, <name> — название снапшота, <repo-name> и <mirror-name> — имя репозитория или зеркала.

Так же доступны команды:

  • list — вывести список снапшотов;
  • show — просмотр содержимого снапшота (по умолчанию список пакетов не выводится, а выводится только количество, для того, чтоб увидеть список пакетов, необходимо добавить параметр -with-packages=true);
  • verify — проверка зависимостей пакетов в снапшоте;
  • merge — объединение снапшотов;
  • drop — удаление снапшотов;
  • diff — сравнение 2-х снапшотов;

Например, сравнение 2-х снапшотов

$ aptly snapshot diff -only-matching=false <name-a>  <name-b>

где, -only-matching=false — вывести весь список пакетов, а значения <name-a>, <name-b> — названия снапшотов.

Публикация снапшотов

Приступаем к генерации самого репозитория, который будет понятен apt и к которому, впоследствии, мы сможем получить доступ через сеть. Для этого нам потребуется сгенерированный GPG-ключ (как сгенерировать ключ, поищите в google) ну и снапшот для публикации.

$ aptly publish snapshot <name> [<prefix>]

Дополнительные параметры:

-component="": ветка репозитория (по умолчанию main);
-distribution="": название дистрибутива (jessie, wheezy, squeeze);
-gpg-key="": ID GPG-ключа, не обязательно, если используется ключ по-умолчанию;
-keyring="": используемый GPG-ключ (вместо по-умолчанию);
-secret-keyring="": секретный GPG-ключ (вместо по-умолчанию);
-skip-signing=false: не подписывать репозиторий GPG-ключом.   

После этого, в «rootDir» появится директория «public», которая будет содержать файлы и пакеты репозитория. Чтобы дать доступ к ней по http, нам необходимо указать директорию «public» на веб-сервере как корневую.