54 votes

Comment mettre en place un référentiel APT ?

Je voudrais mettre en place un dépôt APT sur un serveur qui fournira quelques paquets.

Y a-t-il un moyen d'en créer un ? sans installer un logiciel sur le serveur ?

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


Edita: Je dois faire quelque chose de mal... quelqu'un peut-il m'aider ? J'ai le référentiel à http://quickmediasolutions.com/apt/dists

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

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

deb http://quickmediasolutions.com/apt stable main

40voto

SeaBreeze Points 51

Il suffit de mettre en place un dépôt simple mais signé sur un serveur web. Comme la plupart des autres tutoriels sont quelque peu dépassés ou encombrants, je vais essayer de reproduire la procédure ici. La configuration initiale demande un peu d'effort, mais le simple build script permet de le gérer facilement. Et vous pouvez simplement déposer de nouveaux *.deb puis mettre à jour, ou laisser une tâche cron s'en charger.

Générer des clés de signature

Vous devez d'abord créer un gpg clé de signature pour les paquets et votre référentiel. Faites-en une clé de signature RSA (4), sans mot de passe, et donnez-lui un nom unique $KEYNAME quand on le demande. (Pour d'autres exemples, voir " dpkg1 " comme nom de 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 paquets et le dépôt signés sont seulement destinés à satisfaire les plaintes des gestionnaires de mise à jour à ce sujet. Il suffit de télécharger les deux clés vers le nouveau /apt/ sur votre serveur web, mais supprimez le fichier secret.gpg clé après l'initialisation.

Mise à jour du CGI script

C'est la simple mise à jour Shell/CGI Shell pour cela :

#!/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 gpg ne doivent être exécutées qu'une seule fois, pour initialiser la configuration GPG dans un répertoire quelconque. $GNUPGHOME (au-dessus de la racine du document). Ne supprimez que le secret.gpg après le succès.

L'une des caractéristiques uniques de ce petit Shell Shell est qu'il accepte n'importe quel *.deb que vous déposez, mais recherche aussi récursivement (en commençant par un niveau supérieur) d'autres fichiers, et les intègre par des liens symboliques. (Nécessite .htaccess Options FollowSymLinks éventuellement.)

Vous pouvez soit exécuter ce script manuellement comme CGI ou par cron-job. Mais cachez-le, ou mieux encore, déplacez-le hors de la racine du document.

Parce que c'est un dépôt apt "trivial", il a besoin des éléments suivants apt-sources.list entrée :

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

Cela convient aux dépôts à architecture unique, et si vous n'attendez pas des centaines de paquets.

Signature du paquet

La signature de vos paquets individuels est également triviale, une fois que vous avez configuré vos clés gpg :

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

(Cela doit être fait sur la station de travail où les paquets sont construits, et non sur le serveur web du référentiel).

Référentiel non signé

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

  dpkg-scanpackages . > Packages
  bzip2 -kf Packages

Ce qui peut toujours être utilisé par les utilisateurs moyens, mais nécessite un drapeau personnalisé pour les éléments suivants apt.sources :

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

Mais n'utilisez pas le trusted=yes pour tout, ou si vous n'êtes pas sûr de l'origine du paquet.

Pour la convivialité

Pour les utilisateurs finaux, il suffit de déposer un HEADER.html dans le répertoire du référentiel. Apaches mod_auto_index précédera cette note :

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

Alternatives

Il existe aujourd'hui quelques outils permettant d'automatiser la gestion des référentiels. Et il existe même des hébergeurs de référentiels en ligne et des services de construction de paquets ( gemfourrure , nuage de colis , bintray etc.)

  • Une alternative plutôt pratique est prm . C'est un script Ruby, qui construit des dépôts APT et YUM complexes. (Mais espérons que RPM disparaîtra bientôt ) - Il est mieux installé par gem install prm .

  • Et j'ai également écrit un petit script pour automatiser cela de manière similaire : http://apt.include-once.org/apt-phparchive - Veuillez noter qu'il n'est pas excessivement robuste et qu'il est écrit en PHP (pour une fois, c'est une coïncidence), et qu'il était à l'origine destiné à DEB, et aux paquets RPM-over-APT et Phar.

Comme cela est étroitement lié à la question initiale, il existe également des outils permettant de construire plus facilement des paquets Debian. Un peu dépassé : EPM . Beaucoup plus contemporain : FPM . Et ma fourchette personnelle : XPM (approche plus paresseuse pour l'empaquetage des applications en langage de script).

27voto

Dennis G. Points 355

La mise en place d'un dépôt trivial est très facile en utilisant dpkg-scanpackages. Cette page explique comment mettre en place un repo trivial, et éste explique comment l'utiliser (voir l'exemple 4).

7voto

Joel Spolsky Points 22686

Oui, vous pouvez le faire. Il vous suffit d'organiser les fichiers de la bonne manière et de créer les fichiers d'index. Si vous placez la structure du répertoire à la racine du document de votre serveur Web, les paquets seront accessibles via le serveur Web.

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

Vous pouvez également utiliser un outil appelé reprepro si vous êtes prêt à installer ce seul paquet. Cela rendra l'administration un peu plus pratique.

2voto

Xenph Yan Points 20883

Vous pouvez peut-être aussi envisager un PPA de lancement

0voto

uday Points 1

Pour toute personne rencontrant 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)

faites 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

J'ai mis mon *.deb fichiers dans debs dossier.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X