Maîtriser ses données numériques

Contenu

Le titre du projet est un peu vendeur mais l’idée est là. J’aurais aussi pu l’appeler « Maîtriser ses données numériques version 4 ».

J’ai commencé ce projet bien avant l’avènement de l’ADSL en France avec un bon vieux modem 56k. Sans ADSL (ou fibre optique) point de serveur hébergé à domicile (ou la facture de téléphone risque d’être salée). A l’époque, j’ai quitté club-internet pour Free qui proposait des services Web (HTTP, FTP) inclus dans le forfait. Mon premier site web était né.

Avec l’ADSL et le dégroupage, il a était enfin possible d’avoir son premier serveur à domicile.  J’ai crée la deuxième version de ce projet sur un QNAP TS-109 équipé d’un CPU Marvell 5182 500MHz sur lequel j’ai installé :

  • Apache2 pour le serveur Web
  • MySQL comme base de donnée
  • Joumla comme système de gestion de contenu
  • eyeOS v2 pour les applications infonuagiques
  • phpBB pour le Forum de discussion intégré à Joumla
  • Gallery3 pour les photos
  • Asterix pour la téléphonie sur IP
  • xDove pour le service mail
  • uMurmur pour les conférences téléphoniques sur IP

Pour la version 3, j’ai opté pour QNAP TS-269 Pro avec un Intel Atom D2700 et une extension mémoire de 2Go pour un total de 3Go (soit 12 fois plus que le QNAP TS-109). J’avais passé trop de temps à faire fonctionner et mettre à jour les applications sur le QNAP TS-109 et son CPU Marvell (Sans parler du manque de mémoire).

  • Deux disques durs en RAID 1
  • Apache2 pour le serveur Web
  • MySQL comme base de donnée
  • Joumla comme système de gestion de contenu
  • phpBB pour le Forum de discussion intégré à Joumla
  • Piwigo pour les photos
  • uMurmur pour les conférences téléphoniques sur IP
  • ownCloud pour le stockage et le partage de fichiers et d’applications infonuagiques

Malgré les précautions prises pour essayer de prendre un équipent plus évolutif que dans la version 2, je me suis vite rendu compte que j’étais une fois de plus confronté au même problème. La plateforme hardware de QNAP est trop fermée. Il n’est pas facile de garder des applications à jour. Même si QNAP a fait de grosses améliorations sur son système de gestion intégré au NAS et proposé un nombre important de services clefs en mains. Je me suis rendu compte que mes besoins était toujours refrénés par les limitations des composants logiciels du NAS. Impossible de compiler un driver USB pour faire fonctionner mon dongle Z-Wave, presque un an pour proposer une version de la librairie openssl qui corrigeait la faille Heartbleed. De plus QNAP propose un certain nombre de service payant autour du cloud et ne favorise pas tellement les solutions autonomes. Autant de points qui ont motivé mon choix pour monter mon propre NAS.

Je ne pense pas que la partie hardware nécessite de s’attarder. Ne sachant pas exactement la liste des services que je voulais faire tourner sur le serveur, je ne me suis pas limité sur la puissance. Au détriment de la consommation électrique. Un revirement dans mes choix précédents où j’avais placé la consommation en haut de ma liste des priorités. Un revirement que je justifie par mon expérience passé et le fait que le temps c’est de l’argent : il vaut mieux que je paye un peu plus d’électricité plutôt que de passer des heures à porter des applications sur un système minimaliste.

Donc, hormis le boîtier et l’alimentation, j’ai acheté le reste des composant en fonction des promotions du moment.

  • Boitier Fractal Design Core 500 (250 x 213 x 380 mm)
  • Alimentation Corsair SF450 – Modulaire – 450W – Or – SFX (100 x 125 x 63 mm) 
  • Carte mère Gigabyte GA-Z270N-WIFI
  • Processeur Intel Skylake Processeur Pentium G4400 3.3 GHz 3Mo Cache Socket 1151
  • Barrette mémoire Crucial DDR4 2 x 4 Go 2133 MHz CAS 15
  • Deux disques durs 3.5 Seagate IronWolf – 4 To
  • Disque dur 3.5 – 1 To
  • Unité de stockage SSD Intel 600P Series M.2 – 128 Go (Interface PCIe NVMe 3.0 x4)

J’ai choisi le boîtier Core 500 en connaissance de cause. C’est un boîtier compact mais qui n’ai pas le mieux adapté pour faire un serveur. Le câblage des disques durs est un peu difficile. Pour compenser, j’ai opté pour une alimentation SFX, plus petite que le format ATX ou Micro-ATX, mais qui demande de bricoler un peu les fixations du boîtier (rien de trop compliqué). Ainsi j’ai pu installer 3 disques durs 3.5. Il reste de la place dans le boîtier pour un quatrième disque dur 3.5, deux disque durs 2.5 et une carte graphique (l’alimentation est un peu juste s’il faut installer une carte graphique).

 

Serveur NAS

 


Installer Debian 8 (Jesie) ou supèrieure sur un disque M2 NVME

Télécharger la version de Debian adaptée au matèriel

Pour savoir quelle image il faut télécharger, il faut connaitre l’architecture de votre processeur.
Pour une carte mère Gigabyte Z270N-WiFi, il faut télécharger l’image pour l’architecture amd64.

Sur les architectures i386 et amd64, toutes les images de CD ou DVD peuvent être aussi utilisées sur des clefs USB.

La version stable de Debian peut être téléchargée depuis https://www.debian.org/distrib/. Il existe plusieurs format taille d’image en fonction du mode d’installation: CD minimal, CD, DVD (En génarale l’image du 1er DVD est suffisante pour installer le système). Si vous pouvez benificier d’un accès internet sur l’ordinateur cible lors de l’installation, l’image de taille réduite est suiffisante. Les modules nécessaires, à votre installation, seront téléchargés depuis Internet lors de l’instalation de Debian.



Télécharger Debian

La version de test de Debian peut être téléchargée depuis https://www.debian.org/devel/debian-installer/.

Créer une clef USB bootable pour installer Debian

La carte mère Gigabyte Z270N-WiFi supporte par défaut l’UEFI mais ne boot pas si l’image Debian est crée dans une partion de la clé.

Inserrer la clef USB et supprimer toutes les partions présentes sur la clef avec gparted ou un autre lociel de partition (sur la capture d’écran la partition à déjà été supprimée).

#> sudo gparted



gparted

Copier l’image Debian téléchargée depuis le site officiel sur la clef USB depuis le gestionaire de fichier.

Clique gauche sur le fichier iso pour afficher le menu contextuel : Ouvrir avec -> Enregistreur d’images disque.


Enregistreur d'image disque

Sélectioner la clé dans la lsite des desitnations et démarrer la restauration…



Restaurer l'image sur la clef USB

Installer Debian sur l’ordinateur

Démarrer l’ordinateur avec la clé insérée dans le port USB. Appuyer sur la touche F12 au démarrage de l’ordinateur pour pouvoir sélectioner la clé disque de démarrage.

Avec Debian 8 (jessie)

La version Jesie (8) de Debian ne s’installe pas bien sur les disque NVME. L’installation de Grub retourne une erreur.

Il faut donc interrompre l’installation de Debian juste avant l’installation de Grub.

Dans le menu d’installation choisir les options avancées et l’installation en mode expert pour pouvoir interrompre l’installation avan Grub.

Lors de linstallation, il faut sélectionner l’option backported pour installer la dernière version du noyau linux et des drivers UEFI pour le NVME

Arrivé à l’étape d’installation de Grub, sauter l’étape pour lancer le shell et monter manuellement les répertoires système sur le disque NVME (target)

#> cd /target
#> mount -t proc proc proc/
#> mount --rbind /sys sys/
#> mount --rbind /dev dev/
#> mount --rbind /run run/

Lancer un shell en mode root pour installer la dernière version du noyau (Linux 4.9.0)

#> chroot . /bin/bash
#> apt-get update
#> apt-get -t jessie-backports install linux-image-amd64
#> apt-get -t jessie-backports install grub-efi-amd64
#> update-grub
#> grub-install

Pour sortir du shell root et retourner à l’interface d’installation, il faut executer deux la commande exit

#> exit
#> exit

Finir l’installation et retirer la clé pour que l’ordinateur reboot sur le disque M2 NVME.

Avec Debian 9 (Stretch) ou supérieur

Après la version 8 de Debian, la version de Grub supporte les disques NVME. L’installation est donc plus facile qu’avec la version 8 de Debian et il n’est pas nécessaire de selectionner le mode expert pour installer Debian.

J’ai testé l’installation de Debian avec la version 9.5 (Buster) mais normalement Grub de la version 9 (Stretch) de Debian supporte les disque NVME (puisque qu’ils sont déjà supportés dans la version backport de Jessie – voir le chapitre précédent).

Déplacer les répertoires home sur un disque RAID1

Redémarrer l’ordianteur en mode "single user". Au démarage choisire les options avancée puis le démarage en mode rescue (qui est lancé en mode single user).

#> mkdir /mnt/data

#> mount /dev/mapper/RAID1_4TO_V1-data    /mnt/data

Copier les données du répertoire home vers le répertoire de destination en gardant les permissions et supprimant les fichiers suplémentaires dans le répertoire de destiantion

#> rsync -avp --delete /home /mnt/home

Renomer le répertoire d’origine (le supprimer quand tout sera bien opérationnel)

#> mv /home /home.bak

#> mkdir /home

#> nano /etc/fstab

/dev/mapper/RAID1_4TO_V1-data    /mnt/data    ext4    usrquota,grpquota    0    2
# BINDS
/mnt/data/home    /home    none    bind    0   0

#> reboot

Déplacer les répertoire var et tmp sur un autre disque (partition)

Le disque /dev/sdb va être utilisé pour monter le répertoire tmp (sdb1) et var (sdb2).
La troisième partition (sdb3) du disque servira de stoquage pour des sauvegardes.

 #> fdisk -l

Disque /dev/nvme0n1 : 119,2 GiB, 128035676160 octets, 250069680 secteurs
Unités : secteur de 1 × 512 = 512 octets
Taille de secteur (logique / physique) : 512 octets / 512 octets
taille d'E/S (minimale / optimale) : 512 octets / 512 octets
Type d'étiquette de disque : gpt
Identifiant de disque : BE777995-5D3A-4E16-87D8-62D5E23CC767

Device           Start       End   Sectors   Size Type
/dev/nvme0n1p1    2048   1050623   1048576   512M EFI System
/dev/nvme0n1p2 1050624   1550335    499712   244M Linux filesystem
/dev/nvme0n1p3 1550336 250068991 248518656 118,5G Linux LVM

Disque /dev/sda : 3,7 TiB, 4000787030016 octets, 7814037168 secteurs
Unités : secteur de 1 × 512 = 512 octets
Taille de secteur (logique / physique) : 512 octets / 4096 octets
taille d'E/S (minimale / optimale) : 4096 octets / 4096 octets
Disque /dev/sdb : 931,5 GiB, 1000204886016 octets, 1953525168 secteurs
Unités : secteur de 1 × 512 = 512 octets
Taille de secteur (logique / physique) : 512 octets / 512 octets
taille d'E/S (minimale / optimale) : 512 octets / 512 octets
Type d'étiquette de disque : dos
Identifiant de disque : 0x0c7ce4e4

Device     Boot     Start        End    Sectors   Size Id Type
/dev/sdb1            2048   41945087   41943040    20G 83 Linux
/dev/sdb2        41945088  209717247  167772160    80G 83 Linux
/dev/sdb3       209717248 1951428607 1741711360 830,5G 83 Linux

Disque /dev/sdc : 3,7 TiB, 4000787030016 octets, 7814037168 secteurs
Unités : secteur de 1 × 512 = 512 octets
Taille de secteur (logique / physique) : 512 octets / 4096 octets
taille d'E/S (minimale / optimale) : 4096 octets / 4096 octets
Disque /dev/md0 : 3,7 TiB, 4000652787712 octets, 7813774976 secteurs
Unités : secteur de 1 × 512 = 512 octets
Taille de secteur (logique / physique) : 512 octets / 4096 octets
taille d'E/S (minimale / optimale) : 4096 octets / 4096 octets
Disque /dev/mapper/monnas--vg-root : 110,6 GiB, 118765912064 octets, 231964672 secteurs
Unités : secteur de 1 × 512 = 512 octets
Taille de secteur (logique / physique) : 512 octets / 512 octets
taille d'E/S (minimale / optimale) : 512 octets / 512 octets
Disque /dev/mapper/monnas--vg-swap_1 : 7,9 GiB, 8472494080 octets, 16547840 secteurs
Unités : secteur de 1 × 512 = 512 octets
Taille de secteur (logique / physique) : 512 octets / 512 octets
taille d'E/S (minimale / optimale) : 512 octets / 512 octets
Disque /dev/mapper/RAID1_4TO_V1-data : 3,7 TiB, 3999688294400 octets, 7811891200 secteurs
Unités : secteur de 1 × 512 = 512 octets
Taille de secteur (logique / physique) : 512 octets / 4096 octets
taille d'E/S (minimale / optimale) : 4096 octets / 4096 octets

Créer les répertoires qui serviront de point de montage.

#> mkdir /mnt/var /mnt/tmp /mnt/backups

Monter les répertoires tmp et var

#> mount /dev/sdb1 /mnt/tmp
#> mount /dev/sdb2 /mnt/var

Copier les données existantes vers les nouveaux point de montage en concervant les

#> rsync -aAXv /var/ /mnt/var
#> rsync -aAXv /tmp/ /mnt/tmp

#> ls -la /mnt/var
total 44
drwxr-xr-x 11 root root  4096 avril 12 19:34 .
drwxr-xr-x  5 root root  4096 avril 12 20:36 ..
drwxr-xr-x  2 root root  4096 déc.  28 18:42 backups
drwxr-xr-x  8 root root  4096 avril 12 19:44 cache
drwxr-xr-x 32 root root  4096 avril 12 19:54 lib
drwxrwsr-x  2 root staff 4096 déc.  28 18:42 local
lrwxrwxrwx  1 root root     9 avril 12 19:34 lock -> /run/lock
drwxr-xr-x  6 root root  4096 avril 12 19:54 log
drwxrwsr-x  2 root mail  4096 avril 12 19:34 mail
drwxr-xr-x  2 root root  4096 avril 12 19:34 opt
lrwxrwxrwx  1 root root     4 avril 12 19:34 run -> /run
drwxr-xr-x  5 root root  4096 avril 12 19:44 spool
drwxrwxrwt  2 root root  4096 avril 12 19:53 tmp

Renomer les répertoires d’origine. Il pourront être supprimé quand le déplacement sera bien testé.

#> mv /var /var.old
#> mv /tmp /tmp.old

Créer les nouveaux répertoire qui serviront de point de montage et modifier le fstab pour monter automatiquement le disque et les répertoires au démarrage.

#> mkdir /var /tmp
#> umount /mnt/var
#> umount /mnt/tmp
#> mount /dev/sdb1 /tmp
#> mount /dev/sdb2 /var

#> nano /etc/fstab

# /etc/fstab: static file system information.
#
# Use 'blkid' to print the universally unique identifier for a
# device; this may be used with UUID= as a more robust way to name devices
# that works even if disks are added and removed. See fstab(5).
#
# <file system> <mount point>   <type>  <options>       <dump>  <pass>
/dev/mapper/monnas--vg-root /               ext4    errors=remount-ro 0       1
# /boot was on /dev/nvme0n1p2 during installation
UUID=87c763b1-21c8-45da-a5be-ed0c023a3888 /boot           ext2    defaults        0       2
# /boot/efi was on /dev/nvme0n1p1 during installation
UUID=0AB6-6AB0  /boot/efi       vfat    umask=0077      0       1
/dev/mapper/monnas--vg-swap_1 none            swap    sw              0       0

/dev/mapper/RAID1_4TO_V1-data   /mnt/data       ext4    usrquota,grpquota       0       2
/dev/sdb1       /tmp    ext4    defaults        0       0
/dev/sdb2       /var    ext4    defaults        0       0
/dev/sdb3       /mnt/backups    ext4    defaults        0       0
# BINDS
/mnt/data/home  /home   none    bind    0       0

Supprimer les répertoires temporaire créé pour la resynchro des données et tester la configuration du fstab

#> rmdir /mnt/var /mnt/tmp
#> mount -a
#> reboot



Références :

Intel-750-SSD-in-Debian-Jessie


Installer Webmin sur Debian

Installer webmin depuis le dépot APT sur Debian 8 (Jessie)

Ajouter le dépot webmin au gestionaire d’application d’ubuntu server

#> shh <user>@<ip_address>

#> su -

#> echo "deb http://download.webmin.com/download/repository sarge contrib" > /etc/apt/sources.list.d/webmin.list

Installer la clef du dépot dans le gestionaire

#> cd /root

#> wget http://www.webmin.com/jcameron-key.asc

#> ls -l
total 4
-rw-r--r-- 1 root root 1320 déc.   5  2002 jcameron-key.asc

#> apt-key add jcameron-key.asc

#> apt-get update

Vérifier la version de webmin

#> apt-cache policy webmin
webmin:
  Installé : (aucun)
  Candidat : 1.831
 Table de version :
     1.831 0
        500 http://download.webmin.com/download/repository/ sarge/contrib amd64 Packages

Installer webmin

#> apt-get install apt-transport-https webmin

Utiliser webmin depuis le navigateur (Firefox) : https://192.168.1.23:10000/

Il est possible de se connecter avec le nom et le mot de passe root.

Gestion des quotas utilisateur avec le module "Disk quotas" de Webmin

La gestion des quotas par utilisateur est utile au niveau des serveurs. Si vous avez créé plusieurs comptes utilisateurs et que vous ne voulez pas qu’un seul utilisateur puisse occuper tout l’espace disque, il faut alors définir desquotas qui apporteront une limitation en terme d’espace disque utilisé.

La gestion des quotas peut aussi être utilisée au niveau des groupes. Par exemple, chaque utilisateur du projet Albireo dispose d’un certain espace disque, et le dossier commun du projet Albireo dispose lui aussi d’une taille maximale afin de permettre au projet Denebola d’exister.

Pour pouvoir activer le module "Disk quotas" de Webmin, il faut installer quota et quotatool sur Debian puis activer le module depuis Webmin (Un-used Modules -> Disk Quotas)

#> apt-get install quota quotatool 

Webmin: Disque Quotas

Installer des modules Webmin standard

Depuis "Webmin -> Webmin Configuration -> Webin Modules", selectionner l’option "Standard module fromwww.webmin.com" et cliquer sur l’icon pour choisir le nom du module à installer.

Si la configuration ce module est déjà configuré dans les "Un-used Modules", la configuration ne sera pas perdu.


Références :

www.webmin.com

Main page

Webmin And Quota configuration in debian


Installer Nginx 1.9.10 avec PHP7-fpm sur Debian 8 (Jesie)

Installer Nginx depuis jessie-backports

Installer le serveur web Nginx depuis le dépôt officiel sous Debian

:$ apt-get update && apt-get -t jessie-backports install nginx

