Работа с Aptly API

Используемые термины: Aptly, API, Linux.
В данной инструкции мы рассмотрим процесс установки и запуска API для платформы управления репозиториями Deb-пакетов Aptly. Также мы рассмотрим несколько запросов в качестве примера.
Установка Aptly API и запуск в качестве службы
Обратный прокси NGINX
Примеры запросов к API
Дополнительные материалы
Установка и запуск
В зависимости от типа Linux, на который установлен Aptly. действия будут сильно различаться. Рассмотрим саму установку платформы, а также запуск API в качестве systemd процесса.
Установка Aptly
API является частью приложения Aptly и устанавливается вместе с ним. Сам Aptly может быть установлен на различные операционные системы.
Подробнее, процесс расписан в другой инструкции — Настройка и управление репозиторием Debian с помощью Aptly.
Сразу после установки Aptly можно запустить API командой:
aptly api serve
Однако, мы рассмотрим способ его запуска в качестве сервиса.
Настройка systemd для автозапуска api
Как было сказано выше, процесс отличается для систем на базе deb и rpm.
а) Deb-системы
Для систем DEB разработчики Aptly предоставляют готовые файлы для автозапуска сервиса. Для этого устанавливаем пакет aptly-api:
apt update
apt install aptly-api
б) RPM
Для RPM нет готового пакета с нужными файлами, поэтому создадим их вручную:
vi /usr/lib/systemd/system/aptly-api.service
[Unit]
Description=Aptly REST API
After=network.target
Documentation=man:aptly(1)
[Service]
User=root
Group=root
Environment=TERM=dumb
WorkingDirectory=/opt/aptly
EnvironmentFile=/etc/sysconfig/aptly-api
ExecStart=/usr/bin/aptly api serve -config=/etc/aptly.conf ${APTLY_OPTIONS} -listen=${LISTEN_ADDRESS}
LimitNOFILE=32768
[Install]
WantedBy=multi-user.target
В юните автозапуска мы используем EnvironmentFile. Создадим его:
vi /etc/sysconfig/aptly-api
# Default settings for aptly-api systemd service
# bind to host:port
LISTEN_ADDRESS='localhost:8080'
# aptly options:
# -no-lock allow aptly commands in parallel with api service (no global database lock, but lock per request)
APTLY_OPTIONS="-no-lock"
* наполнение для файла взято из того же файла пакета aptly-api. В нем необходимо обратить внимание на опцию LISTEN_ADDRESS, которая указывает, на какой адресе и каком порту должен запускаться сервис.
Если у нас работает SELinux, то задаем bin_t контекст для исполняемого файла aptly:
chcon -R -t bin_t /usr/bin/aptly
Запуск и проверка
После создания необходимых файлов можно запустить сервис API командой:
systemctl enable aptly-api --now
Проверить работу сервиса можно командой:
systemctl status aptly-api
Также можно сделать первый запрос к API:
curl http://127.0.0.1:8080/api/version
Мы должны получить в ответ информацию о версии установленного Aptly.
NGINX proxy
Мы запустили API на порту 8080. Хорошей практикой будет использовать обратный прокси. Мы будем использовать nginx.
Для начала установим его. Наши действия будут зависеть от типа Linux.
а) Для Deb:
apt install nginx
б) Для RPM:
yum install nginx
NGINX установлен. Идем дальше.
Запускаем сервис nginx и разрешаем его автозапуск:
systemctl --now enable nginx
Создадим конфигурационный файл с настройкой виртуального домена.
а) Для Deb:
vi /etc/nginx/sites-enabled/aptly-api.conf
б) Для RPM:
vi /etc/nginx/conf.d/aptly-api.conf
Вставляем:
server {
listen 80;
server_name aptly-api.dmosk.ru;
client_max_body_size 1G;
access_log off;
location / {
proxy_pass http://127.0.0.1:8080;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
* где aptly-api.dmosk.ru — доменное имя, которое ведет на наш сервер с nginx и aptly-api.
Проверяем конфигурацию и перечитываем ее:
nginx -t && nginx -s reload
Если в нашей системе используется SELinux (как правило, на RPM-based системах), вводим команду:
setsebool httpd_can_network_connect 1 -P
* данная политика разрешает httpd-сервису и веб-скриптам подключение по сети.
Если в нашей системе используется брандмауэр, разрешаем порт 80 (http). В зависимости от фаервола, команды будут отличаться.
а) iptables (как правило, DEB):
iptables -I INPUT -p tcp --dport 80 -j ACCEPT
apt install iptables-persistent
netfilter-persistent save
б) firewalld (как правило, RPM):
firewall-cmd --add-ser=http
firewall-cmd --add-ser=http --per
Готово.
С любого компьютера в сети переходим в браузере по адресу http://<IP-адрес API>/api/version — должна открыться страница с информацией о версии Aptly.
Примеры запросов API
Рассмотрим несколько простых примеров работы с API. Более детальную документацию и примеры можно найти на официальном сайте.
1. Получить список существующих репозиториев:
curl http://aptly.dmosk.ru/api/repos | jq
2. Добавление пакета в репозиторий. выполняется в 3 этапа.
Загружаем deb-файл на сервер во временный каталог:
curl -X POST -F file=@my-app_amd64.deb http://aptly.dmosk.ru/api/files/my-app-temp-dir
* где my-app-temp-dir — временный каталог. Его название может быть произвольным.
Добавляем загруженный файл в репозиторий:
curl -X POST http://aptly.dmosk.ru/api/repos/myrepo-name/file/my-app-temp-dir/my-app_amd64.deb
* где:
- myrepo-name — имя репозитория.
- my-app-temp-dir — временный каталог, куда был скопирован deb-файл.
- my-app_amd64.deb — имя deb-файла.
Обновляем публикацию:
curl -X PUT http://aptly.dmosk.ru/api/publish/filesystem:dmosk:myrepo-name/stable
* где:
- filesystem:dmosk:myrepo-name — путь до публикации в aptly.
- stable — имя дистрибьюшена.
3. Получаем информацию.
Список пакетов в репозитории:
curl http://aptly.dmosk.ru/api/repos/myrepo-name/packages | jq
* где myrepo-name — имя репозитория.
Детальная информация о пакете:
curl "http://aptly.dmosk.ru/api/packages/Pamd64%20my-app%201.0.0%20d572ef62ef4e4836" | jq
* где Pamd64%20my-app%201.0.0%20d572ef62ef4e4836 — пакет в формате "Pamd64 <имя пакета> <версия пакета> <идентификатор>". Обратите внимание, что символы пробела указываются как %20.
4. Удаление пакетов:
curl -X DELETE -H 'Content-Type: application/json' -d '{ "PackageRefs": [ "Pamd64 my-app 1.0.0 d572ef62ef4e4836" ] }' http://aptly.dmosk.ru/api/repos/myrepo-name/packages
* где:
- Pamd64 my-app 1.0.0 d572ef62ef4e4836 — имя пакета для удаления.
- myrepo-name — имя репозитория.
Читайте также
Другие полезные материалы по теме:
1. Настройка и управление репозиторием Debian с помощью Aptly.