Comment configurer un référentiel APT?

52

Je souhaite configurer un référentiel APT sur un serveur qui fournira quelques packages.

Existe-t-il un moyen de le configurer sans installer de logiciel sur le serveur?

Comment les fichiers doivent-ils être organisés?


Edit: Je dois faire quelque chose de mal ... quelqu'un peut-il m'aider s'il vous plaît? J'ai le référentiel sur http://quickmediasolutions.com/apt/dists

Je ne sais pas où ni quoi, mais quelque chose est mal configuré. Je n'ai actuellement qu'un seul paquet et c'est pour toutes les architectures.

Voici ce qui a été ajouté à mon /etc/apt/sources.list:

deb http://quickmediasolutions.com/apt stable main
Nathan Osman
la source
Pouvez-vous éditer et ajouter quel type de licence se trouvent les applications que vous avez téléchargées? Est-ce pour un usage privé ou prévoyez-vous de les distribuer, etc.?
Jorge Castro
@ Jorge: Que veux-tu dire? Quelles applications?
Nathan Osman
1
J'essayais de déterminer si le paquet était du logiciel libre, vous pouvez simplement utiliser le tableau de bord.
Jorge Castro
@ Jorge: Non, ce n'est pas un logiciel libre. (En fait, c'est à peu près la seule application que j'ai écrite qui ne le soit pas.)
Nathan Osman

Réponses:

26

La configuration d'un référentiel trivial est très facile avec dpkg-scanpackages. Cette page explique comment configurer un référentiel trivial, et celle-ci explique comment l’utiliser (faites défiler jusqu’à l’exemple 4).

Michael Crenshaw
la source
Avoir un peu de mal à le faire fonctionner. S'il vous plaît voir ma mise à jour à la question.
Nathan Osman
1
On dirait que vous essayez de configurer un dépôt "automatique". Pour un (ou plusieurs) package (s), vous ferez bien mieux d'utiliser un référentiel trivial. Essayez de déplacer vos packages.gz et deb jusqu’à quickmediasolutions.com/apt/binary . Ensuite, votre source sera deb http://quickmediasolutions.com/apt binary/.
Michael Crenshaw
2
Les dépots triviaux posent des problèmes lors du repérage, mais ils constituent effectivement le moyen le plus rapide / le plus simple de configurer un dépôt pour seulement quelques paquets. Il semblerait idiot de mettre en place un référentiel groupé pour 2 à 3 packages.
Tim Post
George, avez-vous déjà réussi à faire ce travail?
Michael Crenshaw
@mac: Eh bien ... je n'ai pas encore eu le temps de l'essayer :) J'ai fini par tout télécharger sur un PPA.
Nathan Osman
40

Il suffit de configurer un référentiel simple mais signé sur un serveur Web. Étant donné que la plupart des autres didacticiels sont un peu obsolètes ou fastidieux, je vais essayer de reproduire la procédure ici. La configuration initiale prend un peu d'effort, mais le script de construction simple facilite la gestion. Et vous pouvez simplement déposer de nouveaux *.debfichiers, puis mettre à jour ou laisser un travail cron le gérer.

Générer des clés de signature