:$ apt-cache policy nginx
nginx:
  Installé : 1.9.10-1~bpo8+4
  Candidat : 1.9.10-1~bpo8+4
 Table de version :
 *** 1.9.10-1~bpo8+4 0
        100 http://ftp.fr.debian.org/debian/ jessie-backports/main amd64 Packages
        100 /var/lib/dpkg/status
     1.6.2-5+deb8u4 0
        500 http://ftp.fr.debian.org/debian/ jessie/main amd64 Packages
        500 http://security.debian.org/ jessie/updates/main amd64 Packages

Vérifier la version de Nginx

:$ nginx -v
nginx version: nginx/1.9.10

Retrouver le nombre de core du système

:$ nproc
2

Retrouver la limite système du nombre de fichier ouvert par processus

:$ ulimit -n
65536

Ajuster le nombre de Nginx worker_processes en fonction des caractéristique matèriel du sever (une pratique commune est de prendre 1 worker process par core).

Ajuster le nombre de connection simultannée que Nginx accèpte par worker process.

:$ nano /etc/nginx/nginx.conf
user www-data;
worker_processes auto;
pid /run/nginx.pid;

events {
        worker_connections 768;
        # multi_accept on;
}

events {
    worker_connections  768;
}

#worker_rlimit_nofile    1024;  # 2 *  worker_connections

Installer le module Nginx dans Webmin (optionnel)

Depuis Webmin -> Webmin Configuration -> Webmin Modules

L’installation avec « Third party module from » et en filtrant sur Nginx n’a pas fonctionnée.

J’ai télécharger le fichier depuis Internet sur mon pc et utilisé l’option « From uploaded file »

Sur le site Webmin Télécharger le module Nginx : http://www.webmin.com/third.html

Le module Nginx webserver est installé dans /usr/share/webmin/nginx (92 kB) sous la catégorie Servers.

Recharger la page Wedmin pour que Nginx webserver soit visible dans la catégorie Servers de Webmin :Webmin: Nginx Webserver

Installer php7.1-fpm depuis le dépôt de Ondřej Surý

Vérifier si php5 est installé et le desinstaller le cas échéant

:$ apt-cache policy php5 php5-fpm
php5:
  Installé : (aucun)
  Candidat : 5.6.30+dfsg-0+deb8u1
 Table de version :
     5.6.30+dfsg-0+deb8u1 0
        500 http://security.debian.org/ jessie/updates/main amd64 Packages
     5.6.29+dfsg-0+deb8u1 0
        500 http://ftp.fr.debian.org/debian/ jessie/main amd64 Packages
php5-fpm:
  Installé : (aucun)
  Candidat : 5.6.30+dfsg-0+deb8u1
 Table de version :
     5.6.30+dfsg-0+deb8u1 0
        500 http://security.debian.org/ jessie/updates/main amd64 Packages
     5.6.29+dfsg-0+deb8u1 0
        500 http://ftp.fr.debian.org/debian/ jessie/main amd64 Packages

Debian 8 ne propose pas la version 7.1 de php-fpm.

Ajouter le dépôt de Ondřej Surý au gestionaire de paquets. Il est l’administrateur officiel de Debian pour les paquets PHP principaux (core) et d’atutres modules PHP.

:$ apt-get update && apt-get install apt-transport-https lsb-release ca-certificates
:$ wget -O /etc/apt/trusted.gpg.d/php.gpg https://packages.sury.org/php/apt.gpg
:$ echo "deb https://packages.sury.org/php/ $(lsb_release -sc) main" > /etc/apt/sources.list.d/php.list
:$ apt-get update

Vérifier la version de php7.1-fpm

:$ apt-cache policy php7.1-fpm
php7.1-fpm:
  Installé : (aucun)
  Candidat : 7.1.2-1+0~20170217124815.15+jessie~1.gbp510ca7
 Table de version :
     7.1.2-1+0~20170217124815.15+jessie~1.gbp510ca7 0
        500 https://packages.sury.org/php/ jessie/main amd64 Packages

Installler PHP 7.0 pour Nginx et quelques modules utiles pour Nextcloud :

:$ apt-get install php7.1-fpm php7.1-xml php7.1-zip php7.1-bz2 php7.1-mbstring php7.1-imap php7.1-gd php7.1-curl php7.1-cli php7.1-intl php7.1-mcrypt php7.1-imagick php7.1-ldap php7.1-mysqlnd

Vérifier la version de PHP :

:$ php -v
PHP 7.1.2-1+0~20170217124815.15+jessie~1.gbp510ca7 (cli) (built: Feb 17 2017 13:15:28) ( NTS )
Copyright (c) 1997-2017 The PHP Group
Zend Engine v3.1.0, Copyright (c) 1998-2017 Zend Technologies
    with Zend OPcache v7.1.2-1+0~20170217124815.15+jessie~1.gbp510ca7, Copyright (c) 1999-2017, by Zend Technologies

la version retourné est celle utilisé par les ligne de commande CLI pour connaitre la version utilisé par le site web il est préférable d’utiliser phpinfo()

Une fois les différents modules installés, il est important d’ajuster la configuration de PHP-FPM à Nginx et MariaDB.


Références :

installer-php-7-debian-8-jessie-depot-dotdeb

deb.sury.org

packages.sury.org

installing-php-7-1


Configurer PHP-FPM pour fonctionner avec Nginx et MariaDB

Dans ce tutoriel, PHP-FPM doit être déjà installé sur le serveur. Ajuster les lignes de commandes en fonction de la version de PHP-FPM installée sur votre serveur.

$: service --status-all | grep -i fpm
 [ + ]  php7.1-fpm

Pour savoir où est le fichier php.ini utilisé par les commandes CLI

:$ php -i | grep 'php.ini'
Configuration File (php.ini) Path => /etc/php/7.1/cli
Loaded Configuration File => /etc/php/7.1/cli/php.ini

Pour retrouver le fichier php.ini utilisé par le serveur web, une solution est d’afficher le résultat de la fonction PHP <?php phpinfo();?> dans une page Web. Sur mon serveur le fichier est /etc/php/7.1/fpm/php.ini

Configurer PHP-FPM

La litérature du web laisse entendre que l’utilisation de socket unix plutôt que TCP améliore les perfomances avec PHP. Je n’ai pas vérifier ce point mais j’ai pris le parti pour l’instant d’utiliser les socket unix. Une socket unix est un « fichier » qui va remplacer la communication la stack protolaire TCP.

Attention, il faut les définir le fichier « socket » sur un disque mémoire et pas sur un disque physique au risque de voir les performance et la durée de vie du disque juter drastiquement (ex: /run sous debian qui est monté par défaut sur un disque mémoire).

Configurer les informations suivantes dans le fichier de conifguration de PHP-FPM (faire une copie du fichier avant de le modifier)

:$ cp /etc/php/7.1/fpm/pool.d/www.conf /etc/php/7.1/fpm/pool.d/www.conf.bak
:$ nano /etc/php/7.1/fpm/pool.d/www.conf
user = www-data
group = www-data
; listen variable hast to be used in the nginx server configuration file to set the fastcgi_pass variable
listen = /run/php/php7.1-fpm.sock
listen.owner = www-data
listen.group = www-data
listen.mode = 0660
; to Redirect worker stdout and stderr into main error log.
catch_workers_output = yes
; to configure environement variables
env[HOSTNAME] = $HOSTNAME
env[PATH] = /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
env[TMP] = /tmp
env[TMPDIR] = /tmp
env[TEMP] = /tmp

Pour connaitre les informations à configurer dans la variable d’environement PATH, la ligne de commande suivante peut être utilisée :

:$ printenv PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

Redémarrer php-fpm pour prendre en compte les modifications

:$ /etc/init.d/php7.1-fpm restart
[ ok ] Restarting php7.1-fpm (via systemctl): php7.1-fpm.service.

Pour accéder au fichier socket, il faut que les droits soit donnés en lecture et écriture à l’utilisateur wwww-data. Vous pouvez vérifier les droits avec la commande suivante et les changer avec chown le cas échéant.

$: ls -l /run/php/php7.1-fpm.sock
srw-rw---- 1 www-data www-data 0 nov.   9 12:42 /run/php/php7.1-fpm.sock

Ajouter la configuration PHP-FPM dans Nginx

Créer le répertoire snippets s’il n’existe pas.

$: mkdir /etc/nginx/snippets

Créer un fichier avec l’extrait de configuration qu’il faudra ajouter à la configuration de votre serveur dans Nginx.

$: nano /etc/nginx/snippets/fastcgi-php.conf
# regex to split $uri to $fastcgi_script_name and $fastcgi_path
fastcgi_split_path_info ^(.+.php)(/.+)$;

# Check that the PHP script exists before passing it
try_files $fastcgi_script_name =404;

# Mitigate https://httpoxy.org/ vulnerabilities
fastcgi_param HTTP_PROXY "";

# Bypass the fact that try_files resets $fastcgi_path_info
# see: http://trac.nginx.org/nginx/ticket/321
set $path_info $fastcgi_path_info;
fastcgi_param PATH_INFO $path_info;

fastcgi_index index.php;
include fastcgi.conf;

L’extrait inclus lui même un autre fichier de configuration pour les paramètres FastCGI.

$: nano /etc/nginx/fastcgi-php.conf
fastcgi_param  SCRIPT_FILENAME    $document_root$fastcgi_script_name;
fastcgi_param  QUERY_STRING       $query_string;
fastcgi_param  REQUEST_METHOD     $request_method;
fastcgi_param  CONTENT_TYPE       $content_type;
fastcgi_param  CONTENT_LENGTH     $content_length;

fastcgi_param  SCRIPT_NAME        $fastcgi_script_name;
fastcgi_param  REQUEST_URI        $request_uri;
fastcgi_param  DOCUMENT_URI       $document_uri;
fastcgi_param  DOCUMENT_ROOT      $document_root;
fastcgi_param  SERVER_PROTOCOL    $server_protocol;
fastcgi_param  REQUEST_SCHEME     $scheme;
fastcgi_param  HTTPS              $https if_not_empty;

fastcgi_param  GATEWAY_INTERFACE  CGI/1.1;
fastcgi_param  SERVER_SOFTWARE    nginx/$nginx_version;

fastcgi_param  REMOTE_ADDR        $remote_addr;
fastcgi_param  REMOTE_PORT        $remote_port;
fastcgi_param  SERVER_ADDR        $server_addr;
fastcgi_param  SERVER_PORT        $server_port;
fastcgi_param  SERVER_NAME        $server_name;

# PHP only, required if PHP was built with --enable-force-cgi-redirect
fastcgi_param  REDIRECT_STATUS    200;

Configurer PHP pour fonctioner avec MariaDB en local

:$ cat /etc/mysql/my.cnf | grep -i socket
# Remember to edit /etc/mysql/debian.cnf when changing the socket location.
socket        = /var/run/mysqld/mysqld.sock
socket        = /var/run/mysqld/mysqld.sock
socket        = /var/run/mysqld/mysqld.sock

:$ ls -l /var/run/mysqld/mysqld.sock
srwxrwxrwx 1 mysql mysql 0 dc.  26 19:30 /var/run/mysqld/mysqld.sock

:$ cp /etc/php/7.1/fpm/php.ini /etc/php/7.1/fpm/php.ini.bak

:$ nano /etc/php/7.1/fpm/php.ini
[Pdo_mysql]
pdo_mysql.default_socket=/var/run/mysqld/mysqld.sock

[MySQLi]
mysqli.default_socket = /var/run/mysqld/mysqld.sock

Redémarrer php-fpm pour prendre en compte les modifications

:$ /etc/init.d/php7.1-fpm restart
[ ok ] Restarting php7.1-fpm (via systemctl): php7.1-fpm.service.

Ajuster la gestion des processus de PHP-FPM en fonction de votre système

L’article PHP-FPM – process management explique bien comment estimer les resources nécessaires à PHP-FPM pour fonctionner de façon optimale.

Si PHP-FPM n’est pas optimisé pour votre système, PHP-FPM peut ne pas être capable de répondre aux demandes en retournant une erreur, ou pire en cas de manque de mémoire.

Un des paramètres important est le nombre de processus fils que PHP-FPM est autorisé à executer simultanément (pm.max_children). Ce nombre ne doit pas être trop gros pour éviter de consomer l’ensemble des resources du serveur mais il ne doit pas être trop petit non plus.

Si le nombre de processsus fils est trop petit, PHP-FPM capture l’erreur suivante dans le fichier de log du serveur : server reached pm.max_children setting (5), consider raising it. Où 5 est la valeur actuelle du paramètre.

Les raisons peuvent être les suivantes :

  • Trop de requètes utilisateur simultanées à traiter
  • Temps d’execution des scripts lent (manque de resource sur le serveur ou bug dans le script)

La configuration de la gestion des processus de PHP-FPM est dans le fichier www.conf.

:$ nano /etc/php/7.1/fpm/pool.d/www.conf
; Note: - It will only work if the FPM master process is launched as root
;   static  - a fixed number (pm.max_children) of child processes;
;             pm.max_children      - the maximum number of children that can
;             pm.start_servers     - the number of children created on startup.
;             pm.min_spare_servers - the minimum number of children in 'idle'
;             pm.max_spare_servers - the maximum number of children in 'idle'
;             pm.max_children           - the maximum number of children that
;             pm.process_idle_timeout   - The number of seconds after which
pm = dynamic
; The number of child processes to be created when pm is set to 'static' and the
; maximum number of child processes when pm is set to 'dynamic' or 'ondemand'.
; served. Equivalent to the ApacheMaxClients directive with mpm_prefork.
; forget to tweak pm.* to fit your needs.
; Note: Used when pm is set to 'static', 'dynamic' or 'ondemand'
pm.max_children = 5
; Note: Used only when pm is set to 'dynamic'
pm.start_servers = 2
; Note: Used only when pm is set to 'dynamic'
; Note: Mandatory when pm is set to 'dynamic'
pm.min_spare_servers = 1
; Note: Used only when pm is set to 'dynamic'
; Note: Mandatory when pm is set to 'dynamic'
pm.max_spare_servers = 3

Estimer le nombre maximal de processus fils pour PHP-FPM

Pour estimer le nombre de processus fils, il faut prendre en compte les resources globales du serveur ainsi que la mémoire pouvant être allouée à chaque processus enfant.

[nombre de processus possible à executer] = [Mémoire totale disponible pour PHP] / [Mémoire par processus fils]

Si votre seveur est dédié aux application PHP, il est possible de réserver uniquement de la mémoire pour le système d’exploitation et allouer le rester à l’utilisation de PHP. Par exemple, avec 8 GO de mémoire, garder 512 MO pour le système, et utiliser le reste pour PHP (7,5 GO)

Sur mon serveur, les applications PHP doivent partager les resources avec d’autre type d’application. J’ai opté pour n’utiliser que la moitier de la mémoire disponible : Mémoire totale disponible pour PHP = 4000.

Pour estimer la mémoire par processus fils, il est possible de prendre la valeur mémoire maximum (memory_limit) défini dans la configuration de PHP (php.ini) pour l’execution d’un script PHP.

$: cat /etc/php/7.1/fpm/php.ini | grep -i memory_limit
memory_limit = 128M

Une autre approche est d’estimer la valeur moyenne consomée par les scripts PHP tournant sur votre serveur.

ps --no-headers -o "rss,cmd" -C php-fpm7.1
54340 php-fpm: master process (/etc/php/7.1/fpm/php-fpm.conf)
102780 php-fpm: pool www
87040 php-fpm: pool www
59676 php-fpm: pool www

Pour avoir la moyenne dans un format lisible

$: ps --no-headers -o "rss,cmd" -C php-fpm7.1 | awk '{ sum+=$1 } END { printf ("%d%sn", sum/NR/1024,"Mb") }'
74Mb

Basé sur la formule plus haut, le nombre de processus possible à excuter simultanément peut être calculé à partir de la mémoire moyenne necessaire au fonctionnement des scripts PHP

__pm.max_children = 4000 MO / 74 MO = 54__

Estimer les autres paramètres en fonction du nombre maximal de processus enfant pour PHP-FPM

Le nombre minimum de processus au repos (idle) voulus peut être fixé à 20% du nombre maximum de processus fils

pm.min_spare_servers = 54 x 20 / 100 = 11

Le nombre minimum de processus au repos (idle) voulus peut être fixé à 60% du nombre maximum de processus fils

pm.max_spare_servers = 54 x 60 / 100 = 32

Le nombre de processus fils à créer au démarrage est calculé à partir de la formule par défaut et documentée dans la description du paramètre : Valeur par défaut: min_spare_servers + (max_spare_servers - min_spare_servers) / 2

__pm.start_servers = 11 + (32 – 11) / 2 = 21__

Redémarrer php-fpm pour prendre en compte les modifications :

:$ systemctl restart php7.1-fpm.service

Références :

PHP-FPM – process management

PHP Configuration

PHP FastCGI Example

NGINX WebSocket Performance


Configurer un site web dans Nginx

Pour ce tutoriel, Nginx et PHP-FPM doivent être installé et PHP-FPM doit être configuré/ajusté pour fonctioner avec Nginx.

Créer les répertoires du site web

Les fichiers du site web sont stoqués sur un disque différent de celui qui héberge le système d’exploitation (Debian). Si ce n’est pas le cas pour vous, vous pouvez créer le répertoire /var/mon.domain.fr/www ou /var/www. Le nomage est libre. Il faut toutefois penser que ce répertoire devra pouvoir être accessible à l’utilisateur www-data utilisé par le serveur web.

Le répertoire /mnt/data/websites/mon.domain.fr/www va contenir les fichiers du site web.

:$ mkdir -p /mnt/data/websites/mon.domain.fr/www

Il est possible de créer un point de montage à la racine, afin de pouvoir accéder aux fichiers plus facilement avec : /website

:$ mkdir /websites
:$ mount -R /mnt/data/websites /websites
:$ nano /etc/fstab
/mnt/data/websites  /websites   none    bind    0       0

Créer le fichier index.php à la racine du répertoire de votre site web. La ligne de commande suivante ajoute un code PHP au fichier afin d’afficher les informations de PHP depuis le navigateur web.

:$ printf "n<?php var_export($_SERVER)?>n<?php phpinfo(); ?>n" > /websites/[hostname]/www/index.php

Il est important de modifier le contenu de ce fichier lorsque le site sera mis en production. Les informations affichées par la commande PHP sont utiles mais elles peuvent être aussi exploitées à votre insu.

Donner les droits au serveur web d’accéder aux fichiers du site en lecture et écriture. www-data:www-data peut être remplacé par root:www-data pour limiter les droits en lecture seule. Toutefois, si une partie de votre site nécessite d’écrire des données sur le disque, par exemple pour sauvegarder une configuration, il faudra changer les droits des fichiers concernés pour redonner les droits en écriture à l’utilisateur www-data.

:$ chown -R www-data:www-data /websites/mon.domain.fr

Configurer et activer le site web dans Nginx

Désactiver le site web par défaut configuré dans Nginx

:$ rm /etc/nginx/sites-enabled/default

Créer la configuration de votre site web dans Nginx. Remplacer mon.domain.fr avec le nom de votre domaine et /websites/mon.domain.fr/www avec le chemin du répertoire racine contenant les fichiers de votre site web.

:$ cp /etc/nginx/sites-available/default /etc/nginx/sites-available/http_mon.domain.fr
:$ nano /etc/nginx/sites-available/http_mon.domain.fr
# Excludes requests with HTTP status codes 2xx (success) and 3xx (redirection)
map $status $loggable {
    ~^[23]  0;
    default 1;
}
upstream php-handler {
    server unix:/run/php/php7.1-fpm.sock;
}

