Il NAS definitivo con Debian e Nextcloud (parte 3 LAMP e Nextcloud)

In questo 3° articolo ci concentreremo sull’installazione di un ambiente LAMP per far girare Nextcloud e all’installazione vera e propria di Nextcloud. Se vi siete persi gli altri articoli vi consiglio di leggere prima quelli e poi di tornare qui.

La prima cosa da fare è configurare il dominio. Se volete acquistarne uno il mio consiglio è di utilizzare il servizio di google domains, tra l’altro nel prossimo articolo verrà trattato proprio come configurare adeguatamente il dominio dinamico. Intanto però, se volete utilizzare un vostro dominio, è importante che lo acquistiate già e lo configuriate per puntare al vostro NAS. Infatti configureremo il server web apache2 per accettare esclusivamente connessioni cifrate e quindi useremo solo il protocollo https.

Inoltre dovrete al momento aprire almeno la porta 80 e la porta 443 del vostro router, altrimenti non sarete accessibili dal mondo esterno.

Installazione di MariaDB

Per prima cosa pensiamo a installare il database. Utilizzeremo MariaDB pertanto iniziamo l’installazione digitando da root

# apt-get install mariadb-client mariadb-server

Finita l’installazione avviamo lo script di messa in sicurezza del database lanciano

# mysql_secure_installation

Io personalmente ho, per pigrizia, nel mio server personale, non attivato la password di root permettendo l’autenticazione come utenza root del database solamente dall’utente root di sistema. In realtà questa non è affatto una best practice e quindi impostate la password di root!

Configurazione utenze

A questo punto siamo pronti per configurare l’utenza per nextcloud. Effettuiamo l’accesso da root in mysql con

# mysql -p

o nel mio caso (che sono stato una brutta persona e non ho configurato la password di root) solamente con # mysql

A questo punto dobbiamo creare il database che chiameremo d_nextcloud

CREATE DATABASE 'd_nextcloud';

creiamo ora l’utente u_nextcloud con la password c0Mpl3xpwD! che vi consiglio di generare con un generatore casuale di password.
CREATE USER 'u_nextcloud'@localhost IDENTIFIED BY 'c0Mpl3xpwD!';
Garantiamo tutti i privilegi all’utente u_nextcloud al proprio database associato d_nextcloud
GRANT ALL PRIVILEGES ON 'd_nextcloud'.* TO 'u_nextcloud'@localhost;
Aggiorniamo ora i privilegi (altrimenti è come se non avessimo mai creato alcun database).

FLUSH PRIVILEGES;

Usciamo dalla console digitando

\q

Ottimizzazione database

Inoltre per utilizzare al meglio MariaDB con nextcloud è opportuno modificare alcuni parametri del database. Editiamo il file /etc/mysql/my.cnf e sotto a

[client-server]

# Import all .cnf files from configuration directory
!includedir /etc/mysql/conf.d/
!includedir /etc/mysql/mariadb.conf.d/

aggiungete

[server]
skip_name_resolve = 1
innodb_buffer_pool_size = 256M
innodb_buffer_pool_instances = 1
innodb_flush_log_at_trx_commit = 2
innodb_log_file_size = 32M
innodb_log_buffer_size = 32M
innodb_max_dirty_pages_pct = 90
#query_cache_type = 0
query_cache_type = 0
query_cache_limit = 4M
query_cache_min_res_unit = 2k
#query_cache_size = 64M
query_cache_size = 0
tmp_table_size= 64M
max_heap_table_size= 64M
performance_schema = ON
[mysqld]
transaction_isolation = READ-COMMITTED
binlog_format = ROW

La configurazione di MariaDB è conclusa, potete riavviare il server con

service mysql restart

Installazione del web-server

Come web-server ho scelto apache2. Per installare tutte le componenti necessarie al corretto utilizzo di Nextcloud digitate

# apt-get install certbot python3-certbot-apache apache2 libapache2-mod-php php-curl php-dom php-gd php-xml php-json php-mbstring php-zip php-mysql php-intl php-bcmath php-gmp php-imagick imagemagick needrestart

In seguito dobbiamo abilitare 2 mod di apache2 con

a2enmod rewrite
a2enmod headers

Modifiche minori

Apache

Sarà necessario ora effettuare alcune piccole modifiche ai file di configurazione

Aprite il file /etc/apache2/conf-available/security.conf

modificare ServerSignature da On a Off;

