Installare Nextcloud con nginx, PHP7.4 e MySQL8.

Amo avere il controllo dei miei strumenti e anche il mio cloud non fa eccezione. Il plugin fornito da FreeNAS (provatelo, non tornerete mai più indietro) era perfetto ma limitante.

Ecco dunque come installare manualmente Nextcloud su PHP7.4 e MySQL8.

1. Su FreeNAS creiamo una jail con iocage e una volta entrati aggiorniamo i suoi repository

pkg update && pkg upgrade

Installiamo i pacchetti necessari al funzionamento di nextcloud

pkg install php74-mysqli-7.4.0 php74-ctype-7.4.0 php74-curl-7.4.0 php74-dom-7.4.0 php74-gd-7.4.0 php74-iconv-7.4.0 php74-json-7.4.0 php74-iconv-7.4.0 php74-mbstring-7.4.0 php74-openssl-7.4.0 php74-posix-7.4.0 php74-session-7.4.0 php74-simplexml-7.4.0 php74-xmlreader-7.4.0 php74-xmlwriter-7.4.0 php74-zip-7.4.0 php74-zlib-7.4.0 php74-pdo_mysql-7.4.0 php74-fileinfo-7.4.0 php74-bz2-7.4.0 php74-intl-7.4.0 php74-imap-7.4.0 php74-pecl-imagick-im7-3.4.4 php74-xml-7.4.0 php74-filter-7.4.0 php74-readline-7.4.0 php74-pdo-7.4.0 php74-pecl-APCu

Installiamo MySQL8

pkg install mysql80-server-8.0.17

Installiamo il webserver (e qualche utility)

pkg install nginx nano sudo

Mettiamo tutto in auto-start nella jail

sysrc -f /etc/rc.conf nginx_enable="YES"
sysrc -f /etc/rc.conf mysql_enable="YES"
sysrc -f /etc/rc.conf php_fpm_enable="YES"

2. Configuriamo i local PATH per PHP modificando il file www.conf

nano /usr/local/etc/php-fpm.d/www.conf

Rimuoviamo il commento a

env[PATH] = /usr/local/bin:/usr/bin:/bin

3. Avviamo il server SQL e avviamo la procedura di messa in sicurezza di base

service mysql-server start
mysql_secure_installation

Qui verrà richiesto il livello di sicurezza e la password per l’utente root e una serie di domande alle quali potrete rispondere sempre YES 😉

Creiamo un utente nel db di nextcloud modificando prima la modalità di autenticazione (MySQL8 introduce una nuova modalità non ancora supportata da nextcloud)

nano /usr/local/etc/mysql/my.cnf
default_authentication_plugin=mysql_native_password (da inserire dentro sezione mysqld)

Effettuiamo il login sul server MySQL con l’utente di root creato al punto 7

mysql -u root -p
Password:
create database nextcloud; 
create user 'dbadmin'@'localhost' identified by '<password-per-utente-dbadmin>';
grant all privileges on nextcloud.* to 'dbadmin'@'localhost';
flush privileges;
quit;

4. Richiediamo un nuovo certificato per far girare il web server su HTTPS:

mkdir /usr/local/etc/ssl/openssl
cd /usr/local/etc/ssl/openssl
openssl req -new > cert.csr

Completata la procedura effettuiamo qualche rename

openssl rsa -in privkey.pem -out key.pem
openssl x509 -in cert.csr -out cert.pem -req -signkey key.pem -days 1825
cat key.pem>>cert.pem
openssl dhparam 2048 -out dhparam.pem

Modifichiamo nginx.conf in modo da utilizzare https

touch /usr/local/etc/nextcloud_ssl.conf
nano /usr/local/etc/nginx/nextcloud_ssl.conf

E inseriamo la configurazione del server in SSL:

