Installazione Nextcloud 27 su Raspberry pi 4
UPDATE: 14/10/23
con la versione bookworm, php8.2 è gia incluso.
Guida su come installare Nextcloud 27 su Raspberry pi 4. Per installare Nextcloud a differenza delle versioni precedenti è indispensabile avere php8.2
Nota: Assicurati di avere un Raspberry Pi 4 funzionante con Raspberry pi OS al momento bullseye.
1) Aggiornare il sistema:
$ sudo apt update
$ sudo apt upgrade -y
$ sudo reboot
2) Aggiungere i repository per ottenere le ultime versioni di php:
$ curl https://packages.sury.org/php/apt.gpg | sudo tee /usr/share/keyrings/suryphp-archive-keyring.gpg >/dev/null
$ echo "deb [signed-by=/usr/share/keyrings/suryphp-archive-keyring.gpg] https://packages.sury.org/php/ $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/sury-php.list
$ sudo apt update; sudo apt upgrade -y
3) Installazione di Apache2, Mysql, php8.2, certbot:
$ sudo apt install apache2 php8.2 php8.2-gd php8.2-sqlite3 php8.2-curl php8.2-zip php8.2-xml php8.2-mbstring php8.2-mysql php8.2-bz2 php8.2-intl php8.2-imap php8.2-gmp libapache2-mod-php8.2 mariadb-server python3-certbot-apache php8.2-fpm php8.2-apcu php8.2-imagick php8.2-bcmath libmagickcore-6.q16-6-extra ffmpeg redis-server php8.2-redis
4) Verifica Apache2
$ sudo a2enmod proxy_fcgi setenvif
$ sudo a2enconf php8.2-fpm
$ sudo systemctl restart apache2
$ sudo systemctl status apache2
5) Creazione utente nextcloud e db
$ sudo mysql -u root -p
ed invio
create database nextcloud_db;
create user nextclouduser@localhost identified by 'YOUR-STRONG-PWD';
grant all privileges on nextcloud_db.* to nextclouduser@localhost identified by 'YOU-STRONG-PWD';
flush privileges;
exit;
6) Download Nextcloud
$ cd /var/www/
$ sudo wget -v https://download.nextcloud.com/server/releases/latest.zip
$ sudo unzip latest.zip
$ sudo rm latest.zip
creazione della directory di storage, quest’ultima può essere creata anche all’esterno della cartella Nextcloud o su unità esterna.
$ sudo mkdir -p /var/www/nextcloud/data
$ sudo chown -R www-data:www-data /var/www/nextcloud/
$ sudo chmod 750 /var/www/nextcloud/data
7) Configurazione Apache2
$ sudo nano /etc/apache2/sites-available/nextcloud.conf
ed incollare questa semplice configurazione, che punterà a [IPADDRESS]/nextcloud
Alias /nextcloud "/var/www/nextcloud/"
<Directory /var/www/nextcloud/>
Require all granted
AllowOverride All
Options FollowSymLinks MultiViews
<IfModule mod_dav.c>
Dav off
</IfModule>
</Directory>
$ sudo a2ensite nextcloud.conf
$ sudo systemctl reload apache2
se si volesse utilizzare invece un proprio dominio:
<VirtualHost *:80>
DocumentRoot /var/www/nextcloud/
ServerName your.domain.com
<Directory /var/www/nextcloud/>
Require all granted
AllowOverride All
Options FollowSymLinks MultiViews
<IfModule mod_dav.c>
Dav off
</IfModule>
</Directory>
</VirtualHost>
$ sudo a2ensite nextcloud.conf
$ sudo systemctl reload apache2
8) Nextcloud installazione e post installazione
andare all’indirizzo del server: [IPADDRESS]/nextcloud
$ hostname -I
creare username e password per l’accesso via web, e poi inserire nextclouduser e nextcloud_db. I dati di default saranno in /var/www/nextcloud/data, ma si possono anche spostare successivamente.
9) Problemi accesso al server Nextcloud
se non si accede più al server andare a verificare i 2 files principali di apache2, 000-default.conf e default-ssl.conf, che puntano alla directory sbagliata:
$ sudo nano /etc/apache2/sites-available/000-default.conf
$ sudo nano /etc/apache2/sites-available/default-ssl.conf
da
DocumentRoot /var/www/html
a
DocumentRoot /var/www/
10) Tuning Apache2
alcune essenziali modifiche:
$ sudo nano /etc/php/8.2/fpm/php.ini
trovare queste tre stringhe e modificarle da così:
memory_limit = 128M
post_max_size = 8M
upload_max_filesize = 2M
a così:
memory_limit = 1024M
post_max_size = 1024M
upload_max_filesize = 1024M
$ sudo systemctl restart apache2
$ sudo systemctl restart php8.2-fpm.service
Modificare anche le porte, come sotto:
$ sudo nano /etc/apache2/ports.conf
Listen 0.0.0.0:80
<IfModule ssl_module>
Listen 0.0.0.0:443
</IfModule>
<IfModule mod_gnutls.c>
Listen 443
</IfModule>
$ sudo systemctl restart apache2
11) Certificato SSL auto-firmato
nell’esempio sotto, userò un certificato auto-firmato, ma è consigliato un certificato del tipo Let’s Encrypt (vedi capitolo 12)
$ sudo mkdir -p /etc/apache2/ssl
£ sudo openssl req -x509 -nodes -days 365 -newkey rsa:4096 -keyout /etc/apache2/ssl/apache.key -out /etc/apache2/ssl/apache.crt
$ sudo a2enmod ssl
$ sudo systemctl restart apache2
inserire i dati per la creazione del certificato:
Country Name (2 letter code) [AU]:
State or Province Name (full name) [Some-State]:
Locality Name (eg, city) []:
Organization Name (eg, company) [Internet Widgits Pty Ltd]:
Organizational Unit Name (eg, section) []:
Common Name (e.g. server FQDN or YOUR name) []:
Email Address []:
poi trovare queste due stringhe:
$ sudo nano /etc/apache2/sites-available/default-ssl.conf
e modificarle da così:
SSLCertificateFile /etc/ssl/certs/ssl-cert-snakeoil.pem
SSLCertificateKeyFile /etc/ssl/private/ssl-cert-snakeoil.key
a così:
SSLCertificateFile /etc/apache2/ssl/apache.crt
SSLCertificateKeyFile /etc/apache2/ssl/apache.key
$ sudo a2ensite default-ssl.conf
$ sudo systemctl reload apache2
12) Installazione certificato con Let’s Encrypt
- Il raspberry dovrà avere come dominio/hostname l’equivalente di example.com. Questo può essere modificato in /etc/hostname e poi riavviare.
- Il vostro ip pubblico dovrà puntare quindi al dominio, nel caso non si avesse un ip pubblico, utilizzare un servizio di DNS.
- Assicurarsi prima, di aprire la porte 80 verso il proprio server, altrimenti non si potranno ottenere i certificati. Successivamente bisognerà aprire la 443.
con certbot già installato in precedenza basta:
$ sudo certbot --webroot -w /var/www/nextcloud -i apache --agree-tos --redirect --hsts --staple-ocsp --email your@mail.com -d server.example.com
se tutto è andato bene vedremo:
IMPORTANT NOTES:
- Congratulations! Your certificate and chain have been saved at:
/etc/letsencrypt/live/example.com/fullchain.pem
Your key file has been saved at:
/etc/letsencrypt/live/example.com/privkey.pem
Your cert will expire on 2021-03-07. To obtain a new or tweaked
version of this certificate in the future, simply run certbot
again. To non-interactively renew *all* of your certificates, run
"certbot renew"
- If you like Certbot, please consider supporting our work by:
Donating to ISRG / Let's Encrypt: https://letsencrypt.org/donate
Donating to EFF: https://eff.org/donate-le
affinchè il server sia sempre raggiungibile a [IPADDRESS]/nextcloud verificare che sia presente la stringa <Alias /nextcloud “/var/www/nextcloud/”>
$ sudo nano /etc/apache2/sites-available/nextcloud.conf
come sotto:
Alias /nextcloud "/var/www/nextcloud/"
<VirtualHost *:80>
DocumentRoot /var/www/nextcloud/
ServerName server.example.com
13) Sicurezza
13.1) Installazione e configurazione firewall ufw:
$ sudo apt install ufw
$ sudo ufw enable
bloccare tutte le connessioni in ingresso:
$ sudo ufw default allow outgoing
$ sudo ufw default deny incoming
aprire solo le porte interessate, come quella ssh o https, ad ogni modo mai utilizzare porte standard:
$ sudo ufw allow 22
$ sudo ufw allow 443/tcp
$ sudo ufw allow 80/tcp
verifica:
$ sudo ufw status verbose
$ sudo iptables -S
13.2) Installazione e configurazione fail2ban:
$ sudo apt install fail2ban
$ sudo systemctl enable fail2ban
$ sudo systemctl status fail2ban
proteggere tutti i servizi usati, utilizzando /etc/fail2ban/jail.local, fail2ban arriva già con dei filtri predefiniti che possono essere abilitati:
$ ls /etc/fail2ban/filter.d/
quindi:
$ sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
$ sudo nano /etc/fail2ban/jail.local
dove si trovano gia i filtri che si possono abilitare con “enabled = true”
esempio:
[sshd]
enabled = true
port = 22
filter = sshd
logpath = /var/log/auth.log
maxretry = 3
bantime = 120
ignoreip = whitelist-IP
# detect password authentication failures
[apache]
enabled = true
port = http,https
filter = apache-auth
logpath = /var/log/apache*/*error.log
maxretry = 6
# detect potential search for exploits and php vulnerabilities
[apache-noscript]
enabled = true
port = http,https
filter = apache-noscript
logpath = /var/log/apache*/*error.log
maxretry = 6
# detect Apache overflow attempts
[apache-overflows]
enabled = true
port = http,https
filter = apache-overflows
logpath = /var/log/apache*/*error.log
maxretry = 2
# detect failures to find a home directory on a server
[apache-nohome]
enabled = true
port = http,https
filter = apache-nohome
logpath = /var/log/apache*/*error.log
maxretry = 2
$ sudo systemctl restart fail2ban
$ sudo fail2ban-client status
13.3) Integrazione Nextcloud in fail2ban:
$ sudo nano /etc/fail2ban/filter.d/nextcloud.conf
ed inserire il codice sotto:
[Definition]
_groupsre = (?:(?:,?\s*"\w+":(?:"[^"]+"|\w+))*)
failregex = ^\{%(_groupsre)s,?\s*"remoteAddr":"<HOST>"%(_groupsre)s,?\s*"messag>
^\{%(_groupsre)s,?\s*"remoteAddr":"<HOST>"%(_groupsre)s,?\s*"messag>
datepattern = ,?\s*"time"\s*:\s*"%%Y-%%m-%%d[T ]%%H:%%M:%%S(%%z)?"
a questo punto inserire nella sezione Jail il filtro specifico per Nextcloud:
$ sudo nano /etc/fail2ban/jail.local
ed inserire:
[nextcloud]
backend = auto
enabled = true
port = 80,443
protocol = tcp
filter = nextcloud
maxretry = 3
bantime = 86400
findtime = 43200
logpath = /var/www/nextcloud/data/nextcloud.log
verifica con:
$ sudo systemctl restart fail2ban
$ sudo fail2ban-client status nextcloud
errore avvio fail2ban:
$ sudo nano /etc/fail2ban/jail.local
ed impostare:
backend = systemd
14) Trusted Domain
indicare solo gli ip ed i domini che possono accedere:
$ sudo nano /var/www/nextcloud/config/config.php
'trusted_domains' =>
array (
0 => '192.168.1.122',
1 => 'my-domain.com',
15) Abilitare Memory Caching, Redis e default phone region
$ sudo nano /var/www/nextcloud/config/config.php
ed inserire prima della voce trusted_domains
'memcache.local' => '\OC\Memcache\APCu',
poi inserire dopo la voce installed’ => true
'memcache.local' => '\OC\Memcache\APCu',
'memcache.locking' => '\OC\Memcache\Redis',
'memcache.distributed' => '\OC\Memcache\Redis',
'redis' => [
'host' => 'localhost',
'port' => 6379,
],
e a seguire:
'default_phone_region' => 'IT',
16) Background Job
nextcloud richiede un cronjob per allegerire il carico, di default è settato in AJAX, andare nel menu Basic Settings ed impostare a cron:
poi creare un crob job che parte in backgroung ogni 5 minuti:
$ sudo crontab -u www-data -e
ed inserire in fondo:
*/5 * * * * php8.2 --define apc.enable_cli=1 /var/www/nextcloud/cron.php
verificare con:
$ sudo crontab -u www-data -l
17) Forzare la connessione via SSL con certificato auto-firmato
$ sudo nano /etc/apache2/sites-available/000-default.conf
sostituire tutto con quello sotto, che reindirizza tutte le richieste a https:
Alias /nextcloud "/var/www/nextcloud/"
<VirtualHost *:80>
ServerAdmin admin@example
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}$1 [R=301,L]
</VirtualHost>
18) Aggiornamenti di sicurezza automatici giornalieri:
$ sudo apt install unattended-upgrades
$ sudo nano /etc/apt/apt.conf.d/02periodic
inserire:
APT::Periodic::Enable "1";
APT::Periodic::Update-Package-Lists "1";
APT::Periodic::Download-Upgradeable-Packages "1";
APT::Periodic::Unattended-Upgrade "1";
APT::Periodic::AutocleanInterval "1";
APT::Periodic::Verbose "2";
aggiornare:
$ sudo unattended-upgrades -d
19) Sudo DEVE sempre chiedere la password:
$ sudo nano /etc/sudoers.d/010_pi-nopasswd
diventa da così:
YOUR-USER ALL=(ALL) NOPASSWD: ALL
a così:
YOUR-USER ALL=(ALL) PASSWD: ALL
20) Mysql in sicurezza
$ sudo mysql_secure_installation
Enter current password for root (enter for none): Press Enter
Set 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
21) SSH in sicurezza
cambiare subito la porta di default e verificare che non sia abilitato il login come root, ma soprattutto usare una chiave ssh:
$ sudo nano /etc/ssh/sshd_config
#PermitRootLogin prohibit-password
Port 2223
22) Backup
backup da eseguire periodicamente su supporti esterni ed in remoto. Si può utilizzare rsync (guida), tar (guida), dd (guida), scp (guida), lsyncd (guida).
23) VPN
il sistema più sicuro per accedere da remoto è tramite vpn, se si ha un router che supporta ipSec o Wireguard (fritzbox 7590) il tutto è semplice, in alternativa si può creare un server vpn, utilizzando openvpn o wireguard
Installazione Nextcloud 27 su Raspberry pi 4
enjoy 😉