Plus

Installation sur RHEL

Guide de configuration complet d'un serveur Dokos sur plateformes Redhat et clones

Cet article a été rédigé avec ❤️ par un membre de la communauté Dokos. Il est maintenu la communauté et peut donc ne pas être à jour.

Installation de Dokos sur plateformes RHEL (CentOS, AlmaLinux, RockyLinux) 8 et 9

Ce guide explique comment installer Dokos v2 ou v3 sur les plateformes Redhat (RHEL, AlmaLinux, CentOS, RockyLinux) EL8 ou EL9.

Bien qu'en dehors du scope du présent document, il convient de préparer le système hôte pour l'ERP Dokos comme suit:

  • Le chemin /var contiendra les fichiers de l'ERP, une partition dédiée est souhaitable
  • Configurer les éventuels guest tools s'il s'agit d'une machine virtuelle (VMWare, Qemu, HyperV...)
  • Configurer un serveur NTP de préférence intra-réseau
  • Configurer la sécurité, les accès, ainsi que la traçabilité (voir guide sécurité dédié ainsi que guide OpenSCAP)
  • Configurer le tuning machine (voir guide dédié tuned-adm avec profil dédié NPF-APP et valeurs thread siblings)
  • Installer les outils de diagnostics habituels (net-tools bind-utils nano sysstat iotop htop iftop atop nmon telnet lsof traceroute) disponibles essentiellement sur le depot EPEL
  • Configurer la supervision (Prometheus ou SNMPd)

Installation des prérequis

Prérequis standards

Installer les paquets permettant la compilation des modules yarn

dnf install -y git tar bzip2 openssl-devel libffi-devel gcc

Pour la mise en production, il faudra en outre installer l'outil d'automatisation ansible:

# Pour RHEL 8 et clones
dnf -y install ansible
# Pour RHEL 9 et clones
dnf -y install ansible-core

Configuration spécifique du système

Modèle Inotify (mode développement uniquement)

Lors de l'exécution de Dokos en mode développement, le kernel hook inotify est utilisé par le framework JS pour surveiller les changements de fichiers. Par défaut, la limite de fichiers que RHEL 8 surveille est fixé à 8192 pour des raisons de performances, et les logs du framework peuvent contenir des erreurs de type

UnhandledPromiseRejectionWarning: Error: ENOSPC: System limit for number of file watchers reached, watch '/var/dokos/dokos-erp/apps/frappe/frappe/public/scss/common/quill.scss' 23:53:21 watch.1 | at FSWatcher.<computed> (internal/fs/watchers.js:243:19)

Pour un environnement de développement, il est possible de lever cette limite comme suit:

echo "fs.inotify.max_user_watches=$((1024*512))" | sudo tee -a /etc/sysctl.d/90-dokos.conf

Chaque fichier surveillé consomme 1Ko de mémoire, dans notre exemple, pour surveiller 512Ko fichiers, il faudra 512Mo de mémoire vive.

Dans un environnement de production, il faut penser à vider les caches de fichiers précédents de nodejs afin de réduire cette quantité de fichiers à surveiller.

Mémoire VM

Afin d'éviter que les enregistrements en tâche de fond échouent si la mémoire vive est faible:

echo "vm.overcommit_memory=1" | sudo tee -a /etc/sysctl.d/90-dokos.conf

TCP Backlog

Pour optimiser les performances de redis, il faudra modifier le paramètre suivant:

echo "net.core.somaxconn=65535" | sudo tee -a /etc/sysctl.d/90-dokos.conf

Chargement paramètres

Il faudra recharger les paramètres à la volée pour une application sans attendre le redémarrage.

sysctl --load /etc/sysctl.d/90-dokos.conf

Désactivation des Transparent Huge Pages (THP) via le mode opt-in par processus en utilisant la directive « madvise »

Il faudra changer les arguments kernel dans /etc/default/grub comme suit en ajoutant « transparent_hugepage=madvise ». Exemple:

GRUB_CMDLINE_LINUX="crashkernel=auto resume=UUID=598eec09-15a8-4cc9-b1ed-17d2b41b5594 transparent_hugepage=madvise"

Une fois enregistré, il faudra recréer une configuration de boot

find /boot -iname "grub.cfg" | xargs grub2-mkconfig -o

Préparation du service de base de données MySQL

