Installation et configuration de endi.opteos.fr

From Documentation Optéos

Procédure technique utilisée lors de l’installation de l’application web Open Source Autonomie (enDI depuis 2020) autonomie.opteos.fr sur le serveur d’Optéos en avril 2018. Environnement web et procédure mis à jour en mai 2021 suite au changement de nom de l’application.

Préparation de l’environnement web sur le serveur s.opteos.fr[edit | edit source]

Créer les comptes utilisateur UNIX sur le système :

# adduser endi
# adduser bdanon endi
# adduser ssarazin endi
# echo -e "endi: bdanon, ssarazin" >> /etc/aliases && newaliases

Créer le répertoire du projet :

# cd /home/endi/
# mkdir -m 755 endi.opteos.fr
# chgrp endi endi.opteos.fr
# cd endi.opteos.fr/
# mkdir -m 750 config log www
# chown www-data:endi config
# chown www-data:www-data log
# chmod o+rx log
# chgrp endi www
# chmod g+ws,o+rx www
# ln -s /home/endi/endi.opteos.fr /home/bdanon/
# ln -s /home/endi/endi.opteos.fr /home/ssarazin/

Créer la base de donnée et l’accès MySQL :

# mysql
> USE mysql;
> SELECT PASSWORD('***');
> CREATE USER 'endi'@'localhost' IDENTIFIED VIA mysql_native_password USING '***';
> CREATE DATABASE endi_prod CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
> GRANT ALL PRIVILEGES ON `endi`.* TO 'endi_prod'@'localhost';
> FLUSH PRIVILEGES;

Créer la configuration web nginx du projet :

# nano /home/endi/endi.opteos.fr/config/endi.opteos.fr.nginx.conf
server {
  listen 80;
  listen [::]:80;
  listen 443 ssl http2;
  listen [::]:443 ssl http2;
  server_name autonomie.opteos.fr;
  access_log off;
  ssl_certificate /etc/letsencrypt/live/endi.opteos.fr/fullchain.pem;
  ssl_certificate_key /etc/letsencrypt/live/endi.opteos.fr/privkey.pem;
  add_header Strict-Transport-Security "max-age=15724800; preload";
  include snippets/letsencrypt.conf;
  location / {
    return 301 https://endi.opteos.fr$request_uri;
  }
}

server {
  listen 80;
  listen [::]:80;
  server_name endi.opteos.fr;
  access_log off;
  include snippets/letsencrypt.conf;
  location / {
    return 301 https://$host$request_uri;
  }
}

server {
  listen 443 ssl http2;
  listen [::]:443 ssl http2;
  server_name endi.opteos.fr;

  root /home/endi/endi.opteos.fr/www;
  index index.php;

  access_log /home/endi/endi.opteos.fr/log/http/endi.opteos.fr_access.log;
  error_log /home/endi/endi.opteos.fr/log/http/endi.opteos.fr_error.log;

  ssl_certificate /etc/letsencrypt/live/endi.opteos.fr/fullchain.pem;
  ssl_certificate_key /etc/letsencrypt/live/endi.opteos.fr/privkey.pem;
  add_header Strict-Transport-Security "max-age=15724800; preload";

  charset utf-8;
  gzip_static on;

  client_max_body_size 20m;
  client_body_buffer_size 128k;

  include snippets/letsencrypt.conf;

  # Proxy to pserve
  location / {
        include proxy_params;
        proxy_pass http://localhost:8080;
  }

  location ~ /static/favicons/.*\.png {
        include proxy_params;
        proxy_pass http://localhost:8080;
        expires 1M;
        add_header Cache-Control public;
        add_header Last-Modified "";
        add_header ETag "";
        access_log off;
  }

  location ~ \.(?:a?png|cur|css|gif|ico|jpe?g|js|json|svg|svgz|ttc|woff2?)$ {
        include proxy_params;
        proxy_pass http://localhost:8080;
        expires 1M;
        add_header Cache-Control public;
        add_header Last-Modified "";
        add_header ETag "";
        access_log off;
  }

  location = /public/logo.png {
        include proxy_params;
        proxy_pass http://localhost:8080;
        expires 1M;
        proxy_hide_header Content-Disposition;
        add_header Cache-Control public;
        add_header Last-Modified "";
        add_header ETag "";
        access_log off;
  }
}
# ln -s /home/endi/endi.opteos.fr/config/endi.opteos.fr.nginx.conf /etc/nginx/sites-available/endi.opteos.fr.conf
# ln -s /etc/nginx/sites-available/endi.opteos.fr.conf /etc/nginx/sites-enabled/
# nginx -t
# service nginx reload
# certbot certonly --agree-tos --email admin@ficusnode.com --webroot -w /etc/letsencrypt/public -d endi.opteos.fr,autonomie.opteos.fr
# nginx -t
# service nginx reload

