Как настроить хранилище APT?

52

Я хотел бы установить хранилище APT на сервере, который предоставит пару пакетов.

Есть ли способ настроить один без установки какого-либо программного обеспечения на сервере?

Как файлы должны быть организованы?


Редактировать: Я должен делать что-то не так ... может кто-нибудь, пожалуйста, помогите мне? У меня есть хранилище на http://quickmediasolutions.com/apt/dists

Я не уверен, где или что, но что-то неправильно настроено. У меня только один пакет, и он предназначен для всех архитектур.

Вот что было добавлено к моему /etc/apt/sources.list:

deb http://quickmediasolutions.com/apt stable main
Натан Осман
источник
Можете ли вы отредактировать и добавить, в какой лицензии находятся загруженные вами приложения? Это для частного использования или вы планируете распространять их и т. Д.?
Хорхе Кастро
@Jorge: Что ты имеешь в виду? Какие приложения?
Натан Осман
1
Я пытался определить, был ли пакет OSS, вы могли бы просто использовать панель запуска.
Хорхе Кастро
@Jorge: нет, это не OSS. (На самом деле, это практически единственное приложение, которое я написал, но это не так.)
Натан Осман,

Ответы:

26

Настроить простой репозиторий очень просто, используя dpkg-scanpackages. Эта страница объясняет, как настроить тривиальное репо, а эта объясняет, как его использовать (прокрутите вниз до примера 4).

Майкл Креншоу
источник
Возникли проблемы с тем, чтобы заставить его работать. Пожалуйста, смотрите мое обновление на вопрос.
Натан Осман
1
Похоже, вы пытаетесь настроить «автоматическое» репо. Для одного (или только нескольких) пакетов вам будет гораздо удобнее использовать тривиальное репо. Попробуйте переместить ваш Packages.gz и выполнить дебет вплоть до quickmediasolutions.com/apt/binary . Тогда ваш источник будет deb http://quickmediasolutions.com/apt binary/.
Майкл Креншоу,
2
Тривиальные репо представляют проблемы при закреплении, но да, это самый быстрый / простой способ настроить репо всего для нескольких пакетов. Казалось бы глупо устанавливать объединенное хранилище только для 2-3 пакетов.
Тим Пост
Джордж, тебе когда-нибудь удавалось сделать эту работу?
Майкл Креншоу
@mac: Ну .... у меня еще не было времени попробовать :) Я просто загрузил все в PPA.
Натан Осман
40

Просто установите простой, но подписанный репозиторий на веб-сервере. Поскольку большинство других руководств несколько устарели или громоздки, я постараюсь повторить эту процедуру здесь. Первоначальная конфигурация требует немного усилий, но простой сценарий сборки упрощает управление. И вы можете просто вставить новые *.debфайлы, затем обновить или позволить заданию cron справиться с этим.

Создайте несколько ключей подписи

Сначала вам нужно создать gpgключ подписи для пакетов и вашего хранилища. Сделайте это (4) ключом подписи RSA, без пароля, и дайте ему уникальный, $KEYNAMEкогда потребуется. (Дальнейшие примеры предполагают " dpkg1" в качестве имени ключа.)

 gpg --gen-key
 gpg -a --export-secret-key dpkg1 > secret.gpg
 gpg -a --export dpkg1            > public.gpg

Я сказал «нет пароля», потому что на вашем веб-сервере нет встроенной обезьянки, чтобы вводить его повторно. А подписанные пакеты и репозиторий предназначены только для удовлетворения жалоб менеджеров обновлений по этому поводу. Просто загрузите оба ключа в новый /apt/каталог репозитория на вашем веб-сервере, но удалите secret.gpgключ после инициализации.

Обновление скрипта CGI

Это простой сценарий обновления оболочки / CGI для него:

#!/bin/sh
echo Status: 200 Okay
echo Content-Type: text/plain
echo
echo Rebuilding APT repository:

{
  #-- settings
  export GNUPGHOME=/var/www/usr12345/files
  export KEYNAME=dpkg1
  #-- one-time setup
  if [ ! -e "$GNUPGHOME/secring.gpg" ] ; then
     gpg --import -v -v ./secret.gpg
     gpg --import -v -v ./public.gpg
     gpg --list-keys
  fi

  #-- symlink .deb files from adjacent sub-directories
  find .. -name '*.deb' -exec ln -s '{}' . \;

  #-- build Packages file
  apt-ftparchive packages . > Packages
  bzip2 -kf Packages

  #-- signed Release file
  apt-ftparchive release . > Release
  gpg --yes -abs -u $KEYNAME -o Release.gpg Release

} 2>&1

Три gpgстроки необходимо выполнить только один раз, чтобы инициализировать настройку GPG в некотором каталоге $GNUPGHOME(над корнем документа). Удалить только secret.gpgпосле успеха.

Уникальная особенность этого небольшого сценария оболочки заключается в том, что он принимает любые *.debфайлы, которые вы вставили, но также рекурсивно ищет (начиная с одного уровня вверх) другие и вставляет в них ссылки. (В Options FollowSymLinksконечном счете, нужен .htaccess .)