server {
   listen 443 ssl http2;
   server_name nextcloud.local;
   ssl_certificate /usr/local/etc/ssl/openssl/cert.pem;
   ssl_certificate_key /usr/local/etc/ssl/openssl/key.pem;
   ssl_prefer_server_ciphers on;
   ssl_ciphers ECDH+AESGCM:ECDH+AES256:ECDH+AES128:DHE+AES128:!ADH:!AECDH:!MD5;
   ssl_dhparam /usr/local/etc/ssl/openssl/dhparam.pem;
   add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
   #ssl_ciphers         HIGH:!aNULL:!MD5;
 # Path to the root of your installation
   root /usr/local/www/nextcloud/;
 # set max upload size
   client_max_body_size 10G;
   fastcgi_buffers 64 4K;
 # Disable gzip to avoid the removal of the ETag header
   gzip off;
 rewrite ^/caldav(.)$ /remote.php/caldav$1 redirect;   rewrite ^/carddav(.)$ /remote.php/carddav$1 redirect;
   rewrite ^/webdav(.*)$ /remote.php/webdav$1 redirect;
 index index.php;
   error_page 403 /core/templates/403.php;
   error_page 404 /core/templates/404.php;
 location = /robots.txt {
 allow all;
 log_not_found off;
 access_log off;
 }
 location ~ ^/(?:.htaccess|data|config|db_structure.xml|README){
 deny all;
 }
 location / {
 The following 2 rules are only needed with webfinger
 rewrite ^/.well-known/host-meta /public.php?service=host-meta last;
 rewrite ^/.well-known/host-meta.json /public.php?service=host-meta-json last;
 rewrite ^/.well-known/carddav /remote.php/carddav/ redirect;
 rewrite ^/.well-known/caldav /remote.php/caldav/ redirect;
 rewrite ^(/core/doc/[^\/]+/)$ $1/index.html;
 try_files $uri $uri/ =404;
 }
 location ~ .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_pass unix:/var/run/nextcloud-php-fpm.sock;
 fastcgi_pass 127.0.0.1:9000;
 fastcgi_intercept_errors on;
 }
 Adding the cache control header for js and css files
 Make sure it is BELOW the location ~ .php(?:$|/) { block
 location ~* .(?:css|js)$ {
 add_header Cache-Control "public, max-age=7200";
 Add headers to serve security related headers
 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;
 Optional: Don't log access to assets
 access_log off;
 }
 Optional: Don't log access to other assets
 location ~* .(?:jpg|jpeg|gif|bmp|ico|png|swf)$ {
 access_log off;
 }
 }

Ricordiamoci di fare un include di nextcloud_ssl.conf dentro nginx.conf

nano /usr/local/etc/nginx/nginx.conf
include /usr/local/etc/nginx/nextcloud_ssl.conf; (da scrivere in fondo dentro al file)

5. Configuriamo la cache PHP

cp /usr/local/etc/php.ini-production /usr/local/etc/php.ini
# Modify opcache settings in php.ini according to Nextcloud documentation (remove comment and set recommended value)
# https://docs.nextcloud.com/server/15/admin_manual/configuration_server/server_tuning.html#enable-php-opcache
sed -i '' 's/.opcache.enable_cli=./opcache.enable_cli=1/' /usr/local/etc/php.ini
sed -i '' 's/.opcache.opcache.file_cache=./opcache.opcache.file_cache=\/tmp\/.opcache\//' /usr/local/etc/php.ini
sed -i '' 's/.opcache.interned_strings_buffer=./opcache.interned_strings_buffer=8/' /usr/local/etc/php.ini
sed -i '' 's/.opcache.max_accelerated_files=./opcache.max_accelerated_files=10000/' /usr/local/etc/php.ini
sed -i '' 's/.opcache.memory_consumption=./opcache.memory_consumption=128/' /usr/local/etc/php.ini
sed -i '' 's/.opcache.save_comments=./opcache.save_comments=1/' /usr/local/etc/php.ini
sed -i '' 's/.opcache.revalidate_freq=./opcache.revalidate_freq=1/' /usr/local/etc/php.ini
# recommended value of 512MB for php memory limit (avoid warning when running occ)
sed -i '' 's/.memory_limit./memory_limit=512M/' /usr/local/etc/php.ini

6. Scarichiamo, estraiamo e modifichiamo i permessi per nextcloud

cd
fetch nextcloud-17.0.2.tar.bz2 https://download.nextcloud.com/server/releases/nextcloud-17.0.1.tar.bz2
tar -jxf nextcloud-17.0.2.tar.bz2
cp -rf nextcloud /usr/local/www/nextcloud
chown -R www:www /usr/local/www/nextcloud/

7. Installiamo nextcloud specificando il dataset nel quale registrare i dati del software e la cartella di destinazione dei file degli utenti

sudo -u www php /usr/local/www/nextcloud/occ  maintenance:install --database "mysql" --database-name "nextcloud"  --database-user "dbadmin" --database-pass "<passsword-utente-dbadmin>" --admin-user "NextCloud_Admin" --admin-pass "<password-utente-NextCloud_Admin>" --data-dir "/mnt/nextcloud"

Nel mio caso, il dataset accessibile alla jail da FreeNAS è stato montato dentro /mnt/nextcloud.

8. Modifichiamo il file di configurazione di NextCloud esplicitando l’indirizzo e l’eventuale DNS al quale verrà contattato

nano /usr/local/www/nextcloud/config/config.php
 e modificare l'array in questo modo:
 array (
   0 => 'localhost',
   1 => '192.168.0.100',
   2 => 'nextcloud.local',
 ),

9. Diamo il via ai servizi e, tramite browser, godiamoci il nostro nuovo cloud pronto ad esser riempito.

service nginx start
service php-fpm start

That’s all folks.

Emanuele

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.