# Default server configuration
#
server {
    listen 80 default_server;
    listen [::]:80 default_server;

    root /websites/mon.domain.fr/www;

    # Add index.php to the list if you are using PHP
    index index.php index.html index.htm;

    server_name mon.domain.fr local.mon.domain.fr;

    # Excludes requests with HTTP status codes 2xx (success) and 3xx (redirection)
    # The predefined 'combined' format will be used
    #access_log  /var/log/nginx/mon.domain.fr.access.log combined if=$loggable;
    #error_log  /var/log/nginx/mon.domain.fr.error.log warn;

    # Add headers to serve security related headers
    # Before enabling HTTP Strict-Transport-Security headers please read into this
    # topic first.
    add_header Strict-Transport-Security "max-age=15768000; includeSubDomains; preload;";
    #add_header Strict-Transport-Security "max-age=15768000;";
    add_header X-Content-Type-Options nosniff;
    add_header X-XSS-Protection "1; mode=block";
    add_header X-Robots-Tag none;
    add_header X-Download-Options noopen;
    add_header X-Permitted-Cross-Domain-Policies none;
    # From Nextcloud 14
    add_header Referrer-Policy no-referrer;

    # Remove X-Powered-By, which is an information leak
    fastcgi_hide_header X-Powered-By;

    location = /robots.txt {
            allow all;
            log_not_found off;
            access_log off;
        }

    location = /favicon.ico {
            log_not_found off;
            access_log off;
    }

    location / {
        # First attempt to serve request as file, then
        # as directory, then fall back to displaying a 404.
        try_files $uri $uri/ =404;
    }

    # Connecting NGINX to PHP FPM (default) FastCGI server listening php-handler
    # https://www.nginx.com/resources/wiki/start/topics/examples/phpfcgi/
    location ~ [^/].php(/|$) {
        include snippets/fastcgi-php.conf;
        fastcgi_pass php-handler;
    }

}

Le site web est configuré mais il doit être ajouté à la liste des site actifs pour que Nginx prenne en compte la configuration.

:$ ln -s /etc/nginx/sites-available/http_[hostname]e /etc/nginx/sites-enabled/http_mon.domain.fr

Tester la configuration et la corriger en cas d’érreure

:$ nginx -t

Pour que la nouvelle configuration soit prise en compte, il faut redémarrer le serveur Nginx ou la recharger.

Redémarrer le Nginx

:$ /etc/init.d/nginx restart
[ ok ] Restarting nginx (via systemctl): nginx.service.

Recharger la configuraiton dans Nginx

:$ nginx -s reload

Configurer le nom de domaine local et tester l’installation de Nginx

L’adresse local.mon.domain.fr est utilisée sur le réseau local alors que mon.domain.fr est l’adresse publique du site.

L’adresse publique doit être configurée dans un DNS pour que les ordinateurs distants puissent accéder au site web.

L’adresse locale doit être configurée dans le fichier hosts des ordinateurs du réseau local (pas sur le serveur Debian).

:$ sudo nano /etc/hosts
192.168.1.22 local.mon.domain.fr

Accéder au site web depuis l’URL local : http://local.mon.domain.fr/

PHP Info


Créer automatiquement des certificats SSL Let’s Encrypt

Nginx Let's Encrypt

Nous partons du principe que l’utilisateur root est utilisé pour l’installation. Si ce n’est pas le cas, il faut préfixer les commandes linux avec su - ou sudo en fonction de la configuration du système du serveur.

Installer Certbot sur Debian 8 (jessie)

Vérifier la version de Cerbot est disponible pour le serveur tournant sur Debian 8

:$ apt-get udpate

:$ apt-cache policy certbot
certbot:
  Installé : (aucun)
  Candidat : 0.10.2-1~bpo8+1
 Table de version :
     0.10.2-1~bpo8+1 0
        100 http://ftp.fr.debian.org/debian/ jessie-backports/main amd64 Packages

S’il n’y a pas de version disponible. Il faut surement configurer l’entrepôt jessie-backports dans le gestionaire d’application de Debian sur le serveur.

:$ echo 'deb http://ftp.debian.org/debian jessie-backports main' | tee /etc/apt/sources.list.d/backports.list

:$ apt-cache policy certbot

Installer certbot sur le serveur

:$ apt-get install certbot -t jessie-backports

Installer Certbot sur Debian 9 (stretch) ou plus

Depuis la version 9 de Debian, certbot est disponible dans le dépôt de Debian. Mettre à jour le gestionaire d’application du serveur avant de l’installer.

:$ apt update

:$ apt install certbot

:$ apt-cache policy certbot
certbot:
  Installé : 0.28.0-1~deb9u2
  Candidat : 0.28.0-1~deb9u2
 Table de version :
 *** 0.28.0-1~deb9u2 500
        500 http://ftp.fr.debian.org/debian stretch/main amd64 Packages
        500 http://ftp.fr.debian.org/debian stretch-updates/main amd64 Packages
        100 /var/lib/dpkg/status
     0.28.0-1~bpo9+1 100
        100 http://ftp.fr.debian.org/debian stretch-backports/main amd64 Packages

Configurer le serveur web Nginx pour fonctioner avec Webroot

Certbot offre plusieurs solution pour obtenir des certificats. Il existe même un grephon pour Nginx.

La procédure suivante n’utilise pas le grephon Nginx mais le grephon Webroot qui permet de générer des certificats let’s encrypt avec la plupart des serveurs web (Nginx, Apache, …).

Nginx est déjà installé sur le serveur et configuré pour fonctionner en HTTPS sur le port 443 et rediriger les requêtes HTTP (port 80) sur HTTPS.

Le grephon Webroot crée des fichiers de chalenge dans le répertoire caché .well-known/acme-challenge à la racine du site web. Il est possible de générer les fichiers de challenges dans un répertoire différent de celui du site web en utilisant un alias dans la configuration de Nginx.

Créer les répertoires où seront copié les fhicher de challenges de Webroot (Webroot les créra de lui même le cas échéant)

:$ mkdir -p /var/www/.well-known/acme-challenge

Créer une page HTML vide

:$ cat <<EOF > /var/www/.well-known/acme-challenge/index.html
<!DOCTYPE html>
<html lang="fr">
  <head>
    <meta http-equiv="content-type" content="text/html; charset=utf-8">
    <title>No access</title>
  </head>
  <body></body>
</html>
EOF

Modfier les droits utilisateurs pour autoriser l’utilisateur web www-data à lire les fichiers

:$ chown -vR root:www-data /var/www/.well-known

Let’s encrypt fait un GET HTTP (actuellement, le grephon Webroot supporte que HTTP) pour récupérer les fichiers et vérifier que le nom de domaine est bien associé au serveur demandant les certificats.

Il faut modifier la configuration de Nginx pour autoriser les requêtes HTTP des fichiers challenges et rediriger les autres vers HTTPS.

:$ nano /etc/nginx/sites-available/https_mon.domaine.fr
[...]
server {
    listen 80;
    listen [::]:80;
    server_name mon.domaine.fr;

    # Let's Encrypt certificates with Acmetool
    location /.well-known/acme-challenge/ {
        alias /var/www/.well-known/acme-challenge/;
        allow all;
    }

    location / {
        # We will use a 302 redirect until we have verified that everything is working properly.
        # Afterwards, we can change this to a permanent 301 redirect.
        return 302 https://$server_name$request_uri;
    }
}    
[...]

Vérifier que la configuration du serveur ne contient pas d’erreur

:$ nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

Redémarrer Nginx pour prendre en compte les modifications faites dans le fichier de configuration du serveur web.

:$ /etc/init.d/nginx restart

Générer les certificats SSL avec le grephon Webroot

Il faut configurer la freebox pour rediriger les requêtes sur le port HTTP (80) vers le NAS.

Pour demander la génération des certificats à cerbot, il faut ajouter l’option certonly dans la commande et --webroot pour sélectionner la méthode avec le gréphon Webroot. L’otion -w permet de fournir le chemin vers le répertoire du site web à Webroot pour le domain configuré avec l’option -d. Il est possible de configurer plusieurs domaines et sous domaines en ajoutant une option -d par domaine.

:$ certbot certonly --webroot --rsa-key-size 4096 -w /var/www -d mon.domain.fr
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Starting new HTTPS connection (1): acme-v01.api.letsencrypt.org
Obtaining a new certificate
Performing the following challenges:
http-01 challenge for mon.domain.fr
Using the webroot path /var/www for all unmatched domains.
Waiting for verification...
Cleaning up challenges
Unable to clean up challenge directory /var/www/.well-known/acme-challenge
Generating key (4096 bits): /etc/letsencrypt/keys/0000_key-certbot.pem
Creating CSR: /etc/letsencrypt/csr/0000_csr-certbot.pem

IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at
   /etc/letsencrypt/live/mon.domain.fr/fullchain.pem. Your
   cert will expire on 2017-10-14. To obtain a new or tweaked version
   of this certificate in the future, simply run certbot again. To
   non-interactively renew *all* of your certificates, run "certbot
   renew"
 - If you like Certbot, please consider supporting our work by:

   Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
   Donating to EFF:                    https://eff.org/donate-le

Configurer Nginx pour utiliser SSL et les certificats Let’s Encrypt

Ajouter la configuration SSL qui peut être utilisée avec n’importe quel certificat.

Il n’est pas facile (voir impossible) d’enlever les cypher CBC de la liste d’openssl. openssl ne permet pas de le faire facilement. De plus, les clients un peu vieux comme safari 6 ou IE 8 peuvent ne plus être compatible.

si nous utilisons un ceriticat auto-signé "SSL stapling" ne sera pas utilisé par Nginx. Nginx affichera un message d’avertissement disant que le stapling sera désactivé.

Mise à jour 22/10/2019: le support de TLS 1.0 et TLS 1.1 vont être enlevé des navigateur web. Pour des raisons de sécurité il est recommendé de n’utiliser que TLS 1.2 ou plus.

:$ nano /etc/nginx/snippets/ssl-params.conf
# from https://cipherli.st/
# and https://raymii.org/s/tutorials/Strong_SSL_Security_On_nginx.html
# https://www.openssl.org/docs/man1.1.1/man1/ciphers.html
#ssl_protocols TLSv1 TLSv1.1 TLSv1.2; 
ssl_protocols TLSv1.2 TLSv1.3; # Requires nginx >= 1.13.0 and OpenSSL >= 1.1.1 for TLSv1.3
ssl_prefer_server_ciphers on;
# The recommended cipher suite for backwards compatibility (IE6/WinXP)
#ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:ECDHE-RSA-AES128-GCM-SHA256:AES256+EECDH:DHE-RSA-AES128-GCM-SHA256:AES256+EDH:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA:ECDHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES128-SHA256:DHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES256-GCM-SHA384:AES128-GCM-SHA256:AES256-SHA256:AES128-SHA256:AES256-SHA:AES128-SHA:DES-CBC3-SHA:HIGH:!aNULL:!eNULL:!EXPORT:!DES:!MD5:!PSK:!RC4";
# The recommended cipher suite
#ssl_ciphers ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384;
ssl_ciphers "EECDH+ECDSA+AESGCM:EECDH+aRSA+AESGCM:EECDH+ECDSA+SHA384:EECDH+ECDSA+SHA256:EECDH+aRSA+SHA384:EECDH+aRSA+SHA256:EECDH+aRSA+RC4:EECDH:EDH+aRSA:!SHA1";

# L'option ssl_ecdh_curve à secp384r1 empèche DAVDroid de se connecter au serveur (handshack erreur)
#ssl_ecdh_curve secp384r1; # Requires nginx >= 1.1.0
ssl_session_cache shared:SSL:10m;
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
# Nginx fails to start with the error: host not found in resolver "$DNS-IP-1"
#resolver $DNS-IP-1 $DNS-IP-2 valid=300s;
#resolver_timeout 5s;

# Diffie-Hellman parameters
ssl_dhparam /etc/ssl/certs/nginx-dhparam.pem;

Comme Let’s Encrypt utilise OpenSSL, nous devons aussi créer un fichier avec les paramètres Diffie-Hellman pour mettre en place confidentialité persistante entre le serveur et les clients (Confidentialité_persistante, Diffie-Hellman_parameters)

:$ openssl dhparam -out /etc/ssl/certs/nginx-dhparam.pem 2048
:$ chmod 640 /etc/ssl/certs/nginx-dhparam.pem

Ajouter le snippet avec les certificats pour le domaine mon.domain.fr à Nginx

:$ nano /etc/nginx/snippets/letsencrypt-mon.domaine.fr.conf
ssl_certificate /etc/letsencrypt/live/mon.domain.fr/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/mon.domain.fr/privkey.pem;

Modifier la configuration du serveur pour inclure les certificats Let’s Encrypt et la configuration SSL.