Вы можете выполнить этот сценарий вручную как CGI или для cron-job. Но спрячьте или, еще лучше, удалите его из корня документа.

Поскольку это «тривиальный» репозиторий apt, ему нужна следующая apt-sources.listзапись:

deb http://example.org/deb/  ./    # Simple signed repo

Это подходит для репозиториев с одной архитектурой, и если вы не ожидаете сотни пакетов.

Подписание пакета

Подписать ваши индивидуальные пакеты также тривиально, как только вы настроите свои ключи gpg:

dpkg-sig -k dpkg1 -s builder *.deb

(Это следует делать на рабочей станции, на которой создаются пакеты, а не на веб-сервере хранилища.)

Неподписанный репозиторий

Если вам не нужны подписанные пакеты, то вы можете сократить скрипт обновления до:

  dpkg-scanpackages . > Packages
  bzip2 -kf Packages

Который все еще может использоваться обычными пользователями, но нуждается в специальном флаге для apt.sources:

deb [trusted=yes] http://apt.example.org/deb/ ./

Но, пожалуйста, не используйте этот trusted=yesфлаг для всего, или если вы не уверены в происхождении пакета.

Для удобства использования

Для конечных пользователей просто поместите их HEADER.htmlв каталог репозитория. Апачи mod_auto_indexдобавят эту записку:

<h1>http://example.org/apt/</h1>
<dl>
<dt>Add this repository to /etc/apt/sources.list as:
 <dd><kbd>deb http://example.org/apt/ ./  # example repo</kbd>
<dt>Import verification key with:
 <dd><kbd>wget -q http://http://example.org/apt/public.gpg -O- | sudo apt-key add -</kbd>
</dl>

альтернативы

В настоящее время существует несколько инструментов для автоматизации управления хранилищами. И даже есть онлайн- хостинги для репозиториев и сервисы сборки пакетов ( gemfury , packagecloud , bintray и т. Д.)

  • Довольно удобной альтернативой является prm . Это скрипт Ruby, который создает сложные репозитории APT и YUM. (Но давайте просто надеяться, что RPM наконец-то скоро исчезнет ..) - Лучше всего установить в соответствии с gem install prm.

  • И я также написал небольшой скрипт для автоматизации этого аналогичным образом: http://apt.include-once.org/apt-phparchive - Пожалуйста, обратите внимание, что он не слишком устойчив и написан на PHP (на этот раз это случайно), и изначально предназначался для DEB, RPM-over-APT и Phar.

Поскольку это тесно связано с первоначальным вопросом, существуют также инструменты для более простой сборки пакетов Debian. Несколько устаревший: EPM . Гораздо более современно: FPM . И мой личный ответвление: XPM (более ленивый подход для упаковки приложений на языке сценариев).

марио
источник
1
Как добавить ключ gpg, когда я хочу использовать этот репо?
Брюс Сан
1
Обычно что-то вродеwget …/public.gpg -O- | apt-key add -
Марио
Что мне нужно изменить, если я хочу поддерживать несколько архитектур?
starbeamrainbowlabs
1
@starbeamrainbowlabs Не совсем уверен, но я думаю, что dpkg-scanpackages -mможет быть достаточно. Он покажет все архитектуры в одном и том же файле Release. Но пока каждый .deb имеет уникальное имя / или хранится в разных подкаталогах (amd64 /, all /), это должно сработать. Иначе перейдите на один из более сложных инструментов хранилища.
Марио
7

Да. Ты можешь сделать это. Вам просто нужно правильно организовать файлы и создать индексные файлы. Если вы поместите структуру каталогов в корень документа вашего веб-сервера, пакеты будут доступны через веб-сервер.

Вот подробное описание того, как файлы должны быть организованы и как создаются индексные файлы.

Вы также можете использовать инструмент под названием prespro, если вы хотите установить этот пакет. Это сделает администрацию немного удобнее.

txwikinger
источник
@txwikinger: причина, по которой я не могу установить пакеты, заключается в том, что на сервере работает centOS :)
Натан Осман,
Что ж. тебе не нужно Вы можете создать все на другом компьютере и просто перенести все дерево на сервер
Centos
Да, я определенно предпочёл бы использовать репрепро. Это сделает вашу жизнь намного проще. Создание репо на другом компьютере может даже быть функцией, если она позволяет лучше защитить ключ подписи.
андол
@andol & @txwikinger: Я пытаюсь столкнуться с проблемами. Пожалуйста, смотрите мой обновленный вопрос.
Натан Осман
Для вашего файла dists вам все равно понадобится ./binary-<specific arch>.
андол
0

Для тех, кто сталкивается с этой ошибкой после следующего ответа Марио:

Unable to find expected entry 'Packages' in Release file (Wrong sources.list entry or malformed file)

сделайте следующее:

dpkg-scanpackages debs /dev/null > Packages
gzip -k Packages
apt-ftparchive release . > Release
gpg --default-key $KEYID -abs -o Release.gpg Release

Я положил мои *.debфайлы в debsпапку.

theeminence
источник