Production

HappySchool est construit sur un certain nombre de brique logiciel, ses dépendances. Par souci de simplicité, il est conseillé d’installer sur une machine réservée à l’emploi d’HappySchool même si, au vu de la plupart des logiciels utilisés, il est tout à fait possible d’utiliser une machine existante. Une machine virtuelle (ou une instance docker) sera donc tout à fait appropriée et recommandé pour l’installation. La manière la plus rapide et la plus simple pour l’installation est d’utiliser un playbook ansible pour automatiser l’installation et la configuration d’HappySchool. Cependant celle-ci se limite pour le moment à ubuntu 18.04. Pour une installation sur un autre système ou plus poussé, une installation manuelle est décrite ci-dessous. A vous à l’adapter selon les spécificités de votre machine.

Ansible

Ansible est un outil puissant qui permet d’automatiser l’installation et la configuration d’un ou plusieurs serveurs. En règle générale, il s’utilise à distance à travers une session ssh vers le ou les serveurs mais peut très bien s’utiliser en local. Un role pour installer HappySchool est disponible pour n’importe quelle utilisation. Un script shell est également fourni pour faciliter l’installation en local. Pour télécharger le role et l’inclure dans votre propre playbook clonez le dépôt correspondant:

git clone https://github.com/ISLNamur/happyschool-ansible

La configuration de votre instance (superutilisateur, applications actives, etc) se fait dans un playbook que vous pouvez créer à partir du fichier happyschool.example.yml. Les possibilités de configuration se trouve dans roles/common/defaults/main.yml. Ensuite, à la racine du dépôt exécutez le script suivant qui utilisera un playbook happyschool.yml :

./recipe.sh

Celui-ci devrait vous demander votre mot de passe pour l’installation des paquets système. Au final, HappySchool sera installé dans /home/utilisateur/happyschool.

Installation manuelle

Base de donnée

Happyschool utilise une base de donnée postgresql avec une extension pour gérer les caractères accentués.

Pour l’installer :

sudo apt install postgresql postgresql-contrib

Pour activer l’extension pour toutes les futures base de données :

sudo -u postgres bash -c "psql -U postgres -d 'template1' -c 'CREATE EXTENSION unaccent;'"

Puis créer un utilisateur et une base de donnée. D’abord accéder au shell psql:

sudo -u postgres bash -c "psql"

Et introduire les commandes SQL suivantes en spécifiant utilisateur, mot de passe et nom de la base de donnée :

CREATE USER newuser WITH PASSWORD 'yourpassword';
CREATE DATABASE mydb WITH OWNER newuser;
\quit

Paquets système

Happyschool utilise principalement du python pour fonctionner mais pas seulement. Il utilise entre autres git pour la collecte et les mises à jour du code et un serveur redis pour communiquer entre différents processus.

Pour les installer :

curl -sL https://deb.nodesource.com/setup_lts.x | sudo -E bash -
sudo apt install libldap2-dev libsasl2-dev python3-pip git python3-dateutil ttf-bitstream-vera redis-server build-essential libssl-dev zlib1g-dev libbz2-dev libreadline-dev libsqlite3-dev wget curl llvm libncurses5-dev libncursesw5-dev xz-utils tk-dev libffi-dev liblzma-dev python-openssl nodejs

HappySchool

Le code d’Happyschool est disponible sur github. Pour l’installer, placez-vous dans le dossier où vous vous voulez l’installer puis récupérer le code avec git :

cd /home/user/mon/dossier
git clone https://github.com/ISLNamur/happyschool.git

HappySchool s’appuie sur le framework Django ainsi que toutes une série de modules python. Afin des les gérer ainsi que leur versions, pipenv et pyenv sont utilisés. Pour les installer avec un shell bash :

pip3 install --user pipenv
curl https://pyenv.run | bash
echo 'export PATH="$HOME/.pyenv/bin:$PATH"' >> /.bashrc
echo 'eval "$(pyenv init -)"' >> /.bashrc
echo 'eval "$(pyenv virtualenv-init -)"' >> /bashrc
cd happyschool
PIPENV_YES=1 pipenv install

Il existe plusieurs niveaux de configurations pour Happyschool, le plus bas niveau est happyschool/settings.py (chemin relatif au dossier racine d’Happyschool). Un fichier exemple est disponible et peut être copié :

cp happyschool/settings.example.py happyschool/settings.py

Dans celui-ci vous retrouverez la possibilité d’activer/désactiver une application, configurer l’accès à la base de donnée (pensez à mettre le nom de la db, l’utilisateur et le mot de passe définit plus haut), configurer le serveur d’envoi d’email, configurer l’authentification à un serveur LDAP/ActiveDirectory, etc. Plus de détails sont disponibles dans la section Configuration.

Pour installer les dépendances javascript et les compiler, dans le dossier racine (cela peut prendre un peu de temps):

npm install
./node_modules/.bin/webpack --config webpack.dev.js

Pour écrire les schémas dans la base de donnée :

pipenv run ./manage.py migrate

Certaines applications ont besoin que les groupes soient déjà accessibles pour pouvoir fonctionner. La commande suivante permet de les générer à partir du fichier happyschool/settings.py:

