-
Notifications
You must be signed in to change notification settings - Fork 19
Installer lighttpd, django et couchdb sur un sheeva plug
Ceci est un petit tutoriel permettant d’installer un Django (Framework web) accessible via un serveur Lighttpd (serveur web léger) et utilisant une base de données SQLite ainsi qu’une base Couchdb sur une Debian 6.0 (Squeeze). La bonne nouvelle est que tout est disponible dans les paquets d’origine, la mauvaise est que c’est très long.
Ce tutorial permettra ainsi de montrer qu’il est donc possible de déployer un serveur web avancé sur Sheeva Plug.
Tout d’abord vous devez connaitre l’adresse IP de votre plug computer. Pour cela il faut vous connecter via USB sur le Sheeva plug et taper la commande
ifconfig
S’en suit une série d’instructions. Ce qui nous intéresse est la partie suivante :
eth0 Link encap:Ethernet HWaddr 00:24:8c:43:63:1f
inet adr:192.168.1.15 Bcast:192.168.1.255 Masque:255.255.255.0
Les quatre chiffres derrière inet adr représentent l’adresse IP recherchée. La série de chiffres derrière HWaddr correspond à la mac adress du Sheeva plug. Via votre espace Freebox, vous pouvez forcer l’allocation d’adresse IP en associant la mac adress du Sheeva plug à une IP que vous choisissez.
Pour pouvoir accéder à la ligne de commande du Sheeva Plug une simple connexion ssh suffira :
Le mot de passe par défaut est : nosoup4u. Ca y est une invite root nous est proposé. Nous pouvons commencer !
La Debian installée est bien une squeeze :
cat /etc/debian_version
squeeze/sid
En tant qu’utilisateur consciencieux vous changez immédiatement votre mot de passe avec :
passwd
Avant de commencer on met à jours les paquets :
apt-get update
apt-get upgrade
Puis on installe Python et Vim :
apt-get install python
apt-get install vim
Le Sheeva Plug n’est pas un foudre de guerre, on ne prend donc pas peur que cela rame un peu. Plusieurs warnings apparaissent sur la locale utilisée (comprenez traduction des messages). La commande suivante permet de régler ce problème. Celle-ci permet de sélectionner une locale à générer. apt-get m’indiquait que c’est la local fr_FR qui manquait. Je l’ai donc sélectionnée et me suis ainsi débarrassé des messages intempestifs.
dpkg-reconfigure locales
La commande suivante vous installera un beau serveur lighttpd configuré pour être accédé via le port 80.
apt-get install lighttpd
Vous pouvez vérifier que tout a bien fonctionné en vous connectant sur votre adresse IP via votre navigateur, en d’autres termes si votre adresse est 192.168.1.15 mettez http://192.168.1.15/ dans votre barre d’adresses. Si tout va bien vous devriez voir un message vous indiquant que cela marche ou alors une arborescence de fichiers devrait apparaître.
L’installation de Django se fait tout aussi facilement :
apt-get install python-django
Nous allons adjoindre un gestionnaire de bases de données : SQLite en premier lieu :
apt-get install sqlite
apt-get install python-sqlite
Création d’une application django
On crée tout d’abord un utilisateur spécial pour cette application :
adduser newebe
Puis on prend sa peau :
su newebe
cd
Et on crée notre appli :
django-admin startproject newebe
Puis on remplit le fichier de configuration (settings.py). Voici les zones à changer :
DATABASES = {
'default': {
'ENGINE': 'sqlite3',
'NAME': '/home/newebe/newebe/newebe.db',
'USER': '',
'PASSWORD': '',
'HOST': '',
'PORT': '',
}
}
MEDIA_ROOT = '/home/newebe/media/'
TEMPLATE_DIRS = (
'/home/newebe/newebe/templates/'
)
INSTALLED_APPS = (
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.sites',
'django.contrib.messages',
'django.contrib.admin',
'couchdbkit.ext.django',
'newebe.main',
)
On crée ensuite les répertoires correspondants :
mkdir /home/newebe/media/
mkdir /home/newebe/newebe/templates/
On demande de générer l’appli main :
django-manage.py startapp main
On indique que la racine de l’URL du serveur renverra le contenu du template greetings.html (fichier ~ /newebe/main/urls.py) :
urlpatterns = patterns('django.views.generic.simple',
(r'^$', 'direct_to_template', {'template': 'greetings.html'}),
)
On redirige les urls de la racine vers le main (~ /newebe/urls.py) :
urlpatterns = patterns('',
(r'^', include('main.urls')),
)
On remplit le template en question (~ /newebe/templates/greetings.html) :
HTML
<html>
<body>
Hello, it is the Gelnior's Django-Sheeva Plug.
</body>
</html>
Voilà notre application terminée ! Il ne nous reste plus qu’à la brancher sur notre serveur lighttpd :
Interfaçage avec lighttpd
Avant toute chose on ajoute la ligne suivantes au fichier settings.py de l’application newebe :
FORCE_SCRIPT_NAME=""
On modifie ensuite le fichier de configuration de Lighttpd :
Ajout du module « mod_fastcgi » :
server.modules = (
"mod_access",
"mod_alias",
"mod_compress",
"mod_rewrite",
"mod_fastcgi", # <= ici)
Et on ajoute à la fin du fichier la redirection vers le socket du serveur django :
### Django Configuration for Newebe ###
server.document-root = "/home/newebe/newebe"
fastcgi.server = ( "/newebe.fcgi" => ((
"socket" => "/home/newebe/newebe/newebe.sock",
"check-local" => "disable",
)))
Ces premières lignes indiquent où trouver notre serveur django. Les lignes suivantes permettent de monter le dossier media pour accéder facilement aux images.
alias.url = (
"/media" => "/usr/share/pyshared/django/contrib/admin/media/",
)
url.rewrite-once = (
"^(/media.*)$" => "$1",
"^/favicon\.ico$" => "/media/favicon.ico",
"^(/.*)$" => "/newebe.fcgi$1",
)
Il faut démarrer le serveur django afin qu’il renvoie ses informations sur le socket newebe.sock. Pour cela on réalise un script permettant de démarrer le serveur et de fournir les bons droits dessus :
#!/bin/bash
PROJDIR="/home/newebe/newebe/"
PIDFILE="$PROJDIR/newebe.pid"
SOCKET="$PROJDIR/newebe.sock"
cd $PROJDIR
if [ -f $PIDFILE ]; then
kill `cat -- $PIDFILE`
rm -f -- $PIDFILE
fi
exec /usr/bin/env - \
PYTHONPATH="../python:.." \
python manage.py runfcgi socket=$SOCKET pidfile=$PIDFILE
exec chmod 774 newebe.sock
Et on ajoute le user www-data au groupe newebe :
usermod -G newebe www-data
Enfin on démarre le serveur avec un appel au script :
sh start_newebe.sh
On vérifie que le contenu du template apparaît bien maintenant à l’adresse :
http://192.168.1.15/
### Installation Couchdb
On installe le paquet couchdb :
sudo apt-get install couchdb
il faut modifier le fichier /ect/couchdb/local.ini afin de décommenter la ligne suivante (retirer le point virgule de début de ligne) :
;bind_adress = 127.0.0.1
Et remplacer 127.0.0.1 par l’adresse IP de votre Sheeva Plug ou par 0.0.0.0 pour qu’elle soit accessible même si l’IP change ;
bind_adress = 0.0.0.0
On vérifie ensuite que tout a bien fonctionné en se connectant à l’adresse suivante (en remplaçant mon.ip par l’IP de votre Sheeva Plug) :
http://mon.ip:5984/_utils/
### Couchdb et Django.
L’utilitaire d’interface utilisé est couchdbkit. On commence par l’installer :
sudo apt-get install python-couchdbkit
On suit le tutorial indiqué sur le site officiel de couchdbkit.
On met à jour le fichier settings.py en ajoutant :
COUCHDB_DATABASES = (
('newebe.main’, 'http://127.0.0.1:5984/main’),
)
On ajoute la ligne suivante aux applications installés :
'couchdbkit.ext.django’,
On ajoute au modèle de notre application un objet Tweet en étendant la classe Document proposée par couchdbkit. Les champs du modèle sont désormais des propriétés spécifiques à couchdbkit.
import datetime
from django.db import models
from couchdbkit.ext.django.schema import *
class Tweet(Document):
author = StringProperty()
content = StringProperty(required=True)
date = DateTimeProperty(default=datetime.datetime.now())
Dans un fichier forms.py, on génère l’objet formulaire Django correspondant en étendant la classe DocumentForm de couchdbkit :
from couchdbkit.ext.django.forms import DocumentForm
from newebe.main.models import Tweet
class TweetForm(DocumentForm):
class Meta:
document = Tweet
Puis on crée notre vue Django :
from django.views.decorators.csrf import csrf_protect
from django.shortcuts import render_to_response
from django.template import RequestContext
from newebe.main.models import Tweet
from newebe.main.forms import TweetForm
# Home renvoie au format HTML le formulaire de création de Tweet,
# le tweet posté dans le cas d'envoi d'une reqûete post et l'ensemble
# des tweets déjà posté.
@csrf_protect
def home(request):
tweet = None
form = None
# On regarde si la requête est un post de formulaire.
if request.POST:
form = TweetForm(request.POST)
# Si le formulaire est valide,
# l'objet est généré localement.
if form and form.is_valid():
tweet = form.save()
else:
form = TweetForm()
# On récupère la liste des tweets déjà postés en requêtant le
# chemain main/all de la base de données.
tweets = Tweet.view("main/all")
# Renvoie le template home.html en lui fournissant les variables de contexte
# form (le formulaire à afficher), tweet (le tweet posté) et tweets (la liste
# des tweets postés.
return render_to_response("home.html", {
"form": form,
"tweet": tweet,
"tweets": tweets
}, context_instance=RequestContext(request))
Pour que notre base de données fournisse la liste des tweets à travers le chemin main/all, on crée le fichier main/_design/views/all/map.js. C’est un bout de code javascript qui indique quelles données doivent être rappatriés. Ici on fait simple, on récupère toutes les données en vrac et on les affiche :
function(doc) {
if("Tweet" == doc.doc_type) {
emit(null, doc);
}
}
On appelle ensuite la commande de synchronisation de bases de données pour que cette vue couchdb soit enregistrée sur le serveur couchdb :
python manage.py syncdb
Voici le template HTML utilisé (main/templates/home.html) :
<html>
<body>
<form action="/couchdb/" method="post">
{% csrf_token %}
{{ form.as_p }}
<input type="submit" value="Submit" />
</form>
{% if tweet %}
<p>You posted : </p>
<p>{{ tweet.content }}</p>
{% endif %}
{% for tweet in tweets %}
<p>{{ tweet.author }}</p>
<p>{{ tweet.content }}</p>
<p>{{ tweet.date }}</p>
{% endfor %}
</body>
</html>
Et enfin on route le chemion /tweets/ vers notre vue :
(r'^tweets/$', views.home),
On peut vérifier que tout fonctionne bien à l’URL suivante :
http://192.168.1.15/tweets/
Fin !