Installation et préparation de la base de données MariaDB

S'assurer que la version de MariaDB soit >= 10.3.x via la commande suivante:

dnf list mariadb-server

Lancer l'installation via la commandes suivantes:

# Pour RHEL 8 et clones
dnf -y install mariadb-server mariadb-devel
# Pour RHEL 9 et clones
dnf -y install mariadb-server

Configuration du serveur et du client

Ajouter les directives suivantes dans la section [mysql] du fichier /etc/my.cnf.d/mariadb-server.cnf

# NETPERFECT-BZ012: Optimisation des performances mono serveur
table_cache             = 1000
# NETPERFECT-BZ131: Permet l'import de fichiers SQL disposant de INSERT statements trop longs (ERROR 2006 (HY000) at line 696: MySQL server has gone away)
max_allowed_packet      = 128M
# NETPERFECT-BZ065: Augmenter la taille du fichier log INNODB pour permetttre de jouer de plus grandes requêtes (info: MySQL server has gone away.). Additional info: https://jira.kopano.io/browse/KC-1053
innodb_log_file_size    = 128M
# NETPERFECT-BZ213: Augmenter la durée maximale d'absence de requête pour éviter l'erreur (MySQL server has gone away)
wait_timeout            = 288000
# NETPERFECT-BZ003: Chaque table INNODB doit posséder son propre fichier afin de faciliter la récuperation de données en cas de crash
innodb-file-per-table   = 1

# NETPERFECT-BZ401: Do not set client handshake (dokos)
character-set-client-handshake = FALSE
# NETPERFECT-BZ232: Set default collation for most applications
character-set-server           = utf8mb4
# NETPERFECT-BZ232: Set default collation for most applications
collation-server               = utf8mb4_unicode_ci

Ajouter les directives suivantes dans la section [mysql] du fichier etc/my.cnf.d/mysql-clients.cnf

NETPERFECT-BZ232: Set default collation for most applications
default-character-set = utf8mb4

Une fois configuré, vous pourrez lancer le service MariaDB avec la commande suivante

systemctl enable --now mariadb

la configuration de sécurité se fera en lançant la commande

mariadb-secure-installation

La configuration est légèrement différente entre RHEL 8 et RHEL 9. Depuis RHEL 9, les connexions en tant qu'utilisateur root sont possibles sans mot de passe en utilisant un socket unix.

Sous RHEL 8, il faudra ajouter un fichier de mot de passe afin d'arriver à un résultat identique.

Créer le fichier /root/.my.cnf suivant

[client]
password="VotreMotDePasseSuperSécuriséMySQL"

Préparation de la base de données redis

Depuis le Framework Frappe v13 (dokos v2.x), le prérequis minimal est redis 6.x.

RHEL 8 est fourni avec redis 5.x par défaut et RHEL 9 est fourni avec redis 6.x par défaut.

# Pour RHEL 8 et clones
dnf module enable redis:6
dnf install redis -y
# Pour RHEL 9 et clones
dnf install redis -y

Préparation de l'environnement nodeJS

Depuis le Framework Frappe v13 (dokos v2.x), le prérequis minimal est nodejs 14.x.

Depuis le Framework Frappe v14 (dokos v3.x), le prérequis minimal est nodejs 16.x

RHEL 8 est fourni avec nodejs 14.x par défaut et RHEL 9 est fourni avec nodejs 16.x par défaut.

# Pour RHEL 8 et clones
dnf module enable nodejs:14
dnf install nodejs -y
# Pour RHEL 9 et clones
dnf install nodejs -y

Installation du manager de packages JS yarn

Solution d'installation en tant que paquet RPM

Cette solution à l'avantage de mettre à jour automatiquement yarn avec le système.

Depuis le framework Frappe v13, le prérequis minimal est yarn 1.12.

Installation du dépôt yarn

curl --silent --location https://dl.yarnpkg.com/rpm/yarn.repo | tee /etc/yum.repos.d/yarn.repo
rpm --import https://dl.yarnpkg.com/rpm/pubkey.gpg

Installation de yarn

dnf install -y yarn

Solujtion d'installation via npm

Alternativement, il est possible d'installer yarn via le gestionnaire de packages nodejs:

npm install -g yarn

Préparation de l'environnement Python

