Bonjour à toutes et à tous.
Grâce à l’aide reçue sur ce forum, j’ai pu finaliser l’installation de mon serveur Nextcloud.
En fait, il y a beaucoup de tutos pour ubuntu mais très peu pour Opensuse. D’ailleurs, je n’ai rien trouvé pour Leap 15.x
Donc, sans prétentions, je poste ce tuto car j’ai passé beaucoup de temps à adapter les tutos des autres distributions à Opensuse (je ne suis pas un pro!). Si cela peut aider d’autres personnes, j’en serai ravi.
De plus, si les experts de ce forum ont des idées d’améliorations ou si j’ai fait des choses qui exposent mon serveur à la malveillance, je suis preneur de toute remarque.
Avant de commencer, voici les sources qui m’ont bien aidé :
https://www.c-rieger.de/nextcloud-installation-guide-ubuntu-18-04/
https://decatec.de/home-server/nextcloud-auf-ubuntu-server-18-04-lts-mit-nginx-mariadb-php-lets-encrypt-redis-und-fail2ban/
https://www.howtoforge.com/tutorial/owncloud-nginx-opensuse-leap-42.1/
https://nextcloud.com/support/
et notre cher sogal sur Alionet !
Installation de NGINX et PHP
J’ai choisi d’installer une autre version de php-fpm que celle d’origine de Leap 15.1 car le module password de Nextcloud ne va bientôt plus supporter php-fpm7.2.
La version 7.3 sera installée grâce à (php7-apcu et imagick sont dans extensions) :
zypper addrepo https://download.opensuse.org/repositories/devel:languages:php:php73/openSUSE_Leap_15.1/devel:languages:php:php73.repo
zypper addrepo https://download.opensuse.org/repositories/server:php:extensions:php7/php7_openSUSE_Leap_15.1/server:php:extensions:php7.repo
zypper refresh
Je garde les versions par défaut de nginx et mariadb car, d’après sogal, Opensuse Leap recevra les mises à jour de sécurité.
Installation de nginx
zypper in nginx
Installation de PHP
En disséquant la documentation de Nextcloud, j’ai abouti à la liste et l’installation des modules suivants :
sudo zypper in php7 php7-APCu php7-bz2 php7-ctype php7-curl php7-dom php7-exif php7-fileinfo php7-fpm php7-gd php7-gmp php7-iconv php7-imagick php7-intl php7-json php7-ldap php7-mbstring php7-mysql php7-opcache php7-openssl php7-pcntl php7-pdo php7-posix php7-tokenizer php7-xmlreader php7-xmlwriter php7-zip php7-zlib ffmpeg-3
Tests initiaux NGINX et PHP-FPM
Test de NGINX
Créer /srv/www/htdocs/index.html avec
<html>
<body>
<h1> NGINX fonctionne </h1>
</body>
</html>
Modifier /etc/nginx/nginx.conf
Ajouter index.php dans la ligne ci-dessous vers le début du fichier :
index index.html index.htm index.php;
enlever les symboles # de commentaire pour la bloc ci-dessous :
location ~ \.php$ {
root /srv/www/htdocs/;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
include fastcgi_params;
}
Tester la syntaxe des modifications avec la commande ci-dessous qui ne doit pas renvoyer d’erreur :
sudo nginx -t
Démarrer le service
sudo systemctl enable nginx
sudo systemctl start nginx
Dans navigateur taper : localhost et le message « NGINX fonctionne » doit apparaître
Test PHP-FPM
Créer /srv/www/htdocs/info.php avec
<?php
phpinfo();
?>
Initialiser les fichiers de configuration
sudo cp /etc/php7/fpm/php-fpm.conf.default /etc/php7/fpm/php-fpm.conf
sudo cp /etc/php7/fpm/php-fpm/php-fpm.d/www.conf.default /etc/php7/fpm/php-fpm/php-fpm.d/www.conf
modifier php-fpm.conf en enlevant le symbole # de la ligne ci-dessous :
error_log = log/php-fpm.log
modifier www.conf comme ci-dessous, en changeant user et group, et en enlevant le symbole de commentaire qui est cette fois ; pour d’autres:
user = nginx
group = nginx
listen.owner = nginx
listen.group = nginx
listen.mode = 0660
pour améliorer la performance, modifier www.conf de façon à écouter un socket et non un port. Pour cela, commenter la ligne listen = 127.0.0.1:9000 et ajouter une ligne pour pointer vers un socket :
;listen = 127.0.0.1:9000
listen = /var/run/php-fpm.sock
Revenir sur /etc/nginx/nginx.conf et modifier comme suit le bloc location ~ \.php$ en ajoutant la ligne fastcgi_pass pointant le même socket que dans www.conf :
location ~ \.php$ {
root /srv/www/htdocs/;
#fastcgi_pass 127.0.0.1:9000;
fastcgi_pass unix:/var/run/php-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
Initialiser le service :
sudo systemctl enable php-fpm
sudo systemctl start php-fpm
Taper localhost/info.php pour avoir des informations sur la configuration php installée.
https://www.alionet.org/index.php?action=dlattach;sa=tmpattach;attach=post_tmp_33_2337f2e0a91756b5c1bf10c2d55698d9;topic=0
Maintenant que nous nous sommes assurés que NGINX et PHP-FPM fonctionnent, nous allons avancer dans leur optimisation et finir l’installation de NEXTCLOUD
Optimisation de NGINX
Modification du fichier /etc/nginx/nginx.conf
• user : utilisateur du serveur web : nginx
• worker_processes : nombre de coeurs du CPU : auto
• pid : j’ai décommenté la ligne mais je n’ai pas trouvé d’explication. Je suis preneur d’information !
• server_tokens : mettre à off pour la sécurité en limitant les informations fournies par nginx.
• TCP_NOPUCH, TCP_NODELAY, SENDFILE : en les combinant on peut gagner jusqu’à 0,2s lors de l’envoi des données.
En repartant du fichier nginx.conf juste modifié, ajuster les lignes comme suit :
user nginx;
worker_processes auto;
pid /var/run/nginx.pid;
tcp_nopush on;
tcp_nodelay on;
server_tokens off;
Test & Restart NGINX
sudo nginx -t
sudo systemctl restart nginx
Optimisation de PHP
Modification de /etc/php7/fpm/php-fpm.d/www.conf
J’ai limité pm.max_children à 150 en utilisant la formule ci-dessous :
Total Max Processes = (Total Ram - (Used Ram + Buffer)) / (Memory per php process)
En allouant 5Go de ram à mon serveur et avec une taille de 35Mo par requête PHP, cela donne : (1024*5) / 35 = 146.
• user / group : à mettre en consistence avec le serveur = nginx
• Listen : pointer vers le même socket que les autres fichiers = /run/php/php-fpm.sock
• Environment Variables: NEXTCLOUD à besoin de ces variables = bloc à décommenter.
• Prévention d’un timeout de nextcloud à l’installation avec request_terminate_timeout = 300
Ajuster les lignes du fichier comme suit :
user = nginx
group = nginx
;listen = 127.0.0.1:9000
listen = /var/run/php-fpm.sock
listen.owner = nginx
listen.group = nginx
listen.mode = 0660
pm.max_children = 150
pm.start_servers = 20
pm.min_spare_servers = 10
pm.max_spare_servers = 20
pm.max_requests = 500
env[HOSTNAME] = $HOSTNAME
env[PATH] = /usr/local/bin:/usr/bin:/bin
env[TMP] = /tmp
env[TMPDIR] = /tmp
env[TEMP] = /tmp
;ajout de la ligne ci-dessous
request_terminate_timeout = 300
modification de /etc/php7/cli/php.ini
• cgi.fix_pathinfo : pour améliorer la sécurité = 0
• expose_php = off évite d’avoir accès à la version de php depuis l’extérieur
• Plus d’autres paramètres d’optimisation de fonctionnement (memory_limit = 512M est demandé par NEXTCLOUD).
Le fichier php.ini existe déjà dans le répertoire /etc/php7/cli ; ajuster les lignes du fichier comme suit :
implicit_flush = Off
expose_php = Off
max_execution_time = 1800
max_input_time = 3600
memory_limit = 512M
html_errors = On
register_argc_argv = Off
post_max_size = 10240M
cgi.fix_pathinfo=0
upload_max_filesize = 10240M
max_file_uploads = 100
date.timezone = Europe/Paris
opcache.enable=1
opcache.enable_cli=1
opcache.memory_consumption=128
opcache.interned_strings_buffer=8
opcache.max_accelerated_files=10000
opcache.revalidate_freq=1
opcache.save_comments=1
Création de /etc/php7/fpm/php.ini
A l’installation, ce fichier n’existe pas. J’ai donc juste copié le fichier php.ini du répertoire /etc/php7/cli que nous venons de modifier.
sudo cp /etc/php7/cli/php.ini /etc/php7/fpm
Modification de /etc/php7/fpm/php-fpm.conf
Pour faire redémarrer FPM en cas d’erreurs répétées dans un laps de temps.
Ajuster les lignes du fichier comme suit :
pid = /var/run/php-fpm.pid
error_log = /var/log/php-fpm.log
emergency_restart_threshold = 10
emergency_restart_interval = 1m
process_control_timeout = 10s
Mise à jour permission
Important car a empêché la connexion dans Nextcloud malgré les bons nom d’utilisateur et mot de passe.
sudo chown nginx:nginx /var/lib/php7
Création hôte virtuel Nextcloud dans NGINX
A noter que mon serveur nextcloud sera appelé par un sous-répertoire de mon nom domaine : https://mon_domaine/nextcloud
Mon fournisseur internet (free) me permet de créer gratuitement un nom de domaine (avec extension hd.free.fr) qui pointe vers mon serveur. Il ne faudra pas oublier sur la freebox de faire un transfert de port vers l’adresse IP de la machine qui sert de serveur.
Créer le fichier /etc/nginx/vhosts.d/nextcloud.conf (c’est une version sans certificat SSL car certbot s’en chargera ensuite) comme suit et en modifiant mon_domaine par votre nom de domaine :
https://www.alionet.org/index.php?action=dlattach;sa=tmpattach;attach=post_tmp_33_83030c2fc6f295c1024556022389228a;topic=0
Pare-feu
Avec Yast, autoriser http et https
Install Letsencrypt avec Certbot
On peut obtenir un certificat SSL gratuitement grâce à Let’s Encrypt.
Installation du client certbot conseillé par Let’s Encrypt. J’installe aussi le plugin nginx qui fera la modification du fichier nextcloud.conf
sudo zypper in python3-certbot-nginx
Pour obtenir le certificat, lancer la commande suivante et en remplaçant mon_email et mon_domaine par les vôtres :
sudo certbot --nginx --agree-tos --redirect --hsts --staple-ocsp --email[color=red] mon_email[/color] -d [color=red]mon_domaine[/color] --rsa-key-size 4096
Modification du ficher SSL créé par CERTBOT
Recommendation de sites comme SSLAB d’arrêter d’utiliser TLSv1
sudo nano /etc/letsencrypt/options-ssl-nginx.conf
remplacer :
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
par :
ssl_protocols TLSv1.3 TLSv1.2;
cron de renouvellement des certificats
En effet, au bout de 3 mois le certificat expire. Il faut le renouveler et pour cela un script cron est créé (source : sogal)
Créer script cron certbot à placer dans /etc/cron.weekly/
sudo nano /etc/cron.weekly/certbot
#!/bin/sh
# Stop nginx first
systemctl stop nginx
# Renew certs
certbot --standalone renew
# Restart nginx
systemctl start nginx
Penser à le rendre exécutable:
chmod +x /etc/cron.weekly/certbot
MariaDB
Installation par :
zypper in mariadb
puis initialiser par :
sudo rcmysql start
Securisation de MariaDB
sudo mysql_secure_installation
Vous allez devoir répondre aux questions comme suit :
Switch to unix_socket authentication [Y/n] N
Enter current password for root (enter for none): <ENTER>
Set root password? [Y/n] Y
[i]Entrer votre mot de passe et s’en rappeler[color=red][/color][/i]
Remove anonymous users? [Y/n] Y
Disallow root login remotely? [Y/n] Y
Remove test database and access to it? [Y/n] Y
Reload privilege tables now? [Y/n] Y
Création de la base de données
• Nom de la base de données : nextcloud
• Son administrateur nextcloud_admin
• le mot de passe associé admin_password
sudo mysql -uroot -p
> CREATE DATABASE nextcloud CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; CREATE USER nextcloud_admin@localhost IDENTIFIED BY 'admin_password'; GRANT ALL PRIVILEGES on nextcloud.* to nextcloud_admin@localhost; FLUSH privileges; quit;
Installation serveur Nextcloud
• Télécharger l’archive depuis le site de Nextcloud et la décompresser
• Copier le répertoire nextcloud dans /srv/www (ATTENTION : l’archive décompressée contient un sous-répertoire avant celui de nextcloud…)
• Puis donner le bon propriétaire (nginx) :
chown -R nginx:nginx /var/www/nextcloud
J’ai placé la base de données nextcloud dans un répertoire en-dehors de /srv/www/nextcloud
J’ai créé le répertoire /data/nextcloud_data pour cela :
sudo mkdir /data/nextcloud_data
puis
sudo chown -R nginx:nginx /data/nextcloud_data
Lancer ensuite un navigateur internet (firefox par exemple) et taper l’adresse : https://mon_domaine/nextcloud
Vous obtiendrez l’interface de configuration de nextcloud.
Il faut créer l’utilisateur administrateur et entrer les informations de la configuration de la base de données mysql créée précédemment dans la section mariadb.
Ajout d’un cronjob pour Nextcloud
su -
crontab -u nginx -e
et taper :
*/5 * * * * php -f /srv/www/nextcloud/cron.php > /dev/null 2>&1
APCU cache pour Nextcloud
Pour améliorer les performances, ajouter dans le fichier /srv/nextcloud/config/config.php :
'memcache.local' => '\OC\Memcache\APCu',
FAIL2BAN
C’est pour bannir les adresses IP de personnes malveillantes qui tenteraient de s’identifier sur le serveur.
Au bout de 3 tentatives infructueuses de connexion, l’adresse IP sera bannie.
Installation de fail2ban :
zypper in fail2ban
(7 paquets d'installés : ed fail2ban libgamin-1-0 python2-pyinotify python2-systemd python-gamin whois)
Ajouter des lignes suivantes dans /etc/fail2ban/filter.d/nextcloud.conf
[Definition]
failregex=^{"reqId":".*","remoteAddr":".*","app":"core","message":"Login failed: '.*' \(Remote IP: '<HOST>'\)","level":2,"time":".*"}$
^{"reqId":".*","level":2,"time":".*","remoteAddr":".*","app":"core".*","message":"Login failed: '.*' \(Remote IP: '<HOST>'\)".*}$
^.*\"remoteAddr\":\"<HOST>\".*Trusted domain error.*$
Création d’un nouveau fichier prison pour nextcloud :
nano /etc/fail2ban/jail.d/nextcloud.local
et y copier les lignes suivantes :
[nextcloud]
backend = auto
enabled = true
port = 80,443
protocol = tcp
filter = nextcloud
maxretry = 3
bantime = 36000
findtime = 36000
logpath = /data/nextcloud_data/nextcloud.log
[nginx-http-auth]
enabled = true
Redémarrer fail2ban-service et vérifier son statut :
sudo systemclt restart fail2ban
sudo fail2ban-client status nextcloud
Qui donne le résultat suivant :
Status for the jail: nextcloud
|- Filter
| |- Currently failed: 0
| |- Total failed: 0
| `- File list: /data/nextcloud_data/nextcloud.log
`- Actions
|- Currently banned: 0
|- Total banned: 0
`- Banned IP list:
Pour contrôler les IP bannies
sudo fail2ban-client status nextcloud
Pour autoriser à nouveau une IP
sudo fail2ban-client set nextcloud unbanip ip_address
Vous pouvez aussi par la suite faire en sorte que fail2ban vous envoie un email en cas de blocage (configurer postfix pour cela).
Et voilà. Pour moi cela fonctionne du tonnerre.
J’espère que cela pourra aider quelqu’un à se lancer !
N’oublier pas de faire des sauvegardes régulières de vos données et serveurs (voir documentation sur nextcloud.com).
Bien entendu, comme dit la maxime de nos jours, je me dois de décliner toute responsabilité en cas de perte de données ou de réinstallation du système...
A bientôt !
Christian