Guida completa per costruire un cloud personale gratuito

Uno dei problemi che incontro quando provo a suggerire di abbandonre Dropbox o Google Drive è che, molto spesso, è difficile fornire alternative altrettanto comode. Nel mio caso, ad esempio, ho configurato Nextcloud sul mio NAS e protetto tutti i servizi di casa tramite VPN: sono ben consapevole che non tutti possano spingersi verso queste soluzioni.

Quella che ti suggerirò adesso, è una soluzione gratuita che non richiede ragionamenti su possibili scenari di disaster-recovery esagerati (io ho dovuto gestire la possibilità che il mio NAS vada distrutto) ma che permette a chi è leggermente più coraggioso di avventurarsi verso soluzioni “self-hosted” che regalano un sufficiente controllo dei propri dati e della propria privacy. La mia proposta si basa sull’utilizzo di un VPS (virtual private server). Solitamente un VPS, essendo una risorsa hardware “di qualcun altro”, ha un certo costo. Oracle però offre la possibilità di utilizzare un VPS con 100GB di spazio gratuitamente.

Oracle infatti offre dei VPS in versione “free tier, dei tagli molto piccoli offerti principalmente per provare il servizio. Tale concessione non è a tempo, pertanto per servizi poco pesanti dal punto di vista delle risorse può risultare una buona soluzione, in piena legalità, per costruire un servizio di cloud personale, con ottimo uptime e buone garanzie di backup.

Per implementare una soluzione simile ti servono:

  1. una carta di credito (non bisogna pagare nulla ma è richiesta una carta di credito in fase di creazione dell’account Oracle)
  2. un dominio (non è obbligatorio ma certamente rende tutto più armonico) e la possibilità di configurare un record di tipo A sui DNS del dominio che punti all’IP del VPS. Se hai un dominio, al 99% è possibile farlo.

Il primo passo da fare è iscriverti ad Oracle Free Tier. Una volta iscritto, nella sezione Istanze va creata una nuova VM avendo cura di selezionare le risorse offerte “gratis per sempre” (a meno di non voler iniziare a pagare per le risorse usate in stile Amazon AWS).

I passaggi per ottenere una macchina funzionante su Oracle sono:

  1. Crea una istanza per una nuova Virtual Machine
  2. Dagli un nome
  3. Seleziona come OS: Canonical Ubuntu 20.04 Minimal
  4. Nelle opzioni del Network e Storage seleziona: Assegna un indirizzo IP pubblico
  5. Aggiungi una chiave SSH (puoi generarne una usando ssh-keygen se non ne hai già una)
  6. Nelle opzioni avanzate rimuovi la funzione di monitoring (poi toglieremo l’agente dalla VM per risparmiare risorse)
  7. Verifica le risorse e abbi cura che l’istanza e il volume di boot selezionato siano “Always Free” se non intendi pagare successivamente.
  8. Una volta creata la VM, assicurati di poterti collegare in SSH sul server (utilizzando la chiave privata che hai configurato precedentemente) utilizzando l’utente “ubuntu”.

A questo punto dovresti essere in grado di entrare in SSH sulla macchina (scegli tu il client che preferisci: su Windows consiglio Putty, su macOS va benissimo il terminale).

I passaggi per installare Nextcloud a questo punto sono i seguenti:

1. Aggiorna i repository, crea un’area di swap (la macchina ha solo 1GB di RAM, un po’ di swap tornerà utile specie se si installa anche elasticsearch) e imposta il timezone sulla macchina

sudo apt update && sudo apt upgrade
sudo apt install nano
sudo dd if=/dev/zero of=/swap bs=1M count=4k
sudo chmod 0600 /swap
sudo mkswap /swap
sudo swapon /swap
sudo echo '/swap none swap sw 0 0' >> /etc/fstab
sudo dpkg-reconfigure tzdata

Assicurati che l’area di swap sia stata creata e resa attiva (puoi verificare usando il comando top) e poi rimuovi gli agenti di monitoring di Oracle

sudo apt purge netfilter-persistent iptables-persistent
sudo snap remove oracle-cloud-agent

2. Installa il server web e tutti i componenti PHP necessari a Nextcloud

sudo apt install nginx -y
sudo apt install wget unzip zip -y
sudo apt install php-fpm php-curl php-cli php-mysql php-gd php-common php-xml php-json php-intl php-pear php-imagick php-dev php-common php-mbstring php-zip php-soap php-bz2 php-gmp php-bcmath php-opcache php-apcu -y

Spostati nella cartella di PHP per configurare un paio di righe