Depuis le Framework Frappe v13 (dokos v2.x), le prérequis minimal est python 3.8.x

Depuis le Framework Frappe v14 (dokos v3.x), le prérequis minimal est python 3.10.x

Configuration de python pour dokos v2.x

RHEL 8 est fourni avec python 3.8. RHEL 9 est fourni avec python 3.9.

Pour dokos v2.x, il sera donc possible d'utiliser l'interpréteur système

dnf install -y python-pip
python3 -m pip install --upgrade pip
python3 -m pip install --upgrade setuptools wheel virtualenv

Configuration de python pour dokos v3.x

Dokos v3.x utilise python 3.10+. Au 12/12/2022, aucune dépot officiel de python 3.10 n'existe pour RHEL. Il faudra donc compiler manuellement Python et l'installer dans un chemin alternatif /usr/local/bin/python3 pour ne pas interférer avec l'interpréteur python fourni par le système.

# Dépendances de compilation python
dnf install -y wget yum-utils make gcc openssl-devel bzip2-devel libffi-devel zlib-devel
# Dépendances de compilation de modules python nécessaires pour le framework Frappe
dnf install -y libpq-devel gcc-c++ libjpeg-turbo-devel libjpeg-turbo-utils
mkdir /opt/python310 && cd /opt/python310
# Attention: Vérifier sur python.org s'il existe une archive plus récente
curl -OL https://www.python.org/ftp/python/3.10.9/Python-3.10.9.tgz
tar xvf Python-3.10.9.tgz
cd Python-3.10.9
./configure --with-system-ffi --with-computed-gotos --enable-loadable-sqlite-extensions
make -j ${nproc}
make altinstall
alias python3=/usr/local/bin/python3

Installation de wkhtmltopdf

Il faut se rendre sur la page « https://github.com/wkhtmltopdf/packaging/releases pour télécharger la dernière version.

# Pour RHEL 8 et clones
cd /opt
curl -OL https://github.com/wkhtmltopdf/packaging/releases/download/0.12.6.1-2/wkhtmltox-0.12.6.1-2.almalinux8.x86_64.rpm
dnf localinstall wkhtmltox-0.12.6.1-2.almalinux8.x86_64.rpm
dnf install nodejs -y
# Pour RHEL 9 et clones
cd /opt
curl -OL https://github.com/wkhtmltopdf/packaging/releases/download/0.12.6.1-2/wkhtmltox-0.12.6.1-2.almalinux9.x86_64.rpm
dnf localinstall wkhtmltox-0.12.6.1-2.almalinux9.x86_64.rpm

La version de wkhtmlpdf doit avoir été compilée avec le support de la librairie qt.

Il est possible de vérifier que le patch QT soit appliqué avec la commande suivante

wkhtmltopdf -v 2>&1 | grep qt

wkhtmltopdf 0.12.6 (with patched qt)

Afin que les documents PDF générés par Dokos soient conformes à leur version HTML, il conviendra également d'installer les polices Truetype Microsoft avec la commande suivante:

dnf localinstall https://www.itzgeek.com/msttcore-fonts-2.0-3.noarch.rpm

Installation de l'ERP Dokos

L'ERP Dokos est un fork de erpnext, lui même basé sur le framework Frappe. Le framework Frappe s'administre avec l'outil bench (aussi nommé docli chez Dokos).

Création de l'utilisateur dédié

Afin d'améliorer la sécurité, dokos devrait être installé en tant qu'utilisateur non root.

Création d'un utilisateur dédié dont le dossier utilisateur sera stocké dans /var/dokos

user-add --home-dir /var/dokos -G wheel dokos
# Création d'un mot de passe pour l'utilisateur dokos
passwd dokos
su - dokos

Installation du Framework docli (Frappe Bench)

Afin que l'installation se déroule avec succès, il est conseillé de régler temporairement les variables linguistiques sur le standard C, afin que les scripts d'installations automatisés reçoivent des sorties standards des commandes telles que date sans se soucier de la langue.

# En tant qu'utilisateur dokos
export LC_ALL=C.UTF-8
cd /var/dokos && sudo python3 -m pip install dokos-cli

Cette opération installera une copie locale de docli qui est un alias de bench

Création d'une nouvelle instance Dodock (Frappe framework)

