{{tag>depot debian local logiciel howto apt-ftparchive gpg pool}} ====== Créer son propre dépot Debian ====== Il peut être tres pratique de créer son propre dépôt Debian. Il existe pas mal de facons de faire et je vais vous présenter ici la manière que j'utilise au quotidien : Cette méthode utilise : * l'utilitaire apt-ftparchive * un pool de fichiers .deb par dépot (perte d'espace de stockage car les paquets sont dupliqués, mais gain en lisibilité sur les logiciels disponibles par dépot) * pour chaque dépot, le même dépot suffixé de "-test" existe : il sert comme son nom l'indique à déposer des paquets pour les tester avant leur mise en production dans l'autre dépot. * le dépot est signé par une clef GPG Ce dépot permet une installation aisée d'un ensemble de machine car il héberge des meta-packages installant un ensemble de logiciels (peut être un jour un article la dessus). ===== Créer l'arborescence d'un dépot ===== Voici l'arborescence type de l'ensemble des depots : ./cache ./mirror/pool-lenny ./mirror/pool-lenny/custom ./mirror/pool-lenny/custom/binary-i386 ./mirror/pool-lenny/custom/binary-amd64 ./mirror/pool-lenny/custom/binary-all ./mirror/pool-lenny-test ./mirror/pool-lenny-test/custom ./mirror/pool-lenny-test/custom/binary-i386 ./mirror/pool-lenny-test/custom/binary-amd64 ./mirror/pool-lenny-test/custom/binary-all ./mirror/pool-hardy ./mirror/pool-hardy/custom ./mirror/pool-hardy/custom/binary-i386 ./mirror/pool-hardy/custom/binary-amd64 ./mirror/pool-hardy/custom/binary-all ./mirror/pool-hardy-test ./mirror/pool-hardy-test/custom ./mirror/pool-hardy-test/custom/binary-i386 ./mirror/pool-hardy-test/custom/binary-amd64 ./mirror/pool-hardy-test/custom/binary-all ./filelists ./filelists/dists ./filelists/dists/lenny ./filelists/dists/lenny-test ./filelists/dists/hardy ./filelists/dists/hardy-test Comme on ne va pas créer cette arborescence a la main, voici un petit script permettant de créer/ajouter facilement un dépot : #!/bin/bash # /usr/local/sbin/create_debian_repository.sh # cree un nouveau depot deb local ARCHS="i386 amd64" REPO_ROOT="/var/www/depots_deb" MIRROR_ROOT="$REPO_ROOT/mirror/dists" FILELISTS_DIR="$REPO_ROOT/filelists" if [ $# -lt 1 ] ; then echo "" >&2 echo "Usage: $0 depot section" >&2 echo "" >&2 echo "Cree l'arborescence nécessaire pour créer un depot avec la section souhaitée" >&2 echo "Genere le fichier de configuration associé pour apt-ftparchive" >&2 echo "" >&2 exit 1 fi # le premier argument specifie le depot if [ -n "$1" ]; then DIST=$1 shift fi # le deuxieme argument specifie la section if [ -n "$1" ]; then SECTION=$1 shift fi FTP_ARCHIVE_CONF_FILE="/etc/apt/apt-perso-${DIST}.conf" #creation de l'arborescence DIR="" for archi in $ARCHS; do DIR="$DIR ${FILELISTS_DIR}/dists/${DIST} $REPO_ROOT/mirror/pool-${DIST}/$SECTION/binary-${archi} $MIRROR_ROOT/$DIST/$SECTION/binary-${archi}" done DIR="$DIR $REPO_ROOT/mirror/pool-${DIST}/$SECTION/binary-all $MIRROR_ROOT/$DIST/$SECTION/binary-all" mkdir -p $DIR chown root:admin $DIR chmod u=rwx,g=rwxs,o=rx,g+s $DIR chmod g+ws $DIR # generation du fichier de configuration du depot if [ -f $FTP_ARCHIVE_CONF_FILE ]; then echo "Le fichier de conf $FTP_ARCHIVE_CONF_FILE existe deja : Abandon" >&2 echo "Veuillez le compléter a la main (si vous voulez créer une nouvelle section dans un depot existant)" >&2 echo "ou le supprimer avant de relancer ce script" >&2 exit 1 fi echo "APT::FTPArchive::Release::Origin \"Internal Repository\";" > $FTP_ARCHIVE_CONF_FILE echo "APT::FTPArchive::Release::Label \"Internal tools\";" >> $FTP_ARCHIVE_CONF_FILE echo "APT::FTPArchive::Release::Suite \"$DIST\";" >> $FTP_ARCHIVE_CONF_FILE echo "APT::FTPArchive::Release::Codename \"$DIST\";" >> $FTP_ARCHIVE_CONF_FILE echo "APT::FTPArchive::Release::Architecture \"$ARCHS\";" >> $FTP_ARCHIVE_CONF_FILE echo "APT::FTPArchive::Release::components \"$SECTION\";" >> $FTP_ARCHIVE_CONF_FILE echo "APT::FTPArchive::Release::Description \"Internal Repository\";" >> $FTP_ARCHIVE_CONF_FILE echo "" >> $FTP_ARCHIVE_CONF_FILE echo "Tree \"dists/$DIST\" {" >> $FTP_ARCHIVE_CONF_FILE echo " Sections \"$SECTION\";" >> $FTP_ARCHIVE_CONF_FILE echo " Architectures \"$ARCHS\";" >> $FTP_ARCHIVE_CONF_FILE echo " Directory \"pool-$DIST/\$(SECTION)/binary-\$(ARCH)\";" >> $FTP_ARCHIVE_CONF_FILE echo " SrcDirectory \"pool-$DIST/\$(SECTION)/source\";" >> $FTP_ARCHIVE_CONF_FILE echo "}" >> $FTP_ARCHIVE_CONF_FILE Il ne vous reste plus qu'a poser les paquets .deb dans le repertoire pool-$DIST/$(SECTION)/binary-$(ARCH) qui convient. ===== Mettre a jour le depot ===== Pour générer l'index du dépot afin qu'il soit utilisable sur vos postes clients, voici le script de mise à jour utilisé : #!/bin/bash #/usr/local/bin/updateMirror.sh # met a jour le depot debian cible passé en argument DISTS="etch gutsy hardy intrepid lenny ubuntu unstable" # adapter ala liste des depots que vous possédez REPO_ROOT="/var/www/depots_deb" MIRROR_ROOT="$REPO_ROOT/mirror/dists" GPG_HOME="/root/.gnupg_depots_deb" FILELISTS_DIR="$REPO_ROOT/filelists" ARCH_LIST="i386 amd64 all" if [ $# -lt 1 ] ; then echo "" >&2 echo "Usage: $0 [ all|etch|unstable|... ] [ test ]" >&2 echo "" >&2 echo "Mise à jour du ou des dépots (all) spécifié en premier argument." >&2 echo "Un seul dépot peut-être spécifié à la fois." >&2 echo "" >&2 echo "Si le deuxième argument est 'test', " >&2 echo "la mise à jour se fait sur les dépots de test" >&2 echo "" >&2 exit 1 fi # le premier argument specifie le depot à mettre à jour if [ -n "$1" ]; then ONLY_DIST="" tmp_sec=$1 shift for i in ${DISTS} do if [ "X$i" = "X$tmp_sec" ]; then ONLY_DIST=$i break fi done if [ "X$tmp_sec" = "Xall" ]; then ONLY_DIST=${DISTS} fi if [ -z "${ONLY_DIST}" ]; then echo "ERREUR: depot invalide $tmp_sec" >&2 exit 1 fi DISTS=${ONLY_DIST} fi # depots de prod ou de test DIST_SUFFIX="" if [ "X$1" == "Xtest" ]; then DIST_SUFFIX="-test" shift fi for DIST in $DISTS do DIST="${DIST}${DIST_SUFFIX}" FTP_ARCHIVE_CONF_FILE="/etc/apt/apt-perso-${DIST}.conf" rm -f $REPO_ROOT/cache/*db # generation des filelist des depots cd $REPO_ROOT/mirror for section in `ls pool-${DIST}` do for archi in $ARCH_LIST; do if [ "x${archi}" = "xall" ]; then continue fi mkdir -p ${FILELISTS_DIR}/dists/${DIST} echo "Section : ${section}" echo "Arch : ${archi}" FILELIST="${FILELISTS_DIR}/dists/${DIST}/${section}-${archi}.filelist" echo "filelist : $FILELIST" find pool-${DIST}/$section/binary-${archi} pool-${DIST}/$section/binary-all -name "*.deb" > \ ${FILELISTS_DIR}/dists/${DIST}/${section}-${archi}.filelist done done echo "generation apt ftp archive :" apt-ftparchive generate ${FTP_ARCHIVE_CONF_FILE} echo "creation du fichier Release :" # creation des fichiers Release RELEASE_FILE="${MIRROR_ROOT}/${DIST}/Release" apt-ftparchive -c $FTP_ARCHIVE_CONF_FILE release \ ${MIRROR_ROOT}/${DIST}/ > $RELEASE_FILE # signature gpg des fichiers Release rm -f $RELEASE_FILE.gpg ${DEBUG} gpg --verbose --homedir ${GPG_HOME} -ba \ --output $RELEASE_FILE.gpg $RELEASE_FILE done ===== Configuration du virtualhost apache ===== Pour utiliser ce dépot le plus simple est de le servir en http via un serveur Web (apache2 dans notre cas). Voici un exemple de fichier de VirtualHost apache2 (fichier : /etc/apache2/sites-available/debtools.domaine.interne ) : # /etc/apache2/sites-available/debtools.domaine.interne ServerAdmin admin@mondomaine.com ServerName debtools.domaine.interne ServerAlias debtools DocumentRoot /var/www/depots_deb/mirror/ ErrorLog /var/log/apache2/depots_deb_error.log TransferLog /var/log/apache2/depots_deb_access.log AllowOverride AuthConfig Options Indexes FollowSymLinks MultiViews order deny,allow allow from all ===== Utilisation coté client ===== Il suffit d'ajouter la ligne correspondante a la distribution dans votre fichier /etc/apt/sources.list (ou créer un nouveau fichier dans le repertoire /etc/apt/sources.list.d/ ), par exemple pour lenny : cat << EOF >> /etc/apt/sources.list deb http://debtools.domaine.interne lenny custom EOF