При администрировании серверов иногда возникает необходимость в создании репозитория для программного обеспечения, не присутствующего в официальных репозиториях, либо для локального ПО или настроек, упрощающих жизнь системному администратору (например, настроенные пакеты, пересобранные при помощи dpkg-repack
).
Конечно, для стороннего программного обеспечения можно создать PPA на Launchpad, но это не выход, когда, например, есть необходимость использовать закрытое программное обеспечение, либо приходится хранить в пакете конфиденциальную информацию (например, файлы лицензий или закрытые ключи).
В этом случае придётся создавать свой собственный частный репозиторий, что можно сделать, например, с помощью reprepro
.
Чтобы не засорять систему и упростить миграцию в будущем, я держу репозиторий в отдельном контейнере LXC (например, таком), но это дело вкуса.
Итак…
Начнём с создания отдельного пользователя для reprepro
:
# Можно сразу задать открытый ключ, который будет использоваться для логина
mkdir -m 0700 /srv/repo/.ssh
echo 'ssh-dss содержимое открытого ключа' > /srv/repo/.ssh/authorized_keys
chown -R repo:repo /srv/repo/.ssh/
chmod 0600 /srv/repo/.ssh/authorized_keys
# В случае острого приступа паранойи можно запретить изменение файла
chattr +i /srv/repo/.ssh/authorized_keys
# Особо параноидальным можно закрыть доступ к /srv/repo для остальных пользователей
chmod 0700 /srv/repo
Затем создадим сам репозиторий. Предположим, что он будет жить в каталоге /srv/repo/repo
:
cat > /srv/repo/repo/conf/options <<EOT
basedir .
EOT
cat > /srv/repo/repo/conf/distributions <<EOT
Origin: Краткое описание
Codename: trusty
Components: main
Architectures: i386 amd64 source
SignWith: Yes
EOT
Codename
задаёт кодовое имя дистрибутива (для Ubuntu 14.04 это trusty
), Components
задаёт компоненты (типа main
, contrib
, non-free
), Architectures
задаёт список архитектур (править по вкусу).
SignWith: Yes
указывает, что пакеты в репозитории должны быть подписаны. Можно и не подписывать, но тогда по умолчанию при установке пакетов из такого репозитория apt
будет громко ругаться.
В случае, если пакеты всё-таки решено подписывать, то придётся заводить ключ под это дело. gpg --gen-key
в помощь Любителям автоматизации рекомендую прочитать, как можно ключи генерировать полностью автоматически. Если что, ключ нужно генерировать для пользователя repo
, а не root
.
Заводим каталог для входящих пакетов и конфигурируем репозиторий соответствующим образом:
cat > /srv/repo/repo/conf/incoming <<EOT
Name: trusty
IncomingDir: /srv/repo/repo/incoming
TempDir: /srv/repo/repo/tmp
Default: trusty
EOT
Name
задаёт имя очереди входящих пакетов (лично я её устанавливаю в кодовое имя дистрибутива), IncomingDir
задаёт имя каталога, откуда reprepro
будет брать пакеты, TempDir
задаёт имя временного каталога (желательно, чтобы IncomingDir
и TempDir
находились на одном разделе), Default
задаёт кодовое имя дистрибутива, если оно не задано в пакете.
Наконец, устанавливаем правильные права:
Готово.
Теперь собираем какой-нибудь пакет, загружаем его в /srv/repo/repo/conf/incoming
, выполняем
и наслаждаемся результатом.
Если репозиторий должен быть доступным, то можно, например, поставить nginx и раздавать пакеты через него:
cat > /etc/nginx/sites-available/repository.example.com <<EOT
server {
listen 80;
server_name repository.example.com;
access_log off;
root /srv/repo/repo;
location ~ /(db|conf) {
deny all;
}
}
EOT
ln -s /etc/nginx/sites-available/repository.example.com /etc/nginx/sites-enabled/repository.example.com
service nginx reload
В /etc/apt/sources.list
добавляем что-то типа
deb-src http://repository.example.com/ trusty main
Особо эстетствующие могут использовать https
вместо http
(не забыв поправить конфигурацию nginx
соответствующим образом).
Если же репозиторий должен быть закрытым (только для избранных), то можно организовать доступ, например, по ssh
.
deb-src ssh://repo@repository.example.com:/srv/repo/repo trusty main
Если нужно задать нестандартные настройки, то их нужно вносить в файл /root/.ssh/config
, например:
User repo
Hostname repository.example.com
IdentityFile /root/.ssh/id_dsa-repo
Port 55222
PasswordAuthentication no
Protocol 2
а репозитории в /etc/apt/sources.list задавать так:
deb-src ssh://repository.example.com:/srv/repo/repo trusty main
Для вдохновения можно почитать Restrict Access To Your Private Debian Repository.
© 2014 सत्यं वद धर्मं चर. Все права защищены. Перепубликация материалов без разрешения автора запрещена.
При использовании материалов блога наличие активной не закрытой от индексирования ссылки на источник обязательно.