Quantcast
Channel: सत्यं वद धर्मं चर » Debian
Viewing all articles
Browse latest Browse all 13

Использование reprepro для создания репозитория в Debian/Ubuntu Linux

$
0
0

При администрировании серверов иногда возникает необходимость в создании репозитория для программного обеспечения, не присутствующего в официальных репозиториях, либо для локального ПО или настроек, упрощающих жизнь системному администратору (например, настроенные пакеты, пересобранные при помощи dpkg-repack).

Конечно, для стороннего программного обеспечения можно создать PPA на Launchpad, но это не выход, когда, например, есть необходимость использовать закрытое программное обеспечение, либо приходится хранить в пакете конфиденциальную информацию (например, файлы лицензий или закрытые ключи).

В этом случае придётся создавать свой собственный частный репозиторий, что можно сделать, например, с помощью reprepro.

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

Итак…

Начнём с создания отдельного пользователя для reprepro:

adduser --home /srv/repo --disabled-password --gecos "Private Repository" repo

# Можно сразу задать открытый ключ, который будет использоваться для логина
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:

mkdir -p /srv/repo/repo/conf

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.

Заводим каталог для входящих пакетов и конфигурируем репозиторий соответствующим образом:

mkdir -p /srv/repo/repo/incoming

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 задаёт кодовое имя дистрибутива, если оно не задано в пакете.

Наконец, устанавливаем правильные права:

chown -R repo:repo /srv/repo/repo/

Готово.

Теперь собираем какой-нибудь пакет, загружаем его в /srv/repo/repo/conf/incoming, выполняем

reprepro -b /srv/repo/repo processincoming trusty

и наслаждаемся результатом.

Если репозиторий должен быть доступным, то можно, например, поставить nginx и раздавать пакеты через него:

apt-get -qq install --no-install-recommends nginx-light

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 http://repository.example.com/ trusty main
deb-src http://repository.example.com/ trusty main

Особо эстетствующие могут использовать https вместо http (не забыв поправить конфигурацию nginx соответствующим образом).

Если же репозиторий должен быть закрытым (только для избранных), то можно организовать доступ, например, по ssh.

deb ssh://repo@repository.example.com:/srv/repo/repo trusty main
deb-src ssh://repo@repository.example.com:/srv/repo/repo trusty main

Если нужно задать нестандартные настройки, то их нужно вносить в файл /root/.ssh/config, например:

Host repository.example.com
        User repo
        Hostname repository.example.com
        IdentityFile /root/.ssh/id_dsa-repo
        Port 55222
        PasswordAuthentication no
        Protocol 2

а репозитории в /etc/apt/sources.list задавать так:

deb ssh://repository.example.com:/srv/repo/repo trusty main
deb-src ssh://repository.example.com:/srv/repo/repo trusty main

Для вдохновения можно почитать Restrict Access To Your Private Debian Repository.

© 2014 सत्यं वद धर्मं चर. Все права защищены. Перепубликация материалов без разрешения автора запрещена.

При использовании материалов блога наличие активной не закрытой от индексирования ссылки на источник обязательно.


Viewing all articles
Browse latest Browse all 13

Latest Images

Trending Articles





Latest Images