Skip to content

Installer lighttpd, django et couchdb sur un sheeva plug

Piour edited this page Dec 4, 2010 · 13 revisions

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.

Connexion au 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

Utilitaires

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

Serveur web

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.

Django

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 lapplication 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  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 quil 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 à ladresse :

    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 ladresse IP de votre Sheeva Plug ou par 0.0.0.0 pour quelle soit accessible même si lIP change ;

    bind_adress = 0.0.0.0

On vérifie ensuite que tout a bien fonctionné en se connectant à ladresse suivante (en remplaçant mon.ip par lIP de votre Sheeva Plug) :
    http://mon.ip:5984/_utils/

### Couchdb et Django.

Lutilitaire dinterface utilisé est couchdbkit. On commence par linstaller :

    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 lobjet 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. Cest 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 à lURL suivante :

    http://192.168.1.15/tweets/

Fin !