# Repo pour le projet nouvelles ecritures The END

## contenu du projet

### virtualenv

Ce répertoire contient toutes les ressources python utilisées pour construire les environements virtuels ([virtualenv](http://www.virtualenv.org)).
Il y à la fois les distributions des librairies utilisées, ainsi que des scripts de création des environements virtuels.

### sbin

Contient les scripts de synchronisation et de publication. Ces script sont des script [Fabric](http://fabfile.org).

### web

Contient le contenu effectif à publier sur le serveur web.
Il est divisé en 2 partie:
  - un répertoire "static", contenant les fichiers statiques du site.
  - un répertoire "theend" contenant la partie dynamique du site.

Le répertoire statique doit être servi par un serveur web classique (apache, nginx,...). Le répertoire dynamique doit être servi par un serveur applicatif python.

Nous recommandont l'utilisation de serveur applicatif supportant WSGI, comme [uWSGI](http://projects.unbit.it/uwsgi/).


## Procédure de déploiement:

Le processus de déploiement se base sur la notion de version/tag.

1- creation et activation du virtualenv ce synchronisation
    
    cd virtualenv/sync
    python create_python_env.py
    python project-boot.py <path to venv>
    source <path to venv>/bin/activate

2- Creation de l'environement virtuel sur le serveur distant

    cd sbin/sync
    cp config.py.tmpl config.py
    vi config.py
    fab create_virtualenv:<Version>

3- Synchronisation des fichiers statiques et dynamiques sur le serveur distant
    cd sbin/sync
    fab sync_web:<Version>

Cette commande va créer un fichier de configuration minimal sur le serveur web à partir des informations renseignées dans le fichier config.py de l'étape précédente.

4- Sur le serveur distant:
* édition du fichier de configuration `<remote_src_path>/theend/config.py`.
* configuration du serveur web
* du process uwsgi et de leur communication.

Il est recommandé d'avoir un outil de monitoring pour surveiller l'instance uwsgi. [supervisor](http://supervisord.org/) est un bon candidat pour ce role.
Voici un exemple de fichier de configuration `supervisor`:

    [program:theend]
    command=<path to virtualenv>/bin/uwsgi --yaml /etc/uwsgi/theend.yml
    directory=<path to src folder>
    user=www-data
    autostart=true
    autorestart=true
    redirect_stderr=true
    stopsignal=QUIT


et voici le fichier de configuration uwsgi:

    uwsgi:
      master: 1
      socket: /var/run/uwsgi/theend.sock
      virtualenv: <path to virtualenv>
      processes: 5
      logto: /var/log/uwsgi/theend.log
      chdir: <path to src folder>/theend
      module: django_wsgi
      pythonpath: <path to src folder>

On peut remarquer ici qu'on utilise les socket unix pour faire communiquer le serveur web et le serveur uwsgi.

## Procédure de mise à jour

La mise à jour du site se fait ensuite par la commande `sync_web` du script de synchronisation pour des changement dans la partie web et `create_virtualenv` pour les changements de resource python.

À noter que la commande `update_lib` permet de mettre à jour les packages python individuellement:

    fab update_lib:<version>,<package>
où package est l'un des intitulés de package contenus dans le fichier `virtualenv/web/res/res_create_env.py`.
