Делаем собственный репозиторий для Debian

Наткнулся я тут на прошлой неделе на старую публикацию Drew DeVault (его блог, кстати, от всей души рекомендую) и плотно призадумался. Сразу захотелось беспроблемной и по уму установки новый версий всяких мелких программ, которыми я пользуюсь. В последнее время с этим как раз наметились проблемы: копировать каждый раз бинарники на «сервер» Raspberry Pi и на VPS, где крутится этот сайт, настолько лень, что я не всегда пользовался свежей версией webmention.io-backup, хотя сам её пишу, а скачивать и ставить новые версии Hugo вручную и на VPS, и на ноутбук, и на домашний компьютер уж совсем надоело. Теперь у меня собственный репозиторий, и многое из этого будет происходить само по себе. Не прелестно ли, когда компьютеры делают тебе комфортно, а не ты им?!

Можете, кстати, репозиторием-то пользоваться, если есть желание. Строка для sources.list выглядит как

deb [signed-by=/usr/share/keyrings/nekr0z.asc] http://deb.evgenykuznetsov.org stable main

(если, конечно, ключ сохранён в /usr/share/keyrings/nekr0z.asc, а не куда-то ещё).


Вообще-то «правильный» способ делать всё по-дебиановски — не для простых смертных, но, к счастью, есть альтернативы. В частности, для сборки репозитория я пользуюсь aptly, и с ней просто: команда

aptly repo create myrepo

создаёт репозиторий «myrepo». Потом можно сделать ключ PGP, чтобы этот репозиторий подписывать, и добавить пакетов:

aptly repo add myrepo <filename>.deb

после чего собираем репозиторий в файловой системе:

aptly publish repo -distribution="stable" -gpg-key="A9C8BD9C3A5754D4" myrepo

Собственно, после этого готовый к использованию репозиторий лежит в ~/.aptly/public/, и его можно раздавать по HTTP, или, в моём случае, отправить через rsync на VPS, и раздавать уже оттуда.

Теперь, при желании, можно добавлять пакеты или делать какие-то изменения в «myrepo», а потом просто

aptly publish update -gpg-key="A9C8BD9C3A5754D4" stable

Делать всё это вручную, конечно, лень, так что я написал ещё пару небольших скриптов, чтобы добавление пакетов, пересборка репозитория и выгрузка его на VPS происходили в одну команду. А для того, чтобы Github автоматически запускал обновление репозитория, когда я выпускаю новые версии своих программ, пригодился принудительный запуск команды в SSH, о котором я узнал из того же блога; сама функция выглядит примерно так:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
cd /tmp/
mkdir debs
cd debs
for arch in amd64 arm64; do
    deb=$arch[.]deb
    lnk=$(curl -s https://api.github.com/repos/$1/releases/latest | grep browser_download_url | grep $deb | head -n 1 | cut -d '"' -f 4 | sed -e 's/.*"tag_name":"\([^"]*\)".*/\1/')
    wget -c $lnk
done
aptly repo add myrepo *.deb
cd
rm -rf /tmp/debs/
aptly publish update -gpg-key="A9C8BD9C3A5754D4" stable
rsync <...>

(здесь $1 — получаемый из case аргумент вроде nekr0z/webmention.io-backup).