diff --git a/.gitignore b/.gitignore
index f12190af..ab791b2e 100644
--- a/.gitignore
+++ b/.gitignore
@@ -9,3 +9,8 @@ venv/
/src
media/
*.log
+*.sqlite3
+
+# PyCharm
+.idea
+.cache
diff --git a/README.md b/README.md
index b6017577..01f4ead2 100644
--- a/README.md
+++ b/README.md
@@ -66,119 +66,65 @@ car par défaut Django n'écoute que sur l'adresse locale de la machine virtuell
or vous voudrez accéder à GestioCOF depuis votre machine physique. L'url à
entrer dans le navigateur est `localhost:8000`.
+
#### Serveur de développement type production
-Sur la VM Vagrant, un serveur apache est configuré pour servir GestioCOF de
-façon similaire à la version en production : on utilise
+Juste histoire de jouer, pas indispensable pour développer :
+
+La VM Vagrant héberge en plus un serveur nginx configuré pour servir GestioCOF
+comme en production : on utilise
[Daphne](https://github.com/django/daphne/) et `python manage.py runworker`
-derrière un reverse-proxy apache. Le tout est monitoré par
-[supervisor](http://supervisord.org/).
+derrière un reverse-proxy nginx.
Ce serveur se lance tout seul et est accessible en dehors de la VM à l'url
-`localhost:8080`. Toutefois il ne se recharge pas tout seul lorsque le code
-change, il faut relancer le worker avec `sudo supervisorctl restart worker` pour
-visualiser la dernière version du code.
+`localhost:8080/gestion/`. Toutefois il ne se recharge pas tout seul lorsque le
+code change, il faut relancer le worker avec `sudo systemctl restart
+worker.service` pour visualiser la dernière version du code.
+
### Installation manuelle
-Si vous optez pour une installation manuelle plutôt que d'utiliser Vagrant, il
-est fortement conseillé d'utiliser un environnement virtuel pour Python.
+Vous pouvez opter pour une installation manuelle plutôt que d'utiliser Vagrant,
+il est fortement conseillé d'utiliser un environnement virtuel pour Python.
-Il vous faudra installer pip, les librairies de développement de python, un
-client et un serveur MySQL ainsi qu'un serveur redis ; sous Debian et dérivées
-(Ubuntu, ...) :
+Il vous faudra installer pip, les librairies de développement de python ainsi
+que sqlite3, un moteur de base de données léger et simple d'utilisation. Sous
+Debian et dérivées (Ubuntu, ...) :
- sudo apt-get install python-pip python-dev libmysqlclient-dev redis-server
+ sudo apt-get install python3-pip python3-dev sqlite3
Si vous décidez d'utiliser un environnement virtuel Python (virtualenv;
fortement conseillé), déplacez-vous dans le dossier où est installé GestioCOF
(le dossier où se trouve ce README), et créez-le maintenant :
- virtualenv env -p $(which python3)
+ python3 -m venv venv
-L'option `-p` sert à préciser l'exécutable python à utiliser. Vous devez choisir
-python3, si c'est la version de python par défaut sur votre système, ceci n'est
-pas nécessaire. Pour l'activer, il faut faire
+Pour l'activer, il faut faire
- . env/bin/activate
+ . venv/bin/activate
dans le même dossier.
Vous pouvez maintenant installer les dépendances Python depuis le fichier
`requirements-devel.txt` :
+ pip install -U pip
pip install -r requirements-devel.txt
-Copiez le fichier `cof/settings_dev.py` dans `cof/settings.py`.
+Pour terminer, copier le fichier `cof/settings/secret_example.py` vers
+`cof/settings/secret.py`. Sous Linux ou Mac, préférez plutôt un lien symbolique
+pour profiter de façon transparente des mises à jour du fichier:
-#### Installation avec MySQL
+ ln -s secret_example.py cof/settings/secret.py
-Il faut maintenant installer MySQL. Si vous n'avez pas déjà MySQL installé sur
-votre serveur, il faut l'installer ; sous Debian et dérivées (Ubuntu, ...) :
-
- sudo apt-get install mysql-server
-
-Il vous demandera un mot de passe pour le compte d'administration MySQL,
-notez-le quelque part (ou n'en mettez pas, le serveur n'est accessible que
-localement par défaut). Si vous utilisez une autre distribution, consultez la
-documentation de votre distribution pour savoir comment changer ce mot de passe
-et démarrer le serveur MySQL (c'est automatique sous Ubuntu).
-
-Vous devez alors créer un utilisateur local et une base `cof_gestion`, avec le
-mot de passe de votre choix (remplacez `mot_de_passe`) :
-
- mysql -uroot -e "CREATE DATABASE cof_gestion; GRANT ALL PRIVILEGES ON cof_gestion.* TO 'cof_gestion'@'localhost' IDENTIFIER BY 'mot_de_passe'"
-
-Éditez maintenant le fichier `cof/settings.py` pour y intégrer ces changements ;
-la définition de `DATABASES` doit ressembler à (à nouveau, remplacez
-`mot_de_passe` de façon appropriée) :
-
- DATABASES = {
- 'default': {
- 'ENGINE': 'django.db.backends.mysql',
- 'NAME': 'cof_gestion',
- 'USER': 'cof_gestion',
- 'PASSWORD': 'mot_de_passe',
- }
- }
-
-#### Installation avec SQLite
-
-GestioCOF est installé avec MySQL sur la VM COF, et afin d'avoir un
-environnement de développement aussi proche que possible de ce qui tourne en
-vrai pour éviter les mauvaises surprises, il est conseillé d'utiliser MySQL sur
-votre machine de développement également. Toutefois, GestioCOF devrait
-fonctionner avec d'autres moteurs SQL, et certains préfèrent utiliser SQLite
-pour sa légèreté et facilité d'installation.
-
-Si vous décidez d'utiliser SQLite, il faut l'installer ; sous Debian et dérivées :
-
- sudo apt-get install sqlite3
-
-puis éditer le fichier `cof/settings.py` pour que la définition de `DATABASES`
-ressemble à :
-
- DATABASES = {
- 'default': {
- 'ENGINE': 'django.db.backends.sqlite3',
- 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
- }
- }
#### Fin d'installation
-Il ne vous reste plus qu'à initialiser les modèles de Django avec la commande suivante :
+Il ne vous reste plus qu'à initialiser les modèles de Django et peupler la base
+de donnée avec les données nécessaires au bon fonctionnement de GestioCOF + des
+données bidons bien pratiques pour développer avec la commande suivante :
- python manage.py migrate
-
-Charger les mails indispensables au bon fonctionnement de GestioCOF :
-
- python manage.py syncmails
-
-Une base de donnée pré-remplie est disponible en lançant les commandes :
-
- python manage.py loaddata gestion sites articles
- python manage.py loaddevdata
+ bash provisioning/prepare_django.sh
Vous êtes prêts à développer ! Lancer GestioCOF en faisant
@@ -188,7 +134,7 @@ Vous êtes prêts à développer ! Lancer GestioCOF en faisant
Pour mettre à jour les paquets Python, utiliser la commande suivante :
- pip install --upgrade -r requirements.txt -r requirements-devel.txt
+ pip install --upgrade -r requirements-devel.txt
Pour mettre à jour les modèles après une migration, il faut ensuite faire :
@@ -197,6 +143,6 @@ Pour mettre à jour les modèles après une migration, il faut ensuite faire :
## Documentation utilisateur
-Une brève documentation utilisateur pour se familiariser plus vite avec l'outil
-est accessible sur le
-[wiki](https://git.eleves.ens.fr/cof-geek/gestioCOF/wikis/home).
+Une brève documentation utilisateur est accessible sur le
+[wiki](https://git.eleves.ens.fr/cof-geek/gestioCOF/wikis/home) pour avoir une
+idée de la façon dont le COF utilise GestioCOF.
diff --git a/cof/settings/common.py b/cof/settings/common.py
index ffcb8ee5..ba0b6044 100644
--- a/cof/settings/common.py
+++ b/cof/settings/common.py
@@ -8,26 +8,43 @@ the local development server should be here.
import os
-# Database credentials
try:
- from .secret import DBNAME, DBUSER, DBPASSWD
+ from . import secret
except ImportError:
- # On the local development VM, theses credentials are in the environment
- DBNAME = os.environ["DBNAME"]
- DBUSER = os.environ["DBUSER"]
- DBPASSWD = os.environ["DBPASSWD"]
-except KeyError:
- raise RuntimeError("Secrets missing")
-
-
-# Other secrets
-try:
- from .secret import (
- SECRET_KEY, RECAPTCHA_PUBLIC_KEY, RECAPTCHA_PRIVATE_KEY, ADMINS,
- REDIS_PASSWD, REDIS_DB, REDIS_HOST, REDIS_PORT, KFETOPEN_TOKEN,
+ raise ImportError(
+ "The secret.py file is missing.\n"
+ "For a development environment, simply copy secret_example.py"
)
-except ImportError:
- raise RuntimeError("Secrets missing")
+
+
+def import_secret(name):
+ """
+ Shorthand for importing a value from the secret module and raising an
+ informative exception if a secret is missing.
+ """
+ try:
+ return getattr(secret, name)
+ except AttributeError:
+ raise RuntimeError("Secret missing: {}".format(name))
+
+
+SECRET_KEY = import_secret("SECRET_KEY")
+ADMINS = import_secret("ADMINS")
+SERVER_EMAIL = import_secret("SERVER_EMAIL")
+
+DBNAME = import_secret("DBNAME")
+DBUSER = import_secret("DBUSER")
+DBPASSWD = import_secret("DBPASSWD")
+
+REDIS_PASSWD = import_secret("REDIS_PASSWD")
+REDIS_DB = import_secret("REDIS_DB")
+REDIS_HOST = import_secret("REDIS_HOST")
+REDIS_PORT = import_secret("REDIS_PORT")
+
+RECAPTCHA_PUBLIC_KEY = import_secret("RECAPTCHA_PUBLIC_KEY")
+RECAPTCHA_PRIVATE_KEY = import_secret("RECAPTCHA_PRIVATE_KEY")
+
+KFETOPEN_TOKEN = import_secret("KFETOPEN_TOKEN")
BASE_DIR = os.path.dirname(
@@ -119,7 +136,7 @@ TEMPLATES = [
DATABASES = {
'default': {
- 'ENGINE': 'django.db.backends.mysql',
+ 'ENGINE': 'django.db.backends.postgresql_psycopg2',
'NAME': DBNAME,
'USER': DBUSER,
'PASSWORD': DBPASSWD,
diff --git a/cof/settings/dev.py b/cof/settings/dev.py
index ffd34c7d..9c622063 100644
--- a/cof/settings/dev.py
+++ b/cof/settings/dev.py
@@ -3,9 +3,8 @@ Django development settings for the cof project.
The settings that are not listed here are imported from .common
"""
-import os
-
-from .common import *
+from .common import * # NOQA
+from .common import INSTALLED_APPS, MIDDLEWARE_CLASSES
EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend'
@@ -18,9 +17,9 @@ DEBUG = True
# ---
STATIC_URL = '/static/'
-STATIC_ROOT = '/var/www/static/'
+STATIC_ROOT = '/srv/gestiocof/static/'
-MEDIA_ROOT = os.path.join(BASE_DIR, 'media/')
+MEDIA_ROOT = '/srv/gestiocof/media/'
MEDIA_URL = '/media/'
@@ -28,26 +27,6 @@ MEDIA_URL = '/media/'
# Debug tool bar
# ---
-# "Versions" panel of django-debug-toolbar <=1.8 is not compatible with
-# wagtailmenus.
-# See https://github.com/jazzband/django-debug-toolbar/issues/922
-# TODO: Bug should be fixed in ddt 1.9 (not released yet). When fixed, this
-# declaration may be removed.
-DEBUG_TOOLBAR_PANELS = [
- 'debug_toolbar.panels.timer.TimerPanel',
- 'debug_toolbar.panels.settings.SettingsPanel',
- 'debug_toolbar.panels.headers.HeadersPanel',
- 'debug_toolbar.panels.request.RequestPanel',
- 'debug_toolbar.panels.sql.SQLPanel',
- 'debug_toolbar.panels.staticfiles.StaticFilesPanel',
- 'debug_toolbar.panels.templates.TemplatesPanel',
- 'debug_toolbar.panels.cache.CachePanel',
- 'debug_toolbar.panels.signals.SignalsPanel',
- 'debug_toolbar.panels.logging.LoggingPanel',
- 'debug_toolbar.panels.redirects.RedirectsPanel',
-]
-
-
def show_toolbar(request):
"""
On ne veut pas la vérification de INTERNAL_IPS faite par la debug-toolbar
diff --git a/cof/settings/local.py b/cof/settings/local.py
new file mode 100644
index 00000000..6e1f0802
--- /dev/null
+++ b/cof/settings/local.py
@@ -0,0 +1,36 @@
+"""
+Django local settings for the cof project.
+The settings that are not listed here are imported from .common
+"""
+
+import os
+
+from .dev import * # NOQA
+from .dev import BASE_DIR
+
+
+# Use sqlite for local development
+DATABASES = {
+ "default": {
+ "ENGINE": "django.db.backends.sqlite3",
+ "NAME": os.path.join(BASE_DIR, "db.sqlite3")
+ }
+}
+
+# Use the default cache backend for local development
+CACHES = {
+ "default": {
+ "BACKEND": "django.core.cache.backends.locmem.LocMemCache"
+ }
+}
+
+# Use the default in memory asgi backend for local development
+CHANNEL_LAYERS = {
+ "default": {
+ "BACKEND": "asgiref.inmemory.ChannelLayer",
+ "ROUTING": "cof.routing.routing",
+ }
+}
+
+# No need to run collectstatic -> unset STATIC_ROOT
+STATIC_ROOT = None
diff --git a/cof/settings/prod.py b/cof/settings/prod.py
index 5fae5651..286b5547 100644
--- a/cof/settings/prod.py
+++ b/cof/settings/prod.py
@@ -5,7 +5,8 @@ The settings that are not listed here are imported from .common
import os
-from .common import *
+from .common import * # NOQA
+from .common import BASE_DIR
DEBUG = False
@@ -16,11 +17,13 @@ ALLOWED_HOSTS = [
"dev.cof.ens.fr"
]
-STATIC_ROOT = os.path.join(os.path.dirname(BASE_DIR), "static")
+
+STATIC_ROOT = os.path.join(
+ os.path.dirname(os.path.dirname(BASE_DIR)),
+ "public",
+ "static",
+)
+
STATIC_URL = "/gestion/static/"
MEDIA_ROOT = os.path.join(os.path.dirname(BASE_DIR), "media")
MEDIA_URL = "/gestion/media/"
-
-LDAP_SERVER_URL = "ldaps://ldap.spi.ens.fr:636"
-
-EMAIL_HOST = "nef.ens.fr"
diff --git a/cof/settings/secret_example.py b/cof/settings/secret_example.py
index a1d35b68..e9c0e63c 100644
--- a/cof/settings/secret_example.py
+++ b/cof/settings/secret_example.py
@@ -1,10 +1,20 @@
SECRET_KEY = 'q()(zn4m63i%5cp4)f+ww4-28_w+ly3q9=6imw2ciu&_(5_4ah'
-RECAPTCHA_PUBLIC_KEY = "DUMMY"
-RECAPTCHA_PRIVATE_KEY = "DUMMY"
+ADMINS = None
+SERVER_EMAIL = "root@vagrant"
+
+DBUSER = "cof_gestion"
+DBNAME = "cof_gestion"
+DBPASSWD = "4KZt3nGPLVeWSvtBZPSM3fSzXpzEU4"
+
REDIS_PASSWD = "dummy"
REDIS_PORT = 6379
REDIS_DB = 0
REDIS_HOST = "127.0.0.1"
-ADMINS = None
+
+RECAPTCHA_PUBLIC_KEY = "DUMMY"
+RECAPTCHA_PRIVATE_KEY = "DUMMY"
+
+EMAIL_HOST = None
KFETOPEN_TOKEN = "plop"
+LDAP_SERVER_URL = None
diff --git a/manage.py b/manage.py
index 7f4e79f6..094ec16f 100644
--- a/manage.py
+++ b/manage.py
@@ -3,7 +3,7 @@ import os
import sys
if __name__ == "__main__":
- os.environ.setdefault("DJANGO_SETTINGS_MODULE", "cof.settings")
+ os.environ.setdefault("DJANGO_SETTINGS_MODULE", "cof.settings.local")
from django.core.management import execute_from_command_line
diff --git a/provisioning/apache.conf b/provisioning/apache.conf
deleted file mode 100644
index db5bd602..00000000
--- a/provisioning/apache.conf
+++ /dev/null
@@ -1,39 +0,0 @@
-
- ServerName default
- DocumentRoot /var/www/html
-
- ProxyPreserveHost On
- ProxyRequests Off
- ProxyPass /static/ !
- ProxyPass /media/ !
- # Pour utiliser un sous-dossier (typiquement /gestion/), il faut faire a la
- # place des lignes suivantes:
- #
- # RequestHeader set Daphne-Root-Path /gestion
- # ProxyPass /gestion/ws/ ws://127.0.0.1:8001/ws/
- # ProxyPass /gestion http://127.0.0.1:8001/gestion
- # ProxyPassReverse /gestion http://127.0.0.1:8001/gestion
- #
- # Penser egalement a changer les /static/ et /media/ dans la config apache
- # ainsi que dans les settings django.
- ProxyPass /ws/ ws://127.0.0.1:8001/ws/
- ProxyPass / http://127.0.0.1:8001/
- ProxyPassReverse / http://127.0.0.1:8001/
-
- Alias /media /vagrant/media
- Alias /static /var/www/static
-
- Order deny,allow
- Allow from all
-
-
- Order deny,allow
- Allow from all
-
-
- ErrorLog ${APACHE_LOG_DIR}/error.log
- CustomLog ${APACHE_LOG_DIR}/access.log combined
-
-
-
-# vim: syntax=apache ts=4 sw=4 sts=4 sr noet
diff --git a/provisioning/bootstrap.sh b/provisioning/bootstrap.sh
index e35af45a..69bbcf4c 100644
--- a/provisioning/bootstrap.sh
+++ b/provisioning/bootstrap.sh
@@ -9,75 +9,63 @@ DBPASSWD="4KZt3nGPLVeWSvtBZPSM3fSzXpzEU4"
# Installation de paquets utiles
apt-get update && apt-get upgrade -y
-apt-get install -y python3-pip python3-dev python3-venv libmysqlclient-dev \
- libjpeg-dev git redis-server
+apt-get install -y python3-pip python3-dev python3-venv libpq-dev postgresql \
+ postgresql-contrib libjpeg-dev nginx git redis-server
-# Configuration et installation de mysql. Le mot de passe root est le même que
-# le mot de passe pour l'utilisateur local - pour rappel, ceci est une instance
-# locale de développement.
-echo "mysql-server mysql-server/root_password password $DBPASSWD" | debconf-set-selections
-echo "mysql-server mysql-server/root_password_again password $DBPASSWD" | debconf-set-selections
+# Postgresql
+sudo -u postgres createdb $DBNAME
+sudo -u postgres createuser -SdR $DBUSER
+sudo -u postgres psql -c "ALTER USER $DBUSER WITH PASSWORD '$DBPASSWD';"
+sudo -u postgres psql -c "GRANT ALL PRIVILEGES ON DATABASE $DBNAME TO $DBUSER;"
-apt-get install -y mysql-server
-mysql -uroot -p$DBPASSWD -e "CREATE DATABASE $DBNAME; GRANT ALL PRIVILEGES ON $DBNAME.* TO '$DBUSER'@'localhost' IDENTIFIED BY '$DBPASSWD'"
-mysql -uroot -p$DBPASSWD -e "GRANT ALL PRIVILEGES ON test_$DBNAME.* TO '$DBUSER'@'localhost'"
-
-# Configuration de redis
+# Redis
REDIS_PASSWD="dummy"
redis-cli CONFIG SET requirepass $REDIS_PASSWD
redis-cli -a $REDIS_PASSWD CONFIG REWRITE
-# Installation et configuration d'Apache
-apt-get install -y apache2
-a2enmod proxy proxy_http proxy_wstunnel headers
-cp /vagrant/provisioning/apache.conf /etc/apache2/sites-available/gestiocof.conf
-a2ensite gestiocof
-a2dissite 000-default
-service apache2 restart
-mkdir /var/www/static
-chown -R ubuntu:www-data /var/www/static
+# Contenu statique
+mkdir -p /srv/gestiocof/media
+mkdir -p /srv/gestiocof/static
+chown -R ubuntu:www-data /srv/gestiocof
+
+# Nginx
+ln -s -f /vagrant/provisioning/nginx.conf /etc/nginx/sites-enabled/gestiocof.conf
+rm -f /etc/nginx/sites-enabled/default
+systemctl reload nginx
+
+# Environnement virtuel python
+sudo -H -u ubuntu python3 -m venv ~ubuntu/venv
+sudo -H -u ubuntu ~ubuntu/venv/bin/pip install -U pip
+sudo -H -u ubuntu ~ubuntu/venv/bin/pip install -r /vagrant/requirements-devel.txt
+
+# Préparation de Django
+cd /vagrant
+ln -s -f secret_example.py cof/settings/secret.py
+sudo -H -u ubuntu \
+ DJANGO_SETTINGS_MODULE='cof.settings.dev' \
+ bash -c ". ~/venv/bin/activate && bash provisioning/prepare_django.sh"
+/home/ubuntu/venv/bin/python manage.py collectstatic --noinput --settings cof.settings.dev
+
+# Installation du cron pour les mails de rappels
+sudo -H -u ubuntu crontab provisioning/cron.dev
+
+# Daphne + runworker
+cp /vagrant/provisioning/daphne.service /etc/systemd/system/daphne.service
+cp /vagrant/provisioning/worker.service /etc/systemd/system/worker.service
+systemctl enable daphne.service
+systemctl enable worker.service
+systemctl start daphne.service
+systemctl start worker.service
# Mise en place du .bash_profile pour tout configurer lors du `vagrant ssh`
cat >> ~ubuntu/.bashrc <> /vagrant/rappels.log ; python /vagrant/manage.py sendrappels >> /vagrant/rappels.log 2>&1
-*/5 * * * * python /vagrant/manage.py manage_revente >> /vagrant/reventes.log 2>&1
+19 */12 * * * date >> /vagrant/rappels.log ; /ubuntu/home/venv/bin/python /vagrant/manage.py sendrappels >> /vagrant/rappels.log 2>&1
+*/5 * * * * /ubuntu/home/venv/bin/python /vagrant/manage.py manage_revente >> /vagrant/reventes.log 2>&1
diff --git a/provisioning/cron.md b/provisioning/cron.md
index 840a8716..7aff775b 100644
--- a/provisioning/cron.md
+++ b/provisioning/cron.md
@@ -9,9 +9,9 @@ envoie les mails de rappels des spectacles à venir (sauf s'ils ont déjà été
envoyés).
- Un fois toutes les 12 heures me semble bien.
-- Penser à utiliser le bon executable python (virtualenvs) et les bonnes
- variables d'environnement si besoin.
-- Garde les logs peut être une bonne idée.
+- Penser à utiliser le bon executable python (virtualenvs) et le bon fichier de
+ settings pour Django.
+- Garder les logs peut être une bonne idée.
Exemple : voir le fichier `provisioning/cron.dev`.
diff --git a/provisioning/daphne.service b/provisioning/daphne.service
new file mode 100644
index 00000000..41327ce5
--- /dev/null
+++ b/provisioning/daphne.service
@@ -0,0 +1,16 @@
+Description="GestioCOF"
+After=syslog.target
+After=network.target
+
+[Service]
+Type=simple
+User=ubuntu
+Group=ubuntu
+TimeoutSec=300
+WorkingDirectory=/vagrant
+Environment="DJANGO_SETTINGS_MODULE=cof.settings.dev"
+ExecStart=/home/ubuntu/venv/bin/daphne -u /srv/gestiocof/gestiocof.sock \
+ cof.asgi:channel_layer
+
+[Install]
+WantedBy=multi-user.target
diff --git a/provisioning/nginx.conf b/provisioning/nginx.conf
new file mode 100644
index 00000000..015e1712
--- /dev/null
+++ b/provisioning/nginx.conf
@@ -0,0 +1,56 @@
+upstream gestiocof {
+ # Daphne listens on a unix socket
+ server unix:/srv/gestiocof/gestiocof.sock;
+}
+
+server {
+ listen 80;
+
+ server_name localhost;
+ root /srv/gestiocof/;
+
+ # / → /gestion/
+ # /gestion → /gestion/
+ rewrite ^/$ /gestion/;
+ rewrite ^/gestion$ /gestion/;
+
+ # Static files
+ location /static/ {
+ access_log off;
+ add_header Cache-Control "public";
+ expires 7d;
+ }
+
+ # Uploaded media
+ location /media/ {
+ access_log off;
+ add_header Cache-Control "public";
+ expires 7d;
+ }
+
+ location /gestion/ {
+ # A copy-paste of what we have in production
+ proxy_set_header Host $http_host;
+ proxy_set_header X-Real-IP $remote_addr;
+ proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+ proxy_set_header X-Forwarded-Proto $scheme;
+ proxy_set_header X-SSL-Client-Serial $ssl_client_serial;
+ proxy_set_header X-SSL-Client-Verify $ssl_client_verify;
+ proxy_set_header X-SSL-Client-S-DN $ssl_client_s_dn;
+ proxy_set_header Daphne-Root-Path /gestion;
+
+ location /gestion/ws/ {
+ # See http://nginx.org/en/docs/http/websocket.html
+ proxy_buffering off;
+ proxy_http_version 1.1;
+ proxy_set_header Upgrade $http_upgrade;
+ proxy_set_header Connection "upgrade";
+
+ proxy_pass http://gestiocof/ws/;
+ }
+
+ location /gestion/ {
+ proxy_pass http://gestiocof;
+ }
+ }
+}
diff --git a/provisioning/prepare_django.sh b/provisioning/prepare_django.sh
index 4ec1a70f..1818a0cd 100644
--- a/provisioning/prepare_django.sh
+++ b/provisioning/prepare_django.sh
@@ -1,9 +1,6 @@
#!/bin/bash
-# Doit être lancé par bootstrap.sh
-source ~/venv/bin/activate
python manage.py migrate
python manage.py loaddata gestion sites articles
python manage.py loaddevdata
python manage.py syncmails
-python manage.py collectstatic --noinput
diff --git a/provisioning/supervisor.conf b/provisioning/supervisor.conf
deleted file mode 100644
index 5fe3c22b..00000000
--- a/provisioning/supervisor.conf
+++ /dev/null
@@ -1,20 +0,0 @@
-[program:worker]
-command=/home/ubuntu/venv/bin/python /vagrant/manage.py runworker
-directory=/vagrant/
-user=ubuntu
-environment=DBUSER={DBUSER},DBNAME={DBNAME},DBPASSWD={DBPASSWD},DJANGO_SETTINGS_MODULE="cof.settings.dev"
-autostart=true
-autorestart=true
-redirect_stderr=true
-stopasgroup=true
-redirect_stderr=true
-
-[program:interface]
-command=/home/ubuntu/venv/bin/daphne -b 127.0.0.1 -p 8001 cof.asgi:channel_layer
-environment=DBUSER={DBUSER},DBNAME={DBNAME},DBPASSWD={DBPASSWD},DJANGO_SETTINGS_MODULE="cof.settings.dev"
-directory=/vagrant/
-redirect_stderr=true
-autostart=true
-autorestart=true
-stopasgroup=true
-user=ubuntu
diff --git a/provisioning/worker.service b/provisioning/worker.service
new file mode 100644
index 00000000..42836cfe
--- /dev/null
+++ b/provisioning/worker.service
@@ -0,0 +1,16 @@
+[Unit]
+Description="GestioCOF"
+After=syslog.target
+After=network.target
+
+[Service]
+Type=simple
+User=ubuntu
+Group=ubuntu
+TimeoutSec=300
+WorkingDirectory=/vagrant
+Environment="DJANGO_SETTINGS_MODULE=cof.settings.dev"
+ExecStart=/home/ubuntu/venv/bin/python manage.py runworker
+
+[Install]
+WantedBy=multi-user.target
diff --git a/requirements-devel.txt b/requirements-devel.txt
index 83053f76..de272491 100644
--- a/requirements-devel.txt
+++ b/requirements-devel.txt
@@ -1,4 +1,4 @@
-r requirements.txt
-django-debug-toolbar
+-e git://github.com/jazzband/django-debug-toolbar.git@88ddc7bdf39c7ff660eac054eab225ac22926754#egg=django-debug-toolbar
django-debug-panel
ipython
diff --git a/requirements.txt b/requirements.txt
index 1da8c361..f3964212 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -7,7 +7,7 @@ django-djconfig==0.5.3
django-grappelli==2.8.1
django-recaptcha==1.0.5
django-redis-cache==1.7.1
-mysqlclient==1.3.7
+psycopg2
Pillow==3.3.0
six==1.10.0
unicodecsv==0.14.1
@@ -25,3 +25,6 @@ channels==1.1.5
python-dateutil
wagtail==1.10.*
wagtailmenus==2.2.*
+
+# Production tools
+wheel