***********
Déploiement
***********

La documentation de déploiement suivante est sur la base d'une Debian 7.0 (Wheezy).


Options de déploiement
======================

De nombreuses options de déploiement existent. Les plus populaires sont décrite sur le site Django à l'adresse suivante : https://docs.djangoproject.com/en/1.5/howto/deployment/.

Nous décrivons ici l'installation de l'option apache + modwsgi : https://docs.djangoproject.com/en/1.5/howto/deployment/wsgi/modwsgi/


Installation des prérequis
==========================

Liste des prérequis
- python 2.7
- apache
- modwsgi
- postgresql
- elasticsearch
- build tools
- sesame

Le reste des dépendances est fourni dans les sources.
Toute les commandes ci dessous doivent se faire entant que ``root``, typiquement en préfixant toute les commandes avec ``sudo``.


Python 2.7
----------

C'est la version par défaut de la distribution debian 7. Si python n'est pas déjà installé::

    apt-get install python
    
Dans tous les cas, il faut installer les outils de développement python::

    apt-get install python-dev


Apache et mod-wsgi
------------------

On utilise les versions distribuées avec la debian 7.
::

    apt-get install apache2
    apt-get install libapache2-mod-wsgi


Postgresql
----------

La aussi nous utilisons la version distribuée avec la debian 7, c'est à dire la 9.1.
::

    apt-get install postgresql
    apt-get install postgresql-server-dev-9.1


Elasticsearch
-------------

Elasticsearh a Java pour prérequis. Cette étape n'est pas décrite ici.
Télécharger le paquet debian (deb) à l'adresse suivante : https://download.elasticsearch.org/elasticsearch/elasticsearch/elasticsearch-0.90.5.deb .
::

    dpkg -i elasticsearch-0.90.5.deb


Build tools
----------- 

La création de l'environnement virtuel nécessite l'installation des outils de base de compilation. ::

    apt-get install build-essential

Sesame
------

L'application "BO Plan4Learning" nécessite la présence d'un serveur Sesame comprenant l'ensemble des référentiels et thésaurus de l'application.

L'installation d'un tel serveur est hors du scope de cette documentation.

Une partie de l'application accède au serveur Sesame directement en javascript depuis le navigateur de l'utilisateur.
Si le serveur Sesame est sur un autre domaine que l'application Back-Office (même si seulement le numéro de port change), 
il est nécessaire qu'il supporte les en-têtes CORS (cf. http://en.wikipedia.org/wiki/Cross-origin_resource_sharing) en autorisant le domaine de l'application Back-Office. 



Etapes de déploiement
=====================

L'ensemble des commandes suivantes ne nécessite pas d'être exécutées comme utilisateur privilégié.

Organisation des sources / commandes Django
-------------------------------------------

Les fichiers du projet peuvent être organisés en 4 groupes correspondant à des sous-répertoires 
  - ``src`` : contient l'ensemble du code, template et ressources statiques
  - ``virtualenv`` : script de création de l'environnement virtuel et dépendances python
  - ``web`` : répertoire de publication des ressources statiques 
  - ``run`` : répertoire contenant les logs de l'application

Django fournit un utilitaire en ligne de commande permettant l'exécution de tâche d'administration. La documentation se trouve à l'adresse suivante : https://docs.djangoproject.com/en/1.5/ref/django-admin/ .

Les ressources statiques sont tous les fichiers additionnels qui constituent un site web : images, javascript, css,... .


.. _deployment-virtualenv:

Virtualenv
----------

L'environnement d'exécution python est isolé de l'environnement du système par l'utilisation d'un environnement virtuel ou ``virtualenv``.
Une documentation d'utilisation se trouve à l'adresse suivante : http://www.virtualenv.org/en/latest/ .
Il faut en particulier noter la procédure d'activation de l'environnement virtuel. Dans la suite, les commandes d'administration django devront être lancées après cette activation. 

Un script permettant la création de l'environnement virtuel et de l'installation de toutes les dépendances "python" est fourni dans le répertoire ``virtualenv``.

.. code-block :: sh

    cd virtualenv/web/
    python create_python_env.py
    python project-boot.py <chemin de l'environnement virtuel>


Au cours de l'exploitation du serveur et en particulier lors des mise à jour du système d'exploitation, il faut être attentif aux mise à jour de la distribution python ayant servie à la création de l'environnement virtuel.
Si la version de python est mise à jour, l'environnement virtuel devra lui aussi être mis à jour.

Configuration
-------------

La configuration du système se fait dans le fichier ``src/p4l/config.py``. Ce fichier doit être créé à partir du fichier ``src/config.py.tmpl``.
La plupart des configurations sont soit documentées directement dans le fichier, soit documentés à l'adresse suivante : https://docs.djangoproject.com/en/1.5/ref/settings/)

Il existe un autre fichier de configuration : ``src/p4l/settings.py``. C'est en fait le fichier "normal" de configuration de Django (cf. https://docs.djangoproject.com/en/1.5/topics/settings/) .
Techniquement, les propriétés de ``config.py`` viennent redéfinir une partie de celles de ``settings.py``. Néanmoins lors d'un déploiement, seule le fichier ``config.py`` doit être modifié.


Création de la base
-------------------

La base est crée en plusieurs étapes. D'abord il faut créer la base de donnée vide. On pourra par exemple utiliser la commande suivante.

.. code-block :: postgresql

    CREATE DATABASE p4l
      WITH ENCODING='UTF8'
           OWNER=<db user>
           TEMPLATE=template0
           LC_COLLATE='en_US.UTF-8'
           LC_CTYPE='en_US.UTF-8'
           CONNECTION LIMIT=-1;

Tout autre méthode est correcte. Attention cependant d'utiliser un encoding "utf-8". 

Le schéma de la base est créé avec la commande Django suivante (penser à préalablement activer l'environnement virtuel)::

    python manage.py syncdb --migrate

Note: Cette commade doit être aussi lancée après toute installation d'une nouvelle version de l'application ou bien de ces dépendances (virtualenv).

Enfin on crée un "super" utilisateur pouvant accéder à l'administration du site.:: 

    python manage.py createsuperuser


Déploiement des ressources statiques
------------------------------------

Le déploiement des ressources statiques du site se fait à l'aide de la commande suivante:
::

    python manage.py collecststatic

Note: Cette commade doit être aussi lancée après toute installation d'une nouvelle version de l'application ou bien de ces dépendances (virtualenv).

Configuration web
-----------------

La configuration web (apache) est documentée à l'adresse suivante : https://docs.djangoproject.com/en/1.5/howto/deployment/wsgi/modwsgi/ .
Comme cette configuration dépend de l'environnement propre au serveur, nous n'en détaillerons pas les étapes. 

Cependant, voici une liste des points notables:

- Bien faire la séparation entre la partie dynamique servie par modwsgi, et la partie statique servie par apache.
- le système utilise un environnement virtuel. Pensez bien à renseigner le chemin du répertoire ``site-packages`` dans la directive ``WSGIPythonPath``
- L'utilisation de ``mod_wsgi`` en mode démon (``daemon mode``) est fortement recommandée.
  
