Installation et configuration de endi.opteos.fr

De Documentation Optéos
Aller à :navigation, rechercher

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[modifier | modifier le wikicode]

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)[modifier | modifier le wikicode]

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)[modifier | modifier le wikicode]

# # 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[modifier | modifier le wikicode]


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[modifier | modifier le wikicode]

$ 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[modifier | modifier le wikicode]

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/.