# En tant qu'utilisateur dokos
cd /var/dokos && docli init --frappe-branch master dokos-erp

Le résultat devrait ressembler à ceci:

$ /usr/local/bin/virtualenv --quiet env -p python3
$ /var/dokos/dokos-erp/env/bin/python -m pip install --quiet --upgrade pip
Getting dodock
$ git clone https://gitlab.com/dokos/dodock.git --branch master --depth 1 --origin upstream
Clonage dans 'dodock'...
remote: Enumerating objects: 4828, done.
remote: Counting objects: 100% (4828/4828), done.
remote: Compressing objects: 100% (4556/4556), done.
remote: Total 4828 (delta 447), reused 2995 (delta 197), pack-reused 0
Réception d'objets: 100% (4828/4828), 21.74 Mio | 13.96 Mio/s, fait.
Résolution des deltas: 100% (447/447), fait.
Installing frappe
$ /var/dokos/dokos-erp/env/bin/python -m pip install --quiet --upgrade -e /var/dokos/dokos-erp/apps/frappe
$ yarn install
yarn install v1.22.18
[1/4] Resolving packages...
[2/4] Fetching packages...
[3/4] Linking dependencies...
warning " > @fullcalendar/vue@5.10.1" has incorrect peer dependency "vue@^2.6.12".
warning " > bootstrap@4.5.0" has unmet peer dependency "jquery@1.9.1 - 3".
warning " > bootstrap@4.5.0" has unmet peer dependency "popper.js@^1.16.0".
[4/4] Building fresh packages...
Done in 15.04s.
$ bench build
yarn run v1.22.18
$ FRAPPE_ENV=production node rollup/build.js
clean: postcss.plugin was deprecated. Migration guide:
https://evilmartians.com/chronicles/postcss-8-plugin-migration
Production mode
✔ Built js/moment-bundle.min.js
✔ Built js/libs.min.js

Building frappe assets...

✔ Built js/checkout.min.js
✔ Built js/dialog.min.js
✔ Built js/user_profile_controller.min.js
✔ Built js/frappe-vue.min.js
✔ Built js/bootstrap-4-web.min.js
✔ Built js/barcode_scanner.min.js
Browserslist: caniuse-lite is outdated. Please run:
npx browserslist@latest --update-db
Browserslist: caniuse-lite is outdated. Please run next command `yarn upgrade caniuse-lite browserslist`
✔ Built css/frappe-rtl.css
✔ Built js/frappe-recorder.min.js
✔ Built css/report.min.css
✔ Built js/web_form.min.js
✔ Built css/web_form.css
✔ Built css/frappe-chat-web.css
✔ Built js/report.min.js
✔ Built js/data_import_tools.min.js
✔ Built js/chat.js
✔ Built js/frappe-web.min.js
✔ Built js/desk.min.js
✔ Built js/events-portal.min.js
✔ Built js/list.min.js
✔ Built css/printview.css
✔ Built js/control.min.js
✔ Built css/website-calendar.min.css
✔ Built css/email.css
✔ Built css/login.css
✔ Built css/frappe-web-b4.css
✔ Built js/form.min.js
✔ Built css/desk.min.css
✨ Done in 111.635s
Done in 113.26s.
SUCCESS: Bench dokos-erp initialized

Installation des dépendances python du framework Frappe

Au lieu d'une installation en tant que site-packages, les dépendances du framework Frappe seront installés directement dans l'environnement virtuel python crée pour le framework.

# En tant qu'utilisateur dokos
python3 -m venv /var/dokos/dokos-erp/env
/var/dokos/dokos-erp/env/bin/python -m pip install --upgrade -e /var/dokos/dokos-erp/apps/frappe

Installation de l'application ERP dokos

UNe fois le framework configuré, il sera alors possible d'installer dokos comme suit

# En tant qu'utilisateur dokos
cd /var/dokos/dokos-erp && docli get-app --branch master https://gitlab.com/dokos/dokos

La sortie devrait ressembler à ceci:

