septembre
2010
Dans cet article, on va créer un package Debian pour une application Django.
Le package va être responsable pour:
- Installer l’application
- Configurer le serveur web (dans notre cas: Lighttpd + fastcgi)
- Script init.d pour démarrer/arrêter le serveur Django
On va utiliser une template debconf pour demander 1 question à l’utilisateur. Cela va rendre le package plus dynamique..
On présume que l’application Django se trouve dans /usr/share/djangoapp . C’est là où se trouve settings.py, manage.py, views.py etc…
Tout d’abord, on crée un dossier debian et on copie le dossier de l’application Django dedans.
mkdir ./debian mkdir -p ./debian/usr/share/ cp -r /usr/share/djangoapp ./debian/usr/share/
On a également besoin de créer un dossier DEBIAN dans debian/
mkdir ./debian/DEBIAN
Fichiers dans DEBIAN
Ce dossier doit contenir les fichiers suivants:
- control
- config
- conffiles
- templates
- postinst
- postrm
- preinst
- prerm
control
C’est le fichier le plus important dans un package Debian. Ce fichier défini le package et ses dépendances. Il contient dans notre cas le texte suivant:
Package: djangoapp Version: 0.1-1 Section: devel Priority: optional Architecture: all Depends: python, python-django, python-flup, debconf, lighttpd Maintainer: Laurent Luce Description: short description long description
Le paramètre « depends » est une liste de packages dont depends notre package.
config
config est un script demandant des questions à l’utilisateur avant que le package soit installé. On demande une seule question dans notre exemple:
#!/bin/sh -e # Source debconf library. . /usr/share/debconf/confmodule # votre nom ? db_input critical djangoapp/username || true db_go
On a besoin d’inclure le module debconf. Notre question est de type ‘critical’.
Mais où est la définition de notre question ? Elle est défini dans le fichier templates
templates
Template: djangoapp/username Type: string Description: Username: Ce package nécessite votre nom
conffiles
Ce fichier contient les fichiers de configuration généralement localisés dans /etc . Nous ajoutons le fichier de lancement de Django.
/etc/init.d/django
preinst
Ce script est executé avant l’installation du package.
#!/bin/bash set -e # stop le serveur Django if [ -f /etc/init.d/django ] then invoke-rc.d django stop fi
postinst
Ce script est executé après l’installation du package.
#!/bin/sh set -e # Source debconf library. . /usr/share/debconf/confmodule db_get djangoapp/username username="$RET" # utiliser le nom de l'utilisateur comme bon vous semble # enregistrer Django update-rc.d django defaults 90 >/dev/null # démarrer Django invoke-rc.d django start db_stop
postrm
Ce script est executé après que le package soit désinstallé.
#!/bin/bash
set -e
if [ "$1" = "purge" -a -e /usr/share/debconf/confmodule ]; then
# Source debconf library.
. /usr/share/debconf/confmodule
# Supprimer mes changements dans la base de données
db_purge
fi
if [ "$1" = "remove" ]; then
# Source debconf library.
. /usr/share/debconf/confmodule
# Supprimer le script de lancement de Django
update-rc.d -f django remove
# Supprimer mes changements dans la base de données
db_purge
fi
prerm
Ce script est exécuté avant la désinstallation du package
#!/bin/bash set -e # stop django server invoke-rc.d django stop
Configuration du serveur web
On a besoin de modifier le fichier de configuration de lighttpd: lighttpd.conf:
mod_fastcgi doit être ajouté à la liste des modules du serveur.
le serveur Django écoute sur le port 3033:
fastcgi.server = (
"/djangoapp.fcgi" => (
"main" => (
# Use host / port instead of socket for TCP fastcgi
"host" => "127.0.0.1",
"port" => 3033,
"check-local" => "disable",
))
)
Script Django init.d
C’est le moment d’ajouter notre script de lancement pour Django:
#! /bin/sh
### BEGIN INIT INFO
# Provides: FastCGI servers for Django
# Required-Start: networking
# Required-Stop: networking
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Django FastCGI
#
DJANGO_SITE="djangoapp"
SITE_PATH=/var/www
RUNFILES_PATH=$SITES_PATH/tmp
HOST=127.0.0.1
PORT_START=3033
RUN_AS=www-data
set -e
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
DESC="Django FastCGI"
NAME=$0
SCRIPTNAME=/etc/init.d/$NAME
#
# Function that starts the daemon/service.
#
d_start()
{
# Starting all Django FastCGI processes
echo -n ", $DJANGO_SITE"
if [ -f $RUNFILES_PATH/$DJANGO_SITE.pid ]; then
echo -n " already running"
else
start-stop-daemon --start --quiet \
--pidfile $RUNFILES_PATH/$DJANGO_SITE.pid \
--chuid $RUN_AS --exec /usr/bin/env -- python \
$SITE_PATH/$DJANGO_SITE/manage.py runfcgi \
host=$HOST port=$PORT \
pidfile=$RUNFILES_PATH/$DJANGO_SITE.pid
fi
}
#
# Function that stops the daemon/service.
#
d_stop() {
# Killing all Django FastCGI processes running
echo -n ", $DJANGO_SITE"
start-stop-daemon --stop --quiet --pidfile $RUNFILES_PATH/$SITE.pid \
|| echo -n " not running"
if [ -f $RUNFILES_PATH/$DJANGO_SITE.pid ]; then
rm $RUNFILES_PATH/$DJANGO_SITE.pid
fi
}
ACTION="$1"
case "$ACTION" in
start)
echo -n "Starting $DESC: $NAME"
d_start
echo "."
;;
stop)
echo -n "Stopping $DESC: $NAME"
d_stop
echo "."
;;
restart|force-reload)
echo -n "Restarting $DESC: $NAME"
d_stop
sleep 1
d_start
echo "."
;;
*)
echo "Usage: $NAME {start|stop|restart|force-reload}" >&2
exit 3
;;
esac
exit 0
Le script doit être placé dans ./debian/etc/init.d/
On a besoin de créer un lien de /var/www/djangoapp vers /usr/share/djangoapp
changelog, changelog.Debian et copyright
Ces fichiers sont nécessaires pour notre package:
changelog
djangoapp (0.1-1) unstable; urgency=low
* Initial release.
+ Initial package
-- Laurent Luce Fri, 01 Jan 2010 00:00:00 +0000
Dans notre cas, changelog.Debian contient la même chose que changelog.
copyright
DjangoApp Copyright: bla bla 2010-01-01 The home page of xxx is at: http://www.xxx.com Copyright xxx 2010
On doit placer ces fichiers proprement:
mkdir -p ./debian/usr/share/doc/djangoapp cp changelog changelog.Debian copyright ./debian/usr/share/doc/djangoapp/ gzip --best ./debian/usr/share/doc/djangoapp/changelog gzip --best ./debian/usr/share/doc/djangoapp/changelog.Debian
Construction du package
On doit régler les permissions:
find ./debian -type d | xargs chmod 755
On construit le package et on le vérifie de cette manière:
fakeroot dpkg-deb --build debian mv debian.deb DjangoApp_0.1-1_all.deb lintian DjangoApp_0.1-1_all.deb
Notre package est prêt !!!
Si vous avez aimé cet article, ca serait cool d’aller sur mon site Gourmious pour découvrir et partager vos plats préférés au resto.

Un article de laurent luce