Un Raspberry per un Cloud... - Parte Software

cloud in reteTerminata la realizzazione fisica del cloud si passa alla configurazione di tutti i programmi ed i servizi necessari al suo funzionamento; in questo tutorial mi occuperò di impostare la connessione del RasPI, formattare e partizionare l'hard disk oltre ad installare e configurare tutti i programmi necessari ad usare il cloud da qualsiasi punto del mondo vi troviate...

Connessione ad Internet

Il cloud va connesso direttamente all'interfaccia ethernet del router e quindi va configurata una connessione con IP fisso; dalla shell si digita:

sudo nano /etc/network/interfaces

Il comando apre il file di configurazione della rete, nel quale vanno inserite (o modificate qualora già presenti) le seguenti istruzioni:

allow-hotplug eth0
iface eth0 inet static
address 192.168.1.20
gateway 192.168.1.1
netmask 255.255.255.0
broadcast 192.168.1.255

l'indirizzo 192.168.1.20 sarà quello fisso del Raspberry (la scelta del 20 è casuale) mentre configurazione rete cloudquello del gateway corrisponde all'indirizzo del router. Ctrl + X per uscire, non prima però di aver salvato (tasto Y) la configurazione. Ora possiamo accedere ad Internet con il RasPI, e non resta che fissare il suo indirizzo anche sul router: si riavvia il RasPI e si accede (anche con un altro PC) alla pagina di configurazione del router, digitando nella barra degli indirizzi: 192.168.1.1 ; nella pagina di gestione della LAN si prenota l'IP del Raspberry (192.168.1.20 nel mio caso): la procedura varia da caso a caso, ma in genere dovreste trovarvi qualcosa come nella figura qui a destra.

Preparazione del disco rigido

L'hard disk che ho utilizzato proviene dal mio notebook ed è formattato con filesytem NTFS. Affinché sia leggibile dal Raspbian (il sistema operativo) va riformattato, e nel mio caso partizionato: volevo infatti evitare di perdere la partizione di recovery di Windows. A tale scopo è necessario installare un programma di partizionamento; nella shell digitate:

sudo apt-get install gparted

formattazione cloude confermate l'operazione quando vi verrà chiesto. GParted (GNU Partition Editor nel menù) è di facile utilizzo; si seleziona il disco da formattare, e per cominciare a lavorare si "smontano" tutte le partizioni cliccandovi con il tasto destro e selezionando l'opzione "unmount". Quindi si fanno tutte le operazioni necessarie (eliminazione o creazione di partizioni etc.) e si formattano in ext4. Anche il disco è pronto!

Installazione dei pacchetti necessari ad OwnCloud

Innanzitutto è utile un aggiornamento delle librerie e dei pacchetti già presenti sul RasPI, digitando nella shell:

sudo apt-get update

Quindi si installano alcuni componenti fondamentali:

sudo apt-get install nginx openssl ssl-cert php5-cli php5-sqlite php5-gd php5-common php5-cgi sqlite3 php-pear php-apc curl libapr1 libtool curl libcurl4-openssl-dev php-xml-parser php5 php5-dev php5-gd php5-fpm memcached php5-memcache varnish

Un accento va posto su Nginx: è un web server molto più leggero di Apache in termini di memoria e strutturato in modo completamente diverso da quest'ultimo (per chi volesse qualche informazione in più, ecco le differenze): sicuramente più adatto nel caso di un cloud su Raspberry! Prima di passare alla configurazione di Nginx è necessario rendere rintracciabile il cloud in mezzo a tutta Internet...

 DNS dinamico

Per spiegare questa parte sarò più semplice possibile: a meno che il contratto con il vostro provider preveda l'IP fisso, quando il vostro router è connesso ad internet gli è assegnato un indirizzo IP (che gli permette di essere individuato univocamente in mezzo a tutta Internet) che cambia periodicamente o ad ogni riconnessione. Se avete necessità di usare il cloud dall'Irlanda piuttosto che dal lago Titicaca, è fondamentale sapere il  suo indirizzo IP (o meglio, quello del router di casa vostra, a cui è connesso il cloud); ma se questo è variato come fare?