cd /etc/php/7.4/
sudo nano fpm/php.ini
sudo nano cli/php.ini
nel primo file:
--> memory_limit=512M
in entrambi i file:
--> date.timezone = Europe/Rome
--> cgi.fix_pathinfo=0

Modifica inoltre la configurazione di www.conf in questo modo:

sudo nano fpm/pool.d/www.conf
Nel file rimuovere i commenti a:
env[HOSTNAME] = $HOSTNAME
env[PATH] = /usr/local/bin:/usr/bin:/bin
env[TMP] = /tmp
env[TMPDIR] = /tmp
env[TEMP] = /tmp

3. Installa il server SQL e avvia i servizi

sudo apt install mariadb-server -y

Avvia i servizi, configurali per l’avvio automatico e verifica che il server SQL sia partito

sudo systemctl start nginx
sudo systemctl enable nginx
sudo systemctl start php7.4-fpm
sudo systemctl enable php7.4-fpm
sudo systemctl start mariadb
sudo systemctl enable mariadb
sudo systemctl status mariadb

Configura una password per l’utente di root del server SQL e rispondi SI alle altre domande…

sudo mysql_secure_installation

Entra nel server SQL (inserendo la password appena scelta) e crea l’utente e il database per Nextcloud

sudo mysql -u root -p
create database nextcloud_db;
create user Emanuele@localhost identified by 'PaSsWorDMolToComPleSsA';
grant all privileges on nextcloud_db.* to Emanuele@localhost identified by 'PaSsWorDMolToComPleSsA';
flush privileges;
\q

4. Installa certbot per far sì che il servizio possa girare in HTTPS con un certificato valido rilasciato da Let’s Encrypt

sudo apt install certbot -y
sudo systemctl stop nginx

Hai spento il server web, adesso assicurati che nel firewall di Oracle siano aperte la porta 80 e la 443 verso la tua VM (dovrai farlo dalla sezione Networking del pannello di controllo di Oracle) e poi esegui i comandi successivi per generare il certificato (sostituendo opportunamente il tuo dominio)

sudo certbot certonly --standalone -d nextcloud.dreamsworld.it

5. A questo punto dovresti aver generato il certificato (l’output in shell è abbastanza eloquente) e puoi iniziare a scaricare e installare Nextcloud

cd /var/www/
sudo wget -q https://download.nextcloud.com/server/releases/latest.zip
sudo unzip -qq latest.zip
sudo chown -R www-data:www-data /var/www/nextcloud
cd /etc/nginx/sites-available/
sudo nano nextcloud

Dovresti aver aperto un file vuoto, riempilo con tutto quel che è scritto qui a seguire, avendo cura di sostituire le due occorrenze del nome del dominio e il percorso corretto del certificato SSL

upstream php-handler {
    #server 127.0.0.1:9000;
    server unix:/var/run/php/php7.4-fpm.sock;
}

server {
    listen 80;
    listen [::]:80;
    server_name nextcloud.dreamsworld.it;
    # enforce https
    return 301 https://$server_name:443$request_uri;
}

server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    server_name nextcloud.dreamsworld.it;

    # Use Mozilla's guidelines for SSL/TLS settings
    # https://mozilla.github.io/server-side-tls/ssl-config-generator/
    # NOTE: some settings below might be redundant
    ssl_certificate /etc/letsencrypt/live/nextcloud.dreamsworld.it/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/nextcloud.dreamsworld.it/privkey.pem;

    # Add headers to serve security related headers
    # Before enabling Strict-Transport-Security headers please read into this
    # topic first.
    #add_header Strict-Transport-Security "max-age=15768000; includeSubDomains; preload;" always;
    #
    # 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 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 "none" 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;

    # Path to the root of your installation
    root /var/www/nextcloud;

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

    # 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 /public.php?service=host-meta last;
    #rewrite ^/.well-known/host-meta.json /public.php?service=host-meta-json last;

    # The following rule is only needed for the Social app.
    # Uncomment it if you're planning to use this app.
    #rewrite ^/.well-known/webfinger /public.php?service=webfinger last;

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

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

    # 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/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;

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

    location / {
        rewrite ^ /index.php;
    }

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

    location ~ ^\/(?:index|remote|public|cron|core\/ajax\/update|status|ocs\/v[12]|updater\/.+|oc[ms]-provider\/.+)\.php(?:$|\/) {
        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;
        # Avoid sending the security headers twice
        fastcgi_param modHeadersAvailable true;
        # Enable pretty urls
        fastcgi_param front_controller_active true;
        fastcgi_pass php-handler;
        fastcgi_intercept_errors on;
        fastcgi_request_buffering off;
    }

    location ~ ^\/(?:updater|oc[ms]-provider)(?:$|\/) {
        try_files $uri/ =404;
        index index.php;
    }

    # Adding the cache control header for js, css and map files
    # Make sure it is BELOW the PHP block
    location ~ \.(?:css|js|woff2?|svg|gif|map)$ {
        try_files $uri /index.php$request_uri;
        add_header Cache-Control "public, max-age=15778463";
        # 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;" always;
        #
        # 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 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 "none" always;
        add_header X-XSS-Protection "1; mode=block" always;

        # Optional: Don't log access to assets
        access_log off;
    }

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