Installation de Python 3.7 (si nécessaire)[edit | edit source]

Sources :

# aptitude update
# aptitude upgrade
# aptitude install build-essential zlib1g-dev libncurses5-dev libgdbm-dev libnss3-dev libssl-dev libreadline-dev libffi-dev curl libbz2-dev
# curl -O https://www.python.org/ftp/python/3.7.9/Python-3.7.9.tar.xz
# tar xvf Python-376.9.tgz
# cd Python-3.7.9
# ./configure --enable-optimizations
# make
# make altinstall
# python3.7 -V

Installation de cairo 1.15.4 (si nécessaire)[edit | edit source]

# # décommenter les lignes deb-src dans /etc/apt/sources.list
# aptitude update
# apt-get build-dep cairo
# wget https://cairographics.org/snapshots/cairo-1.15.14.tar.xz
# tar -xJf cairo-1.15.14.tar.xz
# cd cairo-1.15.14/
# ./configure
# make
# make install

Installation et configuration de l’application web enDI[edit | edit source]


Installer les dépendances nécessaires (Debian 9 Strecth : libmariadb2 et 10 Buster : libmariadb3) :

# aptitude install virtualenvwrapper build-essential libjpeg-dev libfreetype6 libfreetype6-dev libmariadbclient-dev zlib1g-dev python-dev python-mysqldb redis-server libmariadb2 libmariadb-dev-compat

Télécharger et installer l’application avec git :

# su - endi
$ cd ~/endi.opteos.fr/
$ mkvirtualenv --python=/usr/local/bin/python3.7 endi
$ git clone https://framagit.org/endi/endi.git
$ cd endi/
$ git checkout 6.1.19
$ pip install -r requirements.txt
$ pip install faker virtualenvwrapper pshell
$ python setup.py install
$ cp development.ini.sample production.ini

Modifier le fichier de configuration production.ini :

sqlalchemy.url = mysql://endi:…@localhost/endi_prod?charset=utf8
session.secret = …
session.longtimeout = 172800 # 48h
endi.instance_name = endi.opteos.fr

BROKER_URL = [[1]]@localhost:6379/0

[filter:fanstatic]
use = egg:fanstatic#fanstatic
bundle=True
minified=True
bottom=True
versioning=True

[server:main]
host = 127.0.0.1

Modifier le niveau de journalisation :

$ sed -i -E 's/^level ?= ?(DEBUG|INFO)/level = WARN/' production.ini

Créer les premiers administrateurs de l’application :

$ endi-admin production.ini useradd --user=bdanon --pwd=CHANGEMEFAST --firstname=Benjamin --lastname=Danon --group=admin --email=benjamin@ficusnode.com
$ endi-admin production.ini useradd --user=ssarazin --pwd=CHANGEMEFAST --firstname=Simon --lastname=Sarazin --group=admin --email=simons@simons.fr

Utiliser cairo 1.15.14 :

$ echo "export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/bin/" >> ~/.bashrc
$ echo "import os; os.environ['LD_LIBRARY_PATH'] = '/usr/local/bin/'" >> ~/.virtualenvs/endi/lib/python3.7/site-packages/_set_envs.pth
$ exit
# su - endi
$ cd ~/endi.opteos.fr/endi
$ workon endi
$ python -c "import os; print (os.getenv('LD_LIBRARY_PATH'))"

Démarrer puis stopper le processus de l’application :

$ pserve production.ini
> CTRL+C

Installation de l’application web enDI en tant que service[edit | edit source]

$ exit
# loginctl enable-linger endi
# adduser endi systemd-journal
# nano /home/endi/.bashrc
# Required variables for `systemctl --user`
export XDG_RUNTIME_DIR=/run/user/`id -u`
export DBUS_SESSION_BUS_ADDRESS="unix:path=${XDG_RUNTIME_DIR}/bus"
# su - endi
$ mkdir -p ~/.config/systemd/user/
$ nano ~/.config/systemd/user/opteos_endi@.service
[Unit]
Description=Optéos enDI
After=network.target mariadb.target redis-server.target nginx.target

