forked from DGNum/gestioCOF
Merge branch 'master' into test/views_kfet
This commit is contained in:
commit
343b52f986
19 changed files with 274 additions and 261 deletions
5
.gitignore
vendored
5
.gitignore
vendored
|
@ -9,3 +9,8 @@ venv/
|
||||||
/src
|
/src
|
||||||
media/
|
media/
|
||||||
*.log
|
*.log
|
||||||
|
*.sqlite3
|
||||||
|
|
||||||
|
# PyCharm
|
||||||
|
.idea
|
||||||
|
.cache
|
||||||
|
|
118
README.md
118
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 à
|
or vous voudrez accéder à GestioCOF depuis votre machine physique. L'url à
|
||||||
entrer dans le navigateur est `localhost:8000`.
|
entrer dans le navigateur est `localhost:8000`.
|
||||||
|
|
||||||
|
|
||||||
#### Serveur de développement type production
|
#### Serveur de développement type production
|
||||||
|
|
||||||
Sur la VM Vagrant, un serveur apache est configuré pour servir GestioCOF de
|
Juste histoire de jouer, pas indispensable pour développer :
|
||||||
façon similaire à la version en production : on utilise
|
|
||||||
|
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`
|
[Daphne](https://github.com/django/daphne/) et `python manage.py runworker`
|
||||||
derrière un reverse-proxy apache. Le tout est monitoré par
|
derrière un reverse-proxy nginx.
|
||||||
[supervisor](http://supervisord.org/).
|
|
||||||
|
|
||||||
Ce serveur se lance tout seul et est accessible en dehors de la VM à l'url
|
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
|
`localhost:8080/gestion/`. Toutefois il ne se recharge pas tout seul lorsque le
|
||||||
change, il faut relancer le worker avec `sudo supervisorctl restart worker` pour
|
code change, il faut relancer le worker avec `sudo systemctl restart
|
||||||
visualiser la dernière version du code.
|
worker.service` pour visualiser la dernière version du code.
|
||||||
|
|
||||||
|
|
||||||
### Installation manuelle
|
### Installation manuelle
|
||||||
|
|
||||||
Si vous optez pour une installation manuelle plutôt que d'utiliser Vagrant, il
|
Vous pouvez opter pour une installation manuelle plutôt que d'utiliser Vagrant,
|
||||||
est fortement conseillé d'utiliser un environnement virtuel pour Python.
|
il est fortement conseillé d'utiliser un environnement virtuel pour Python.
|
||||||
|
|
||||||
Il vous faudra installer pip, les librairies de développement de python, un
|
Il vous faudra installer pip, les librairies de développement de python ainsi
|
||||||
client et un serveur MySQL ainsi qu'un serveur redis ; sous Debian et dérivées
|
que sqlite3, un moteur de base de données léger et simple d'utilisation. Sous
|
||||||
(Ubuntu, ...) :
|
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;
|
Si vous décidez d'utiliser un environnement virtuel Python (virtualenv;
|
||||||
fortement conseillé), déplacez-vous dans le dossier où est installé GestioCOF
|
fortement conseillé), déplacez-vous dans le dossier où est installé GestioCOF
|
||||||
(le dossier où se trouve ce README), et créez-le maintenant :
|
(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
|
Pour l'activer, il faut faire
|
||||||
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
|
|
||||||
|
|
||||||
. env/bin/activate
|
. venv/bin/activate
|
||||||
|
|
||||||
dans le même dossier.
|
dans le même dossier.
|
||||||
|
|
||||||
Vous pouvez maintenant installer les dépendances Python depuis le fichier
|
Vous pouvez maintenant installer les dépendances Python depuis le fichier
|
||||||
`requirements-devel.txt` :
|
`requirements-devel.txt` :
|
||||||
|
|
||||||
|
pip install -U pip
|
||||||
pip install -r requirements-devel.txt
|
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
|
#### 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
|
bash provisioning/prepare_django.sh
|
||||||
|
|
||||||
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
|
|
||||||
|
|
||||||
Vous êtes prêts à développer ! Lancer GestioCOF en faisant
|
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 :
|
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 :
|
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
|
## Documentation utilisateur
|
||||||
|
|
||||||
Une brève documentation utilisateur pour se familiariser plus vite avec l'outil
|
Une brève documentation utilisateur est accessible sur le
|
||||||
est accessible sur le
|
[wiki](https://git.eleves.ens.fr/cof-geek/gestioCOF/wikis/home) pour avoir une
|
||||||
[wiki](https://git.eleves.ens.fr/cof-geek/gestioCOF/wikis/home).
|
idée de la façon dont le COF utilise GestioCOF.
|
||||||
|
|
|
@ -8,26 +8,43 @@ the local development server should be here.
|
||||||
|
|
||||||
import os
|
import os
|
||||||
|
|
||||||
# Database credentials
|
|
||||||
try:
|
try:
|
||||||
from .secret import DBNAME, DBUSER, DBPASSWD
|
from . import secret
|
||||||
except ImportError:
|
except ImportError:
|
||||||
# On the local development VM, theses credentials are in the environment
|
raise ImportError(
|
||||||
DBNAME = os.environ["DBNAME"]
|
"The secret.py file is missing.\n"
|
||||||
DBUSER = os.environ["DBUSER"]
|
"For a development environment, simply copy secret_example.py"
|
||||||
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,
|
|
||||||
)
|
)
|
||||||
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(
|
BASE_DIR = os.path.dirname(
|
||||||
|
@ -119,7 +136,7 @@ TEMPLATES = [
|
||||||
|
|
||||||
DATABASES = {
|
DATABASES = {
|
||||||
'default': {
|
'default': {
|
||||||
'ENGINE': 'django.db.backends.mysql',
|
'ENGINE': 'django.db.backends.postgresql_psycopg2',
|
||||||
'NAME': DBNAME,
|
'NAME': DBNAME,
|
||||||
'USER': DBUSER,
|
'USER': DBUSER,
|
||||||
'PASSWORD': DBPASSWD,
|
'PASSWORD': DBPASSWD,
|
||||||
|
|
|
@ -3,9 +3,8 @@ Django development settings for the cof project.
|
||||||
The settings that are not listed here are imported from .common
|
The settings that are not listed here are imported from .common
|
||||||
"""
|
"""
|
||||||
|
|
||||||
import os
|
from .common import * # NOQA
|
||||||
|
from .common import INSTALLED_APPS, MIDDLEWARE_CLASSES
|
||||||
from .common import *
|
|
||||||
|
|
||||||
|
|
||||||
EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend'
|
EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend'
|
||||||
|
@ -18,9 +17,9 @@ DEBUG = True
|
||||||
# ---
|
# ---
|
||||||
|
|
||||||
STATIC_URL = '/static/'
|
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/'
|
MEDIA_URL = '/media/'
|
||||||
|
|
||||||
|
|
||||||
|
@ -28,26 +27,6 @@ MEDIA_URL = '/media/'
|
||||||
# Debug tool bar
|
# 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):
|
def show_toolbar(request):
|
||||||
"""
|
"""
|
||||||
On ne veut pas la vérification de INTERNAL_IPS faite par la debug-toolbar
|
On ne veut pas la vérification de INTERNAL_IPS faite par la debug-toolbar
|
||||||
|
|
36
cof/settings/local.py
Normal file
36
cof/settings/local.py
Normal file
|
@ -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
|
|
@ -5,7 +5,8 @@ The settings that are not listed here are imported from .common
|
||||||
|
|
||||||
import os
|
import os
|
||||||
|
|
||||||
from .common import *
|
from .common import * # NOQA
|
||||||
|
from .common import BASE_DIR
|
||||||
|
|
||||||
|
|
||||||
DEBUG = False
|
DEBUG = False
|
||||||
|
@ -16,11 +17,13 @@ ALLOWED_HOSTS = [
|
||||||
"dev.cof.ens.fr"
|
"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/"
|
STATIC_URL = "/gestion/static/"
|
||||||
MEDIA_ROOT = os.path.join(os.path.dirname(BASE_DIR), "media")
|
MEDIA_ROOT = os.path.join(os.path.dirname(BASE_DIR), "media")
|
||||||
MEDIA_URL = "/gestion/media/"
|
MEDIA_URL = "/gestion/media/"
|
||||||
|
|
||||||
LDAP_SERVER_URL = "ldaps://ldap.spi.ens.fr:636"
|
|
||||||
|
|
||||||
EMAIL_HOST = "nef.ens.fr"
|
|
||||||
|
|
|
@ -1,10 +1,20 @@
|
||||||
SECRET_KEY = 'q()(zn4m63i%5cp4)f+ww4-28_w+ly3q9=6imw2ciu&_(5_4ah'
|
SECRET_KEY = 'q()(zn4m63i%5cp4)f+ww4-28_w+ly3q9=6imw2ciu&_(5_4ah'
|
||||||
RECAPTCHA_PUBLIC_KEY = "DUMMY"
|
ADMINS = None
|
||||||
RECAPTCHA_PRIVATE_KEY = "DUMMY"
|
SERVER_EMAIL = "root@vagrant"
|
||||||
|
|
||||||
|
DBUSER = "cof_gestion"
|
||||||
|
DBNAME = "cof_gestion"
|
||||||
|
DBPASSWD = "4KZt3nGPLVeWSvtBZPSM3fSzXpzEU4"
|
||||||
|
|
||||||
REDIS_PASSWD = "dummy"
|
REDIS_PASSWD = "dummy"
|
||||||
REDIS_PORT = 6379
|
REDIS_PORT = 6379
|
||||||
REDIS_DB = 0
|
REDIS_DB = 0
|
||||||
REDIS_HOST = "127.0.0.1"
|
REDIS_HOST = "127.0.0.1"
|
||||||
ADMINS = None
|
|
||||||
|
RECAPTCHA_PUBLIC_KEY = "DUMMY"
|
||||||
|
RECAPTCHA_PRIVATE_KEY = "DUMMY"
|
||||||
|
|
||||||
|
EMAIL_HOST = None
|
||||||
|
|
||||||
KFETOPEN_TOKEN = "plop"
|
KFETOPEN_TOKEN = "plop"
|
||||||
|
LDAP_SERVER_URL = None
|
||||||
|
|
|
@ -3,7 +3,7 @@ import os
|
||||||
import sys
|
import sys
|
||||||
|
|
||||||
if __name__ == "__main__":
|
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
|
from django.core.management import execute_from_command_line
|
||||||
|
|
||||||
|
|
|
@ -1,39 +0,0 @@
|
||||||
<VirtualHost *:80>
|
|
||||||
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
|
|
||||||
<Directory /vagrant/media>
|
|
||||||
Order deny,allow
|
|
||||||
Allow from all
|
|
||||||
</Directory>
|
|
||||||
<Directory /var/www/static>
|
|
||||||
Order deny,allow
|
|
||||||
Allow from all
|
|
||||||
</Directory>
|
|
||||||
|
|
||||||
ErrorLog ${APACHE_LOG_DIR}/error.log
|
|
||||||
CustomLog ${APACHE_LOG_DIR}/access.log combined
|
|
||||||
|
|
||||||
</VirtualHost>
|
|
||||||
|
|
||||||
# vim: syntax=apache ts=4 sw=4 sts=4 sr noet
|
|
|
@ -9,75 +9,63 @@ DBPASSWD="4KZt3nGPLVeWSvtBZPSM3fSzXpzEU4"
|
||||||
|
|
||||||
# Installation de paquets utiles
|
# Installation de paquets utiles
|
||||||
apt-get update && apt-get upgrade -y
|
apt-get update && apt-get upgrade -y
|
||||||
apt-get install -y python3-pip python3-dev python3-venv libmysqlclient-dev \
|
apt-get install -y python3-pip python3-dev python3-venv libpq-dev postgresql \
|
||||||
libjpeg-dev git redis-server
|
postgresql-contrib libjpeg-dev nginx git redis-server
|
||||||
|
|
||||||
# Configuration et installation de mysql. Le mot de passe root est le même que
|
# Postgresql
|
||||||
# le mot de passe pour l'utilisateur local - pour rappel, ceci est une instance
|
sudo -u postgres createdb $DBNAME
|
||||||
# locale de développement.
|
sudo -u postgres createuser -SdR $DBUSER
|
||||||
echo "mysql-server mysql-server/root_password password $DBPASSWD" | debconf-set-selections
|
sudo -u postgres psql -c "ALTER USER $DBUSER WITH PASSWORD '$DBPASSWD';"
|
||||||
echo "mysql-server mysql-server/root_password_again password $DBPASSWD" | debconf-set-selections
|
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'"
|
# Redis
|
||||||
mysql -uroot -p$DBPASSWD -e "GRANT ALL PRIVILEGES ON test_$DBNAME.* TO '$DBUSER'@'localhost'"
|
|
||||||
|
|
||||||
# Configuration de redis
|
|
||||||
REDIS_PASSWD="dummy"
|
REDIS_PASSWD="dummy"
|
||||||
redis-cli CONFIG SET requirepass $REDIS_PASSWD
|
redis-cli CONFIG SET requirepass $REDIS_PASSWD
|
||||||
redis-cli -a $REDIS_PASSWD CONFIG REWRITE
|
redis-cli -a $REDIS_PASSWD CONFIG REWRITE
|
||||||
|
|
||||||
# Installation et configuration d'Apache
|
# Contenu statique
|
||||||
apt-get install -y apache2
|
mkdir -p /srv/gestiocof/media
|
||||||
a2enmod proxy proxy_http proxy_wstunnel headers
|
mkdir -p /srv/gestiocof/static
|
||||||
cp /vagrant/provisioning/apache.conf /etc/apache2/sites-available/gestiocof.conf
|
chown -R ubuntu:www-data /srv/gestiocof
|
||||||
a2ensite gestiocof
|
|
||||||
a2dissite 000-default
|
# Nginx
|
||||||
service apache2 restart
|
ln -s -f /vagrant/provisioning/nginx.conf /etc/nginx/sites-enabled/gestiocof.conf
|
||||||
mkdir /var/www/static
|
rm -f /etc/nginx/sites-enabled/default
|
||||||
chown -R ubuntu:www-data /var/www/static
|
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`
|
# Mise en place du .bash_profile pour tout configurer lors du `vagrant ssh`
|
||||||
cat >> ~ubuntu/.bashrc <<EOF
|
cat >> ~ubuntu/.bashrc <<EOF
|
||||||
# On utilise la version de développement de GestioCOF
|
# On utilise la version de développement de GestioCOF
|
||||||
export DJANGO_SETTINGS_MODULE='cof.settings.dev'
|
export DJANGO_SETTINGS_MODULE='cof.settings.dev'
|
||||||
|
|
||||||
# Identifiants MySQL
|
|
||||||
export DBUSER="$DBUSER"
|
|
||||||
export DBNAME="$DBNAME"
|
|
||||||
export DBPASSWD="$DBPASSWD"
|
|
||||||
|
|
||||||
# Permet d'utiliser les utilitaires pythons locaux
|
|
||||||
export PATH="\$PATH:\$HOME/.local/bin"
|
|
||||||
|
|
||||||
# Charge le virtualenv
|
# Charge le virtualenv
|
||||||
source ~/venv/bin/activate
|
source ~/venv/bin/activate
|
||||||
|
|
||||||
# On va dans /vagrant où se trouve le code de gestioCOF
|
# On va dans /vagrant où se trouve le code de gestioCOF
|
||||||
cd /vagrant
|
cd /vagrant
|
||||||
EOF
|
EOF
|
||||||
|
|
||||||
# On va dans /vagrant où se trouve gestioCOF
|
|
||||||
cd /vagrant
|
|
||||||
|
|
||||||
# Installation du virtualenv, on utilise désormais python3
|
|
||||||
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 requirements.txt -r requirements-devel.txt
|
|
||||||
|
|
||||||
# Préparation de Django
|
|
||||||
if [ ! -f cof/settings/secret.py ]; then sudo -H -u ubuntu ln -s secret_example.py cof/settings/secret.py; fi
|
|
||||||
sudo -H -u ubuntu DJANGO_SETTINGS_MODULE='cof.settings.dev' DBUSER=$DBUSER DBNAME=$DBNAME DBPASSWD=$DBPASSWD bash provisioning/prepare_django.sh
|
|
||||||
|
|
||||||
# Installation du cron pour les mails de rappels
|
|
||||||
sudo -H -u ubuntu crontab provisioning/cron.dev
|
|
||||||
|
|
||||||
# On installe Daphne et on demande à supervisor de le lancer
|
|
||||||
sudo -H -u ubuntu ~ubuntu/venv/bin/pip install daphne
|
|
||||||
apt-get install -y supervisor
|
|
||||||
cp /vagrant/provisioning/supervisor.conf /etc/supervisor/conf.d/gestiocof.conf
|
|
||||||
sed "s/{DBUSER}/$DBUSER/" -i /etc/supervisor/conf.d/gestiocof.conf
|
|
||||||
sed "s/{DBNAME}/$DBNAME/" -i /etc/supervisor/conf.d/gestiocof.conf
|
|
||||||
sed "s/{DBPASSWD}/$DBPASSWD/" -i /etc/supervisor/conf.d/gestiocof.conf
|
|
||||||
service supervisor restart
|
|
||||||
|
|
|
@ -6,5 +6,5 @@ DBUSER="cof_gestion"
|
||||||
DBNAME="cof_gestion"
|
DBNAME="cof_gestion"
|
||||||
DBPASSWD="4KZt3nGPLVeWSvtBZPSM3fSzXpzEU4"
|
DBPASSWD="4KZt3nGPLVeWSvtBZPSM3fSzXpzEU4"
|
||||||
|
|
||||||
19 */12 * * * date >> /vagrant/rappels.log ; python /vagrant/manage.py sendrappels >> /vagrant/rappels.log 2>&1
|
19 */12 * * * date >> /vagrant/rappels.log ; /ubuntu/home/venv/bin/python /vagrant/manage.py sendrappels >> /vagrant/rappels.log 2>&1
|
||||||
*/5 * * * * python /vagrant/manage.py manage_revente >> /vagrant/reventes.log 2>&1
|
*/5 * * * * /ubuntu/home/venv/bin/python /vagrant/manage.py manage_revente >> /vagrant/reventes.log 2>&1
|
||||||
|
|
|
@ -9,9 +9,9 @@ envoie les mails de rappels des spectacles à venir (sauf s'ils ont déjà été
|
||||||
envoyés).
|
envoyés).
|
||||||
|
|
||||||
- Un fois toutes les 12 heures me semble bien.
|
- Un fois toutes les 12 heures me semble bien.
|
||||||
- Penser à utiliser le bon executable python (virtualenvs) et les bonnes
|
- Penser à utiliser le bon executable python (virtualenvs) et le bon fichier de
|
||||||
variables d'environnement si besoin.
|
settings pour Django.
|
||||||
- Garde les logs peut être une bonne idée.
|
- Garder les logs peut être une bonne idée.
|
||||||
|
|
||||||
Exemple : voir le fichier `provisioning/cron.dev`.
|
Exemple : voir le fichier `provisioning/cron.dev`.
|
||||||
|
|
||||||
|
|
16
provisioning/daphne.service
Normal file
16
provisioning/daphne.service
Normal file
|
@ -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
|
56
provisioning/nginx.conf
Normal file
56
provisioning/nginx.conf
Normal file
|
@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,9 +1,6 @@
|
||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
# Doit être lancé par bootstrap.sh
|
|
||||||
|
|
||||||
source ~/venv/bin/activate
|
|
||||||
python manage.py migrate
|
python manage.py migrate
|
||||||
python manage.py loaddata gestion sites articles
|
python manage.py loaddata gestion sites articles
|
||||||
python manage.py loaddevdata
|
python manage.py loaddevdata
|
||||||
python manage.py syncmails
|
python manage.py syncmails
|
||||||
python manage.py collectstatic --noinput
|
|
||||||
|
|
|
@ -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
|
|
16
provisioning/worker.service
Normal file
16
provisioning/worker.service
Normal file
|
@ -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
|
|
@ -1,4 +1,4 @@
|
||||||
-r requirements.txt
|
-r requirements.txt
|
||||||
django-debug-toolbar
|
-e git://github.com/jazzband/django-debug-toolbar.git@88ddc7bdf39c7ff660eac054eab225ac22926754#egg=django-debug-toolbar
|
||||||
django-debug-panel
|
django-debug-panel
|
||||||
ipython
|
ipython
|
||||||
|
|
|
@ -7,7 +7,7 @@ django-djconfig==0.5.3
|
||||||
django-grappelli==2.8.1
|
django-grappelli==2.8.1
|
||||||
django-recaptcha==1.0.5
|
django-recaptcha==1.0.5
|
||||||
django-redis-cache==1.7.1
|
django-redis-cache==1.7.1
|
||||||
mysqlclient==1.3.7
|
psycopg2
|
||||||
Pillow==3.3.0
|
Pillow==3.3.0
|
||||||
six==1.10.0
|
six==1.10.0
|
||||||
unicodecsv==0.14.1
|
unicodecsv==0.14.1
|
||||||
|
@ -25,3 +25,6 @@ channels==1.1.5
|
||||||
python-dateutil
|
python-dateutil
|
||||||
wagtail==1.10.*
|
wagtail==1.10.*
|
||||||
wagtailmenus==2.2.*
|
wagtailmenus==2.2.*
|
||||||
|
|
||||||
|
# Production tools
|
||||||
|
wheel
|
||||||
|
|
Loading…
Reference in a new issue