Abilita e verifica la configurazione, poi riavvia i servizi:

sudo ln -s /etc/nginx/sites-available/nextcloud /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl restart nginx
sudo systemctl restart php7.4-fpm

6. Configura il firewall della macchina limitando l’accesso alle sole porte 80 e 443

sudo apt install ufw
sudo su
for svc in ssh http https
do
ufw allow $svc
done
ufw enable
ufw status numbered
exit

7. Installa Elasticsearch, il “motore di ricerca” che indicizzerà i contenuti sul tuo cloud per ricerche velocissime (con scansione anche dei contenuti dei file)

sudo apt update
wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -
sudo sh -c 'echo "deb https://artifacts.elastic.co/packages/7.x/apt stable main" > /etc/apt/sources.list.d/elastic-7.x.list'
sudo apt update
sudo apt install elasticsearch
sudo /usr/share/elasticsearch/bin/elasticsearch-plugin install ingest-attachment
sudo systemctl enable --now elasticsearch.service

Date le risorse limitate della macchina, il servizio potrebbe fallire ad avviarsi, in tal caso aumenta il tempo di timeout e avvialo nuovamente

sudo systemctl show elasticsearch | grep ^Timeout
sudo mkdir /etc/systemd/system/elasticsearch.service.d
echo -e "[Service]\nTimeoutStartSec=180" | sudo tee /etc/systemd/system/elasticsearch.service.d/startup-timeout.conf
sudo systemctl daemon-reload

8. Abilita la cache nella configurazione di Nextcloud per velocizzarne il funzionamento

sudo nano var/www/nextcloud/config/config.php
inserire:
'memcache.local' => '\OC\Memcache\APCu',

9. Installa e configura un cron per le routine di manutenzione di Nextcloud e riavvia i servizi

sudo apt install cron
sudo crontab -e -u www-data
inserire:
*/15  *  *  *  * php -f /var/www/nextcloud/cron.php
sudo systemctl restart nginx
sudo systemctl restart php7.4-fpm

A questo punto, se hai eseguito tutto correttamente, collegandoti a https://nextcloud.TUODOMINIO.it, dovresti vedere la pagina di configurazione di Nextcloud.

I parametri da inserire sono i seguenti (sostituisci ovviamente il tuo nome e la tua password)

Configurazione nextcloud:
utente: Emanuele
password: PaSsWorDMolToComPleSsA
Dir dati: /var/www/nextcloud/data
Dati database: nextcloud_db

Nelle “Impostazioni di base” di Nextcloud (l’url è /settings/admin), vai a selezionare “Cron” come modalità di esecuzione delle attività di manutenzione e installa i tre plugin necessari al funzionamento di Elasticsearch: Full text search / Full text search – Elasticsearch Platform / Full text search – Files (questo lo fai da /settings/apps).

Da qui in poi, sta tutto a te. Nextcloud è una piattaforma di file sharing che si può ampliare all’infinito attraverso i suoi plugin.

Ho scritto questa guida per un amico che aveva voglia di imparare ad installare Nextcloud da sé. Se credi ti sia stata utile, se trovi imperfezioni o hai suggerimenti sei caldamente invitato a lasciare un commento.

Riprendiamoci i nostri dati!

Emanuele

2 commenti » Scrivi un commento

  1. Ciao Emanuele,
    Bellissimo articolo!!
    Non conoscevo ElasticSearch e mi ha affascinato… una curiosità: come indicizzare anche i word/Excel?
    Che GUI usi per svolgere tutte le attività?

    • Ciao Federico, Elasticsearch indicizza anche i documenti Office (nome del file e contenuto) pertanto, ad esempio, la ricerca dentro Nextcloud sarà in grado di trovare il file con un determinato valore in una cella excel.
      Non ho installato alcuna interfaccia di Elasticsearch (Kibana ad esempio) in quanto i plugin di Nextcloud integrano Elasticsearch direttamente nel campo “Cerca” (che è quel che serve a me: vado sul mio cloud e voglio trovare quel che cerco). Spero sia più chiaro e spero di aver interpretato bene le tue domande…
      Ciao,
      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.