Vengono allora in aiuto i servizi di DNS dinamico che, in poche parole, ricevono l'indirizzo IP del cloud e lo associano ad un dominio precedentemente registrato ed a cui punterà il vostro PC. In questo casi il servizio utilizzato è No-IP, gratuito seppur con alcune limitazioni (la più fastidiosa è che ogni 30 giorni bisogna rinnovare il nome);cloud ci si registra al servizio e nel pannello di controllo si clicca su "add host". Quindi, inserito un nome per l'host si sceglie uno dei domini appartenenti al gruppo "free no-ip domains" e lasciate inalterate le altre impostazioni si invia la richiesta. Dopo un minuto sarà già attivo il dominio scelto e rimarrà da configurare il router: la procedura cambia a seconda del modello; nel mio caso, tra le impostazioni del router vi è "DNS dinamico" che restituisce una finestra all'interno della quale inserire i dati ottenuti da No-IP (come nella figura a sinistra). Terminata questa fase si può passare a configurare Nginx.

Configurazione di Nginx e PHP

Innanzitutto si comincia creando i certificati SSL:

sudo openssl req $@ -new -x509 -days 730 -nodes -out /etc/nginx/cert.pem -keyout /etc/nginx/cert.key

sudo chmod 600 /etc/nginx/cert.pem
sudo chmod 600 /etc/nginx/cert.key

Dopo aver digitato la prima riga delle 3, vi verrà chiesto di inserire alcuni parametri a completamento del certificato (paese, località, organizzazione etc.): potete lasciare tranquillamente in bianco tutti i campi, io ho solo compilato il paese.Quindi si passa alla configurazione vera e propria del server:

sudo nano /etc/nginx/sites-available/default

e nel file di configurazione che si apre vanno inserite tutte le istruzioni necessarie alla configurazione del server: in particolare dove trovate name_server dovrete inserire l'indirizzo IP del RasPI e nelle righe dei certificati SSL dovrete inserire i percorsi corretti dei certificati (qui sotto sono già quelli giusti):

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

server {
listen 80;
server_name 192.168.1.20;
# enforce https
return 301 https://$server_name$request_uri;
}

server {
listen 443 ssl;
server_name 192.168.1.20;

ssl_certificate /etc/nginx/cert.pem;
ssl_certificate_key /etc/nginx/cert.key;

# Path to the root of your installation
root /var/www/owncloud/;
# set max upload size
client_max_body_size 10G;
fastcgi_buffers 64 4K;

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/ /index.php;
}

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_param HTTPS on;
fastcgi_pass php-handler;
}

# Optional: set long EXPIRES header on static assets
location ~* \.(?:jpg|jpeg|gif|bmp|ico|png|css|js|swf)$ {
expires 30d;
# Optional: Don't log access to assets
access_log off;
}

}

E si salvano le modifiche. La configurazione appena vista vale per la versione 7 di OwnCloud: se adottate un'altra versione dovrete usare il file di configurazione adatto per quella (i file sono reperibili sul sito di Owncloud, tra i documenti per gli amministratori); lo scherzo di utilizzare il file di una vecchia versione di OwnCloud, senza accorgermene, mi è costato 2 giorni persi a capire perchè non funzionava nulla... 👿  Resta ora da configurare il modulo php:

sudo nano /etc/php5/fpm/php.ini

in cui si aggiornano le righe, consentendo l'upload sul cloud di file fino a 10 Gigabyte:

upload_max_filesize = 10G
post_max_size = 10G

quindi:

sudo nano /etc/php5/fpm/pool.d/www.conf

e si aprirà un file in cui la riga

listen = /var/run/php5-fpm.sock

va sostituita con:

listen = 127.0.0.1:9000

