Linux репозитории своими руками

3 мин

Понадобилось мне на днях развернуть репозитории Linux, причем сразу для обоих форматов пакетов, RPM и DEB. И вроде ничего сложного, все это уже когда-то делал. Но, согласитесь, поднимать свои репозитории - дело не ежедневное. Чтобы не вспоминать все заново в следующий раз, решил набросать небольшую заметку.

DEB

Этот формат мне как-то роднее, ввиду моей любви к “Дедушке Дебиану” и большим опытом работы с Ubuntu Linux. А раз так, то и начнем с него. Создавать репозиторий мы будем с помощью утилиты reprepro, которую необходимо установить. Так же нам понадобиться OpenPGP, с помощью которого мы будем подписывать пакеты в нашем будущем репозитории.

sudo apt install -y reprepro gnupg

Создадим директорию для нашего будущего репозитория.

mkdir /opt/apt

Настроим OpenPGP.

install -m 600 -d ~/.gnupg
echo '# Prioritize stronger algorithms for new keys.
default-preference-list SHA512 SHA384 SHA256 SHA224 AES256 AES192 AES CAST5 BZIP2 ZLIB ZIP Uncompressed
# Use a stronger digest than the default SHA1 for certifications.
cert-digest-algo SHA512' > ~/.gnupg/gpg.conf

Создадим ключ

gpg --gen-key

Теперь настроим Reprepro. Создадим директорию conf и заполним конфигурацию нашего репозитория.

mkdir /opt/apt/conf
echo 'Origin: Your project name
Label: Your project name
Codename: <osrelease>
Architectures: source i386 amd64
Components: main
Description: Apt repository for project x
SignWith: <key-id>' > /opt/apt/conf/distributions

Где osrelease - имя релиза, например bookworm или sid, а key-id - ID ключа OpenPGP, который мы сгенерировали. Найти его можно в выводе следующей команды, в блоке sub.

gpg --list-secret-key --with-subkey-fingerprint

Чтобы сделать свою жизнь чуточку легче (цитата из документации Debian), докинем еще немного настроек для Reprepro.

echo 'verbose
basedir /opt/apt/
ask-passphrase' > /opt/apt/conf/options

Для того, чтобы добавить пакеты в репозиторий, если у вас есть пакет с файлом изменений (*.changes), используйте следующую команду:

reprepro include <osrelease> <changesfile>

Здесь вы можете использовать ключ --ignore=wrongdistribution при необходимости.

Если у вас только сам пакет, то вы можете добавить его следующей командой:

reprepro includedeb <osrelease> <debfile>

Пример конфига для Nginx:

server {
  listen 80;
  server_name apt.example.com;

  access_log /var/log/nginx/apt-access.log;
  error_log /var/log/nginx/apt-error.log;

  location / {
    root /opt/apt;
    autoindex on;
  }

  location ~ /(.*)/conf {
    deny all;
  }

  location ~ /(.*)/db {
    deny all;
  }
}

RPM

Для развертывания RPM-репозитория, нам понадобиться утилита createrepo. Значит начнем с установки. Для YUM/DNF установка будет выглядеть как-то так:

yum install createrepo

Я же не буду изменять своим привычкам и разверну репозиторий на Debian:

apt install createrepo_c

Теперь создадим структуру репозитория:

mkdir -p /opt/yum/prod/9/custom/x86_64/

После того, как мы поместим необходимые пакеты в директорию, нужно создать метаданные:

createrepo /opt/yum/prod/9/custom/x86_64/

Для подписи пакетов, вам понадобится сам пакет RPM

apt install rpm

Будем считать, что ключ GPG у нас уже есть из предыдущего параграфа и нам остается лишь немного настроить RPM, чтобы и здесь немного упростить себе жизнь:

echo '%_signature gpg
%_gpg_path ~/.gnupg
%_gpg /usr/bin/gpg
%_gpg_name <name>' > ~/.rpmmacros

Где name - имя, которое вы использовали при создании ключа.

Внимание!
Я видел в документациях, в том числе у RadHat варианты %_gpgbin и %_gpg_bin,
но лично в моем случае работал только %_gpg, 
как это указано в документации к rpmsign

Теперь можем добавить подпись или заменить подпись на пакете на свою, заменив ключ --addsign на --resign:

rpm --addsign --verbose best-package-1.0.0-1.el9.x86_64.rpm 

Пример конфига Nginx:

server {
  listen 80;
  server_name yum.example.com;

  access_log /var/log/nginx/yum-access.log;
  error_log /var/log/nginx/yum-error.log;

  location / {
    root /opt/yum;
    autoindex on;
  }
}

Ссылки