modificare ServerTokens da Full a Prod;

modificare TraceEnable da On a Off.

Php

Aprite il file /etc/php/7.3/apache2/php.ini e

Modificate opcache.enable=1

opcache.memory_consumption=128

opcache.interned_strings_buffer=8

opcache.max_accelerated_files=10000

opcache.max_wasted_percentage=5

Installazione Nextcloud

È giunto ora il momento (finalmente) di installare Nextcloud!

Preparazione directory

Per prima cosa creiamo la nuova directory di installazione di Nextcloud con un

mkdir /var/www/

Posizioniamoci in quella directory con cd e scarichiamo con wget il file zip contenente Nextcloud reperibile alla pagina di download ufficiale.

A questo punto, ottenuto il file spacchettiamolo con unzip dando

unzip nomearchivio.zip

Se il comando non è presente installatelo con apt-get.

Vi troverete ora la directory nextcloud appena estratta. Fornitele i giusti permessi con

chown -R www-data:www-data nextcloud

Creiamo intanto ora anche la directory dati nel disco esterno per nextcloud con

mkdir /mnt/data/nextcloud

e diamo sempre i giusti permessi con

chown -R www-data:www-data /mnt/data/nextcloud

Configurazione virtualhost

A questo punto dobbiamo creare i virtualhost per apache2

Posizioniamoci in /etc/apache2/sites-available

e creiamo un file chiamato

rediricter.conf contenente

<VirtualHost *:80>
	ServerAdmin webmaster@localhost
	DocumentRoot /var/www/html

	#LogLevel info ssl:warn

	ErrorLog ${APACHE_LOG_DIR}/error.log
	CustomLog ${APACHE_LOG_DIR}/access.log combined

	# Rewite
	<IfModule mod_rewrite.c>
		RewriteEngine on
		RewriteCond %{HTTP_HOST} =www.tuodominio.org
		RewriteRule ^ https://tuodominio.org%{REQUEST_URI} [END,NE,R=permanent]

		RewriteCond %{SERVER_NAME} =tuodominio.org
	        RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]

                RewriteCond %{HTTP_HOST} =cloud.tuodominio.org
                RewriteRule ^ https://tuodominio.org%{REQUEST_URI} [END,NE,R=permanent]

	</IfModule>
</VirtualHost>

Lo scopo di questa configurazione è reindirizzare tutto il traffico di nostro interesse da http verso il protocollo https. Inoltre reindirizzerà anche il traffico proveniente dal dominio di terzo livello www e cloud verso il dominio di secondo livello. Inoltre sarà anche il dominio di default nel caso di richieste provenienti da domini non configurati.

Creiamo ora il file rediricter-ssl.conf che si occuperà di redirigere il traffico dai sottodomini non desiderati per il protocollo https.

<IfModule mod_ssl.c>
	<VirtualHost _default_:443>
		ServerName www.tuodominio.org
		ServerAlias cloud.tuodominio.org
		
		ServerAdmin webmaster@localhost
		#LogLevel info ssl:warn
		DocumentRoot /var/www/html
		
		ErrorLog ${APACHE_LOG_DIR}/error.log
		CustomLog ${APACHE_LOG_DIR}/access.log combined

		#SSLEngine on

		Include /etc/letsencrypt/options-ssl-apache.conf

		SSLCertificateFile	/etc/letsencrypt/live/tuodominio.org/fullchain.pem
		SSLCertificateKeyFile /etc/letsencrypt/live/tuodominio.org/privkey.pem

		Redirect "/index.html" "https://tuodominio.org/"
	</VirtualHost>
</IfModule>

Infine creiamo nextcloud.conf che è il file di configurazione vero e proprio per Nextcloud.

<IfModule mod_ssl.c>
	<VirtualHost _default_:443>
		ServerAdmin webmaster@localhost
		#LogLevel info ssl:warn
		DocumentRoot /var/www/nextcloud

		<Directory /var/www/nextcloud>
			Options Indexes FollowSymLinks
			AllowOverride All
			Require all granted
		</Directory>

		ErrorLog ${APACHE_LOG_DIR}/error.log
		CustomLog ${APACHE_LOG_DIR}/access.log combined

		#SSLEngine on
		
		ServerName tuodominio.org
		Include /etc/letsencrypt/options-ssl-apache.conf