Getting dokos
$ git clone https://gitlab.com/dokos/dokos --branch master --depth 1 --origin upstream
Cloning into 'dokos'...
warning: redirecting to https://gitlab.com/dokos/dokos.git/
remote: Enumerating objects: 5773, done.
remote: Counting objects: 100% (5773/5773), done.
remote: Compressing objects: 100% (4740/4740), done.
remote: Total 5773 (delta 1454), reused 3419 (delta 796), pack-reused 0
Receiving objects: 100% (5773/5773), 17.10 MiB | 17.00 MiB/s, done.
Resolving deltas: 100% (1454/1454), done.
Installing erpnext
$ /var/dokos/dokos-erp/env/bin/python -m pip install --quiet --upgrade -e /var/dokos/dokos-erp/apps/erpnext
$ yarn install
yarn install v1.22.18
[1/4] Resolving packages...
[2/4] Fetching packages...
[3/4] Linking dependencies...
[4/4] Building fresh packages...
Done in 1.53s.
$ bench build --app erpnext
yarn run v1.22.18
$ FRAPPE_ENV=production node rollup/build.js --app erpnext
clean: postcss.plugin was deprecated. Migration guide:
https://evilmartians.com/chronicles/postcss-8-plugin-migration
Production mode
✔ Built js/moment-bundle.min.js
✔ Built js/libs.min.js

Building erpnext assets...

✔ Built js/erpnext-web.min.js
✔ Built js/item-dashboard.min.js
✔ Built js/erpnext.min.js
✔ Built js/portal-payments.min.js
✔ Built js/point-of-sale.min.js
Browserslist: caniuse-lite is outdated. Please run:
npx browserslist@latest --update-db
Browserslist: caniuse-lite is outdated. Please run next command `yarn upgrade caniuse-lite browserslist`
✔ Built css/erpnext-web.css
✔ Built css/erpnext.css
✔ Built js/bank-reconciliation.min.js
✔ Built js/bank-transaction-importer.min.js
✔ Built js/portal-calendars.min.js
✔ Built js/resource-calendar.min.js
✨ Done in 38.242s
Done in 39.81s.

Note: L'erreur suivante peut apparaître

ERROR: pip's dependency resolver does not currently take into account all the packages that are installed. This behaviour is the source of the following dependency conflicts. frappe 2.13.0 requires PyJWT~=1.7.1, but you have pyjwt 2.3.0 which is incompatible.

Création d'un site

Par défaut, l'application dokos installée sur le framework n'est pas accessible publiquement.

Il convient de créer un site (nom de domaine) sur lequel le framework servira les applications qu'il héberge.

Le nom du site devra respecter la nomenclature DNS et pourra être un FQDN arbitraire (exemple: erp.masociete.local) ou un FQDN attaché à un nom de domaine existant (exemple: erp.monsite-societe.fr)

# En tant qu'utilisateur dokos
cd /var/dokos/dokos-erp && docli new-site <FQDN DE VORTE SITE>
docli --site <FQDN DE VOTRE SITE> set-config hostname http://<FQDN DE VOTRE SITE]

Dans le cas d'un FQDN arbitraire qui n'est pas résolu par un serveur DNS, il faudra ajouter les entrées suivantes au fichier /etc/hosts permettant au serveur local de résoudre le nom du site

127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4 <FQDN DE VOTRE SITE>
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6 <FQDN DE VOTRE SITE>

La sortie de la commande de création de site devrait ressembler à ceci:

MySQL root password:

Installing frappe...
Updating DocTypes for frappe : [========================================] 100%
Updating country info : [========================================] 100%
Set Administrator password:
Re-enter Administrator password:
*** Scheduler is disabled ***
Current Site set to <FQDN DE VOTRE SITE>

Installation de l'application dokos sur le site crée

# En tant qu'utilisateur dokos
cd /var/dokos/dokos-erp && docli --site <FQDN DE VOTRE SITE> install-app dokos

La sortie devrait ressembler à ceci:

Installing erpnext...
Updating DocTypes for erpnext : [========================================] 100%
Updating customizations for Address
Updating customizations for Contact
Updating customizations for Payment Gateway

Fin d'installation

L'installation de l'ERP dokos est terminée et vous pouvez mettre fin à la session de l'utilisateur dokos.

# Redevenir utilisateur root
exit

A partir d'ici, vous pouvez tester dokos en mode développement ou alors configurer le serveur en mode production.

Optionnel: Démarrage du framework et l'ensemble des sites en mode développement

# En tant qu'utilisateur root
sudo -u dokos "cd /var/dokos/dokos-erp && docli start"