pipenv run ./manage.py creategroups

Vous pouvez créer un super utilisateur en répondant aux questions posées par :

pipenv run ./manage.py createsuperuser

Ensuite récupérez les fichiers statiques (css,…) utilisés par django et ses applications. Pour cela, assurez-vous que DEBUG = FALSE dans votre fichier happyschool/settings.py et lancez la commande suivante :

pipen run ./manage.py collectstatic

Supervisord

Supervisord est un système de gestion des processus. Il a pour but de coordoner le (re)démarrage et l’arrêt des différents processus utilisés pour le bon fonctionnement d’Happyschool. Il s’installe avec pip :

sudo pip3 install supervisor

Supervisor se configure avec le fichier /etc/supervisor/supervisord.conf (à créer) pour la configuration générale :

[unix_http_server]
file=/var/run/supervisor.sock   ; the path to the socket file
chown = root

[supervisord]
nodaemon = False
childlogdir = /var/log/happyschool
user = root
pidfile = /var/run/supervisord.pid

[rpcinterface:supervisor]
supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface

[supervisorctl]
serverurl = unix:///var/run/supervisor.sock ; use a unix:// URL  for a unix socket

[include]
files = /etc/supervisor/conf.d/*.conf

Ainsi qu’un fichier pour chacun des processus que supervisor doit gérer. /etc/supervisor/conf.d/daphne.conf :

[program:daphne]
command=/home/myuser/.local/bin/pipenv run daphne -b 0.0.0.0 -p 8080 happyschool.asgi:application ; Remplacer 'myuser' par l'utilisateur courant !
directory=/home/myuser/happyschool            ; Remplacer 'myuser' par l'utilisateur courant !
autostart=true
autorestart=true
environment=HOME="/home/myuser",USER="myuser"   ; Remplacer 'myuser' par l'utilisateur courant !
user=myuser                                   ; Remplacer 'myuser' par l'utilisateur courant !
stdout_logfile_maxbytes=10MB

et /etc/supervisor/conf.d/celery.conf :

[program:celery]
command=/home/myuser/.local/bin/pipenv run celery -A happyschool worker -l info ; Remplacer 'myuser' par l'utilisateur courant !
directory=/home/myuser/happyschool            ; Remplacer 'myuser' par l'utilisateur courant !
autostart=true
autorestart=true
environment=HOME="/home/myuser",USER="myuser"   ; Remplacer 'myuser' par l'utilisateur courant !
user=myuser                                   ; Remplacer 'myuser' par l'utilisateur courant !
stdout_logfile_maxbytes=10MB

Vérifiez que les chemins d’accès à Happyschool ainsi que le nom d’utilisateur sont correctement configurés.

Pour s’assurer que supervisor est bien lancé au démarrage de la machine, vous pouvez créer un service dans /etc/systemd/system/supervisord.service:

[Unit]
Description=Supervisor process control system for UNIX
Documentation=http://supervisord.org
After=network.target

[Service]
ExecStart=/usr/local/bin/supervisord -n -c /etc/supervisor/supervisord.conf
ExecStop=/usr/local/bin/supervisorctl shutdown
ExecReload=/usr/local/bin/supervisorctl reload
KillMode=process
Restart=on-failure
RestartSec=50s

[Install]
WantedBy=multi-user.target

Que vous pouvez activer avec

sudo systemctl enable supervisord
sudo systemctl start supervisord

Nginx

Nginx va nous permettre de répartir les différentes demandes entre les contenus dynamiques que va gérer daphne, et les contenus statiques (images, css, js,…). Il s’installe simplement avec :

sudo apt install nginx

Ensuite pour le configurer, modifiez le fichier /etc/nginx/sites-available/default:

server {
        listen 80 default_server;
        listen [::]:80 default_server;
        server_name mon.domaine 10.32.141.6; # Nom de domaine du serveur, l'ip n'est pas nécessaire. À MODIFIER.
        client_max_body_size 100m;

        location /static/ {
                 add_header Service-Worker-Allowed "/";
                 alias /home/user/happyschool/static/; # Mettre le chemin vers les fichiers statiques. À MODIFIER.
        }

        location /media/ {
                 alias /home/user/happyschool/media/; # Mettre le chemin vers les fichiers media (upload,…). À MODIFIER.
        }

        location /favicon.ico {
                 alias /home/user/happyschool/static/favicon.ico; # Mettre le chemin correct.
        }

        # On transmet le reste à daphne.
        location / {
                 proxy_pass http://0.0.0.0:8080; # Le port d'écoute de daphne.
                 proxy_set_header Upgrade $http_upgrade;
                 proxy_set_header Connection "upgrade";

                 proxy_redirect     off;
                 proxy_set_header   Host $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-Host $server_name;
        }
}

Pour vérifier qu’il n’y a pas de faute de syntaxe, la commande sudo nginx -t est bien utile. Ensuite pour charger la nouvelle configuration :

sudo systemctl reload nginx

Happyschool devrait maintenant être accessible à l’adresse IP ou au nom de domaine que vous avez choisi. La prochaine étape est la Configuration Happyschool que ce soit pour l’envoi automatique des courriels ou pour le choix des applications.