#		ServerAlias www.tuodominio.org
#		ServerAlias cloud.tuodominio.org

		SSLCertificateFile	/etc/letsencrypt/live/tuodominio.org/fullchain.pem
		SSLCertificateKeyFile /etc/letsencrypt/live/tuodominio.org/privkey.pem

		#Nextcloud
		<IfModule mod_headers.c>
			Header always set Strict-Transport-Security "max-age=15552000; includeSubDomains"
		</IfModule>
		
		<IfModule mod_rewrite.c>
			RewriteEngine on
			RewriteCond %{HTTP_HOST} ^www.tuodominio.org [NC]
			RewriteRule ^(.*)$ https://tuodominio.org/$1 [L,R=301]
			RewriteCond %{HTTP_HOST} ^cloud.tuodominio.org [NC]
                        RewriteRule ^(.*)$ https://tuodominio.org/$1 [L,R=301]
		</IfModule>
                <IfModule mod_php7.c>
                        php_value mbstring.func_overload 0
                        php_value default_charset 'UTF-8'
                        php_value output_buffering 0
                        php_value memory_limit 512M
                        php_value post_max_size 1G
                        php_value upload_max_filesize 1G
               </IfModule>
</VirtualHost>
</IfModule>

Questi virtualhost sono configurati per accettare la connessione su tuodominio.org e reindirizzare su tuodominio.org tutte le connessioni provenienti anche da altri sottodomini. Se non avete creato sottodomini potete anche cancellare quella parte di reindirizzamento. Comunque lasciate il reindirizzamento per www perché necessario.

Ovviamente dovete modificare tuodominio.org con il nome del vostro dominio.

Ora i virtualhost sono disabilitati, dovrete abilitarli con

a2ensite rediricter.conf rediricter-ssl.conf nextcloud.conf

Al contempo disabilitate i siti di default con

a2dissite 000-default.conf default-ssl.conf

Richiesta dei certificati

Ovviamente questo virtualhost per il momento non funzionerà, infatti prevede sia abilitato ssl. Pertanto è giunto il momento di richiedere i certificati ssl con certbot!

certbot certonly --standalone --pre-hook "service apache2 stop" --post-hook "service apache2 start"

Seguite le istruzioni a schermo. Per funzionare ovviamente il dominio deve essere correttamente configurato e la porta 80 deve essere correttamente raggiungibile. Configurate ora per tutti i domini che vi interessano. Inserite per primo il dominio di secondolivello (nell’esempio tuodominio.org) e poi tutti i domini di terzo livello (come www.tuodominio.org). È necessario che inseriate tutti i sottodomini nella stessa richiesta in modo da avere un certificato unico per tutti.

Certbot provvederà anche autonomamente all’auto rinnovo del certificato e al riavvio di apache2.

Installazione di Nextcloud

Fatto ciò potrete ora collegarvi al vostro dominio e vi troverete la pagina di Nextcloud pronta ad accettare una nuova installazione.

Pagina di installazione di nextcloud

Assicuratevi di inserire correttamente il nome del database, della password e come Data folder selezionate la directory che abbiamo creato appositamente, cioè /mnt/data/nextcloud.

Bene, abbiamo finito! Avrete ora il vostro servizio di Cloud auto hostato personale. Non vi resta che ultimare le vostre personalizzazioni, installando applicazioni aggiuntive, come l’ottima stuite Collabora Online che altro non è che LibreOffice utilizzabile da browser (come google documents).

Inoltre è conveniente che configuriate cron per far eseguire i lavori periodici in maniera indipendente dalla navigazione sul browser. Per fare questo dovrete impostare dalle impostazioni e poi impostazioni di base di NextCloud di eseguire i lavori con cron

e poi digitare da terminale

sudo -u www-data crontab -e

e impostare

*/5 * * * * php -f /var/www/nextcloud/cron.php --define apc.enable_cli=1

In questo modo farete eseguire ogni 5 minuti i task automatici.

Non dimenticate di installare sui vostri dispositivi i client di Nextcloud! Grazie a questi programmi potrete attivare la sincronizzazione automatica di tutti i vostri dispositivi (mobile e desktop) e visualizzare da browser (ed eventualmente ripristinare) le versioni dei file.

Abbiamo praticamente finito, nei prossimi articoli vedremo come configurare al meglio il dominio dinamico, il server di posta e l’UPS per ricevere automaticamente le notifiche in caso di intervento ed infine un sistema di backup automatico!