Maintenant que vous savez créer un paquet Deb, nous allons voir comment créer un dépôt Apt qui vous permettra de les installer avec ce dernier, au lieu de Dpkg. Apt est une surcouche à Dpkg qui télécharge automatiquement les paquets Deb et sait gérer les dépendances entres eux.
Créer un dépôt Apt nécessite un serveur web. Cela dit, il ne lui faudra aucune configuration particulière, simplement une racine web. Son installation et sa configuration sortent donc du contexte de cet article. Nous partirons du principe que vous utilisez Apache2 ou Nginx et que sa racine web est située dans /var/www/html/.
On trouve déjà de nombreux tutoriels sur le sujet. Mais de ce que j’ai pu voir, la plupart traitent de l’installation d’un dépôt mono-distribution. Pour ma part, j’utilise souvent plusieurs distributions en parallèle (Debian, Raspbian, Ubuntu), et j’ai donc besoin de les faire cohabiter sur le même serveur.
Créer un dépôt Apt
Nous allons commencer par créer un dossier par distribution dans notre racine web :
$ sudo mkdir /var/www/html/{debian,raspbian,ubuntu}
Normalement, vous devriez pouvoir lister ces dossiers vides à l’aide de votre navigateur. Si ce n’est pas le cas, vérifiez :
- Si votre serveur web est bien installé et démarré
- La configuration de votre serveur web (
+Indexessous Apache) - Si le port 80 est bien en écoute par votre serveur web (
sudo netstat -nlp | grep :80) - Si aucun pare-feu ne bloque ce port
La création d’un dépôt Apt se fait avec l’outil reprepro, documenté par la page man reprepro (1) :
$ sudo apt-get install reprepro
Nous allons ensuite lui créer une arborescence, qui comme pour la partie web, contiendra une branche par distribution :
$ sudo mkdir --parents /var/reprepro/{debian,raspbian,ubuntu}/{conf,incoming}
Ce qui donnera :
$ tree -paugs /var/reprepro
/var/reprepro
├── [drwxr-xr-x root root 4096] debian
│ ├── [drwxr-xr-x root root 4096] conf
│ └── [drwxr-xr-x root root 4096] incoming
├── [drwxr-xr-x root root 4096] raspbian
│ ├── [drwxr-xr-x root root 4096] conf
│ └── [drwxr-xr-x root root 4096] incoming
└── [drwxr-xr-x root root 4096] ubuntu
├── [drwxr-xr-x root root 4096] conf
└── [drwxr-xr-x root root 4096] incoming
9 directories, 0 files
Dans chaque dossier conf/, nous allons configurer la famille de distributions qui correspond en créant deux fichiers :
- Un fichiers de description des distributions (obligatoire). Il indiquera quelles distributions nous gérerons dans chaque famille, comment les indexer, etc.
- Un fichier de configuration de reprepro (optionnel). Il indiquera les options de reprepro par famille (verbosité, chemins, etc).
La syntaxe complète du fichier distributions est indiquée dans la page man reprepro (1). Voici celui que nous utiliserons pour héberger les paquets que nous avons créé dans l’article précédent pour les distributions Wheezy et Jessie de la famille Debian :
Origin: David Mézière Label: Dépôt personnel Suite: stable Codename: wheezy Version: 7 Architectures: i386 amd64 Components: main Description: Dépôt du réseau local Origin: David Mézière Label: Dépôt personnel Suite: stable Codename: jessie Version: 8 Architectures: i386 amd64 Components: main Description: Dépôt du réseau local
Je vous laisse le soin de créer ceux des autres familles en fonction de vos besoins.
Le fichier options vous permet d’enregistrer des options d’appel de reprepro pour chaque famille de distributions. Documenté aussi dans la page man, il doit contenir les options en ligne de commande de reprepro sans leurs double tiret, une par ligne :
verbose basedir /var/reprepro/debian outdir /var/www/html/debian
Je vous laisse le soin de créer ceux des autres familles en fonction de vos besoins.
Nous allons créer un dossier par distribution dans chaque dossier incomming/ de chaque famille :
$ sudo mkdir /var/reprepro/debian/incoming/{wheezie,jessie}
Même chose pour les autres familles.
Nous pouvons maintenant placer nos Debs dans /var/reprepro/debian/incoming/jessie/, puis appeler reprepro pour les injecter dans sa base de données, qui sera créée à la volée lors du premier appel :
$ sudo reprepro --basedir /var/reprepro/debian/ includedeb jessie /var/reprepro/debian/incoming/jessie/dme-sys-base_1.0-1.deb /var/reprepro/debian/incoming/jessie/dme-sys-base_1.0-1.deb: component guessed as 'main' Exporting indices...
Note: Si vous obtenez une erreur du type : « Second appearance of ‘Origin’ in the same chunk!« , vous avez probablement eu un accident de copier-coller et devrez refaire votre saut de ligne entre les chunks.
Nous pouvons voir le résultat en ouvrant le dossier /debian avec notre navigateur. Reprepro a créé des dossiers dist/ et pool/, avec toutes les meta données que l’on a l’habitude de voir sur un dépôt Apt. Vous pouvez si vous le souhaitez supprimer ce Deb du dossier incomming/, il ne sert plus à rien.
En bonus, voici un script qui mettra a jour plus simplement vos dépôts :
#!/bin/bash
#
# Updates the debs repositories
#
BASE_DIR=/var/reprepro
OUT_DIR=/var/www/html
# Iterates over each family
for FAMILY in `find ${BASE_DIR}/ -mindepth 1 -maxdepth 1 -type d -printf "%f\n"`; do
# Iterates over each distribution
for DIST in `find ${BASE_DIR}/${FAMILY}/incoming/ -mindepth 1 -maxdepth 1 -type d -printf "%f\n"`; do
# Iterates over each package
for FILE in `find ${BASE_DIR}/${FAMILY}/incoming/${DIST}/ -mindepth 1 -maxdepth 1 -type f -printf "%f\n"`; do
# Import the file in the repository
reprepro \
--basedir ${BASE_DIR}/${FAMILY} \
includedeb ${DIST} ${BASE_DIR}/${FAMILY}/incoming/${DIST}/${FILE}
if [[ ${?} -eq 0 ]]; then
# On success, delete the file in incoming folder
echo "Added ${FAMILY} ${DIST} ${FILE}."
rm ${BASE_DIR}/${FAMILY}/incoming/${DIST}/${FILE}
else
# On error, keep the file in incoming folder
echo "Failed to add ${FAMILY} ${DIST} ${FILE}."
fi
done # Package
done # Distribution
# Cleans owner and group of web server exposed files
sudo find ${OUT_DIR} ! -user www-data -exec chown www-data {} +
sudo find ${OUT_DIR} ! -group www-data -exec chgrp www-data {} +
done # Family
Ce script va automatiquement descendre dans chaque dossier incomming/, ajouter les Debs qu’il trouvera, puis les supprimera lorsqu’il aura réussi, laissant derrière lui ceux qui n’auront pas été importés.
Utiliser votre dépôt Apt
Pour qu’une machine puisse prendre en compte votre dépôt il faut l’ajouter aux sources Apt. Il y a deux façons de faire :
- Créer un fichier
/etc/apt/sources.list.d/mon-depot.list - L’ajouter au fichier
/etc/apt/sources.list
La première méthode est la plus propre, mais ne fonctionne que sur des systèmes récents. La seconde méthode fonctionne sur tous les systèmes.
Les lignes à créer ou ajouter selon le cas, sont formées comme suit :
deb http://192.168.1.2/debian/ jessie main
Bien-sûr, vous remplacerez l’adresse IP 192.168.1.2 par l’adresse ou le nom de la machine qui vous sert de dépôt.
Pour que votre système voit vos Debs, il faut mettre à jour sa base de données maintenant qu’il connaît ce nouveau dépôt :
$ sudo apt-get update (...) Ign http://192.168.2.1 jessie InRelease Ign http://192.168.2.1 jessie Release.gpg Réception de : 1 http://192.168.2.1 jessie Release [1 649 B] Réception de : 2 http://192.168.2.1 jessie/main amd64 Packages [601 B] Ign http://192.168.2.1 jessie/main Translation-fr_FR Ign http://192.168.2.1 jessie/main Translation-fr Ign http://192.168.2.1 jessie/main Translation-en (...)
On voit ici qu’il a bien reconnu mon serveur, puisque son adresse apparaît dans la liste, au milieu des autres (que j’ai volontairement omis).
On voit aussi qu’il manque des choses sur notre dépôt, mais qu’Apt a choisi d’ignorer. Il s’agit des lignes qui commencent par Ign. Certaines sont purement optionnelles, comme les traductions, d’autres seraient bien venues, comme les signatures, qui feront l’objet d’un autre article.
On peut aller plus loin en recherchant les paquets que notre nouveau dépôt est sensé servir :
$ apt-cache search ^dme- dme-sys-base - Installe les éléments de base du système dme-usr-dmeziere - Configure le compte utilisateur dmeziere
Je vais maintenant installer ces paquets et leurs dépendances avec un simple apt-get :
$ apt-get install dme-sys-base dme-usr-dmeziere (...) ATTENTION : les paquets suivants n'ont pas été authentifiés. dme-sys-base dme-usr-dmeziere Faut-il installer ces paquets sans vérification ? [o/N] o (..)
Comme le montre la sortie d’écran, il ne nous reste plus qu’à signer nos paquets avec GPG pour atteindre le degré de propreté supérieur 🙂
3 commentaires
Les commentaires sont fermés.