Vediamo come installare ownCloud su un Ubuntu Server 20.04.1. In aggiunta configureremo anche un VirtualHost con un certificato autofirmato, aggiungendo infine un disco in LVM che ospiti i dati di ownCloud.
1. Configurazione server LAMP
Anzitutto configuriamo il server LAMP installando Apache, MariaDB e il PHP 7.4.
Eseguiamo il seguente comando:
1 |
sudo apt install -y apache2 libapache2-mod-php mariadb-server php-imagick php-common php-curl php-gd php-imap php-intl php-json php-mbstring php-mysql php-ssh2 php-xml php-zip php-apcu php-redis redis-server bzip2 rsync curl jq inetutils-ping smbclient coreutils php-ldap |
A questo punto configuriamo il database eseguendo:
1 |
sudo mysql_secure_installation |
ATTENZIONE! Se si esegue il commando senza sudo
verrà chiesta la password dell’utente root e non ci sarà modo di cambiarla, generando l’errore: ERROR 1698 (28000): Access denied for user 'root'@'localhost'
Digitare in sequenza, per le singole domande:
Change the root password? [Y/n] Y
Remove anonymous users? [Y/n] Y
Disallow root login remotely? [Y/n] Y
Remove test database and access to it? [Y/n] Y
Reload privilege tables now? [Y/n] Y
Una volta completata la configurazione di MariaDB il server LAMP e pronto è possiamo procedere con le specifiche configurazioni.
2. Creiamo il certificato di crittografia
Se non lo abbiamo già fatto installiamo openssl
. Questo ci servirà per creare un certificato autofirmato, nel caso in cui si disponga già del certificato si può passare al punto successivo.
1 |
sudo apt-get install openssl |
Creiamo la chiave privata e il certificato:
1 |
sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/ssl/private/cloud.local.2020.key -out /etc/ssl/certs/cloud.local.2020.crt |
Nel caso specifico stiamo dicendo ad openssl:
- req sottocomando col quale specifichiamo che vogliamo usare l’X.509 CSR (certificate signing request), un’infrastruttura standard per le chiavi pubbliche utilizzata tipicamente con SSL e TSL
- nodes indica ad OpenSSL di non cifrare il certificato con una password, dal momento che verrà utilizzato su Apache che deve potervi accedere liberamente
- days specifica la durata di validità del certificato, nel nostro caso 365 giorni
- newkey specifica il tipo di chiave privata (RSA 2048) che si vuole generare e il fatto che la si voglia generare assieme al certificato
- keyout indica la posizione dove creare la chiave
- out indica la posizione dove creare il certificato
Rispondiamo ai quesiti posti da OpenSSL per la configurazione del certificato. Nel mio caso procederò così:
Country Name (2 letter code) [AU]:IT
State or Province Name (full name) [Some-State]:Firenze
Locality Name (eg, city) []:Firenze
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Torregatti Spa
Organizational Unit Name (eg, section) []:Servizi Cloud
Common Name (e.g. server FQDN or YOUR name) []:cloud.local
Email Address []:scrivi@petarkaran.it
I valori sono per lo più arbitrari, l’unica cosa importante è il Common Name, che può essere l’indirizzo IP del server, oppure il dominio a cui sarà associato il certificato.
Configuriamo Apache affinché utilizzi correttamente i certificati SSL:
1 |
sudo nano /etc/apache2/conf-available/certificati.conf |
Nel file digitiamo:
1 2 3 4 5 6 7 8 9 |
SSLCipherSuite EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH SSLProtocol All -SSLv2 -SSLv3 -TLSv1 -TLSv1.1 SSLHonorCipherOrder On Header always set X-Frame-Options DENY Header always set X-Content-Type-Options nosniff SSLCompression off SSLUseStapling on SSLStaplingCache "shmcb:logs/stapling-cache(150000)" SSLSessionTickets Off |
Affinché la configurazione funzioni dobbiamo attivare il modulo SSL e il modulo Headers in Apache.
1 2 |
sudo a2enmod ssl sudo a2enmod headers |
A questo punto attiviamo la configurazione digitando:
1 |
sudo a2enconf certificati |
Affinché la configurazione sia corretta bisogna riavviare Apache, anche se non è necessario farlo adesso, lo possiamo fare anche dopo.
1 |
sudo service apache2 reload |
3. Configuriamo il VirtualHost
A questo punto configuriamo il nostro VirtualHost, immaginiamo che il nostro ownCloud debba trovarsi all’indirizzo cloud.local. (nel caso specifico da http://cloud.local e https://cloud.local)
Creiamo anzitutto due cartelle in /var/www
, una per i file, una per i dati ed una per i log, entrambe sottocartelle di cloud.local
, nella maniera seguente.
1 2 3 |
sudo mkdir -p /var/www/cloud.local/httpdocs sudo mkdir -p /var/www/cloud.local/logs sudo mkdir -p /var/www/cloud.local/dati |
Grazie all’argomento -p
creiamo l’intero percorso anche se non esiste.
A questo punto procediamo con la creazione del file del VirtualHost vero e proprio.
1 |
sudo nano /etc/apache2/sites-available/cloud.local.conf |
Nel file inseriamo le seguenti istruzioni.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 |
<VirtualHost *:80> ServerName cloud.local ServerAlias www.cloud.local DocumentRoot /var/www/cloud.local/httpdocs ErrorLog /var/www/cloud.local/logs/error.log CustomLog /var/www/cloud.local/logs/access.log combined Redirect permanent "/" "https://cloud.local/" </VirtualHost> <IfModule mod_ssl.c> <VirtualHost *:443> ServerName cloud.local ServerAlias www.cloud.local DocumentRoot /var/www/cloud.local/httpdocs ErrorLog /var/www/cloud.local/logs/error.log CustomLog /var/www/cloud.local/logs/access.log combined SSLEngine on SSLCertificateFile /etc/ssl/certs/cloud.local.2020.crt SSLCertificateKeyFile /etc/ssl/private/cloud.local.2020.key <FilesMatch "\.(cgi|shtml|phtml|php)$"> SSLOptions +StdEnvVars </FilesMatch> <Directory /usr/lib/cgi-bin> SSLOptions +StdEnvVars </Directory> </VirtualHost> </IfModule> <Directory /var/www/cloud.local/httpdocs/> Options +FollowSymlinks -Indexes AllowOverride All <IfModule mod_dav.c> Dav off </IfModule> SetEnv HOME /var/www/cloud.local/httpdocs SetEnv HTTP_HOME /var/www/cloud.local/httpdocs </Directory> |
In questo modo forziamo il redirect sul HTTPS e abilitiamo il certificato creato in precedenza.
A questo punto riavviamo apache:
1 |
sudo service apache2 restart |
4. Creazione partizione per i dati con LVM
Aggiungiamo al nostro server un disco aggiuntivo a creiamo un nuovo disco logico con LVM. Per ulteriori approfondimenti sulla procedura rimando all’articolo LVM, gestore logico dei volumi su Ubuntu [per pinguini alle prime armi]
Anzitutto vediamo i dischi dei quali disponiamo con:
1 |
sudo fdisk -l |
Nel mio caso (sto utilizzando VirtualBox per l’esempio con 2 dischi da 10GB ciascuno):
Il disco che utilizzerò è /dev/sdb
. Procediamo quindi a preparare il disco:
1 |
sudo fdisk /dev/sdb |
Su fdisk digitiamo in ordine:
- n per creare una nuova partizione
- p per una partizione primaria
- 1 numero di partizione
- INVIO per confermare il primo settore di default 2048
- INVIO per confermare l’ultimo settore
- t per modificare la partizione
- 8e per impostare Linux LVM
- w per scrivere e salvare il tutto
Utilizzando sudo fdisk -l
dovremmo vedere qualcosa di simile:
Creiamo un volume fisico digitando:
1 |
sudo pvcreate /dev/sdb1 |
Creiamo un gruppo di volumi chiamato dati-cloud digitando:
1 |
sudo vgcreate dati-cloud /dev/sdb1 |
Creiamo sopra il volume logico dati:
1 |
sudo lvcreate -l 100%FREE -n dati dati-cloud |
Formattiamo il volume in ext4.
1 |
sudo mkfs -t ext4 /dev/dati-cloud/dati |
A questo punto montiamo il nuovo volume logico sulla cartella /var/www/cloud.local/dati
1 |
sudo mount /dev/dati-cloud/dati /var/www/cloud.local/dati |
Siccome vogliamo che il disco sia montato in modo permanente, modifichiamo /etc/fstab
.
1 |
sudo nano /etc/fstab |
In fondo al file aggiungiamo la seguente riga:
1 |
/dev/dati-cloud/dati /var/www/cloud.local/dati ext4 rw,defaults 0 0 |
In questo modo al riavvio del server il volume logico verrà caricato automaticamente.
5. Creiamo un database per ownCloud
ownCloud necessita di un database per funzionare, pertanto creiamone uno nuovo all’interno di MariaDB.
Entriamo in MariaDB/MySQL:
1 |
sudo mysql -u root |
Una volta dentro creiamo un nuovo database chiamato cloud_db:
1 |
CREATE DATABASE cloud_db; |
Creiamo anche un utente per il database appena creato, che potrà accedere esclusivamente da locale (agli scopi dell’esercizio metterò una password banale):
1 2 3 |
CREATE USER 'cloud_user'@'localhost' IDENTIFIED BY 'password123'; GRANT ALL PRIVILEGES ON cloud_db.* TO 'cloud_user'@'localhost'; FLUSH PRIVILEGES; |
6. Installazione ownCloud
Scarichiamo ownCloud nella cartella httpdocs
. Da qui possiamo scegliere da dove scaricarlo.
1 |
sudo wget https://download.owncloud.org/community/owncloud-complete-20200731.zip |
Se non abbiamo installato unzip
facciamolo:
1 |
sudo apt-get install unzip |
A questo punto estraiamo il file zip.
1 |
sudo unzip owncloud-complete-20200731.zip |
Spostiamo i file dalla cartella owncloud
creata dall’unzip, nella radice del virtualhost.
1 2 3 4 |
sudo rm owncloud-complete-20200731.zip sudo mv owncloud/* . sudo mv owncloud/.* . sudo rm -r owncloud/ |
In questo modo rimuoviamo anche la cartella aggiuntiva ed il file zip.
Assegniamo adesso l’utente apache a tutta la cartella ed i file creati.
1 |
sudo chown -R www-data:www-data /var/www/cloud.local/ |
Infine abilitiamo la configurazione e riavviamo apache:
1 2 |
sudo a2ensite cloud.local sudo service apache2 restart |
Se tutto è andato bene potremo aprire ownCloud all’indirizzo https://cloud.local/
Inseriamo i parametri nella maniera seguente (utilizzando quelli creati):
- Scegliamo un utente ed una password
- Per la cartella dati impostiamo la cartella creata all’inizio
- Inseriamo i dati del database configurati in precedenza:
Una volta fatto tutto possiamo premere su TERMINA CONFIGURAZIONE.
Se tutto è andato bene vedremo una schermata come la seguente:
Fatto tutto questo possiamo accedere al sistema. Spostandoci su Impostazioni > Generali, potremmo notare delle notifiche come le seguenti:
Apportiamo quindi ancora un paio di modifiche per aggiustare il tutto correttamente.
Anzitutto configuriamo correttamente il crontab affinché esegua gli script di ownCloud.
Digitiamo:
1 |
sudo crontab -u www-data -e |
Se è la prima volta che lo apriamo ci chiederà quale editor preferiamo utilizzare, io scelgo 1 per nano.
Aggiungiamo la seguente riga:
1 |
*/15 * * * * /var/www/cloud.local/httpdocs/occ system:cron |
Salviamo con CTRL+O e usciamo.
Nelle suddette impostazioni di ownCloud selezioniamo come meccanismo di aggiornamento Cron.
Spostiamoci nella nostra cartella di installazione con:
1 |
cd /var/www/cloud.local/httpdocs/ |
Eseguiamo i seguenti comandi:
1 2 3 |
sudo -u www-data ./occ config:system:set memcache.local --value '\OC\Memcache\APCu' sudo -u www-data ./occ config:system:set memcache.locking --value '\OC\Memcache\Redis' sudo -u www-data ./occ config:system:set redis --value '{"host": "127.0.0.1", "port": "6379"}' --type json |
L’utilizzo di sudo -u www-data
è necessario perché l’esecuzione deve essere effettuata da Apache. Eseguendolo senza sudo
lo faremmo usando il nostro utente, con sudo
come root. In entrambi i casi non andrebbe bene.
Per risolvere l’avviso di HTTP "Strict-Transport-Security"
dobbiamo aggiungere a <VirtualHost *:443>
le seguenti tre righe:
1 2 3 |
<IfModule mod_headers.c> Header always set Strict-Transport-Security "max-age=15552000; includeSubDomains" </IfModule> |
Il file definitivo del virtualhost sarà come il seguente:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 |
<VirtualHost *:80> ServerName cloud.local ServerAlias www.cloud.local DocumentRoot /var/www/cloud.local/httpdocs ErrorLog /var/www/cloud.local/logs/error.log CustomLog /var/www/cloud.local/logs/access.log combined Redirect permanent "/" "https://cloud.local/" </VirtualHost> <IfModule mod_ssl.c> <VirtualHost *:443> ServerName cloud.local ServerAlias www.cloud.local DocumentRoot /var/www/cloud.local/httpdocs ErrorLog /var/www/cloud.local/logs/error.log CustomLog /var/www/cloud.local/logs/access.log combined SSLEngine on SSLCertificateFile /etc/ssl/certs/cloud.local.2020.crt SSLCertificateKeyFile /etc/ssl/private/cloud.local.2020.key <FilesMatch "\.(cgi|shtml|phtml|php)$"> SSLOptions +StdEnvVars </FilesMatch> <Directory /usr/lib/cgi-bin> SSLOptions +StdEnvVars </Directory> <IfModule mod_headers.c> Header always set Strict-Transport-Security "max-age=15552000; includeSubDomains" </IfModule> </VirtualHost> </IfModule> <Directory /var/www/cloud.local/httpdocs/> Options +FollowSymlinks AllowOverride All <IfModule mod_dav.c> Dav off </IfModule> SetEnv HOME /var/www/cloud.local/httpdocs SetEnv HTTP_HOME /var/www/cloud.local/httpdocs </Directory> |
Riavviamo ancora una volta apache.
1 |
sudo service apache2 restart |
A questo punto è tutto pronto e possiamo cominciare ad usare ownCloud.