Vous devez d’abord créer une gpgclé de signature pour les packages et votre référentiel. Faites-en une (4) clé de signature RSA, sans mot de passe, et donnez-lui une clé unique $KEYNAMElorsque demandé. (D'autres exemples supposent " dpkg1" comme nom clé.)

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

J'ai dit pas de mot de passe, parce que votre serveur web n'a pas de singe intégré pour le taper à plusieurs reprises. Et les packages et le référentiel signés sont uniquement destinés à satisfaire les plaintes des responsables de la mise à jour à ce sujet. Il suffit de télécharger les deux clés dans le nouveau /apt/répertoire du référentiel sur votre serveur Web, mais de supprimer la secret.gpgclé après l’ initialisation.

Mettre à jour le script CGI

Voici le script shell / CGI de mise à jour simple:

#!/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

Les trois gpglignes ne doivent être exécutées qu'une seule fois pour initialiser la configuration de GPG dans un répertoire $GNUPGHOME(au-dessus de la racine du document). Ne supprimez que les secret.gpgsuccès ultérieurs.

Une caractéristique unique de ce petit script shell est qu’il accepte tous les *.debfichiers dans lesquels vous déposez des fichiers, mais recherche également de manière récursive (à partir du niveau supérieur) les autres, puis les relie par un lien symbolique Options FollowSymLinks.

Vous pouvez exécuter ce script manuellement en tant que CGI ou par tâche cron. Mais cachez-le, ou mieux encore, déplacez-le hors de la racine du document.

Comme il s'agit d'un référentiel apt "trivial", il a besoin de l' apt-sources.listentrée suivante :

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

Cela convient aux référentiels à architecture unique, et si vous ne vous attendez pas à des centaines de paquets.

Signature de colis

Signer vos paquets individuels est également trivial, une fois que vous avez configuré vos clés gpg:

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

(Cette opération doit être effectuée sur le poste de travail sur lequel les packages sont générés, et non sur le serveur Web du référentiel.)

Référentiel non signé

Si vous n'avez pas besoin de packages signés, vous pouvez alors réduire le script de mise à jour à:

  dpkg-scanpackages . > Packages
  bzip2 -kf Packages

Qui peut toujours être utilisé par les utilisateurs moyens, mais nécessite un indicateur personnalisé pour apt.sources:

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

Mais s'il vous plaît, n'utilisez pas le trusted=yesdrapeau habituellement pour tout, ou si vous n'êtes pas sûr de l'origine du paquet.

Pour la facilité d'utilisation

Pour les utilisateurs finaux, il suffit de déposer un HEADER.htmldans le répertoire du référentiel. Les Apaches mod_auto_indexajouteront cette note:

<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>

Des alternatives

De nos jours, il existe quelques outils pour automatiser la gestion des référentiels. Et il existe même des hébergeurs en ligne et des services de construction de paquets ( gemfury , packagecloud , bintray, etc.)

  • Une alternative plutôt pratique est prm . C'est un script Ruby, qui construit des pensions complexes APT et YUM. (Mais espérons simplement que RPM s'éteindra bientôt dans un instant ..) - Il vaut mieux l'installer gem install prm.

  • Et j'ai aussi écrit un petit script pour automatiser cela de la même façon: http://apt.include-once.org/apt-phparchive - S'il vous plaît, notez qu'il n'est pas trop robuste et écrit en PHP (pour une fois, c'est une coïncidence), et était à l'origine destiné aux ensembles DEB, et RPM-over-APT et Phar.

Étant donné que cela est étroitement lié à la question initiale, il existe également des outils permettant de créer plus facilement des paquets Debian. Un peu dépassé: EPM . Beaucoup plus contemporain: FPM . Et ma fourchette personnelle: XPM (approche plus paresseuse pour empaqueter des applications en langage de script.)

Mario
la source
1
Comment puis-je ajouter la clé gpg lorsque je veux utiliser ce dépôt?
Bruce Sun
1
Habituellement, quelque chose commewget …/public.gpg -O- | apt-key add -
mario
Que devrais-je changer si je voulais prendre en charge plusieurs architectures?
starbeamrainbowlabs
1
@starbeamrainbowlabs Pas tout à fait sûr, mais je pense que cela dpkg-scanpackages -mpourrait suffire. Il listera toujours toutes les architectures dans le même fichier Release. Mais tant que chaque .deb a un nom unique / ou est stocké dans des sous-répertoires distincts (amd64 /, all /), il faut que cela fonctionne. Sinon, optez pour l'un des outils de référentiel les plus complexes.
mario
7

Oui. Tu peux le faire. Vous avez juste besoin d'organiser les fichiers de la bonne manière et de créer les fichiers d'index. Si vous placez la structure de répertoires à la racine du document de votre serveur Web, vous pouvez uniquement accéder aux packages via le serveur Web.

Voici une description détaillée de la manière dont les fichiers doivent être organisés et de la manière dont les fichiers d’index sont créés.

Vous pouvez également utiliser un outil appelé reprepro si vous souhaitez installer ce package. Cela rendra l'administration un peu plus pratique.

txwikinger
la source
@txwikinger: La raison pour laquelle je ne peux pas installer de paquet, c'est parce que le serveur exécute centOS :)
Nathan Osman le
Bien. vous n'avez pas besoin de. Vous pouvez tout créer sur un autre ordinateur et rsynciser tout l'arborescence sur le serveur
centos
Oui, j'approuverais certainement l'utilisation de reprepro. Cela vous facilitera tellement la vie. La création du référentiel sur un autre ordinateur peut même constituer une fonctionnalité, au cas où cela vous permettrait de mieux protéger votre clé de signature.
andol
@andol & @txwikinger: J'essaie mais je rencontre des problèmes. S'il vous plaît voir ma question mise à jour.
Nathan Osman
Pour votre fichier dists, vous aurez toujours besoin de ./binary-<archive specifique>.
andol
2

Vous pouvez peut-être aussi envisager un PPA Launchpad

UPS
la source
0

Pour toute personne confrontée à cette erreur après avoir suivi la réponse de Mario:

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

faire ce qui suit:

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

Je mets mes *.debfichiers dans un debsdossier.

la mineure
la source