Remarque: Si les logs sont remplis d'erreurs de type ENOSPC, il faudra vérifier la configuration du nombre de noeuds inotify (voir ci-dessus) et vérifier l'espace disque disponible.

Dokos sera servi sur le port 8000. Il faudra donc configurer le parefeu.

# En tant qu'utilisateur root
firewall-cmd --add-port=8000/tcp

Cette commande ouvrira le port 8000 jusqu'au redémarrage du serveur. Si aucune mise en production aura lieu sur ce serveur, il sera possible de configurer de rendre cette configuration permanente

# En tant qu'utilisateur root
firewall-cmd --runtime-to-permanent

L'environnement dokos sera disponible à l'adresse http://[IP-DU-SERVEUR]:8000

Mise en production

Configuration de l'environnement de production

Ajout des dépendances nécessaires à la mise en production

Le dépot EPEL est repuis pour fail2ban et supervisor.

# En tant qu'utilisateur root
dnf install -y epel-release
dnf install -y fail2ban nginx supervisor

Droits d'accès

# En tant qu'utilisateur root
chmod 750 /var/dokos
usermod -aG dokos nginx

Configuration SELinux

Le système de production crée un lien symbolique du fchier nginx de configuration local vers le dossier de configuration nginx.

Il est nécessaire de changer le contexte de sécurité SELinux pour autoriser le chargement de ce fichier par nginx hors du dossier /etc/nginx.

# En tant qu'utilisateur root
semanage fcontext -a -t httpd_config_t /var/dokos/dokos-erp/config/nginx.conf
restorecon -Rv /var/dokos/dokos-erp/config/nginx.conf

Il faudra également autoriser nginx à se connecter à internet:

# En tant qu'utilisateur root
setsebool -P httpd_can_network_connect 1

Enfin, il faudra rendre le dossier sites lisible pour nginx:

# En tant qu'utilisateur root
site=[NOM SITE DOKOS]
http_ro_content=(/var/dokos/dokos-erp/sites/assets /var/dokos/dokos-erp/apps/frappe/frappe/public /var/dokos/dokos-erp/apps/erpnext/erpnext/public /var/dokos/dokos-erp/apps/erpnext/node_modules /var/dokos/dokos-erp/apps/frappe/node_modules /var/dokos/dokos-erp/sites/$site/public)
http_rw_content=(/var/dokos/dokos-erp/sites/$site/public/files /var/dokos/dokos-erp/sites/$site/private/files)
for path in ${http_ro_content[@]}; do semanage fcontext -a -t httpd_sys_content_t "${path}(/.*)?"; restorecon -Rv "${path}"; done
for path in ${http_rw_content[@]}; do semanage fcontext -a -t httpd_sys_rw_content_t "${path}(/.*)?"; restorecon -Rv "{$path}"; done

Setup automatisé production Dokos

Choix de la gestion des services

Afin de vérifier la bonne exécution de l'ensemble des services, il faudra choisir entre utiliser des services systemd ou utiliser supervisord. Dans ce guide, nous utiliserons supervisord.

# En tant qu'utilisateur dokos
cd /var/dokos/dokos-erp && docli setup supervisor

Setup de production

Note: les patchs https://gitlab.com/dokos/docli/-/merge_requests/2 https://gitlab.com/dokos/docli/-/merge_requests/3 et https://gitlab.com/dokos/docli/-/merge_requests/4 doivent être intégrés.

L'action suivante configurera supervisord et nginx:

# En tant qu'utilisateur dokos
cd /var/dokos/dokos-erp && sudo env "PATH=$PATH" docli setup production dokos

Vérification

Afin de vérifier que l'ensemble des processus nécessaires au fonctionnement de dokos sont actifs, il faudra exécuter les commandes suivantes:

supervisorctl status
systemctl status nginx

Setup services supplémentaires

Firewall

Pour un serveur de production, il faudra ouvrir les ports HTTP et HTTPS de manière permanente:

# En tant qu'utilisateur dokos
cd /var/dokos/dokos-erp && sudo env "PATH=$PATH" docli setup firewall

Fail2ban

Fail2ban permettra de bannir une IP tentant une authentification par brute force

# En tant qu'utilisateur dokos
cd /var/dokos/dokos-erp && sudo env "PATH=$PATH" docli setup fail2ban

CC-BY-SA 3.0