Работа с Aptly API

Обновлено и опубликовано Опубликовано:

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

В данной инструкции мы рассмотрим процесс установки и запуска API для платформы управления репозиториями Deb-пакетов Aptly. Также мы рассмотрим несколько запросов в качестве примера.

Установка и запуск

В зависимости от типа 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.

2. Описание процесса сборки пакета deb.

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

Да            Нет