Mise en production d’Esup-Pod

Base de données MySQL/MariaDB

Installation de MariaDB

sudo apt install mariadb-server mariadb-client
sudo mysql_secure_installation

Attention il faut modifier le fichier /etc/mysql/mariadb.conf.d/50-server.cnf

character-set-server  = utf8
collation-server      = utf8_general_ci

Vous devez ensuite créer une nouvelle base de données.

sudo mysqladmin create mydatabase

Il faut ensuite donner les droits à cette base à un utilisateur renseigné dans votre fichier de settings ci-après

$ sudo mysql
mysql> GRANT ALL PRIVILEGES ON mydatabase.* TO 'mydatabaseuser'@127.0.0.1 IDENTIFIED BY 'mypassword';
Query OK, 0 rows affected (0.00 sec)

mysql> exit

Le timezone doit être enregistré dans le moteur SQL (Mysql ou mariadb) (à faire en tant que root mysql !)

mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root -p mysql --database=mysql

Pour utiliser la base de données MySQL/MariaDB sur le serveur frontal (ou sur un serveur distant), il faut installer le moteur MySql/Python :

$ sudo apt install pkg-config python3-dev default-libmysqlclient-dev
(django_pod4) pod@pod:/usr/local/django_projects/podv4$ pip3 install mysqlclient

Optimisation de MariaDB

Votre configuration doit être adaptée à la taille de votre base de donnée. Pour éviter d’éventuels souci lors des mises à jour, je vous invite à vous assurer que vous avez au minimum 256M pour le paramètre “max_allowed_packet” (voir plus si votre base de données est plus importante. Il faut indiquer la taille de votre plus grosse table)

/etc/my.cnf

[mysqld]
max_allowed_packet=256M

Configuration d’Esup-Pod

Si ce n’est pas encore fait, vous devez spécifier la configuration de votre base de données dans votre fichier de configuration settings_local.py :

(django_pod4) pod@pod:~/django_projects/podv4$ vim pod/custom/settings_local.py
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': '<my_database>',
        'USER': '<my_database_user>',
        'PASSWORD': '<my_database_password>',
        'HOST': '<my_database_host>',
        'PORT': '3306',
        'OPTIONS': {
            'init_command': "SET storage_engine=INNODB, sql_mode='STRICT_TRANS_TABLES', innodb_strict_mode=1",
            'charset': 'utf8mb4',
        },
    }
}

Remplacer les différentes variables <my_database_*> selon votre environnement. Par exemple, en local, <my_database_host> pourra être remplacé par 127.0.0.1.

Il faut ensuite relancer le script présent à la racine afin de créer les fichiers de migration, puis de les lancer afin de créer la base de données :

(django_pod4) pod@pod:~/django_projects/podv4$ make createDB

Ne pas oublier de créer à nouveau un superutilisateur :

(django_pod4) pod@pod:~/django_projects/podv4$ python manage.py createsuperuser

Frontal Web NGINX / UWSGI et fichiers statiques

Pour plus de renseignements, d’explication que la documentation ci-dessous, voir le tutoriel que j’ai suivi pour mettre en place cette solution

Installation du serveur Web NGINX et paramétrage

Commencer par installer le serveur NGINX

(django_pod4) pod@pod:~/django_projects/podv4$ sudo apt install nginx

Ensuite, modifier le fichier /etc/nginx/sites-enabled/default

(django_pod4) pod@pod:~/django_projects/podv4sudo vim /etc/nginx/sites-enabled/default

Rechercher la ligne ci-dessous à modifier