[Service]
WorkingDirectory=/home/endi/endi.opteos.fr/endi
ExecStart=/home/endi/.virtualenvs/endi/bin/pserve /home/endi/endi.opteos.fr/endi/production.ini
Restart=always
RestartSec=500ms
StartLimitInterval=0

[Install]
WantedBy=multi-user.target
$ nano ~/.config/systemd/user/opteos_endi_celery_worker@.service
[Unit]
Description=Optéos enDI Celery Worker
After=network.target mariadb.target redis-server.target nginx.target opteos_endi.target

[Service]
WorkingDirectory=/home/endi/endi.opteos.fr/endi
ExecStart=/home/endi/.virtualenvs/endi/bin/celery worker -A pyramid_celery.celery_app --ini /home/endi/endi.opteos.fr/endi/production.ini
Restart=always
RestartSec=500ms
StartLimitInterval=0

[Install]
WantedBy=multi-user.target
$ nano ~/.config/systemd/user/opteos_endi_celery_beat@.service
[Unit]
Description=Optéos enDI Celery Beat
After=network.target mariadb.target redis-server.target nginx.target opteos_endi.target opteos_endi_celery_worker.target

[Service]
WorkingDirectory=/home/endi/endi.opteos.fr/endi
ExecStart=/home/endi/.virtualenvs/endi/bin/celery beat -A pyramid_celery.celery_app --ini /home/endi/endi.opteos.fr/endi/production.ini
Restart=always
RestartSec=500ms
StartLimitInterval=0

[Install]
WantedBy=multi-user.target
$ systemctl --user enable opteos_endi@1.service
$ systemctl --user enable opteos_endi_celery_worker@1.service
$ systemctl --user enable opteos_endi_celery_beat@1.service
$ systemctl --user start opteos_endi@1.service
$ systemctl --user status opteos_endi@1.service
$ systemctl --user start opteos_endi_celery_worker@1.service
$ systemctl --user status opteos_endi_celery_worker@1.service
$ systemctl --user start opteos_endi_celery_beat@1.service
$ systemctl --user status opteos_endi_celery_beat@1.service
$ journalctl -f

Configurer la rotation des journaux dans le fichier /etc/logrotate.d/endi :

# nano /etc/logrotate.d/endi
/home/endi/endi.opteos.fr/endi/logfile.log {
  rotate 6
  monthly
  missingok
  compress
  notifempty
  create 0664 endi endi
  su endi endi
}
# chmod g-w /etc/logrotate.d/endi

Installation des scripts de maintenance exécutés avec des tâches planifiées[edit | edit source]

Nettoyage des fichiers temporaires, /home/endi/endi_cleanup.sh :

#!/bin/bash

# Fichiers de session dont le dernier accès est supérieur à une semaine
find /home/endi/endi.opteos.fr/endi/data/sessions/ -type f -amin +10080 -print0 | xargs -0 -r rm

# Fichiers de cache dont le dernier accès est supérieur à une journée
find /home/endi/endi.opteos.fr/endi/data/cache/data/ -type f -amin +1440 -print0 | xargs -0 -r rm

# Fichiers temporaires de téléversement dont le dernier accès est supérieur à une journée
find /home/endi/endi.opteos.fr/endi/tmp/tempdir/ -type f -amin +1440 -print0 | xargs -0 -r rm

# Fichiers de cache Python dont la dernière modification est supérieure à une semaine
find /tmp/tmp* -maxdepth 0 -type d -mmin +10080 -print0 | xargs -0 -r rm -r

Redémarrage de l’application, /home/endi/restart_endi.sh :

#!/bin/bash

# Required variables for `systemctl --user`
export XDG_RUNTIME_DIR=/run/user/`id -u`
export DBUS_SESSION_BUS_ADDRESS="unix:path=${XDG_RUNTIME_DIR}/bus"

# Required to use cairo 1.15.4
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib

source /home/endi/.virtualenvs/endi/bin/activate
systemctl --user stop opteos_endi@1.service
systemctl --user start opteos_endi@1.service

Tâches planifiées crontab :

# Supprimer régulièrement les fichiers temporaires
12 6 * * * /home/endi/endi_cleanup.sh

# Redémarrer enDI quotidiennement pour éviter le bogue avec MySQL
22 6 * * * /home/endi/restart_endi.sh

Accéder à l’application : https://endi.opteos.fr/.