# Déploiement

On suit d'abord sur le serveur toutes les étapes d'installation qui concernent l'obtention de flop et l'installation sans docker jusqu'au lancement non inclus.

Reste à configurer le déploiement de l'application sur le serveur.

# Configuration du serveur web

# Installation

On installe nginx :

sudo apt install nginx

# Configuration du vhost

On crée le fichier vhost :

sudo vi /etc/nginx/sites-available/fedt

Voici un exemple de vhost :

server {
        listen 443 ssl;
        server_name fedt.iut-orsay.fr;

        ssl_certificate /etc/ssl/fedt/fedt_iut-orsay_fr.pem;
        ssl_certificate_key /etc/ssl/fedt/fedt.iut-orsay.fr.key;
        ssl_session_timeout 5m;

        # Intermediate configuration. tweak to your needs.
        ssl_protocols TLSv1.2 TLSv1.3;# Requires nginx >= 1.13.0 else use TLSv1.2
        ssl_prefer_server_ciphers on;
        ssl_ciphers EECDH+AESGCM:EDH+AESGCM;
        ssl_session_cache shared:SSL:10m;
        ssl_ecdh_curve secp384r1; # Requires nginx >= 1.1.0
        ssl_dhparam /etc/ssl/fedt/dhparam2048.pem;
        add_header Strict-Transport-Security "max-age=63072000; includeSubdomains; preload";
        add_header X-Frame-Options DENY;
        add_header X-Content-Type-Options nosniff;
        ssl_session_tickets off; # Requires nginx >= 1.5.9
        ssl_stapling on; # Requires nginx >= 1.3.7
        ssl_stapling_verify on; # Requires nginx => 1.3.7
        add_header X-XSS-Protection "1; mode=block";
        resolver ip.de.votre.dns1 ip.de.votre.dns2 valid=300s;
        resolver_timeout 5s;

        # serve static files
        location /static/ {
          alias /var/www/html/edt/static/;
        }

        # pass requests for dynamic content to gunicorn
        location / {
          proxy_pass http://127.0.0.1:8000;
          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;
        }

        location /solver/ {
          proxy_pass http://127.0.0.1:8000;
          proxy_http_version 1.1;
          proxy_set_header Upgrade $http_upgrade;
          proxy_set_header Connection "upgrade";

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

        }
}

# Activation du vhost

On active le vhost :

cd /etc/nginx/
sudo ln -s /etc/nginx/sites-available/fedt /etc/nginx/sites-enabled/fedt

On redémarre nginx :

sudo systemctl restart nginx

# Création du répertoire de fichiers statiques

En production, Django a besoin d'un répertoire où il va stocker (et d'où il va servir) tous les fichiers statiques (e.g. les fichiers javascript).

On crée le répertoire statique pour flop :

sudo mkdir /var/www/html/edt/

On donne les droits à l'utilisateur et au groupe fedt :

sudo chown -R fedt:fedt /var/www/html/edt/

# Configuration du service sous systemd

# Service systemd sans Gurobi

On crée le service /etc/systemd/system/fedt.service :

[Unit]
Description=FlopEdt
After=network.target

[Service]
PIDFile=/run/daphne/pid
User=fedt
Group=fedt
WorkingDirectory=/home/fedt/FlOpEDT/FlOpEDT
ExecStart=/home/fedt/FlOpEDT/venv/bin/daphne -b 127.0.0.1 -p 8000 --verbosity 3 --access-log=/tmp/flop.log FlOpEDT.asgi:application
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s TERM $MAINPID
Restart=on-abort
Environment="DJANGO_LOG_LEVEL=DEBUG"

[Install]
WantedBy=multi-user.target

On active le service :

sudo systemctl enable fedt.service

# Service systemd avec la prise en compte de Gurobi

On crée le service /etc/systemd/system/fedt.service :

[Unit]
Description=FlopEdt
After=network.target

[Service]
PIDFile=/run/daphne/pid
User=fedt
Group=fedt
WorkingDirectory=/home/fedt/FlOpEDT/FlOpEDT
Environment="GUROBI_HOME=/home/fedt/gurobi902/linux64"
Environment="PATH=YOUR_PATH:/home/fedt/gurobi902/linux64/bin"
Environment="LD_LIBRARY_PATH=/home/fedt/gurobi902/linux64/lib"
Environment="GRB_LICENSE_FILE=/home/fedt/gurobi.lic"
ExecStartPre=/bin/echo ${GUROBI_HOME} ${PATH}
ExecStart=/home/fedt/FlOpEDT/venv/bin/daphne -b 127.0.0.1 -p 8000 --verbosity 3 --access-log=/tmp/flop.log FlOpEDT.asgi:application
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s TERM $MAINPID
Restart=on-abort
Environment="DJANGO_LOG_LEVEL=DEBUG"

[Install]
WantedBy=multi-user.target

On active le service :

sudo systemctl enable fedt.service

# Configuration de Django

En utilisant éventuellement le compte Unix dédié, on va modifier la configuration du fichier manage.py :

 sudo -i -u fedt
 vi FlOpEDT/FlOpEDT/manage.py

On remplace la ligne :

 os.environ.setdefault("DJANGO_SETTINGS_MODULE", "FlOpEDT.settings.local")

par

 os.environ.setdefault("DJANGO_SETTINGS_MODULE", "FlOpEDT.settings.dockerless-production")

Note : le fichier local.py n'est plus pris en compte par Django, les deux fichiers lus sont désormais base.py et dockerless-production.py.

On édite ensuite le fichier dockerless-production.py :

vi /home/fedt/FlOpEDT/FlOpEDT/FlOpEDT/settings/dockerless-production.py
from .base import *

STATIC_ROOT = '/var/www/html/edt/static/'

SECRET_KEY = 'ssssssssssssssssssssssssssssssssss'

DEBUG = False

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql',
        'NAME': 'flop_db_yyyyyyyyyyyyyyyyy',
        'USER': 'flop_user',
        'PASSWORD': 'xxxxxxxxxxxxxxxxxxxxx',
        'HOST': '127.0.0.1',
        'PORT': '5432',
    }
}

CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
        'LOCATION': '127.0.0.1:11211',
    }
}

On ajoute également les hôtes autorisés à se connecter au serveur en ajoutant la ligne suivante dans le dockerless-production.py :

ALLOWED_HOSTS = ['localhost','l_adresse_de_votre_serveur']

# Copie des fichiers statiques

On se reconnecte éventuellement avec l'utilisateur fedt :

 sudo -i -u fedt

On utilise le virtualenv :

cd FlOpEDT/
source venv/bin/activate

On génère les fichiers statiques qui seront distribués par Nginx :

python3.7 manage.py collectstatic
214 static files copied to '/var/www/html/edt/static'.

# Lancer FlOpEDT

On démarre le serveur web :

 sudo systemctl start nginx.service

Et on démarre le service systemd :

sudo systemctl start fedt.service