[...]
server { listen 80 default_server;
# listen [::]:80 default_server;
[...]

⚠️ Il peut aussi être nécessaire de remplacer cette étape par la suppression du fichier default :

(django_pod4) pod@pod:~/django_projects/podv4sudo unlink /etc/nginx/sites-enabled/default

Installer les addons de NGINX

(django_pod4) pod@pod:(~/django_projects/podv4$) sudo apt install nginx-extras

Rajouter les lignes ci-dessous dans le fichier de configuration de nginx :

/etc/nginx/nginx.conf

user pod www-data;
[...]
http {
    [...]
    # Pod Progress Bar : reserve 1MB under the name "uploads" to track uploads
    upload_progress uploadp 1m;
    [...]
}

💡 Mettre user pod www-data; en première ligne indique à Nginx de lancer ses processus worker avec l’utilisateur pod et le groupe www-data au lieu de www-data:www-data. Cela simplifie la gestion des droits et accès aux fichiers vidéos, entre autres, pour la suite.

Il faut ensuite spécifier le host pour le serveur web (changer si besoin les paramètres dans le fichier pod_nginx.conf).

(django_pod4) pod@pod:(~/django_projects/podv4$) cp pod_nginx.conf pod/custom/.
(django_pod4) pod@pod:(~/django_projects/podv4$) vim pod/custom/pod_nginx.conf
(django_pod4) pod@pod:(~/django_projects/podv4$) sudo ln -s /usr/local/django_projects/podv4/pod/custom/pod_nginx.conf /etc/nginx/sites-enabled/pod_nginx.conf
(django_pod4) pod@pod:(~/django_projects/podv4$) sudo /etc/init.d/nginx restart (ou sudo systemctl restart nginx)

Pour démarrer le service Nginx automatiquement, lancer la commande :

pod@pod:$ sudo systemctl enable nginx

UWSGI

Un fichier de configuration est fourni pour faciliter l’usage d’UWSGI.

Installer le module uwsgi

(django_pod4) pod@pod:(~/django_projects/podv4$) sudo pip3 install uwsgi --break-system-packages

Dupliquez le fichier modèle et éditez-le pour personnaliser les paramètres :

(django_pod4) pod@pod:(~/django_projects/podv4$) cp pod_uwsgi.ini pod/custom/.
(django_pod4) pod@pod:(~/django_projects/podv4$) vim pod/custom/pod_uwsgi.ini
(django_pod4) pod@pod:(~/django_projects/podv4$) sudo uwsgi --ini pod/custom/pod_uwsgi.ini --enable-threads --daemonize /usr/local/django_projects/podv4/pod/log/uwsgi-pod.log --uid pod --gid www-data --pidfile /tmp/pod.pid
...
[uWSGI] getting INI configuration from pod/custom/pod_uwsgi.ini
(django_pod4) pod@pod:(~/django_projects/podv4$)

Pour lancer le service UWSGI au démarrage de la machine :

Créer un fichier uwsgi-pod.service

(django_pod4) pod@pod:(~/django_projects/podv4$) sudo vim /etc/systemd/system/uwsgi-pod.service

Y ajouter :

[Unit]
Description=Pod uWSGI app
After=syslog.target

[Service]
ExecStart=/usr/local/bin/uwsgi --ini /usr/local/django_projects/podv4/pod/custom/pod_uwsgi.ini \
        --enable-threads \
        --pidfile /tmp/pod.pid
ExecStop=/usr/local/bin/uwsgi --stop /tmp/pod.pid
User=pod
Group=www-data
Restart=on-failure
KillSignal=SIGQUIT
Type=notify
StandardError=syslog
NotifyAccess=all

[Install]
WantedBy=multi-user.target

Il faut ensuite activer le service

(django_pod4) pod@pod:(~/django_projects/podv4$) sudo systemctl enable uwsgi-pod

Pour le lancer ou l’arrêter :

(django_pod4) pod@pod:(~/django_projects/podv4$) sudo systemctl stop uwsgi-pod
(django_pod4) pod@pod:(~/django_projects/podv4$) sudo systemctl restart uwsgi-pod

Attention, il faut penser à collecter les fichiers “statics” pour qu’ils soient servis par le frontal web NGINX.

(django_pod4) pod@pod:(~/django_projects/podv4$) python manage.py collectstatic

Log Rotate

Les fichiers de log peuvent vite grossir sur un serveur en production. Aussi, je vous invite à mettre en place un système de log rotate pour les logs d’Esup-Pod :

/etc/logrotate.d/esup-pod

/usr/local/django_projects/podv4/pod/log/*.log {
    su pod www-data
    daily
    missingok
    rotate 14
    nocompress
    delaycompress
    notifempty
    create 0640 pod www-data
    sharedscripts
    postrotate
        systemctl restart uwsgi-pod >/dev/null 2>&1
    endscript
}

Puis lancez la commande suivante pour vérifier que ça fonctionne :

sudo logrotate -d /etc/logrotate.d/esup-pod

Personnalisations

Certaines pages ont été automatiquement pré-générées pour vous faciliter la tâche, mais il reste certaines informations à y compléter. Il y a notamment les pages suivantes :