Buongiorno, oggi vedremo come installare Nextcloud 31 su una maccina Debian 12. Per prima cosa, in questo articolo, si parlerà di come installare un'instanza Nextcloud sulla macchina e non si utilizzerà un Docker perché si assumerà che l'installazione sia per un numero elevato di utenti e che sia per una sola azienda quindi senza necessità di ottimizzare le risorse ma con la specifica di creare un'istanza che possa utilizzare a pieno la VPS.
Iniziamo intanto preparando l'ambiente. Per prima cosa Installiamo nginx mediante il comando:
# apt update
# apt install nginx
A questo punto il servizio dovrebbe essere installato e pronto all'uso però possiamo controllarlo utilizzando i comandi
# systemctl status nginx
e nel caso sia stoppato possiamo avviarlo mediante il comando
# systemctl start nginx
Assicuriamoci inoltre che il servizio parta automaticamente all'avvio del server. Quindi digitiamo il comando:
# systemctl enable nginx
In questo modo siamo sicuri che il servizio si avvierà in automatico. Ora bisogna installare la parte riguardante l'ambiente php. Dalla versione 31 di nextcloud si raccomanda l'installazione di PHP versione 8.3 mentre la versione 8.1 è sicuramente deprecata ma supportata mentre la 8.4 è supportata ma non consigliata. Quindi dobbiamo installare la versione PHP 8.3 con il servizio fpm (FastCGI process Manager) in questo modo gli script PHP verranno gestiti in modo maggiormente ottimizzato e veloce.
Per far questo, però, dobbiamo installare i repository sicuri ma non uffciali
https://wiki.debian.org/AdditionalPHPVersions
Brevemente per installare la cosa più semplice è quella di installare il pacchetto extrepo e quindi abilitare il repo sury
# apt install extrepo
e quindi abilitare il repo sury
# extrepo enable sury
A questo punto possiamo installare i pacchetti php che ci interessano
# apt update
# apt install php8.3-fpm php8.3-curl php8.3-cli php8.3-mysql php8.3-gd php8.3-common php8.3-xml php8.3-json php8.3-intl php8.3-pear php8.3-imagick php8.3-mbstring php8.3-zip php8.3-soap php8.3-bz2
inoltre se dovessimo collegare l'instanza Nextcloud a una fonte LDAP (come ad esempio un server AD) dobbiamo installare anche il pacchetto
# apt install php8.3-ldap
così come se l'installazione dovesse collegarsi a cartelle di rete Windows avrebbe bisogno del pacchetto
# apt install php8.3-smbclient
Fatto questo dobbiamo andare a modificare delle voci in entrambi i file di configurazione /etc/php/8.3/fpm/php.ini e /etc/php/8.3/cli/php.ini . Le voci ca modificare sono:
decommentare date.timezone e assegnargli il valore:
date.timezone = Europe/Rome
decommentare cgi.fix_pathinfo e assegnarli il valore 0
cgi.fix_pathinfo=0
Salvare e uscire.
Quindi andare sul file /etc/php/8.3/fpm/pool.d/www.conf e decommentare le righe:
env[HOSTNAME] = $HOSTNAME
env[PATH] = /usr/local/bin:/usr/bin:/bin
env[TMP] = /tmp
env[TMPDIR] = /tmp
env[TEMP] = /tmp
Salvare ed uscire. A questo punto possiamo andare riavviare il servizio php-fpm perché legga le impostazioni
# systemctl restart php8.3-fpm
e possiamo assicurarci che anche questo venga avviato automaticamente all'avvio del sistema.
# systemctl enable php8.3-fpm
Ora dobbiamo installare Mysql o MariaDB. Installiamo MariaDB che troviamo già nei repository di Debian. Anche qui dobbiamo fare attenzione perchè la versione 31 di Nextcloud raccomanda l'installazione della versione 10.11 di MariaDB server quindi debbiamo avere almeno una Debian 12 Bookworm installata.
Per installare MariaDB installiamo il pacchetto:
# apt install mariadb-server
Controlliamo anche qui l'installazione se il servizio è attivo
# systemctl status mariadb
se non è attivo avviamolo
# systemctl start mariadb-server
e abilitiamolo in modo che venga automaticamente avviato con l'accesione del sistema.
# systemctl enable mariadb-server
Ora dobbiamo avviare la prima configurazione del servizio col comando:
# mysql_secure_installation
e rispondiamo alle domande
Enter current password for root (enter for none): <password>Press EnterSet root password? [Y/n]YRemove anonymous users? [Y/n]YDisallow root login remotely? [Y/n]YRemove test database and access to it? [Y/n]YReload privilege tables now? [Y/n]Y
A questo punto abbiamo instanziato l'installazione di MariaDB e, quindi, possiamo procedere alla configurazione del DB su cui installare Nexcloud e l'utente che deve accedere.
Entriamo nell'istanza MariaDB utilizzando il comando:
# mysql -u root -p
Dopo aver inserito la password di root che avevamo inserito al punto precedente diamo i seguenti comandi SQL:
> create database nextcloud_db;
> create user nextuser@localhost identified by '<password>';
Mi raccomando di generare una password complessa mediante appositi programmi come keepassXC così da tenerla memorizzata.
Diamo quindi i permessi all'utente nextuser sul database nextcloud_db
> grant all privileges on nextcloud_db.* to nextuser@localhost identified by '<password>';
dove la password è sempre quella precedentemente generata.
> flush privileges;
> quit;
A questo punto anche l'instanza del DB è pronta. Mi raccomando segnatevi il nome del DB, il nome dell'utente e la password.
Ora dobbiamo generare un certificato per la gestione degli accessi tramite https. Per far questo dobbiamo aver preventivamente registrato il record DNS A che sarà in nostro indirizzo con cui richiamare l'instanza Nextcloud (ad esempio cloud.miodominio.it).
Installiamo certbot che serve alla gestione dei sertificati con Let'sEncrypt.
# apt install certbot
Quindi stoppiamo il servizio nginx che altrimenti occupa la porta 80 che serve al trasferimento del certificato
# systemctl stop nginx
Quindi scarichiamo il certificato
# certbot certonly --standalone -d cloud.miodominio.it
a questo punto seguiamo le istruzioni. Inseriamo una mail, accettiamo con A i termini del servizio e rispondiamo Si o no se vogliamo o meno che il nostro indirizzo mail venga condiviso con il l'organizzazione no-profit EFF (Electronic Frontier Foundation).
Fatto questo i file del certificato verranno scaricati e installati nella cartella /etc/letsencrypt/live/cloud.miodominio.it/ e q questi dovremmo far riferimento quando andremo a configurare il file nginx per l'instanza nextcloud.
Creiamo il file di configurazione /etc/nginx/sites-available/nextcloud.conf e scriviamo dentro:
upstream php-handler {
server unix:/var/run/php/php8.3-fpm.sock;
}
# Set the `immutable` cache control options only for assets with a cache busting `v` argument
map $arg_v $asset_immutable {
"" "";
default "immutable";
}
server {
listen 80
listen [::]:80;
server_name cloud.miodominio.it;
# Prevent nginx HTTP Server Detection
server_tokens off;
# Enforce HTTPS
return 301 https://$server_name$request_uri:443;
}
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name cloud.miodominio.it;
# Path to the root of your installation
root /srv/www/nextcloud;
# Use Mozilla's guidelines for SSL/TLS settings
# https://mozilla.github.io/server-side-tls/ssl-config-generator/
#ssl_certificate /etc/ssl/nginx/cloud.example.com.crt;
#ssl_certificate_key /etc/ssl/nginx/cloud.example.com.key;
ssl_certificate /etc/letsencrypt/live/cloud.miodominio.it/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/cloud.miodominio.it/privkey.pem;
# Prevent nginx HTTP Server Detection
server_tokens off;
access_log /var/log/nginx/nextcloud_access.log;
error_log /var/log/nginx/nextcloud_error.log;
# Codice da abilitare se è installato modsecurity
# modsecurity on;
# modsecurity_rules_file /etc/nginx/modsec/main.conf;
# HSTS settings
# WARNING: Only add the preload option once you read about
# the consequences in https://hstspreload.org/. This option
# will add the domain to a hardcoded list that is shipped
# in all major browsers and getting removed from this list
# could take several months.
add_header Strict-Transport-Security "max-age=15768000; includeSubDomains; preload" always;
# set max upload size and increase upload timeout:
client_max_body_size 5120M;
client_body_timeout 800s;
fastcgi_buffers 516 32K;
# Enable gzip but do not remove ETag headers
gzip on;
gzip_vary on;
gzip_comp_level 4;
gzip_min_length 256;
gzip_proxied expired no-cache no-store private no_last_modified no_etag auth;
gzip_types application/atom+xml application/javascript application/json application/ld+json application/manifest+json application/rss+xml application/vnd.geo+json application/vnd.ms-fontobject application/wasm application/x-font-ttf application/x-web-app-manifest+json application/xhtml+xml application/xml font/opentype image/bmp image/svg+xml image/x-icon text/cache-manifest text/css text/plain text/vcard text/vnd.rim.location.xloc text/vtt text/x-component text/x-cross-domain-policy;
# Pagespeed is not supported by Nextcloud, so if your server is built
# with the `ngx_pagespeed` module, uncomment this line to disable it.
#pagespeed off;
# The settings allows you to optimize the HTTP2 bandwitdth.
# See https://blog.cloudflare.com/delivering-http-2-upload-speed-improvements/
# for tunning hints
client_body_buffer_size 2048k;
# HTTP response headers borrowed from Nextcloud `.htaccess`
add_header Referrer-Policy "no-referrer" always;
add_header X-Content-Type-Options "nosniff" always;
add_header X-Download-Options "noopen" always;
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-Permitted-Cross-Domain-Policies "none" always;
add_header X-Robots-Tag "noindex, nofollow" always;
add_header X-XSS-Protection "1; mode=block" always;
# Remove X-Powered-By, which is an information leak
fastcgi_hide_header X-Powered-By;
# Specify how to handle directories -- specifying `/index.php$request_uri`
# here as the fallback means that Nginx always exhibits the desired behaviour
# when a client requests a path that corresponds to a directory that exists
# on the server. In particular, if that directory contains an index.php file,
# that file is correctly served; if it doesn't, then the request is passed to
# the front-end controller. This consistent behaviour means that we don't need
# to specify custom rules for certain paths (e.g. images and other assets,
# `/updater`, `/ocm-provider`, `/ocs-provider`), and thus
# `try_files $uri $uri/ /index.php$request_uri`
# always provides the desired behaviour.
index index.php index.html /index.php$request_uri;
# Rule borrowed from `.htaccess` to handle Microsoft DAV clients
location = / {
if ( $http_user_agent ~ ^DavClnt ) {
return 302 /remote.php/webdav/$is_args$args;
}
}
location = /robots.txt {
allow all;
log_not_found off;
access_log off;
}
# Make a regex exception for `/.well-known` so that clients can still
# access it despite the existence of the regex rule
# `location ~ /(\.|autotest|...)` which would otherwise handle requests
# for `/.well-known`.
location ^~ /.well-known {
# The rules in this block are an adaptation of the rules
# in `.htaccess` that concern `/.well-known`.
location = /.well-known/carddav { return 301 /remote.php/dav/; }
location = /.well-known/caldav { return 301 /remote.php/dav/; }
location /.well-known/acme-challenge { try_files $uri $uri/ =404; }
location /.well-known/pki-validation { try_files $uri $uri/ =404; }
# Let Nextcloud's API for `/.well-known` URIs handle all other
# requests by passing them to the front-end controller.
return 301 /index.php$request_uri;
}
# Rules borrowed from `.htaccess` to hide certain paths from clients
location ~ ^/(?:build|tests|config|lib|3rdparty|templates|data)(?:$|/) { return 404; }
location ~ ^/(?:\.|autotest|occ|issue|indie|db_|console) { return 404; }
# Ensure this block, which passes PHP files to the PHP process, is above the blocks
# which handle static assets (as seen below). If this block is not declared first,
# then Nginx will encounter an infinite rewriting loop when it prepends `/index.php`
# to the URI, resulting in a HTTP 500 error response.
location ~ \.php(?:$|/) {
# Required for legacy support
rewrite ^/(?!index|remote|public|cron|core\/ajax\/update|status|ocs\/v[12]|updater\/.+|oc[ms]-provider\/.+|.+\/richdocumentscode\/proxy) /index.php$request_uri;
fastcgi_split_path_info ^(.+?\.php)(/.*)$;
set $path_info $fastcgi_path_info;
try_files $fastcgi_script_name =404;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $path_info;
fastcgi_param HTTPS on;
fastcgi_read_timeout 800;
fastcgi_param modHeadersAvailable true; # Avoid sending the security headers twice
fastcgi_param front_controller_active true; # Enable pretty urls
fastcgi_pass php-handler;
fastcgi_intercept_errors on;
fastcgi_request_buffering off;
fastcgi_max_temp_file_size 0;
}
location ~ \.(?:css|js|mjs|svg|gif|png|jpg|ico|wasm|tflite|map)$ {
try_files $uri /index.php$request_uri;
add_header Cache-Control "public, max-age=15778463, $asset_immutable";
access_log off; # Optional: Don't log access to assets
location ~ \.wasm$ {
default_type application/wasm;
}
}
location ~ \.woff2?$ {
try_files $uri /index.php$request_uri;
expires 7d; # Cache-Control policy borrowed from `.htaccess`
access_log off; # Optional: Don't log access to assets
}
# Rule borrowed from `.htaccess`
location /remote {
return 301 /remote.php$request_uri;
}
location / {
try_files $uri $uri/ /index.php$request_uri;
}
if ( $http_host !~* ^(cloud\.miodominio\.it\:443)$ ) {
return 444;
}
}
In questo file già ci sono delle particolari configurazioni di sicurezza e di utilità per aumentare, ad esempio, il tempo di timeout delle sessioni per agevolare l'upload di file particolarmente corposi (diciamo fino a 5 GB).
Salviamo il file così modificato e abilitiamo linkandolo sulla cartella /etc/nginx/sites-enable mediante il comando:
# ln -s /etc/nginx/sites-availavle/nextcloud.conf /etc/nginx/sites-enable/nextcloud
a questo punto possiamo riavviare il servizio nginx
# systemctl restart nginx
e il sito sarà quindi pronto a ricevere risposte aspettandosi di trovare i file del programma nella cartella /srv/www/nextcloud.
Prima però scarichiamo i file del server sulla cartella /srv/ e iniziamo a preparare l'ambiente.
# cd /srv
# wget https://download.nextcloud.com/server/releases/nextcloud-31.0.12.zip
Ora creiamo la cartella www e scompattiamo i file di nextcloud dentro alla cartella stessa.
/srv# unzip nextcloud-31.0.12.zip
/srv# mkdir www
/srv# mv nextcloud www/
Se non doveste avere il comando unzip sarà possibile installarlo tramite il pacchetto zip
# apt install zip
Correggiamo i permessi e il proprietario della cartella:
/srv# cd www
/srv/www# chown -R www-data:www-data nextcloud
/srv/www# find nextcloud/ -type d -exec chmod 750 {} \;
/srv/www# find nextcloud/ -type f -exec chmod 640 {} \;
A questo punto possiamo proseguire l'installazione da qualsiasi browser collegandoci al sito https://cloud.miodominio.it. Al termine avremo un'installazione di base di Nextcloud versione 31.