Infine è utile aumentare la dimensione dei file di swap:

sudo nano /etc/dphys-swapfile

In cui cambiare il valore da 100 a 500. Per rendere immediatamente effettive le modifiche:

sudo /etc/init.d/php5-fpm restart
sudo /etc/init.d/nginx restart

Installazione e configurazione di OwnCloud

Ultimo passo... Si scarica il .tar di OwnCloud, si installa il programma e si rimuovono i file non più necessari:

sudo mkdir -p /var/www/owncloud
sudo wget https://download.owncloud.org/community/owncloud-7.0.1.tar.bz2
sudo tar xvf owncloud-7.0.1.tar.bz2
sudo mv owncloud/ /var/www/
sudo chown -R www-data:www-data /var/www
rm -rf owncloud owncloud-7.0.1.tar.bz2

quindi  si riavvia per rendere effettive le tonnellate di configurazioni e modifiche fatte:

sudo reboot

pagina impostazione cloudA questo punto, digitando nella barra degli indirizzi del RasPI, l'IP del cloud (il famoso 192.168.1.20) dovreste trovarvi di fronte alla pagina di configurazione del programma (come nella figura a lato); inserite username e password che utilizzerete per l'account amministratore, quindi la cartella in cui salvare i file (nel mio caso il percorso dell'hard disk esterno). Clic su "Finish setup" e accederete per la prima volta al cloud! Se poi digitate 192.168.1.20/owncloud da uno qualsiasi dei computer in rete arriverete nuovamente alla pagina di accesso di OwnCloud; ora non rimane che rendere disponibile il cloud da qualsiasi parte del mondo vi accediate...

Portmapping per il Cloud

Anche in questo caso la procedura varia a seconda del router, ma le impostazioni da configurazione porte per cloudconfigurare si trovano facilmente nei menù del router. Per accedervi bisogna digitare, nella barra degli indirizzi del browser, l'IP del router (in genere è 192.168.1.1), quindi inserire le eventuali credenziali di accesso. Tra le voci del menù bisogna cercare "Port mapping"; si accederà ad una funzione che permetterà di instradare le richieste provenienti dal client OwnCloud, che da Milano vuole caricare la tesi sul cloud, sul Raspberry connesso al disco rigido. Senza tale impostazione il router non saprebbe che fare dei file e delle richieste in arrivo, e vi restituirebbe una pagina di errore (se non ci credete provate a digitare su un computer connesso ad un'altra rete "indirizzo_NOIP/192.168.1.20/owncloud"!). La procedura è semplice e consiste nello sbloccare alcune porte per l'IP corrispondente al RasPI: selezionata la porta 80 (che è quella associata al protocollo HTTP) sia in ingresso che in uscita la si associa all'IP 192.168.1.20; poi si ripete la stessa procedura per la porta 443 (associata alla connessione HTTPS, preferibile rispetto alla prima in quanto più sicura). Se ora digitatetrusted_domain owncloud l'indirizzo accederete alla pagina di login di OwnCloud, ma visualizzerete il messaggio di errore nella figura qui a destra: "Stai accedendo al server da un dominio non affidabile". Il problema è legato al fatto che l'applicazione al primo avvio salva l'indirizzo da cui state visitando OwnCloud come quello sicuro, da cui gli utenti possono accedere: la prima visita proveniva ovviamente dal 192.168.1.20 (da cui è stato creato l'account admin!). Per ovviare al problema bisogna aggiornare il file di configurazione:

sudo nano /var/www/owncloud/config/config.php

trusted_domain owncloudAlla voce "trusted_domain" si vedrà già inserito 192.168.1.20, accanto al quale andrà aggiunto l'indirizzo ottenuto dal servizio di dns dinamico (figura a sinistra). Salvato il file, tutto dovrebbe funzionare! Non resta che sistemare la routine di gestione dei led di segnalazione e regalare un case decente al cloud...

Stay tuned! 😎