:$ nano /etc/nginx/sites-available/https_mon.domain.fr
[...]
server {
    listen 443 ssl;
    listen [::]:443 ssl;
    #include snippets/self-signed.conf;
    include snippets/letsencrypt-mon.domain.fr.conf;
    include snippets/ssl-params.conf;
[...]

Vérifier la configuration avant de l’utiliser

:$ nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

Recharger la configuration dans Nginx

:$ /etc/init.d/nginx reload
[ ok ] Reloading nginx configuration (via systemctl): nginx.service.

Configurer le serveur pour automatiquement renouveler les certificats SSL

L’application Certbot installe automatique un service de mise à jour des certificats. Ce service renouvelle les certificats avant la date d’expiration.

Il est possible de tester le renouvellement des certificats, sans changer les certificats courants, avec la commande suivante.

:$ certbot renew --dry-run
Saving debug log to /var/log/letsencrypt/letsencrypt.log

-------------------------------------------------------------------------------
Processing /etc/letsencrypt/renewal/mon.domain.fr.conf
-------------------------------------------------------------------------------
Cert not due for renewal, but simulating renewal for dry run
Starting new HTTPS connection (1): acme-staging.api.letsencrypt.org
Renewing an existing certificate
Performing the following challenges:
http-01 challenge for mon.domain.fr
Waiting for verification...
Cleaning up challenges
Unable to clean up challenge directory /var/www/.well-known/acme-challenge
Generating key (4096 bits): /etc/letsencrypt/keys/0007_key-certbot.pem
Creating CSR: /etc/letsencrypt/csr/0007_csr-certbot.pem
** DRY RUN: simulating 'certbot renew' close to cert expiry
**          (The test certificates below have not been saved.)

Congratulations, all renewals succeeded. The following certs have been renewed:
  /etc/letsencrypt/live/mon.domain.fr/fullchain.pem (success)
** DRY RUN: simulating 'certbot renew' close to cert expiry
**          (The test certificates above have not been saved.)

IMPORTANT NOTES:
 - Your account credentials have been saved in your Certbot
   configuration directory at /etc/letsencrypt. You should make a
   secure backup of this folder now. This configuration directory will
   also contain certificates and private keys obtained by Certbot so
   making regular backups of this folder is ideal.

Par défaut, il n’y a rien à faire pour que les certificats soit renouvelés.
Il est possible de manuellement lancer le renouvellement des certificats avec la commande suivantes.

#$ certbot renew

Même si les certificats sont renouvelés, il est possible que le serveur web garde la version qu’il a chargé au démarrage. Il est donc parfois nécessaire de redémarrer le serveur pour qu’il puisse prendre en compte les nouveaux certificats. C’est le cas avec Nginx.

Pour relancer Nginx

#$ systemctl restart nginx.service

A FAIRE :

Il est possible, avec Certbot, de lancer des scripts lors du renouvellement des certificats afin d’adapter le renouvellement automatique des certificats à son système.

Il est donc possible de redémarrer automatiquement le serveur Web une fois le renouvellement des certificats réussi en ajoutant un script dans le répertoire /etc/letsencrypt/renewal-hooks/deploy.

Les scripts dans ce répertoire sont executer dans l’ordre alphabétique.

Il est possible de trouver plus d’information sur le paramétrage du renouvellement des certificats dans l’aide en ligne de Certbot : Cerbot – renewing certificats

Gérer les certificats

Pour afficher la liste des certificats géré par Certbot

:$ certbot certificates
Saving debug log to /var/log/letsencrypt/letsencrypt.log

-------------------------------------------------------------------------------
Found the following certs:
  Certificate Name: mon.domain.fr
    Domains: mon.domain.fr
    Expiry Date: 2018-10-09 21:18:05+00:00 (VALID: 59 days)
    Certificate Path: /etc/letsencrypt/live/mon.domain.fr/fullchain.pem
    Private Key Path: /etc/letsencrypt/live/mon.domain.fr/privkey.pem
-------------------------------------------------------------------------------

Références :

Certbot : User Guide

Certbot : debian-jessie-nginx

Confidentialité_persistante

Diffie-Hellman_parameters

Digitalocean : how-to-secure-nginx-with-let-s-encrypt-on-debian-8


Installer MariaDB 10.1 sous Debian 8 (Jessie)

Installer MariaDB depuis la repostiory APT

Récupérer la clé d’identification des paquet de MariaDB

:$ apt-key adv --recv-keys --keyserver keyserver.ubuntu.com 0xcbcb082a1bb943db
Executing: gpg --ignore-time-conflict --no-options --no-default-keyring --homedir /tmp/tmp.0W5qPMnq19 --no-auto-check-trustdb --trust-model always --keyring /etc/apt/trusted.gpg --primary-keyring /etc/apt/trusted.gpg --keyring /etc/apt/trusted.gpg.d/debian-archive-jessie-automatic.gpg --keyring /etc/apt/trusted.gpg.d/debian-archive-jessie-security-automatic.gpg --keyring /etc/apt/trusted.gpg.d/debian-archive-jessie-stable.gpg --keyring /etc/apt/trusted.gpg.d/debian-archive-squeeze-automatic.gpg --keyring /etc/apt/trusted.gpg.d/debian-archive-squeeze-stable.gpg --keyring /etc/apt/trusted.gpg.d/debian-archive-wheezy-automatic.gpg --keyring /etc/apt/trusted.gpg.d/debian-archive-wheezy-stable.gpg --recv-keys --keyserver keyserver.ubuntu.com 0xcbcb082a1bb943db
gpg: demande de la clef 1BB943DB sur le serveur hkp keyserver.ubuntu.com
gpg: clef 1BB943DB : clef publique « MariaDB Package Signing Key <package-signing-key@mariadb.org> » importée
gpg:       Quantité totale traitée : 1
gpg:                     importées : 1

Ajouter les source de MariaDB dans la repository

:$ nano /etc/apt/sources.list.d/MariaDB.list
# MariaDB 10.1 repository list - created 2017-02-15 23:13 UTC
# http://downloads.mariadb.org/mariadb/repositories/
deb [arch=amd64,i386] http://fr.mirror.babylon.network/mariadb/repo/10.1/debian jessie main
deb-src http://fr.mirror.babylon.network/mariadb/repo/10.1/debian jessie main

Installer MariaDB

:$ apt-get update && apt-get install mariadb-server

Installer le module MariaDB dans Webmin

Le module MySQL Database Server de Webmin peut être utilisé avec MariaDB :


Webmin: MySQL Database Server


Changer le répertoire de donnée par défaut

move-data-folder-and-drive-mysql-centos

change-datadir-for-mariadb-5-5

how-to-move-a-mysql-data-directory-to-a-new-location-on-ubuntu-16-04

Trouver le répertoire contenant les données de MariaDB

:$ mysql -u root -p
MariaDB [(none)]> select @@datadir;
+-----------------+
| @@datadir       |
+-----------------+
| /var/lib/mysql/ |
+-----------------+
1 row in set (0.00 sec)

MariaDB [(none)]> exit

Stopper la base de donnée

:$ systemctl stop mariadb

:$ systemctl status mysql
Status: "MariaDB server is down"

Copier les données de MariaDB vers le répertoire de destination en gardant les permissions et supprimant les fichiers suplémentaires dans le répertoire de destiantion

:$ rsync -aAXv --delete /var/lib/mysql/ /mnt/data/mariadb/

Renomer le répertoire d’origine (le supprimer quand tout sera bien opérationnel)

:$ mv /var/lib/mysql /var/lib/mysql.bak

Modifier la configuration de MariaDB pour utiliser le nouveau répertoire

:$ cp /etc/mysql/my.cnf /etc/mysql/my.cnf.bak

:$ nano /etc/mysql/my.cnf
datadir = /mnt/data/mariadb

Vérifier que la socket de MariaDB n’est pas configurée dans le répertoire déplacé (/var/lib/mysql). Sinon, changer le chemin de la socket vers le nouveau.

Avec Debian 8, le fichier my.cnf contient l’instruction suivante :

:$ nano /etc/mysql/my.cnf
socket = /var/run/mysqld/mysqld.sock

Redémarrer la base de donnée MariaDB

:$ systemctl start mysql

:$ systemctl status mysql
Status: "Taking your SQL requests now..."

Vérifier que le MariaDB utilise bien le nouveau répertoire

:$ mysql -u root -p
MariaDB [(none)]> select @@datadir;
+--------------------+
| @@datadir          |
+--------------------+
| /mnt/data/mariadb/ |
+--------------------+
1 row in set (0.00 sec)

MariaDB [(none)]> exit



Références :

Download MariaDB

installing-mariadb-deb-files


Installer OpenLDAP sous Debian 8 (Jessie)

Depuis la version 2.4 de OpenLDAP la gestion de la configuration se fait par défaut via la On-Line Configuration (cn=config). OLC remplace la gestion de la configuration via le fichier slapd.conf. Elle permet une gestion dynamique de la configuration sans redémarrage systématique du service LDAP.

Installer OpenLDAP depuis Webmin

Il est possible d’installer OpenLDAP avec Webmin depuis ‘Un-used Modules’ -> LDAP Server

Il est aussi possible d’utiliser les lignes de commandes :

:$ apt-get install slapd ldap-utils

Vérification

:$ apt-cache policy slapd
slapd:
  Installé : 2.4.40+dfsg-1+deb8u2
  Candidat : 2.4.40+dfsg-1+deb8u2
 Table de version :
 *** 2.4.40+dfsg-1+deb8u2 0
        500 http://ftp.fr.debian.org/debian/ jessie/main amd64 Packages
        100 /var/lib/dpkg/status
     2.4.40+dfsg-1+deb8u1 0
        500 http://security.debian.org/ jessie/updates/main amd64 Packages
:$ ps aux | grep l[d]ap
openldap 11268  0.0  0.0 1306656 5888 ?        Ssl  12:06   0:00 /usr/sbin/slapd -h ldap:/// ldapi:/// ldaps:/// -g openldap -u openldap -F /etc/ldap/slapd.d

Vérifier le nom de la base

:$ ldapsearch -LLL -Y EXTERNAL -H ldapi:/// -b "cn=config" olcSuffix | grep ^olcSuffix
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
olcSuffix: dc=zebulon,dc=freeboxos,dc=fr

:$ hostname -f
monnas.zebulon.freeboxos.fr

Vérifier les shémas installés par défaut

:$ ldapsearch -LLL -Y EXTERNAL -H ldapi:/// -b "cn=config" olcSchemaConfig | grep ^cn
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
cn: config
cn: module{0}
cn: schema
cn: {0}core
cn: {1}cosine
cn: {2}nis
cn: {3}inetorgperson

Lister le contenu de la base LDAP

:$ ldapsearch -LLL -x -H ldap:/// -b "dc=zebulon,dc=freeboxos,dc=fr" -D cn=admin,dc=zebulon,dc=freeboxos,dc=fr -W
Enter LDAP Password:
dn: dc=zebulon,dc=freeboxos,dc=fr
objectClass: top
objectClass: dcObject
objectClass: organization
o: zebulon.freeboxos.fr
dc: zebulon

dn: cn=admin,dc=zebulon,dc=freeboxos,dc=fr
objectClass: simpleSecurityObject
objectClass: organizationalRole
cn: admin
description: LDAP administrator
userPassword:: e1NTSEF9WndRampUMUx1dnJqOVZVU0JlVzJ1VEhpVGtxeXB6aWU=

Sécurisation de LDAP avec GnuTLS

Ne pas utiliser Webmin pour générer le certificat et la clé. Il y a un bug dans Webmin bugs: 4729

OpenLDAP est compilé avec GnuTLS (et pas OpenSSL).

:$ apt-get install apt-rdepends

:$ apt-rdepends slapd | grep tls
Reading package lists... Done
Building dependency tree      
Reading state information... Done
  Depends: libgnutls-deb0-28 (>= 3.3.0)
libgnutls-deb0-28
  Depends: libgnutls-deb0-28 (>= 3.3.0)

Installer GnuTLS

:$ apt-get install gnutls-bin

Certificat auto-signé

Générer le certifcat auto-signé dans le répertoire /etc/ldap/ssl (Le hostname du serveur doit est égal au CN)

:$ mkdir /etc/ldap/ssl && chown openldap: /etc/ldap/ssl && cd /etc/ldap/ssl

:$ certtool --generate-privkey --outfile ca-key.pem

:$ hostname -f
monnas.zebulon.freeboxos.fr

:$ certtool --generate-self-signed --load-privkey ca-key.pem --outfile ca-cert.pem
Generating a 2048 bit RSA private key...
root@monnas:/etc/ldap/ssl# certtool --generate-self-signed --load-privkey ca-key.pem --outfile ca-cert.pem
Generating a self signed certificate...
Please enter the details of the certificate's distinguished name. Just press enter to ignore a field.
Common name: monnas.zebulon.freeboxos.fr
UID:
Organizational unit name:
Organization name:
Locality name:
State or province name:
Country name (2 chars): FR
Enter the subject's domain component (DC):
This field should not be used in new certificates.
E-mail:
Enter the certificate's serial number in decimal (default: 6408556149305393288):

Activation/Expiration time.
The certificate will expire in (days): 3650

Extensions.
Does the certificate belong to an authority? (y/N):
Is this a TLS web client certificate? (y/N):
Will the certificate be used for IPsec IKE operations? (y/N):
Is this a TLS web server certificate? (y/N): y
Enter a dnsName of the subject of the certificate: monnas.zebulon.freeboxos.fr
Enter a dnsName of the subject of the certificate:
Enter a URI of the subject of the certificate:
Enter the IP address of the subject of the certificate:
Will the certificate be used for signing (DHE and RSA-EXPORT ciphersuites)? (Y/n):
Will the certificate be used for encryption (RSA ciphersuites)? (Y/n): Y
Enter the URI of the CRL distribution point:
X.509 Certificate Information:
    Version: 3
    Serial Number (hex): 58efc3dd227e4088
    Validity:
        Not Before: Thu Apr 13 18:30:55 UTC 2017
        Not After: Sun Apr 11 18:31:01 UTC 2027
    Subject: CN=monnas.zebulon.freeboxos.fr,C=FR
    Subject Public Key Algorithm: RSA
    Algorithm Security Level: Medium (2048 bits)
        Modulus (bits 2048):
            00:a7:40:e0:5e:b9:de:b4:d9:39:94:e4:dd:a2:74:12
            99:ee:88:f3:9e:02:3e:6d:c4:ca:3c:35:cc:c0:75:96
            21:99:7b:be:8e:78:b1:d5:34:70:ce:c7:b7:a8:44:26
            30:e7:b5:2d:35:ab:6b:f0:7f:d5:44:e2:50:0c:51:80
            7c:7b:d7:18:9c:b2:50:51:a9:f4:1f:ff:7f:d2:38:0d
            55:c8:ee:b0:4a:99:fe:16:7e:65:ce:9d:39:29:d5:8f
            19:11:a3:e1:72:bb:43:ef:56:2b:a7:58:26:40:0b:31
            66:4f:c7:24:c7:b2:21:51:14:de:93:10:8f:59:a0:5a
            0b:b7:f6:d7:69:55:ed:cf:02:ed:c7:f3:46:bd:30:ac
            01:b3:0d:db:0f:50:08:4a:d6:c2:d8:8e:65:b5:6a:d9
            f4:6b:a5:b5:be:d4:ea:69:f1:c4:85:cf:73:43:2e:9c
            0c:33:2b:34:f2:f9:bb:32:32:e2:c3:89:4d:77:ce:a3
            54:ad:6b:e2:18:da:06:d2:99:56:2b:2e:6e:1b:b1:ce
            4a:76:2c:c5:d9:ac:8c:52:23:61:74:6b:09:6e:a1:67
            dd:92:bb:a4:a3:6b:03:7e:c4:ab:eb:74:78:53:9d:0c
            b6:b8:e1:70:84:fc:d3:6a:65:83:54:60:63:31:e1:d1
            77
        Exponent (bits 24):
            01:00:01
    Extensions:
        Basic Constraints (critical):
            Certificate Authority (CA): FALSE
        Subject Alternative Name (not critical):
            DNSname: monnas.zebulon.freeboxos.fr
        Key Purpose (not critical):
            TLS WWW Server.
        Key Usage (critical):
            Digital signature.
            Key encipherment.
        Subject Key Identifier (not critical):
            8f59492399af747b9ab172f3701d76e0e46f6e38
Other Information:
    Public Key ID:
        8f59492399af747b9ab172f3701d76e0e46f6e38
    Public key's random art:
        +--[ RSA 2048]----+
        |                 |
        |         o       |
        |        + o   o  |
        |         + o + . |
        |        S =   = .|
        |       . B . o + |
        |        + = o ..o|
        |        . oO  Eo.|
        |         o+o.  o.|
        +-----------------+

Is the above information ok? (y/N): y

Signing certificate...

Vérifier que les fichiers ont bien été créé

:$ ls -l
total 12
-rw-r--r-- 1 root root 1314 févr. 24 14:30 ca-cert.pem
-rw------- 1 root root 5823 févr. 24 14:21 ca-key.pem

Modifier les droit d’accès sur les fichiers de certification pour éviter une erreur (80) avec ldapmodify

:$ chown -R openldap: /etc/ldap/ssl && ls -l /etc/ldap/ssl
total 16
-rw-r--r-- 1 openldap openldap 1204 févr. 24 14:37 ca-cert.pem
-rw------- 1 openldap openldap 5823 févr. 24 14:21 ca-key.pem
-rw-r--r-- 1 root root  173 févr. 24 14:45 olcSSL.ldif

:$ chmod 400 /etc/ldap/ssl/*.pem

Configurer LDAP pour utiliser le certificat auto-signé

:$ cat > olcSSL.ldif << EOF
dn: cn=config
add: olcTLSCertificateKeyFile
olcTLSCertificateKeyFile: /etc/ldap/ssl/ca-key.pem
-
add: olcTLSCertificateFile
olcTLSCertificateFile: /etc/ldap/ssl/ca-cert.pem
-
# Remove CA for self signed certificate and add olcTLSVerifyClient to never
#replace: olcTLSCACertificateFile
#-
add: olcTLSVerifyClient
olcTLSVerifyClient: never
EOF
:$ ldapmodify -Y EXTERNAL -H ldapi:/// -f olcSSL.ldif
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
modifying entry "cn=config"

Ajouter ldaps:/// dans le /etc/default/slapd pour les clients LDAP qui ne supporte pas StartTLS mais LDAP over SSL sur le port 636.

Autoriser ldap uniquement en local

:$ nano /etc/default/slapd
SLAPD_SERVICES="ldap://127.0.0.1:389/ ldapi:/// ldaps:///"

Redémarrer le serveur

:$ /etc/init.d/slapd restart

Vérification

:$ ps axu | grep slapd
openldap 15893  0.0  0.0 1221696 5236 ?        Ssl  15:26   0:00 /usr/sbin/slapd -h ldap://127.0.0.1:389/ ldapi:/// ldaps:/// -g openldap -u openldap -F /etc/ldap/slapd.d

:$ netstat -tunlp | grep slapd
tcp        0      0 0.0.0.0:636             0.0.0.0:*               LISTEN      15893/slapd    
tcp        0      0 127.0.0.1:389           0.0.0.0:*               LISTEN      15893/slapd    
tcp6       0      0 :::636                  :::*                    LISTEN      15893/slapd

Pour lancer slapd en ligne de command et en mode debug (en cas de problème)

:$ slapd -h ldap:/// ldapi:/// -u openldap -g openldap -d 65 -F /etc/ldap/slapd.d/ -d 65

Configurer le module Webmin "LDAP Server" :

  • Login for LDAP server = cn=admin,dc=zebulon,dc=freeboxos,dc=fr
  • Password for LDAP server = ***
  • Use encryption with LDAP server? = Yes TLS

Webmin propose d’installer automatiquement le module Perl Net::LDAP s’il n’est pas installé.

Ajouter les fichiers ca-cert.pem et ca-key.pem au "Backup Configuration Files" de Webmin

Modifier les droits d’accès (ACL)

ldaps-openldap-et-gnutls-debian

openldap: ACL

Créer un nouveau mot de passe pour un nouvel utilisateur LDAP

:$ slappasswd -s <MOT DE PASSE>
{SSHA}CpE4s/JDSV452-KPCUXtMAXdMFptwZkG

Créer un nouvel utilisateur LDAP qui aura un accès uniquement en lecture seule

:$ cat > service.ldif << EOF
dn: cn=service,dc=zebulon,dc=freeboxos,dc=fr
objectClass: simpleSecurityObject
objectClass: organizationalRole
cn: client
description: LDAP services
userPassword: {SSHA}LCslFkBp5RlbYf/gLUHeao0AaGPn0Bso
EOF
:$ ldapadd -cxWD cn=admin,dc=zebulon,dc=freeboxos,dc=fr -f service.ldif
Enter LDAP Password:
adding new entry "cn=service,dc=zebulon,dc=freeboxos,dc=fr"

Lister le contenu de la base LDAP avec le nouvel utilisateur (pour l’instant les droits d’accès ne sont pas changés)

:$ ldapsearch -LLL -x -H ldap:/// -b "dc=zebulon,dc=freeboxos,dc=fr" -D cn=service,dc=zebulon,dc=freeboxos,dc=fr -W
Enter LDAP Password:
dn: dc=zebulon,dc=freeboxos,dc=fr
objectClass: top
objectClass: dcObject
objectClass: organization
o: zebulon.freeboxos.fr
dc: zebulon

dn: cn=admin,dc=zebulon,dc=freeboxos,dc=fr
objectClass: simpleSecurityObject
objectClass: organizationalRole
cn: admin
description: LDAP administrator

dn: cn=service,dc=zebulon,dc=freeboxos,dc=fr
objectClass: simpleSecurityObject
objectClass: organizationalRole
cn: client
cn: service
description: LDAP services
userPassword:: e1NTSEF9TENzbEZrQnA1UmxiWWYvZ0xVSGVhbzBBYUdQbjBCc28=

Par défaut, LDAP autorise tous les utilisateurs à lire les données de la base. Pour le vérifier, il suffit de rechercher dans la base avec un utilisateur.

:$ ldapsearch -LLL -x -H ldap:/// -b "dc=cyberlogis" -D uid=jacky,ou=users,dc=zebulon,dc=freeboxos,dc=fr -W
Enter LDAP Password:
dn: dc=zebulon,dc=freeboxos,dc=fr
objectClass: top
objectClass: dcObject
objectClass: organization
o: zebulon.freeboxos.fr
dc: zebulon
...

Une recherche avec ‘olcAccess’ permet de voir les règles appliquées par LDAP (ici sur la base de donnée ‘mdb’).

:$ ldapsearch  -Y EXTERNAL -H ldapi:/// -b cn=config olcAccess
...
# {0}config, config
dn: olcDatabase={0}config,cn=config
olcAccess: {0}to * by dn.exact=gidNumber=0+uidNumber=0,cn=peercred,cn=external
,cn=auth manage by * break

# {1}mdb, config
dn: olcDatabase={1}mdb,cn=config
olcAccess: {0}to attrs=userPassword,shadowLastChange by self write by anonymou
s auth by * none
olcAccess: {1}to dn.base="" by * read
olcAccess: {2}to * by * read
...

Créer le fichier pour modifier les règles d’accès à la base LDAP

:$ cat > acl.ldif << EOF
dn: olcDatabase={1}mdb,cn=config
add: olcAccess
olcAccess: {0}to attrs=userPassword,shadowLastChange by self write by dn="cn=admin,dc=zebulon,dc=freeboxos,dc=fr" write by dn="cn=service,dc=zebulon,dc=freeboxos,dc=fr" read by anonymous auth by * none
-
add: olcAccess
olcAccess: {1}to * by dn="cn=admin,dc=zebulon,dc=freeboxos,dc=fr" write by self write by dn="cn=service,dc=zebulon,dc=freeboxos,dc=fr" read by anonymous auth by * none
EOF

Règle 0: permet aux utilisateurs de changer leur propre mot de passe, à l’administrateur de changer les mots de passe des utilisateurs, au service de lire les mots de passes (peut être pas utile), de forcer les anonyme a s’identifier et refuse le reste ("by * none" pourait être remplacé par "by user none" puisque que nous forçons les anonymes à s’identifier juste avant).

Règle 1: permet aux utilisateurs de changer leurs propre données, à l’administrateur de changer les données des utilisateurs, au service de lire les données des utilisateurs, de forcer les anonyme a s’identifier et refuse le reste ("by * none" pourait être remplacé par "by user none" puisque que nous forçons les anonymes à s’identifier juste avant).

Appliquer les modification dans la base LDAP

:$ ldapmodify -Y EXTERNAL -H ldapi:/// -f acl.ldif
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
modifying entry "olcDatabase={1}mdb,cn=config"

Vérification

:$ ldapsearch -LLL -x -H ldap:/// -b "dc=zebulon,dc=freeboxos,dc=fr" -D uid=jacky,ou=users,dc=zebulon,dc=freeboxos,dc=fr -W
Enter LDAP Password:
No such object (32)

:$ ldapsearch -LLL -x -H ldap:/// -b "dc=zebulon,dc=freeboxos,dc=fr" -D cn=service,dc=zebulon,dc=freeboxos,dc=fr -W
Enter LDAP Password:
dn: dc=zebulon,dc=freeboxos,dc=fr
objectClass: top
objectClass: dcObject
objectClass: organization
o: zebulon.freeboxos.fr
dc: zebulon
...

Gérer les utilisateur et groupes Unix avec LDAP depuis Webmin

Installer le module Webmin "LDAP Users and Groups" depuis "Un-used Modules"

Configurer le module "LDAP Users and Groups" pour utiliser le server LDAP local :

  • Configurer "localhost" comme LDAP server host
  • Selectioner TLS
  • Utilder "cn=admin,dc=zebulon,dc=freeboxos,dc=fr" comme utilisateur pour configurer LDAP
  • Configurer le password admin (credentials for bind name above)
  • Utiliser "ou=users,dc=zebulon,dc=freeboxos,dc=fr" comme Organizational Unit (OU) pour les utilisateurs
  • Utiliser "ou=groups,dc=zebulon,dc=freeboxos,dc=fr" comme Organizational Unit (OU) pour les groups


Webmin


La RFC 1274: COSINE and Internet X.500 Schema définie un certain nombre de paramètres LDAP qui font partis de RFC :Definition of the inetOrgPerson LDAP Object Class. Nous utilisons le paramètre mail de inetOrgPerson pour les utilisateurs (Le mail des utilisateur pourra être affiché dans Nextcloud).

Il faut que les utilisateur LDAP soit membre de inetOrgPerson.

Avec Webmin, il faut configurer le module "LDAP Users and Groups" pour ajouter inetOrgPerson dans Other objectClasses to add to new users et "mail" dans les listes suivantes :

  • LDAP properties for all new users
  • LDAP properties for modified users
  • Extra LDAP user properties to allow editing of

L’option Show fields for given name and surname doit être configurée à No. Sinon, l’erreure suivante Failed to save user : Failed to add user to LDAP database : objectClass: value #4 invalid per syntax sera retournée à la création d’un nouveau utilisateur.

Ajouter les Organizational Unit (OU) dans la base LDAP

:$ cat > ouUsersGroups.ldif << EOF
dn: ou=users,dc=zebulon,dc=freeboxos,dc=fr
objectClass: organizationalUnit
ou: users

dn: ou=groups,dc=zebulon,dc=freeboxos,dc=fr
objectClass: organizationalUnit
ou: groups
EOF
:$ ldapadd -cxWD cn=admin,dc=zebulon,dc=freeboxos,dc=fr -f ouUsersGroups.ldif
Enter LDAP Password:
adding new entry "ou=users,dc=zebulon,dc=freeboxos,dc=fr"

adding new entry "ou=groups,dc=zebulon,dc=freeboxos,dc=fr"

Vérification

:$ ldapsearch -LLL -x -H ldap:/// -b "dc=zebulon,dc=freeboxos,dc=fr" -D cn=admin,dc=zebulon,dc=freeboxos,dc=fr -W
Enter LDAP Password:
dn: dc=zebulon,dc=freeboxos,dc=fr
objectClass: top
objectClass: dcObject
objectClass: organization
o: zebulon.freeboxos.fr
dc: zebulon

dn: cn=admin,dc=zebulon,dc=freeboxos,dc=fr
objectClass: simpleSecurityObject
objectClass: organizationalRole
cn: admin
description: LDAP administrator
userPassword:: e1NTSEF9WndRampUMUx1dnJqOVZVU0JlVzJ1VEhpVGtxeXB6aWU=

dn: cn=service,dc=zebulon,dc=freeboxos,dc=fr
objectClass: simpleSecurityObject
objectClass: organizationalRole
cn: client
cn: service
description: LDAP services
userPassword:: e1NTSEF9TENzbEZrQnA1UmxiWWYvZ0xVSGVhbzBBYUdQbjBCc28=

dn: ou=users,dc=zebulon,dc=freeboxos,dc=fr
objectClass: organizationalUnit
ou: users

dn: ou=groups,dc=zebulon,dc=freeboxos,dc=fr
objectClass: organizationalUnit
ou: groups

Installer le client LDAP

configure-linux-clients-authenticate-using-openldap

www.debian.org

linux-ldap-authentication

authentification-ldap-debian-wheezy

Avec Webmin depuis "Un-Used modules" -> "LDAP client" cliquer sur le bouton pour installer automatiquement NSS (libnss-ldap:amd64), NSCD et PAM (libpam-ldap:amd64).

Ou en ligne de commande pour mieux controler les options d’installations

NSCD gère un cache local dans le cas ou le serveur LDAP n’est pas joignable quand l’utilisateur se connecte.

:$ apt-get install libnss-ldap libpam-ldap nscd

Installation de NSS

  • URI: ldap://127.0.0.1:389/

  • DN: dc=zebulon,dc=freeboxos,dc=fr

  • LDAP Version: 3

  • LDAP root: cn=admin,dc=zebulon,dc=freeboxos,dc=fr

  • LDAP root pwd: ***

le fichier /etc/nsswitch.conf devra être modifié manuellement après l’installation

Installation de PAM

Donner les privilèges de superutilisateur local au compte administrateur LDAP pour pouvoir modifier les comptes utilisateurs locaux depuis les informations sauvegardées dans la base LDAP.

  • LDAP demande une identification: oui

  • LDAP root: cn=admin,dc=zebulon,dc=freeboxos,dc=fr

  • LDAP root pwd: ***

  • Utilisateur lecture seule: cn=service,dc=zebulon,dc=freeboxos,dc=fr

  • Mot de passe utilisateur lecture seule: ***

Configurer NSS

wiki.debian.org

La documenation est dans le répertoire /usr/share/doc/libnss-ldap/

La configuration de NSS peut être changé après l’installation avec la commande "dpkg-reconfigure libnss-ldap"

Il est possible de vérifier la configuration dans le fichier /etc/libnss-ldap.conf

Avant de modifier la conifguration de NSS, il est préférable d’arreter NSCD:

:$ /etc/init.d/nscd stop

Mettre à jour le fichier /etc/nsswitch.conf pour ajouter LDAP au différent services à activer (ATTENTION: il faut ajouer LDAP après ‘files’)

LDAP peut être utilisé pour les services suivants: aliases (mail aliases, ignoré par la plupart des services), ethers (adresse ethernet), group (groups des utilisateurs), hosts (adress et nom des domains), netgroup (domain et group utilisateur utilisé pour le control d’accès), networks (nom des réseaux et adresses), passwd (mot de passe utilisateurs), protocols (protocoles réseaux), rpc (noms et adresses des "remote procedure call"), services (noms et adresses des services réseaux) et shadow (mot de passe caché des utilisateurs).

:$ nano /etc/nsswitch.conf
# /etc/nsswitch.conf
#
# Example configuration of GNU Name Service Switch functionality.
# If you have the `glibc-doc-reference' and `info' packages installed, try:
# `info libc "Name Service Switch"' for information about this file.

passwd:         compat ldap
group:          compat ldap
shadow:         compat ldap
gshadow:        files ldap

hosts:          files dns
networks:       files

protocols:      db files
services:       db files
ethers:         db files
rpc:            db files

netgroup:       nis

Redémarrer NSCD

:$ /etc/init.d/nscd restart

Vérifier que NSS voit les utilisateurs LDAP avec la command "getent passwd"

:$ getent passwd
root:x:0:0:root:/root:/bin/bash
...
openldap:x:110:114:OpenLDAP Server Account,,,:/var/lib/ldap:/bin/false
nextcloud:x:1001:33:nextcloud:/home/nextcloud:/bin/false
jacky:x:1002:100:Jacqueline:/home/jacky:/bin/bash

Configurer PAM

wiki.debian.org

La configuration de PAM peut être changé après l’installation avec la commande dpkg-reconfigure libpam-ldap

Il est possible de vérifier la configuration dans le fichier /etc/pam_ldap.conf

Les fichiers de configuration de PAM (/etc/pam.d/common-*) sont modifiés lors de l’installation de NSS.

Ajouter la ligne suivante au fichier common-session pour créer automatiquement le répertoire home des utilisateurs qui se connectent.

:$ echo -e "#create a HOME directorynsessiontrequiredtttpam_mkhomedir.so" >> /etc/pam.d/common-session

Redémarrer NSCD

:$ /etc/init.d/nscd restart

Pour vérifier l’instalation, il suffit de se connecter avec un utilisateur créé dans la base LDAP.

Modifier le mot de passe d’un utilisateur LDAP

Créer un nouveau password

:$ slappasswd -s <MOT DE PASSE>
{SSHA}CpE4s/JDSVrMyrKP1126tMAXdMFptwZkG

Changer le password de l’utilisateur service

:$ cat > password.ldif << EOF
dn: cn=service,dc=zebulon,dc=freeboxos,dc=fr
changetype: modify
replace: userPassword
userPassword: {SSHA}CpE4s/JDSVrMyrKP1126tMAXdMFptwZkG
EOF
:$ ldapmodify -H ldap://127.0.0.1:389/ -D cn=admin,dc=zebulon,dc=freeboxos,dc=fr -W  -f password.ldif
Enter LDAP Password:
modifying entry "cn=service,dc=zebulon,dc=freeboxos,dc=fr"

Vérification

:$ ldapsearch -LLL -x -H ldap:/// -b "dc=zebulon,dc=freeboxos,dc=fr" -D cn=service,dc=zebulon,dc=freeboxos,dc=fr -W
Enter LDAP Password:
dn: dc=zebulon,dc=freeboxos,dc=fr
objectClass: top
objectClass: dcObject
objectClass: organization
o: zebulon.freeboxos.fr
dc: zebulon
...

Pour le password root (admin), il faut modifier olcRootPW dans dn: olcDatabase={1}mdb,cn=config

:$ ldapsearch -LLL -Y EXTERNAL -H ldapi:/// -b "cn=config"
...
dn: olcDatabase={1}mdb,cn=config
objectClass: olcDatabaseConfig
objectClass: olcMdbConfig
olcDatabase: {1}mdb
olcDbDirectory: /var/lib/ldap
olcSuffix: dc=cyberlogis
olcAccess: {0}to attrs=userPassword,shadowLastChange by self write by anonymou
 s auth by * none
olcAccess: {1}to dn.base="" by * read
olcAccess: {2}to * by * read
olcLastMod: TRUE
olcRootDN: cn=admin,dc=zebulon,dc=freeboxos,dc=fr
olcRootPW: {SSHA}AotMeV789+L19KYgH5bMnRNyWApQ/mwE
...

Références :

wiki.debian.org

Webmin: LDAP_Users_and_Groups

ldaps-openldap-et-gnutls-debian

www.debian.org


Installer Nextcloud 11 sous Debian 8 (Jessie) avec Nginx

Prérequis

Installer MariaDB : Se rapporter au tutoriel : "Installer MariaDB 10.1 sur Debian 8 (Jessie)"

Installer Nginx : Se rapporter au tutoriel : "Installer Nginx 1.9 sur Debian 8 (Jessie)"

Vérifier la version de Nginx

:$ nginx -v
nginx version: nginx/1.10.2

Vérifier les prérequis pour PHP et l’installation de Nextcloud 11.0.1

La liste des prérequis pour Nextcloud 11 peut être lu ici : Nextcloud : Admin Manual – Installation

Module Générique :

PHP et modules requis :

Module Générique Installé
php5 (>= 5.6, 7.0 or 7.1) 7.1.2-2
PHP module ctype enabled
PHP module dom 2.9.1
PHP module GD 2.1.1-dev
PHP module iconv 2.19
PHP module JSON 1.5.0
PHP module libxml (Linux package libxml2 must be >=2.7.0) 2.9.1
PHP module mb multibyte 1.3.2 (mbstring)
PHP module posix Id: b691ca925e7a085e6929579c4eba8fed0732e0ef
PHP module SimpleXML Id: 7e5516dcdf2fe6ded7970eaeb6abd8d07df39a2a
PHP module XMLWriter enable
PHP module zip 1.13.5
PHP module zlib 1.2.8
Module Base de Donnée (en séléctioner un) Installé
PHP module sqlite (>= 3, usually not recommended for performance reasons) Not installed
PHP module pdo_mysql (MySQL/MariaDB) mysqlnd 5.0.12-dev – 20150407
PHP module pgsql (requires PostgreSQL >= 9.0) No installed
PHP modules recommendés Installé
PHP module curl 7.38.0
PHP module fileinfo (highly recommended, enhances file analysis performance) 1.0.5
PHP module bz2 (recommended, required for extraction of apps) 1.0.6, 6-Sept-2010
PHP module intl (increases language translation performance and fixes sorting of non-ASCII characters) 1.1.0
PHP module mcrypt (increases file encryption performance) 2.5.8
PHP module openssl (required for accessing HTTPS resources) OpenSSL 1.0.2k 26 Jan 2017
PHP modules requis pour certaines applications Installé
PHP module ldap (for LDAP integration) API Version 3001 – Vendor Version 20444
PHP module smbclient (SMB/CIFS integration, see SMB/CIFS) Not installed
PHP module ftp (for FTP storage / external user authentication) enabled
PHP module imap (for external user authentication) 2007f
PHP modules recommendés pour certaines applications Installé
PHP module exif (for image rotation in pictures app) 1.4
PHP module gmp (for SFTP storage) Not installed
Pour améliorer les performances du serveur (selectioner l’un des memcaches) Installé
PHP module apc Not installed
PHP module apcu Not installed
PHP module memcached Not installed
PHP module redis (>= 2.2.5, required for Transactional File Locking) Not installed
Pour la génération d’apperçu Installé
PHP module imagick 3.4.3RC1
avconv or ffmpeg Not installed
OpenOffice or LibreOffice Not installed

Pour les commande en ligne :

PHP module pcntl (enables command interruption by pressing ctrl-c)  

La version de php et des différants modules peuvent être obtenu en créant un fichier ‘index.php’ a la racine du serveur contenant : <?php phpinfo();?>

Installer les fichier Nextcloud 11.0.2 sur Debian

:$ cd /websites/<hostname>/www
:$ wget https://download.nextcloud.com/server/releases/nextcloud-11.0.2.zip
:$ unzip nextcloud-11.0.2.zip
:$ rm nextcloud-11.0.2.zip
:$ chown -R www-data:www-data nextcloud/

Vérifier les prérequis et configurer MariaDB pour Nextcloud 11.0.1
La liste des prérequis pour Nextcloud 11 peut être lu ici : Nextcloud : system_requirements

les fichiers dans le répertoire conf.d sont automatiquement ajouté à la configuration – voir /etc/mysql/my.cnf

Désactiver les log binaire de MariaDB :

:$ echo -e "[mysqld]nskip-log-bin" >> /etc/mysql/conf.d/disable_binary_log.cnf

Configurer le niveau d’isolation des transactions à "READ-COMMITTED" :

:$ echo -e "[mysqld]ntransaction-isolation = READ-COMMITTED" >> /etc/mysql/conf.d/transaction_isolation.cnf

Appliquer les modifications en redémarant MariaDB :

:$ /etc/init.d/mysql restart

Créer l’utilisateur et la base de donnée dans MariaDB pour Nextcloud :

:$ mysql -uroot -p

MariaDB [(none)]> CREATE USER 'nextcloud'@'localhost' IDENTIFIED BY '<PASSWORD>';
CREATE DATABASE IF NOT EXISTS nextcloud;
GRANT ALL PRIVILEGES ON nextcloud.* TO 'nextcloud'@'localhost' IDENTIFIED BY '<PASSWORD>';

MariaDB [(none)]> quit

Activer le support des Emoji dans Nextcloud en activant le support de UTF8 4-byte dans MariaDB :

:$ echo -e "[mysqld]ninnodb_large_prefix=trueninnodb_file_format=barracudaninnodb_file_per_table=1" >> /etc/mysql/conf.d/enable_emoji.cnf

:$ /etc/init.d/mysql restart

Se connecter avec l’utilisateur administrateur de la base de donnée de Nextcloud pour configurer le support de UTF8 4-byte

:$ mysql -unextcloud -p

MariaDB [(none)]> ALTER DATABASE nextcloud CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;

MariaDB [(none)]> quit

Il faut modifier la configuration de Nextcloud pour activer UTF8 4-byte. Cette étape ne peut être faite qu’une fois nextcloud installé.

Optimiser Nginx pour Nextcloud

Nextcloud: performance-tuning

Nextcloud: Nginx Example Configurations

Nginx: http2 module

ATTENTION : l’utilisation de http_v2 ne fonctionne pas avec nginx 1.10.3 et php-fsm 7.1.4.

Vérifier que le module Nginx http_v2 est installé

:$ nginx -V 2>&1 | grep http_v2 -o
http_v2

ATTENTION : l’utilisation de http_v2 ne fonctionne pas avec nginx et php-fsm.

Nginx config doit être mis à jour pour utiliser http2 sur le port 443

:$ nano /etc/nginx/sites-available/https_mon.domaine.fr
# [...]
listen 443 ssl http2;

Le module ngx_cache_purge n’est pas installé par défaut avec Nginx sur Debian et Rasbian (il faut compiler Nginx avec le module – PAS FAIT).
Ce module permet d’optimiser l’affichage des images dans la gallerie de Nextcloud

:$ nginx -V 2>&1 | grep ngx_cache_purge -o

Configure Nginx 1.10.2 pour Nextcloud 11.0.0

Nextcloud : Nextcloud in a subdir of nginx

Mettre à jour la configuration de Nginx pour inclure à la fin du fichier la configuration de Nextcloud

:$ nano /etc/nginx/sites-available/http_mon.domaine.fr
upstream php-handler {

    #server 127.0.0.1:9000;
    server unix:/var/run/php/php7.0-fpm.sock;
}

# Default server configuration
#
server {

        # [...]

        #
        # Nextcloud
        #
        include snippets/nextcloud.conf;
}

Copier la configuration de l’exemple dans le fichier nextcloud.conf qui est inclus dans la configuration principale :

:$ nano /etc/nginx/snippets/nextcloud.conf
    # The following 2 rules are only needed for the user_webfinger app.
    # Uncomment it if you're planning to use this app.
    # rewrite ^/.well-known/host-meta /nextcloud/public.php?service=host-meta
    # last;
    #rewrite ^/.well-known/host-meta.json
    # /nextcloud/public.php?service=host-meta-json last;

    location = /.well-known/carddav {
      return 301 $scheme://$host/nextcloud/remote.php/dav;
    }
    location = /.well-known/caldav {
      return 301 $scheme://$host/nextcloud/remote.php/dav;
    }

    location /.well-known/acme-challenge { }

    location ^~ /nextcloud {

        # set max upload size
        client_max_body_size 512M;
        fastcgi_buffers 64 4K;

        # Disable gzip to avoid the removal of the ETag header
        gzip off;

        # Uncomment if your server is build with the ngx_pagespeed module
        # This module is currently not supported.
        #pagespeed off;

        location /nextcloud {
            rewrite ^ /nextcloud/index.php$uri;
        }

        location ~ ^/nextcloud/(?:build|tests|config|lib|3rdparty|templates|data)/ {
            deny all;
        }
        location ~ ^/nextcloud/(?:.|autotest|occ|issue|indie|db_|console) {
            deny all;
        }

        location ~ ^/nextcloud/(?:index|remote|public|cron|core/ajax/update|status|ocs/v[12]|updater/.+|ocs-provider/.+|core/templates/40[34]).php(?:$|/) {
            fastcgi_split_path_info ^(.+.php)(/.*)$;
            include fastcgi_params;
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
            fastcgi_param PATH_INFO $fastcgi_path_info;
            fastcgi_param HTTPS on;
            #Avoid sending the security headers twice
            fastcgi_param modHeadersAvailable true;
            fastcgi_param front_controller_active true;
            fastcgi_pass php-handler;
            fastcgi_intercept_errors on;
            fastcgi_request_buffering off;
        }

        location ~ ^/nextcloud/(?:updater|ocs-provider)(?:$|/) {
            try_files $uri/ =404;
            index index.php;
        }

        # Adding the cache control header for js and css files
        # Make sure it is BELOW the PHP block
        location ~* .(?:css|js|woff|svg|gif)$ {
            try_files $uri /nextcloud/index.php$uri$is_args$args;
            add_header Cache-Control "public, max-age=7200";
            # Add headers to serve security related headers  (It is intended
            # to have those duplicated to the ones above)
            # Before enabling Strict-Transport-Security headers please read
            # into this topic first.
            # add_header Strict-Transport-Security "max-age=15768000;
            # includeSubDomains; preload;";
            add_header X-Content-Type-Options nosniff;
            add_header X-Frame-Options "SAMEORIGIN";
            add_header X-XSS-Protection "1; mode=block";
            add_header X-Robots-Tag none;
            add_header X-Download-Options noopen;
            add_header X-Permitted-Cross-Domain-Policies none;
            # Optional: Don't log access to assets
            access_log off;
        }

        location ~* .(?:png|html|ttf|ico|jpg|jpeg)$ {
            try_files $uri /nextcloud/index.php$uri$is_args$args;
            # Optional: Don't log access to other assets
            access_log off;
        }
    }

ATTENTION : la commande fastcgi_params HTTPS on; dans le fichier /etc/nginx/snippets/nextcloud.conf doit être commentée si HTTPS n’est pas utilisé.

Vérifier la configuration avant de redémarrer le serveur

:$ nginx -t

Redémarrer le serveur

:$ /etc/init.d/nginx restart

Installer Nextcloud 11.0.0 avec le Wizard

Nextcloud : installation wizard

Il est possible de stoquer les données utilisateurs sur un répertoire distant, voir les notes :

  • Monter répertoire partagé Freebox avec Samba depuis le RaspberryPi
  • Monter un répertoire partagé QNAP depuis raspberry avec samba

Depuis le navigateur web : http://local.mon.domaine.fr/nextcloud

Si le répertoire de donnée des utilisateurs est stoqué sur une machine distante, configurer le répertoire de donnée (data folder) avec le chemin du point de montage.

Par example : /media/pi/Nextcloud

Modifier la configuration de Nextcloud pour activer UTF8 4-byte (ne peut pas être fait avant d’avoir fini l’installation de nextcloud)

:$ cd /websites/mon.domaine.fr/www/nextcloud

:$ su -s /bin/sh www-data -c 'php occ config:system:set mysql.utf8mb4 --type boolean --value="true"'
System config value mysql.utf8mb4 set to boolean true

Authentification des utilisateurs avec LDAP

Nextcloud : user auth ldap

Activer l’application Nextcloud ‘LDAP user and group backend’ depuis le gestionaire d’application Nextcloud

Activer LDAP

Configure le client LDAP depuis la console d’administration de Nextcloud

Configurer LDAP

Cette configuration est basé sur la RFC 1274: COSINE and Internet X.500 Schema qui définie un certain nombre de paramètres LDAP qui font partis de RFC :Definition of the inetOrgPerson LDAP Object Class. Nous utilisons le paramètre mail de inetOrgPerson pour les utilisateurs Nextcloud. Pour plus de détail, se rapporter au wiki "Installer OpenLDAP sous Debian 8 (jesie) avec Webmin"

Configuration du serveur :

  • Host : localhost
  • User DN : cn=client,dc=mon,dc=domaine,dc=fr
  • Password :
  • Base DN : dc=mon,dc=domaine,dc=fr

Configuration des utilisateurs :

  • Only these object classes : posixAccount

Configuration de la connection :

  • LDAP / AD Username : x

Configuration des groupes :

  • Only these object classes : posixGroup

Configuration avancée :

  • User Display Name Field : cn
  • 2nd User Display Name Field : mail
  • Base User Tree : ou=users,dc=mon,dc=domaine,dc=fr
  • Group Display Name Field : cn
  • Base Group Tree : ou=groups,dc=mon,dc=domaine,dc=fr
  • Group-Member association : memberUid
  • Email Field : mail

Configuration expert

  • Internal Username: uid

les boutons "Clear Username-LDAP User Mapping" et/ou "Clear Username-LDAP Group Mapping" doivent être cliqué pour prendre en compte les changements dans la configuration expert.

Configuration de la mémoire-cache

Nextcloud : caching configuration

Nextcloud supporte les gestionnaire de mémore-cache suivants:

  • APCu (>= 4.0.6) : Pour la gestion de la mémoire-cahce locale du système.
  • Memcached : Gestion de la mémoire-cache distribuée pour plusieurs serveurs Nextcloud.
  • Redis avec un module PHP >= 2.2.6 : Gestion de la mémoire-cache distribué (plus résent de Memcached et gére mieux la réservation des resources fichiers)

Pour un petit serveur, l’utilisation d’APCu est suffisant.

Installation de PHP APCu et configuration de Nextcloud

Sous Debian Jessie il faut utiliser le dépôt deb.sury.org pour installer le paquet php-apcu qui fournit php-user-cache, php5.6-apcu, php7.0-apcu et php7.1-apcu.

:$ apt-get update

:$ apt-cache policy php-apcu
php-apcu:
  Installé : (aucun)
  Candidat : 5.1.8+4.0.11-1+0~20170123102543.11+jessie~1.gbpcbae00
 Table de version :
     5.1.8+4.0.11-1+0~20170123102543.11+jessie~1.gbpcbae00 0
        500 https://packages.sury.org/php/ jessie/main amd64 Packages

:$ apt-get install php-apcu

Redémarrer php-fpm et le serveur Nginx et ajouter la ligne "’memcache.local’ => ‘OCMemcacheAPCu’," au fichier "config.php" de Nextcloud.

:$ /etc/init.d/php7.1-fpm restart && /etc/init.d/nginx restart

:$ nano /websites/binaryworld.fr.eu.org/www/nextcloud/config/config.php
:$ nano /websites/binaryworld.fr.eu.org/www/nextcloud/config/config.php
<?php
$CONFIG = array (

  'memcache.local' => 'OCMemcacheAPCu',
);

Recharger la page d’administration de Nextcloud. L’avertissement à propos de la mémoire-cache devrait avoir disparu.

La page avec phpinfo() retourne bien la version apcu 5.1.7 (compatible apc 1.0.3) avec les fichiers de configuraitons : /etc/php/7.1/fpm/conf.d/20-apcu.ini et /etc/php/7.1/fpm/conf.d/20-apcu_bc.ini

Installation de PHP Redis et conifguration de Nextcloud

Installer PHP Redis

Mettre à jour la liste des applications du gestionnaire d’applications

$: apt-get update

Vérifier les versions disponibles de redis

$: apt-cache policy redis-server
redis-server:
  Installé : (aucun)
  Candidat : 2:2.8.17-1+deb8u5
 Table de version :
     3:3.2.8-2~bpo8+1 0
        100 http://ftp.fr.debian.org/debian/ jessie-backports/main amd64 Packages
     2:2.8.17-1+deb8u5 0
        500 http://ftp.fr.debian.org/debian/ jessie/main amd64 Packages
        500 http://security.debian.org/ jessie/updates/main amd64 Packages

Installer la dernière version disponible (3.2.8) de redis depuis jessie-backports

$: apt-get -t jessie-backports -y install redis-server
Lecture des listes de paquets... Fait
Construction de l'arbre des dépendances       
Lecture des informations d'état... Fait
Les paquets suivants ont été installés automatiquement et ne sont plus nécessaires :
  linux-image-3.16.0-4-amd64 linux-image-4.9.0-0.bpo.2-amd64 python-ldap3
Veuillez utiliser « apt-get autoremove » pour les supprimer.
Les paquets supplémentaires suivants seront installés :
  redis-tools
Paquets suggérés :
  ruby-redis
Les NOUVEAUX paquets suivants seront installés :
  redis-server redis-tools
0 mis à jour, 2 nouvellement installés, 0 à enlever et 86 non mis à jour.
Il est nécessaire de prendre 523 ko dans les archives.
Après cette opération, 1 394 ko d'espace disque supplémentaires seront utilisés.
Réception de : 1 http://ftp.fr.debian.org/debian/ jessie-backports/main redis-tools amd64 3:3.2.8-2~bpo8+1 [109 kB]
Réception de : 2 http://ftp.fr.debian.org/debian/ jessie-backports/main redis-server amd64 3:3.2.8-2~bpo8+1 [414 kB]
523 ko réceptionnés en 0s (745 ko/s)  
Sélection du paquet redis-tools précédemment désélectionné.
(Lecture de la base de données... 88860 fichiers et répertoires déjà installés.)
Préparation du dépaquetage de .../redis-tools_3%3a3.2.8-2~bpo8+1_amd64.deb ...
Dépaquetage de redis-tools (3:3.2.8-2~bpo8+1) ...
Sélection du paquet redis-server précédemment désélectionné.
Préparation du dépaquetage de .../redis-server_3%3a3.2.8-2~bpo8+1_amd64.deb ...
Dépaquetage de redis-server (3:3.2.8-2~bpo8+1) ...
Traitement des actions différées (« triggers ») pour man-db (2.7.0.2-5) ...
Traitement des actions différées (« triggers ») pour systemd (230-7~bpo8+2) ...
Paramétrage de redis-tools (3:3.2.8-2~bpo8+1) ...
Paramétrage de redis-server (3:3.2.8-2~bpo8+1) ...
Traitement des actions différées (« triggers ») pour systemd (230-7~bpo8+2) ...

Vérifier l’installation

$: redis-server --version
Redis server v=3.2.8 sha=00000000:0 malloc=jemalloc-3.6.0 bits=64 build=bb0ba4e36835f109

$: systemctl status redis-server
● redis-server.service - Advanced key-value store
   Loaded: loaded (/lib/systemd/system/redis-server.service; enabled; vendor preset: enabled)
   Active: active (running) since dim. 2017-12-03 18:25:45 CET; 2min 8s ago
     Docs: http://redis.io/documentation,
           man:redis-server(1)
 Main PID: 17055 (redis-server)
   CGroup: /system.slice/redis-server.service
           └─17055 /usr/bin/redis-server 127.0.0.1:6379       

déc. 03 18:25:45 monnas systemd[1]: Starting Advanced key-value store...
déc. 03 18:25:45 monnas run-parts[17049]: run-parts: executing /etc/redis/redis-server.pre-up.d/00_example
déc. 03 18:25:45 monnas run-parts[17056]: run-parts: executing /etc/redis/redis-server.post-up.d/00_example
déc. 03 18:25:45 monnas systemd[1]: Started Advanced key-value store.

Noter le port découte du serveur redis (ici 6379)

Tester redis

$: redis-cli
127.0.0.1:6379> set test "HelloRedis"
OK
127.0.0.1:6379> get test
"HelloRedis"

Normalement php-redis est disponible avec la version 8 de debian.
Pour le vérfier :

$: apt-cache policy php.*-redis
php5.6-redis:
  Installé : (aucun)
  Candidat : (aucun)
 Table de version :
php5-redis:
  Installé : (aucun)
  Candidat : 2.2.5-1
 Table de version :
     2.2.5-1 0
        500 http://ftp.fr.debian.org/debian/ jessie/main amd64 Packages
php7.0-redis:
  Installé : (aucun)
  Candidat : (aucun)
 Table de version :
php7.1-redis:
  Installé : (aucun)
  Candidat : (aucun)
 Table de version :
php-redis-dbgsym:
  Installé : (aucun)
  Candidat : 3.1.4~rc1.really.3.1.2-1+0~20170912061752.3+jessie~1.gbpba69c3
 Table de version :
     3.1.4~rc1.really.3.1.2-1+0~20170912061752.3+jessie~1.gbpba69c3 0
        500 https://packages.sury.org/php/ jessie/main amd64 Packages
php-redis:
  Installé : (aucun)
  Candidat : 3.1.4~rc1.really.3.1.2-1+0~20170912061752.3+jessie~1.gbpba69c3
 Table de version :
     3.1.4~rc1.really.3.1.2-1+0~20170912061752.3+jessie~1.gbpba69c3 0
        500 https://packages.sury.org/php/ jessie/main amd64 Packages
php7.2-redis:
  Installé : (aucun)
  Candidat : (aucun)
 Table de version :

Installer le module PHP pour redis (compatible aussi avec php-fpm).

$: apt-get -y install php-redis

Redémarrer php-fpm

$: systemctl restart php7.1-fpm
$: systemctl status php7.1-fpm
● php7.1-fpm.service - The PHP 7.1 FastCGI Process Manager
   Loaded: loaded (/lib/systemd/system/php7.1-fpm.service; enabled; vendor preset: enabled)
   Active: active (running) since dim. 2017-12-03 18:41:55 CET; 3s ago
     Docs: man:php-fpm7.1(8)
 Main PID: 18023 (php-fpm7.1)
   Status: "Ready to handle connections"
    Tasks: 3
   Memory: 48.5M
      CPU: 315ms
   CGroup: /system.slice/php7.1-fpm.service
           ├─18023 php-fpm: master process (/etc/php/7.1/fpm/php-fpm.conf)                      
           ├─18024 php-fpm: pool www                                                            
           └─18025 php-fpm: pool www                                                            

déc. 03 18:41:55 monnas systemd[1]: Starting The PHP 7.1 FastCGI Process Manager...
déc. 03 18:41:55 monnas systemd[1]: Started The PHP 7.1 FastCGI Process Manager.

Configurer Nextcloud avec PHP Redis

APCu est plus rapide que Redis pour gérer le cache local. Il est donc préférable
d’utiliser APCu pour gérer le cache local et Redis pour la réservation des ressources (files locking).
Comme APCu demande plus de mémoire que Redis, si vous êtes dans un environnement avec peu de mémoire, utiliser Redis pour la gestion du cache local.

Editer le fichier de configuration de Nextcloud

$: nano /www/nextcloud/config/config.php

Modifier la configuration du memcache

  'memcache.distributed' => '\OC\Memcache\Redis',
  'memcache.local' => '\OCMemcache\APCu',
  'memcache.locking' => '\OC\Memcache\Redis',
  'redis' => array(
      'host' => 'localhost',
      'port' => 6379,
  ),

Redémarrer le server web (Nginx)

$: systemctl restart nginx
$: systemctl status nginx
● nginx.service - A high performance web server and a reverse proxy server
   Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled)
   Active: active (running) since dim. 2017-12-03 19:12:45 CET; 10s ago
     Docs: man:nginx(8)
  Process: 18533 ExecStop=/sbin/start-stop-daemon --quiet --stop --retry QUIT/5 --pidfile /run/nginx.pid (code=exited, status=0/SUCCESS)
  Process: 18539 ExecStart=/usr/sbin/nginx -g daemon on; master_process on; (code=exited, status=0/SUCCESS)
  Process: 18535 ExecStartPre=/usr/sbin/nginx -t -q -g daemon on; master_process on; (code=exited, status=0/SUCCESS)
 Main PID: 18541 (nginx)
    Tasks: 3
   Memory: 4.2M
      CPU: 90ms
   CGroup: /system.slice/nginx.service
           ├─18541 nginx: master process /usr/sbin/nginx -g daemon on; master_process on
           ├─18542 nginx: worker process                           
           └─18543 nginx: worker process                           

déc. 03 19:12:45 monnas systemd[1]: Starting A high performance web server and a reverse proxy server...
déc. 03 19:12:45 monnas systemd[1]: Started A high performance web server and a reverse proxy server.

Configure Redis with Unix Socket

Pour améliorer les performances (~25%), il est possible de configurer Redis pour utiliser les socket unix plutôt que TCP.
TBC

How to Configure Redis to Use Unix Socket Speed Boost


Il faut modifier la configuration de Nextcloud
https://docs.nextcloud.com/server/12/admin_manual/configuration_server/caching_configuration.html#id3

Renforcer la sécurité

Nextcloud : strong permissions

Créer un script pour modifier les permissions des fichiers de Nextcloud. Modifier les paramètre ocpath avec le chemin vers le repertoire installation de Nextcloud. Remplacer websites avec le répertoire principale du serveur HTTP. Il faut adapter le script si le répertoire des données utilisateurs a été déplacé vers un autre répertoire que celui par défaut.

:$ cat > nextcloud_set_strong_permissions.sh << EOF
#!/bin/bash
# the Nextcloud script is updated to make it relative to the /websites/ folder in order to avoid to impact the root directory (/)
# if the ocpath parameter is empty
ocpath='mon.domain.fr/www/nextcloud'
htuser='www-data'
htgroup='www-data'
rootuser='root'

printf "Creating possible missing Directoriesn"
mkdir -p /websites/$ocpath/data
mkdir -p /websites/$ocpath/updater

printf "chmod Files and Directoriesn"
find /websites/${ocpath}/ -type f -print0 | xargs -0 chmod 0640
find /websites/${ocpath}/ -type d -print0 | xargs -0 chmod 0750

printf "chown Directoriesn"
chown ${rootuser}:${htgroup} /websites/${ocpath}
chown -R ${rootuser}:${htgroup} $(ls -1 /websites/${ocpath} | awk -vnpath=/websites/${ocpath}/ '{if($1 != "data" && $1 != "apps" && $1 != "config" && $1 != "themes"){print npath$1}}')
chown -R ${htuser}:${htgroup} /websites/${ocpath}/apps/
chown -R ${htuser}:${htgroup} /websites/${ocpath}/config/
chown -R ${htuser}:${htgroup} /websites/${ocpath}/data/
chown -R ${htuser}:${htgroup} /websites/${ocpath}/themes/
chown -R ${htuser}:${htgroup} /websites/${ocpath}/updater/

chmod +x /websites/${ocpath}/occ

printf "chmod/chown .htaccessn"
if [ -f /websites/${ocpath}/.htaccess ]
 then
  chmod 0644 /websites/${ocpath}/.htaccess
  chown -v ${rootuser}:${htgroup} /websites/${ocpath}/.htaccess
fi
if [ -f /websites/${ocpath}/data/.htaccess ]
 then
  chmod 0644 /websites/${ocpath}/data/.htaccess
  chown -v ${rootuser}:${htgroup} /websites/${ocpath}/data/.htaccess
fi

printf "chmod/chown .user.inin"
if [ -f /websites/${ocpath}/.user.ini ]
 then
  chmod 0644 /websites/${ocpath}/.user.ini
  chown ${rootuser}:${htgroup} /websites/${ocpath}/.user.ini
fi

Lancer le script

:$ ~/nextcloud_set_strong_permissions.sh



Références :

Nextcloud : instructions-server

Nextcloud : installation nextcloud 11

Nextcloud : source_installation

Nextcloud : Admin Manual – Installation

Nextcloud : system_requirements

Nextcloud : performance-tuning

Nextcloud : Nginx Example Configurations

Nextcloud : Nextcloud in a subdir of nginx

Nextcloud : Nextcloud in a subdir of nginx

Nextcloud : user auth ldap

Nextcloud : caching configuration

Nextcloud : files locking

Nextcloud : strong permissions

Nginx : http2 module

howtoforge.com : installing-nginx-with-php-fpm-and-mariadb-lemp-on-debian-jessie

Redis : documentation


Installer Docker CE sur Debian 8 (Jessie)

Docker permet d’embarquer une application dans un container qui pourra s’exécuter sur n’importe quel machine. D’abord optimisé pour Linux, il l’est désormais pour Windows Server. C’est une technologie qui a pour but de faciliter les déploiements d’application, et la gestion du dimensionnement de l’infrastructure sous-jacente. Elle est en partie proposée en open source (sous licence Apache 2.0) par une société américaine, également appelée Docker, qui a été lancée par un Français : Solomon Hykes.

Comme le container n’embarque pas d’OS, à la différence de la machine virtuelle, il est par conséquent beaucoup plus léger que cette dernière. Il n’a pas besoin d’activer un second système pour exécuter ses applications. Cela se traduit par un lancement beaucoup plus rapide, mais aussi par la capacité à migrer plus facilement un container (du fait de son faible poids) d’une machine physique à une autre.

Le shéma suivant met en évidence les différences d’architecture en VM (à gauche) et Container (à droite).


Docker vs VM


Mettre à jour Debian 8

Mettre à jour les dépôts APT

:$ apt-get update

Mettre à jour le système si nécessaire

:$ apt-get upgrade

Désinstaller les verisons de Docker précédentes

Vérifier s’il existe déjà une version de Docker installée

:$ apt-cache policy docker
docker:
  Installé : (aucun)
  Candidat : 1.5-1
 Table de version :
     1.5-1 0
        500 http://ftp.fr.debian.org/debian/ jessie/main amd64 Packages

Ce n’est pas le cas sur mon serveur. Pour désinstaller une version de Docker

:$ sudo apt-get remove docker docker-engine docker.io

Installer Docker CE sur Debian 8

Installer les librairies nécessaires à l’installation d’application via HTTPS pour APT

:$ apt-get install apt-transport-https ca-certificates curl gnupg2 software-properties-common

Installer la clef officiel GPG de Docker

:$ curl -fsSL https://download.docker.com/linux/debian/gpg | apt-key add -
OK       

Vérifier que l’idantifiant est bien 9DC8 5822 9FC7 DD38 854A E2D8 8D81 803C 0EBF CD88

:$ apt-key fingerprint 0EBFCD88
[...]
pub   4096R/0EBFCD88 2017-02-22
 Empreinte de la clef = 9DC8 5822 9FC7 DD38 854A  E2D8 8D81 803C 0EBF CD88
uid                  Docker Release (CE deb) <docker@docker.com>
sub   4096R/F273FCD8 2017-02-22

Ajouter le dépôt de Docker CE dans APT pour les architecture AMD64 (lsb_release -cs retourne la nom de la distribution de Degian, soit jessie)

:$ add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/debian $(lsb_release -cs) stable"

Mettre à jour les dépôts

:$ apt-get update

Vérifier les versions disponible de Docker CE pour Debian 8

:$ apt-cache policy docker-ce
docker-ce:
  Installé : (aucun)
  Candidat : 17.06.0~ce-0~debian
 Table de version :
     17.06.0~ce-0~debian 0
        500 https://download.docker.com/linux/debian/ jessie/stable amd64 Packages
     17.03.2~ce-0~debian-jessie 0
        500 https://download.docker.com/linux/debian/ jessie/stable amd64 Packages
     17.03.1~ce-0~debian-jessie 0
        500 https://download.docker.com/linux/debian/ jessie/stable amd64 Packages
     17.03.0~ce-0~debian-jessie 0
        500 https://download.docker.com/linux/debian/ jessie/stable amd64 Packages

Docker CE recommande d’installer une version particulière plutôt que toujours installer la dernière version.

:$ apt-get install docker-ce=17.03.2~ce-0~debian-jessie

Le démon Docker est automatiquement lancé après l’installation.
Les commandes Docker doivent être lancées avec l’utilisateur root

Vérifier que Docker fonctionne

Vérifier le status de Docker

:$ systemctl status docker
● docker.service - Docker Application Container Engine
   Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled)
   Active: active (running) since sam. 2017-07-15 17:50:05 CEST; 9min ago
     Docs: https://docs.docker.com
 Main PID: 29661 (dockerd)
   CGroup: /system.slice/docker.service
           ├─29661 /usr/bin/dockerd -H fd://
           └─29668 docker-containerd -l unix:///var/run/docker/libcontainerd/docker-containerd.sock --metrics-interval=0 --start-timeout 2m --state-dir /var/run/docker/libcontainerd/containerd --shim docker

Lancer hello-word dans Docker

:$ docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
b04784fba78d: Pull complete 
Digest: sha256:f3b3b28a45160805bb16542c9531888519430e9e6d6ffc09d72261b0d26ff74f
Status: Downloaded newer image for hello-world:latest

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://cloud.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/engine/userguide/

Lancer automatiquement Docker au démarrage du système

Activer le lancement automatique de docker au démarrage

:$ systemctl enable docker

Désactiver le lancement automatique de docker au démarrage

:$ systemctl disable docker

Mettre à jour Docker

Mettre à jour les dépôts APT

:$ apt-get update

Vérifier les versions disponibles et installer celle qui convient

:$ apt-cache policy docker-ce



Références :

Docker : Debian

Docker : Get Docker CE for Debian

Docker : Post Install


Ajouter Libre Office dans Nextcloud sous Debian avec Nginx

Installer Collabora Online sous Debian avec Docker

Se rapporter au Wiki "Installer Docker CE sur Debian 8 (Jessie)" pour l’installation de Docker.

Télécharger Collabora Online

:$ docker pull collabora/code

Démarrer Collabora Online. Il est possible de configurer les dictionaires en ligne de commande (Voir les options sur le site de collaboraoffice).

:$ docker run -t -d -p 127.0.0.1:9980:9980 -e 'domain=mon\.domaine\.fr' -e 'dictionaries=fr_FR en_GB en_US' --restart always --cap-add MKNOD collabora/code

la commande suivante semble aussi fonctionner : docker run -t -d -p 127.0.0.1:9980:9980 -e 'domain=mon.domaine.fr' --cap-add MKNOD collabora/code

Il est possible de configurer un utilisateur admin et son mot de passe en ligne de commande en ajoutant -e "username=admin" -e "password=S3cRet".

Il est aussi possible d’ajuster la gestion des certifiats de collabora en ligne de commande Collabora Office : Code

ATTENTION : Il faut un certificat valide pour le domaine ou Collabora ne fonctionnera pas avec Nextcloud.

Installer Collabora Online sous Debian 9 avec Docker depuis le dépôt linux

Il faut compter une taille de 800 MO pour la version 4.0.5

Désinstaller la version de Collabora Online Docker si besoin. Lister les images docker sur le système pour connaitre l’identifiant du container de Collabora Online.

:$ docker ps
CONTAINER ID        IMAGE                        COMMAND                  CREATED             STATUS              PORTS                      NAMES
5d5349d57975        technosoft2000/calibre-web   "/bin/bash -c /init/…"   9 months ago        Up 37 minutes       0.0.0.0:8083->8083/tcp     calibre-web
e70dca86bf5e        f80df62976c0                 "/bin/sh -c 'bash st…"   17 months ago       Up 37 minutes       127.0.0.1:9980->9980/tcp   peaceful_noether

Arrêter et supprimer l’image docker de Collabora Online

CONTAINER_ID doit être remplacé par l’ID du container retourné par la commande docker ps. Ici ‘e70dca86bf5e’.

:$ docker stop CONTAINER_ID
:$ docker rm CONTAINER_ID

Importer la clé du dépôt dans le système Debian

:$ sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 0C54D189F4BA284D
Executing: /tmp/apt-key-gpghome.R1YJnPxXd5/gpg.1.sh --keyserver keyserver.ubuntu.com --recv-keys 0C54D189F4BA284D
gpg: key 0C54D189F4BA284D: 1 signature not checked due to a missing key
gpg: clef 0C54D189F4BA284D : clef publique « Collabora Productivity <libreoffice@collabora.com> » importée
gpg:       Quantité totale traitée : 1
gpg:                     importées : 1

Ajouter le dépôt au gestionaire d’application Debian (i.e. APT)

:$ echo 'deb https://www.collaboraoffice.com/repos/CollaboraOnline/CODE-debian9 ./' >> /etc/apt/sources.list.d/collaboraoffice.list

Mettre à jour la liste des applications des dépôts du gestionaire d’application

:$ apt update

Vérifier les versions disponibles

:$ apt-cache policy loolwsd code-brand
loolwsd:
  Installé : (aucun)
  Candidat : 4.0.5-2
 Table de version :
     4.0.5-2 500
        500 https://www.collaboraoffice.com/repos/CollaboraOnline/CODE-debian9 ./ Packages
code-brand:
  Installé : (aucun)
  Candidat : 4.0-2
 Table de version :
     4.0-2 500
        500 https://www.collaboraoffice.com/repos/CollaboraOnline/CODE-debian9 ./ Packages

Installer Collabora Online. Les modules, collaboraoffice.-en, collaboraoffice.-gb et collaboraoffice.-fr, installeront le support de la langue anglaise et française (d’autres langues sont disponibles).

:$ apt install loolwsd code-brand collaboraoffice*.*-fr collaboraoffice*.*-en collaboraoffice*.*-gb
Lecture des listes de paquets... Fait
Construction de l'arbre des dépendances
Lecture des informations d'état... Fait
Les paquets suivants ont été installés automatiquement et ne sont plus nécessaires :
...
0 mis à jour, 24 nouvellement installés, 0 à enlever et 1 non mis à jour.
Il est nécessaire de prendre 286 Mo dans les archives.
Après cette opération, 794 Mo d'espace disque supplémentaires seront utilisés.
Souhaitez-vous continuer ? [O/n] O

Par défaut, Collabora Office active SSL et ne trouve pas les certificats ce qui empèche le service de démarrer : Failed to start LibreOffice Online WebSocket Daemon.

:$ systemctl status loolwsd
● loolwsd.service - LibreOffice Online WebSocket Daemon
   Loaded: loaded (/lib/systemd/system/loolwsd.service; enabled; vendor preset: enabled)
   Active: failed (Result: exit-code) since Thu 2019-08-15 16:12:38 CEST; 18min ago
  Process: 13504 ExecStart=/usr/bin/loolwsd --version --o:sys_template_path=/opt/lool/systemplate --o:lo_template_path=/opt/collaboraoffice6.0 --o:child_root_path=/opt/lool/child-roots --o
 Main PID: 13504 (code=exited, status=70)
      CPU: 311ms

août 15 16:12:38 monnas systemd[1]: loolwsd.service: Main process exited, code=exited, status=70/n/a
août 15 16:12:38 monnas systemd[1]: loolwsd.service: Unit entered failed state.
août 15 16:12:38 monnas systemd[1]: loolwsd.service: Failed with result 'exit-code'.
août 15 16:12:38 monnas systemd[1]: loolwsd.service: Service hold-off time over, scheduling restart.
août 15 16:12:38 monnas systemd[1]: Stopped LibreOffice Online WebSocket Daemon.
août 15 16:12:38 monnas systemd[1]: loolwsd.service: Start request repeated too quickly.
août 15 16:12:38 monnas systemd[1]: Failed to start LibreOffice Online WebSocket Daemon.
août 15 16:12:38 monnas systemd[1]: loolwsd.service: Unit entered failed state.
août 15 16:12:38 monnas systemd[1]: loolwsd.service: Failed with result 'exit-code'.

Il est possible de vérifier ce point en désactivant SSL dans la configuration de Collabora Office et en redémarrant le service.

Modifier la configuration de Collabora Online pour configurer les certificats. Attention: les fichier certificats doivent être accessible par l’utilisateur lool

:$ cp /etc/loolwsd/loolwsd.xml /etc/loolwsd/loolwsd.xml.bak
:$ nano /etc/loolwsd/loolwsd.xml 
    <ssl desc="SSL settings">
        <enable type="bool" desc="Controls whether SSL encryption is enable (do not disable for production deployment). If default is false, must first be compiled with SSL support to enable." default="true">true</enable>
        <termination desc="Connection via proxy where loolwsd acts as working via https, but actually uses http." type="bool" default="true">true</termination>
<!--
        <cert_file_path desc="Path to the cert file" relative="false">/etc/loolwsd/cert.pem</cert_file_path>
        <key_file_path desc="Path to the key file" relative="false">/etc/loolwsd/key.pem</key_file_path>
        <ca_file_path desc="Path to the ca file" relative="false">/etc/loolwsd/ca-chain.cert.pem</ca_file_path>
-->
        <cert_file_path desc="Path to the cert file" relative="false">/etc/letsencrypt/live/mon.domaine.fr/fullchain.pem</cert_file_path>
        <key_file_path desc="Path to the key file" relative="false">/etc/letsencrypt/live/mon.domaine.fr/privkey.pem</key_file_path>
        <ca_file_path desc="Path to the ca file" relative="false">/etc/letsencrypt/live/mon.domaine.fr/fullchain.pem</ca_file_path>
        <cipher_list desc="List of OpenSSL ciphers to accept" default="ALL:!ADH:!LOW:!EXP:!MD5:@STRENGTH"></cipher_list>
        <hpkp desc="Enable HTTP Public key pinning" enable="false" report_only="false">
            <max_age desc="HPKP's max-age directive - time in seconds browser should remember the pins" enable="true">1000</max_age>
            <report_uri desc="HPKP's report-uri directive - pin validation failure are reported at this URL" enable="false"></report_uri>
            <pins desc="Base64 encoded SPKI fingerprints of keys to be pinned">
            <pin></pin>
            </pins>
        </hpkp>
    </ssl>

Le script suivant peut être utilisé pour tester les droits d’un utilisateur sur un fichier

:$ cat ./check-permissions.sh 
#!/bin/bash
file=$1
namei -m $file
# Handle non-absolute paths
if ! [[ "$file" == /* ]] ; then
    path=.
fi
dirname "$file" | tr '/' $'n' | while read part ; do
    path="$path/$part"
    # Check for execute permissions
    if ! [[ -x "$path" ]] ; then
        echo "'$path' is blocking access."
    fi
done
if ! [[ -r "$file" ]] ; then
    echo "'$file' is not readable."
fi

La commande suivante permet de vérifier les droits de l’utilisateur lool sur les fichiers certificats générés par letsencrypt

:$ sudo -u lool ./check-permissions.sh /etc/letsencrypt/live/mon.domaine.fr/fullchain.pem
f: /etc/letsencrypt/live/mon.domaine.fr/fullchain.pem
 drwxr-xr-x /
 drwxr-xr-x etc
 drwxr-xr-x letsencrypt
 drwx--x--x live
 drwxr-xr-x mon.domaine.fr
 lrwxrwxrwx fullchain.pem -> ../../archive/mon.domaine.fr/fullchain13.pem
   drwx--x--x ..
   drwxr-xr-x ..
   drwx------ archive
              mon.domaine.fr — fichier ou répertoire inexistant
'/etc/letsencrypt/live/mon.domaine.fr/fullchain.pem' is not readable.

Pour donner les droits à l’utilisateur lool de parcourir les répertoires live et archive

J’ai ajouté l’utilisateur lool au group root

:$ chmod +x systemctl /etc/letsencrypt/live
:$ chmod +x systemctl /etc/letsencrypt/archive

Si Nginx et Collabora Office tourne sur le même serveur, une autre solution est de désactiver SSL pour Collabora Office et d’utiliser SSL coté Nginx. Solution "SSL terminates at the proxy" dans Collabora Office : Setting up Nginx reverse proxy (ssl.enable=false and ssl.termination=true)

Redémarrer Collabora Office pour prendre en compte les changement de configuration.

:$ systemctl restart loolwsd

Vérfier que le service a bien démarré et qu’il n’y a pas d’erreur.

:$ systemctl status loolwsd
● loolwsd.service - LibreOffice Online WebSocket Daemon
   Loaded: loaded (/lib/systemd/system/loolwsd.service; enabled; vendor preset: enabled)
   Active: active (running) since Thu 2019-08-15 16:56:31 CEST; 4s ago
 Main PID: 14254 (loolwsd)
    Tasks: 10 (limit: 4915)
   Memory: 100.4M
      CPU: 744ms
   CGroup: /system.slice/loolwsd.service
           ├─14254 /usr/bin/loolwsd --version --o:sys_template_path=/opt/lool/systemplate --o:lo_template_path=/opt/collaboraoffice6.0 --o:child_root_path=/opt/lool/child-roots --o:file_se
           ├─14257 /usr/bin/loolforkit --losubpath=lo --systemplate=/opt/lool/systemplate --lotemplate=/opt/collaboraoffice6.0 --childroot=/opt/lool/child-roots/ --clientport=9980 --master
           └─14260 /usr/bin/loolforkit --losubpath=lo --systemplate=/opt/lool/systemplate --lotemplate=/opt/collaboraoffice6.0 --childroot=/opt/lool/child-roots/ --clientport=9980 --master

août 15 16:56:32 monnas loolwsd[14254]: Preloading thesauri:
août 15 16:56:32 monnas loolwsd[14254]: Preload icons
août 15 16:56:32 monnas loolwsd[14254]: Preload languages
août 15 16:56:32 monnas loolwsd[14254]: Preload fonts
août 15 16:56:32 monnas loolwsd[14254]: frk-14257-14257 2019-08-15 14:56:32.496567 [ forkit ] TRC  Finished lok_preinit(/opt/collaboraoffice6.0/program", "file:///user") in 316 ms.| kit/Ki
août 15 16:56:32 monnas loolwsd[14254]: frk-14257-14257 2019-08-15 14:56:32.496613 [ forkit ] ERR  Error: forkit has more than a single thread after pre-init| kit/ForKit.cpp:544
août 15 16:56:32 monnas loolwsd[14254]: frk-14257-14257 2019-08-15 14:56:32.496620 [ forkit ] INF  Preinit stage OK.| kit/ForKit.cpp:546
août 15 16:56:32 monnas loolwsd[14254]: frk-14257-14257 2019-08-15 14:56:32.496639 [ forkit ] DBG  Forking a loolkit process with jailId: vi7YqJ2EjjGZnWRP.| kit/ForKit.cpp:253
août 15 16:56:32 monnas loolwsd[14254]: frk-14257-14257 2019-08-15 14:56:32.498438 [ forkit ] INF  Forked kit [14260].| kit/ForKit.cpp:294
août 15 16:56:32 monnas loolwsd[14254]: frk-14257-14257 2019-08-15 14:56:32.498484 [ forkit ] INF  Forkit initialization complete: setting log-level to [warning] as configured.| kit/ForKit
lines 1-22/22 (END)

Modifier les langues par défaut de Collabora Office

:$ nano /etc/loolwsd/loolwsd.xml 
    <allowed_languages desc="List of supported languages of Writing Aids (spell checker, grammar checker, thesaurus, hyphenation) on this instance. Allowing too many has negative effect on startup performance." default="fr_FR en_GB en_US">fr_FR en_GB en_US</allowed_languages>

redémarrer le service pour prendre en compte le changement de configuration.

:$ systemctl restart loolwsd

Configurer Collabora Office pour fonctioner avec Nextcloud

18/08/2019: il y a un bug dans l’application Collabora de Nextcloud qui ne permet pas de préconfigurer les langues lors de la création d’un nouveau document : Document language in new documents does not respect language settings #496

Configurer WebDav dans Collabora Office. Attention à bien préfixer les ‘.’ par des  » dans le nom de domaine.

:$ nano /etc/loolwsd/loolwsd.xml 
    <storage desc="Backend storage">
        <filesystem allow="false" />
        <wopi desc="Allow/deny wopi storage. Mutually exclusive with webdav." allow="true">
            <host desc="Regex pattern of hostname to allow or deny." allow="true">localhost</host>
            <host desc="Regex pattern of hostname to allow or deny." allow="true">mon.domaine.fr</host>
            <host desc="Regex pattern of hostname to allow or deny." allow="true">10.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}</host>
            <host desc="Regex pattern of hostname to allow or deny." allow="true">172.1[6789].[0-9]{1,3}.[0-9]{1,3}</host>
            <host desc="Regex pattern of hostname to allow or deny." allow="true">172.2[0-9].[0-9]{1,3}.[0-9]{1,3}</host>
            <host desc="Regex pattern of hostname to allow or deny." allow="true">172.3[01].[0-9]{1,3}.[0-9]{1,3}</host>
            <host desc="Regex pattern of hostname to allow or deny." allow="true">192.168.[0-9]{1,3}.[0-9]{1,3}</host>
            <host desc="Regex pattern of hostname to allow or deny." allow="false">192.168.1.1</host>
            <max_file_size desc="Maximum document size in bytes to load. 0 for unlimited." type="uint">0</max_file_size>
        </wopi>
        <webdav desc="Allow/deny webdav storage. Mutually exclusive with wopi." allow="false">
            <host desc="Hostname to allow" allow="false">mon.domaine.fr</host>
        </webdav>
    </storage>

redémarrer le service pour prendre en compte le changement de configuration.

:$ systemctl restart loolwsd

Activer les log dans un fichier

Modifier la configuration pour activer les log dans un fichier <file enable="true"> et configrer le chemming vers le fichier de log /var/log/loolwsd/loolwsd.log

:$ nano /etc/loolwsd/loolwsd.xml 
    <logging>
        <color type="bool">true</color>
        <level type="string" desc="Can be 0-8, or none (turns off logging), fatal, critical, error, warning, notice, information, debug, trace" default="warning">warning</level>
        <file enable="true">
            <property name="path" desc="Log file path.">/var/log/loolwsd/loolwsd.log</property>
            <property name="rotation" desc="Log file rotation strategy. See Poco FileChannel.">never</property>
            <property name="archive" desc="Append either timestamp or number to the archived log filename.">timestamp</property>
            <property name="compress" desc="Enable/disable log file compression.">true</property>
            <property name="purgeAge" desc="The maximum age of log files to preserve. See Poco FileChannel.">10 days</property>
            <property name="purgeCount" desc="The maximum number of log archives to preserve. Use 'none' to disable purging. See Poco FileChannel.">10</property>
            <property name="rotateOnOpen" desc="Enable/disable log file rotation on opening.">true</property>
            <property name="flush" desc="Enable/disable flushing after logging each line. May harm performance. Note that without flushing after each line, the log lines from the different processes will not appear in chronological order.">false</property>
        </file>
        <anonymize>
            <filenames type="bool" desc="Enable to anonymize/obfuscate filenames in logs. If default is true, it was forced at compile-time and cannot be disabled." default="false">false</filenames>
            <usernames type="bool" desc="Enable to anonymize/obfuscate usernames in logs. If default is true, it was forced at compile-time and cannot be disabled." default="false">false</usernames>
        </anonymize>
    </logging>

Donner les droits à l’utilisateur Collabora Office sur le répertoire et redémarrer le service pour prendre en compte le changement de configuration.

:$ chown lool:lool /var/log/loolwsd/
:$ systemctl restart loolwsd

Consol d’administration

URL: http://192.168.XXX.XXX:9980/loleaflet/dist/admin/admin.html
Saisire le nom et le mot de passe de l’administrateur (par défaut admin / admin)

Le nom et le mot de passe peuvent être changés dans la configuration

:$ nano /etc/loolwsd/loolwsd.xml 
    <admin_console desc="Web admin console settings.">
        <enable desc="Enable the admin console functionality" type="bool" default="true">true</enable>
        <enable_pam desc="Enable admin user authentication with PAM" type="bool" default="false">false</enable_pam>
        <username desc="The username of the admin console. Ignored if PAM is enabled.">admin</username>
        <password desc="The password of the admin console. Deprecated on most platforms. Instead, use PAM or loolconfig to set up a secure password.">admin</password>
    </admin_console>

Configurer Nginx pour Collabora Online

Comme Collabora Online tourne sur le même serveur que Nextcloud, il suffit de créer un snippet à inclure dans la configuration du serveur.

Créer le snippet contenant la configuration de Collabora Online pour Nginx. Le contenu du snippet provient de Collabora Office : Setting up Nginx reverse proxy. Il est mis à jour avec les mise à jour de Collabora mais contient des erreurs pour la règle lool (trop restrictive) qui empêchent d’ouvrir les fichieers sous Nextcloud (une erreur 404 s’affiche dans les log d’access de Nginx).

Pour la version avec Docker (SSL est activé par défaut) et Collabora configurée avec SSL :

:$ cat > /etc/nginx/snippets/collaboraonline.conf <<'EOF'
# static files
location ^~ /loleaflet {
    proxy_pass https://localhost:9980;
    proxy_set_header Host $http_host;
}

# WOPI discovery URL
location ^~ /hosting/discovery {
    proxy_pass https://localhost:9980;
    proxy_set_header Host $http_host;
}

# main websocket
#location ~ ^/lool/(.*)/ws$ {
#    proxy_pass https://localhost:9980;
#    proxy_set_header Upgrade $http_upgrade;
#    proxy_set_header Connection "Upgrade";
#    proxy_set_header Host $http_host;
#    proxy_read_timeout 36000s;
#}

# download, presentation and image upload
#location ~ ^/lool {
#    proxy_pass https://localhost:9980;
#    proxy_set_header Host $http_host;
#}

# Admin Console websocket
#location ^~ /lool/adminws {
#    proxy_pass https://localhost:9980;
#    proxy_set_header Upgrade $http_upgrade;
#    proxy_set_header Connection "Upgrade";
#    proxy_set_header Host $http_host;
#    proxy_read_timeout 36000s;
#}

# main websocket
location ^~ /lool {
    proxy_pass https://localhost:9980;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "Upgrade";
    proxy_set_header Host $http_host;
    proxy_read_timeout 36000s;
    proxy_buffering off;
}   
EOF

Pour la version sans SSL, il faut remplacer toutes les occurences de proxy_pass https://localhost:9980 par proxy_pass http://localhost:9980 (plus de ‘s’ dans ‘https’)

Inclure le snippet de Collabora Online à la configuration du serveur Nginx

:$ nano /etc/nginx/site-available/https_mon.domaine.fr
#[...]
#
# Nextcloud
#
include snippets/nextcloud.conf;

#
# Collabora Online
#
include snippets/collaboraonline.conf;
#[...]

Vérifier la confiugraion avant de redémarrer le serveur Nginx

:$ nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

Recharger la configuration de Nginx

:$ nginx -s reload

Activer l’application Collabora dans Nextcloud

Se connecter avec l’utilisateur admin de Nextcloud et activer l’application Collabora Online dans ‘Apps’ -> ‘Office & Text’.


Installer Application Nextcloud pour Collabora Online


Dans le menu ‘Admin’, configurer le domaine de Collabora Online : https://mon.domaine.fr et cliquer sur bouton ‘Apply’


Configurer Collabora Online dans Nextcloud


Créer et Editer des fichiers Libre Office depuis Nextcloud

Sélectionner l’application Fichiers en cliquant sur l’icone "répertoire" de la barre d’application de Nextcloud en haut à gauche (1).

Cliquer sur le bouton ‘+’ et créer un nouveau fichier (un tableau Libre Office – 2) en le nomant "Mon Tableau.ods". Nextcloud créera un fichier Libre Office et l’ajoutera dans le répertoire courant (3).


Créer Un Tableau Libre Office


Pour ouvrir un fichier Libre Office et l’éditer, il suffit de cliquer dessus dans l’explorateur de fichier de Nextcloud. Automatiquement, Collabora Online ouvrira le fichier (ici un tableau) pour pouvoir en changer le contenu directement depuis l’interface web de Nextcloud.


Editer Un Tableau Libre Office


Maintenance de Collabora Online

Lister les images Docker

:$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                      NAMES
4c49cdd8e699        collabora/code      "/bin/sh -c 'bash ..."   6 seconds ago       Up 5 seconds        127.0.0.1:9980->9980/tcp   condescending_rosalind

Arrêter le container de Collabora Online

:$ docker stop CONTAINER_ID

Supprimer l’image de Collabora Online

:$ docker rm CONTAINER_ID    

CONTAINER_ID doit être remplacé par l’ID du container retourné par la commande docker ps. Ici ‘4c49cdd8e699’.

Mettre à jour Collabora Online

Récupérer la nouvelle version de l’image de Collabora Online depuis Internet

:$ docker pull collabora/code
[...]
Digest: sha256:2de540bade5595d394b7729bf711ca84e3c8b99581c41319a51a0f3df2324d5d
Status: Downloaded newer image for collabora/code:latest

Lister les images docker sur le système pour connaitre l’identifiant du container de Collabora Online.

:$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                      NAMES
4c49cdd8e699        8bc1d306ff41        "/bin/sh -c 'bash st…"   7 months ago        Up 23 seconds       127.0.0.1:9980->9980/tcp   condescending_rosalind

Arrêter et supprimer l’image docker de Collabora Online

CONTAINER_ID doit être remplacé par l’ID du container retourné par la commande docker ps. Ici ‘4c49cdd8e699’.

:$ docker stop CONTAINER_ID
:$ docker rm CONTAINER_ID    

Démarrer la nouvelle version de l’image docker de Collabora Online en remplaçant mon\.domaine\.fr par votre nom de domaine (garder les deux barres obliques inverses \ devant chaque point .).

:$ docker run -t -d -p 127.0.0.1:9980:9980 -e 'domain=mon\.domaine\.fr' -e 'dictionaries=fr_FR en_GB en_US' --restart always --cap-add MKNOD collabora/code
e70dca86bf5e8ad556d4c797f5d038ed6081b599c8d1a6118007b3d188703adb

Résoudre des problèmes

Échec du chargement du document.

Le message suivant s’affiche dans une popup à l’ouverture d’un document de Collabora Online dans Nextcloud

Échec du chargement du document. Veuillez vous assurer que le type de fichier est pris en charge, qu’il n’est pas corrompu et essayez de nouveau.

Redémarrer le service docker Failure: “Please ensure the file type is supported and not corrupted”

:$ systemctl restart docker
:$ systemctl status docker
● docker.service - Docker Application Container Engine
   Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled)
   Active: active (running) since mer. 2018-03-07 21:28:49 CET; 2s ago
     Docs: https://docs.docker.com
 Main PID: 12433 (dockerd)
    Tasks: 31
   Memory: 24.3M
      CPU: 402ms
   CGroup: /system.slice/docker.service
           ├─12433 /usr/bin/dockerd -H fd://
           ├─12438 docker-containerd --config /var/run/docker/containerd/containerd.toml
           ├─12557 /usr/bin/docker-proxy -proto tcp -host-ip 127.0.0.1 -host-port 9980 -container-ip 172.17.0.2 -container-port 9980
           └─12563 docker-containerd-shim -namespace moby -workdir /var/lib/docker/containerd/daemon/io.containerd.runtime.v1.linux/moby/e70dca86bf5e8ad556d4c797f5d038ed6081b599c8d1a6118007b3d188703adb -add

mars 07 21:28:49 monnas dockerd[12433]: time="2018-03-07T21:28:49.005363370+01:00" level=info msg="Default bridge (docker0) is assigned with an IP address 172.17.0.0/16. Daemon option --bip can be used to s
mars 07 21:28:49 monnas dockerd[12433]: time="2018-03-07T21:28:49.402006226+01:00" level=info msg="ignoring event" module=libcontainerd namespace=moby topic=/containers/create type="*events.ContainerCreate"
mars 07 21:28:49 monnas dockerd[12433]: time="2018-03-07T21:28:49+01:00" level=info msg="shim docker-containerd-shim started" address="/containerd-shim/moby/e70dca86bf5e8ad556d4c797f5d038ed6081b599c8d1a6118
mars 07 21:28:49 monnas dockerd[12433]: time="2018-03-07T21:28:49.537366237+01:00" level=warning msg="unknown container" container=e70dca86bf5e8ad556d4c797f5d038ed6081b599c8d1a6118007b3d188703adb module=lib
mars 07 21:28:49 monnas dockerd[12433]: time="2018-03-07T21:28:49.555451893+01:00" level=warning msg="unknown container" container=e70dca86bf5e8ad556d4c797f5d038ed6081b599c8d1a6118007b3d188703adb module=lib

Erreur de connexion avec Collabora Online à l’ouverture ou à la création d’un fichier dans Nextcloud

Vérifier qu’il est possible de redémarrer l’image docker de Collabora Online. Si la commande retourne une erreure iptables c’est que les règles de docker ne sont pas configurées dans iptables. Au démmarage, docker ajoute les règles dans l’iptables. Il faut démarrer docker après le chargement des règles iptables pour qu’il ajoute les règles nécessaire à son bon fonctionnement ou ajouter les règles de docker dans son fichier de configuration.

:$ docker restart e70dca86bf5e
Error response from daemon: Cannot restart container e70dca86bf5e: driver failed programming external connectivity on endpoint peaceful_noether (3c12509d5198a86b1cfff76439f07e64f77604f9193a0c1ff41c9544c4c4ab32):  (iptables failed: iptables --wait -t filter -A DOCKER ! -i docker0 -o docker0 -p tcp -d 172.17.0.2 --dport 9980 -j ACCEPT: iptables: No chain/target/match by that name.
 (exit status 1))

Ou docker n’arrive pas à lister les images

:$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                      NAMES

Redémarrer docker

:$ systemctl restart docker

Une fois redémarrer docker à ajouté les règles dans iptables. Il est possible de lister les images et de redémarrer collabora online.

:$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                      NAMES
e70dca86bf5e        collabora/code      "/bin/sh -c 'bash st…"   10 days ago         Up 9 minutes        127.0.0.1:9980->9980/tcp   peaceful_noether
:$ docker restart e70dca86bf5e
e70dca86bf5e

Si le problème persiste, vérifier dans le fichier de log de votre serveur web.

:$ tail -f /var/log/nginx/error.log

2018/03/17 21:29:23 [error] 2872#2872: *780 connect() failed (111: Connection refused) while connecting to upstream, client: 192.168.0.254, server: www.mondomain.fr, request: "GET /hosting/discovery HTTP/1.1", upstream: "https://[::1]:9980/hosting/discovery", host: "www.mondomain.fr"

Redémarrer le serveur et php

:$ systemctl restart nginx
:$ systemctl restart php7.1-fpm.service

Page vide et erreur 404 dans les logs de Nginx

Problème non corrigé. Ressemble à celui-ci: https://help.nextcloud.com/t/collabora-404-on-lool-ws-empty-page/13363/4

82.232.100.146 - - [15/Aug/2019:14:24:50 +0200] "GET /lool/https%3A%2F%2Fbinaryworld.fr.eu.org%2Fnextcloud%2Findex.php%2Fapps%2Frichdocuments%2Fwopi%2Ffiles%2F829664_ocqezo3zz4e0%3Faccess_token%3DffHFLSL2NV7WpOqvvjbjSUXTUBaG9L3f%26access_token_ttl%3D0%26permission%3Dedit/ws?WOPISrc=https%3A%2F%2Fbinaryworld.fr.eu.org%2Fnextcloud%2Findex.php%2Fapps%2Frichdocuments%2Fwopi%2Ffiles%2F829664_ocqezo3zz4e0&compat=/ws HTTP/1.1" 404 143 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:68.0) Gecko/20100101 Firefox/68.0"
82.232.100.146 - - [15/Aug/2019:14:24:51 +0200] "GET /lool/https%3A%2F%2Fbinaryworld.fr.eu.org%2Fnextcloud%2Findex.php%2Fapps%2Frichdocuments%2Fwopi%2Ffiles%2F829664_ocqezo3zz4e0%3Faccess_token%3DffHFLSL2NV7WpOqvvjbjSUXTUBaG9L3f%26access_token_ttl%3D0%26permission%3Dedit/ws?WOPISrc=https%3A%2F%2Fbinaryworld.fr.eu.org%2Fnextcloud%2Findex.php%2Fapps%2Frichdocuments%2Fwopi%2Ffiles%2F829664_ocqezo3zz4e0&compat=/ws HTTP/1.1" 404 143 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:68.0) Gecko/20100101 Firefox/68.0"

Modifier le fichier de configuration de Collabora

Récupérer le nom du container de Collabora

#> docker ps
CONTAINER ID        IMAGE                        COMMAND                  CREATED             STATUS              PORTS                      NAMES
7671b05f7d6e        collabora/code               "/bin/sh -c 'bash st…"   11 minutes ago      Up 11 minutes       127.0.0.1:9980->9980/tcp   pedantic_stallman

Il est possible d’utiliser la commande docker cp pour copier le fichier en local depuis le container et le modifier. Toutefois, lors de sa recopie dans le container, les permissions du fichier seront modifiées ce qui empèchera Collabora de démarrer.

#> docker cp pedantic_stallman:/etc/loolwsd/loolwsd.xml loolwsd.xml
#> nano loolwsd.xml
#> docker cp loolwsd.xml pedantic_stallman:/etc/loolwsd/loolwsd.xml 

Il est préférable de modifier le fichier directement dans le container

#> docker exec -it pedantic_stallman bash
:$ ls -l /etc/loolwsd/loolwsd.xml
-rw-r----- 1 lool lool 12679 May 19 18:53 /etc/loolwsd/loolwsd.xml
:$ cat /etc/loolwsd/loolwsd.xml loolwsd.xml
<config>

    <!-- Note: 'default' attributes are used to document a setting's default value as well as to use as fallback. -->
    <!-- Note: When adding a new entry, a default must be set in WSD in case the entry is missing upon deployment. -->

    <allowed_languages desc="List of supported languages of Writing Aids (spell checker, grammar checker, thesaurus, hyphenation) on this instance. Allowing too many has negative effect on startup performance." default="de_DE en_GB en_US es_ES fr_FR it nl pt_BR pt_PT ru">fr_FR en_GB en_US</allowed_languages>
    ...

Il n’y a pas d’editeur (ex: vim ou nano) dans le container de collabora. Plusieurs solutions existes. La plus simple est d’utiliser sed pour remplacer le text dans le fichier

#> sed -i 's/de_DE en_GB en_US es_ES fr_FR it nl pt_BR pt_PT ru/fr_FR en_GB en_US/g' /etc/loolwsd/loolwsd.xml loolwsd.xml

la commande sed remplace les langues par defaut dans le fichier de comfiguration.

Sortir du shell du container et vérifier que Collabora est joignable. Si nécessaire redémarrer le container avec la commande docker restart <CONTAINER ID>

#> exit
#> curl -k https://localhost:9980
OK

Références

Nextcloud : Collabora Online

Collabora Office : Code

Blog de dada : Installer Collabora Online avec Nextcloud

icewind.nl : Running Online Office with Nextcloud and nginx

Setting up and configuring collabora/code Docker image

Collabora Office : Setting up Nginx reverse proxy

Laisser un commentaire