Linux репозитории своими руками
Понадобилось мне на днях развернуть репозитории 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
- имя, которое вы использовали при создании ключа.
Теперь можем добавить подпись или заменить подпись на пакете на свою, заменив ключ --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;
}
}
Ссылки
- Debian repository setup with Reprepro - https://wiki.debian.org/DebianRepository/SetupWithReprepro
- Creating a Yum Repository - https://docs.redhat.com/en/documentation/red_hat_enterprise_linux/6/html/deployment_guide/sec-yum_repository#sec-Yum_Repository
- Документация rpmsign - https://manpages.debian.org/stable/rpm/rpmsign.8.en.html