5. Nextcloud installierenWebserver, PHP und Datenbank installieren und einrichtenAls erstes müssen Webserver, PHP und Datenbank installiert werden:
sudo apt-get update
sudo apt-get install nginx mariadb-client mariadb-server php7.0-common php7.0-fpm php7.0-cli php7.0-json php7.0-mysql php7.0-curl php7.0-intl php7.0-mcrypt php-pear php7.0-gd php7.0-zip php7.0-xml php7.0-mbstring php7.0-apcu
Während der Installation muss man evtl. ein root-Kennwort für die MariaDB-Datenbank eingeben.
Danach konfiguriert man MariaDB für den sicheren Betrieb durch den folgenden Befehl:
sudo mysql_secure_installation
Dabei dann immer mit Y antworten bzw. das gewünschte root-Kennwort eingeben.
Im folgenden wird eine Datenbank mit dem Namen "nextcloud" und ein Datenbankbenutzer mit Namen "nextcloud" angelegt. Der folgende Befehl öffnet dazu eine MariaDB-Shell (dabei das vorher festgelegt root-Kennwort für MariaDB eingeben):
sudo mysql -u root -p
In diese MySQL-Shell gibt man nun die folgenden Befehle ein und schliesst die Shell zum Schluss wieder mit exit. "HierdasKennwort" muss natürlich gegen das gewünschte Kennwort für den nextcloud -Benutzer ausgetauscht werden.
CREATE DATABASE nextcloud;
CREATE USER 'nextcloud'@'localhost' IDENTIFIED BY 'HierdasKennwort';
GRANT ALL PRIVILEGES ON nextcloud.* TO 'nextcloud'@'localhost';
FLUSH PRIVILEGES;
exit;
Nextcloud installierenZunächst sucht man auf der
Nextcloud-Installationsseite den Download-Link, z.B.:
https://download.nextcloud.com/server/releases/nextcloud-12.0.3.zipDieser Link wird in den folgenden Befehlen verwendet, mit denen Nextcloud heruntergeladen und entpackt wird:
cd /var/www/html
sudo wget https://download.nextcloud.com/server/releases/nextcloud-12.0.3.zip
sudo unzip nextcloud-12.0.3.zip
sudo rm nextcloud-12.0.3.zip
sudo chown -R www-data:www-data nextcloud
SSL-Zertifikat erstellenJe nach gewünschter Variante müssen ein oder zwei SSL-Zertifikate erstellt werden.
Variante A: für cloud4.apfelinsel.de
Variante B: für cloud6.apfelinsel.de
Variante C: für cloud4.apfelinsel.de und cloud6.apfelinsel.de
Die folgenden Befehlen müssen für jedes Zertifikat eingegeben werden. "serverx" ist dabei durch "server4" (für cloud4.apfelinsel.de) bzw. "server6" (für cloud6.apfelinsel.de) zu ersetzen.
Als erstes werden der private Schlüssel und eine Zertifikatsanforderung erzeugt. Bei dem zweiten Befehl werden verschiedene Informationen abgefragt. Hier muss unter "Common Name" der spätere Servername angegeben werden (also z.B. cloud4.apfelinsel.de). Alle anderen Punkte können nach Belieben ausgefüllt werden.
sudo openssl genrsa -out serverx.key 4096
sudo openssl req -new -key serverx.key -out serverx.csr
Die erstellte Zertifkatsanforderung wird dann von uns selber zertifiziert. Die Zahl hinter "days" gibt an, wie lange das Zertifikat gültig sein soll. In diesem Beispiel sind es 365 Tage=1 Jahr. 10 Jahre=3650 Tage funktionieren, 100 Jahre=36500 Tage funktionieren nicht.
sudo openssl x509 -req -days 365 -in serverx.csr -signkey serverx.key -out serverx.crt
Auf diesem Weg haben wir zwei Dateien erstellt:
serverx.key: der private Schlüssel
serverx.crt: das SSL-Zertifikat
Nun werden die Dateien noch in einen anderen Ordner verschoben:
sudo chmod 400 serverx.key
sudo mv serverx.key /root/serverx.key
sudo mv serverx.crt /root/serverx.crt
IPv6 Privacy Extensions deaktivierennur bei Variante B und CStandardmässig sind die IPv6 Privacy Extensions aktiviert und der Raspberry wechselt daher nach einer gewissen Zeit von alleine seine IPv6-Adresse. Leider merkt die Fritzbox das nicht richtig und gibt diese Änderung nicht an den Dienst MyFritz weiter. Daher muss diese Änderung deaktiviert werden:
Die entsprechende Konfigurationsdatei wird im Editor geöffnet:
sudo nano /etc/dhcpcd.conf
Dann wird die Zeile
slaac private
in
slaac hwaddr
Den Editor mit Ctrl-X, J und Return verlassen und den raspberry neu starten:
sudo reboot
PHP einrichtenIn der PHP-Konfiguration sollte die maximale Ausführungszeit erhöht werden. Dazu die Datei php.ini öffnen:
sudo nano /etc/php/7.0/fpm/php.ini
Hier nach max_execution_time suchen und ändern:
max_execution_time = 300
Den Editor mit Ctrl-X, J und Return verlassen.
Dann die Datei
www.conf öffnen:
sudo nano /etc/php/7.0/fpm/pool.d/www.conf
Hier nach request_terminate_timeout suchen, auskommentieren und ändern:
request_terminate_timeout = 300
Den Editor mit Ctrl-X, J und Return verlassen.
Abschließend PHP7.FPM neu starten:
sudo /etc/init.d/php7.0-fpm reload
Nginx einrichtenDer Webserver muss noch so konfiguriert werden, dass er auf den gewählten Servernamen reagiert und auch das SSLZertifikat einbindet. Dazu wird die Konfigurationsdatei geöffnet:
sudo nano /etc/nginx/sites-available/default
Der alte Inhalt wird durch den folgenden Text komplett ersetzt. Dabei cloud4.apfelinsel.de bzw. cloud6.apfelinsel.de entsprechend der gewünschten Variante verwenden und die Namen "cloudx" und "serverx" entsprechend anpassen.
upstream php-handler {
server unix:/run/php/php7.0-fpm.sock;
}
server {
listen 80;
server_name cloudx.apfelinsel.de;
# enforce https
return 301 https://$server_name$request_uri;
}
server {
listen 443 ssl;
server_name cloudx.apfelinsel.de;
ssl_certificate /root/serverx.crt;
ssl_certificate_key /root/serverx.key;
# 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;";
add_header X-Content-Type-Options nosniff;
add_header X-XSS-Protection "1; mode=block";
add_header X-Robots-Tag none;
add_header X-Download-Options noopen;
add_header X-Permitted-Cross-Domain-Policies none;
# Path to the root of your installation
root /var/www/html/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;
location = /.well-known/carddav {
return 301 $scheme://$host/remote.php/dav;
}
location = /.well-known/caldav {
return 301 $scheme://$host/remote.php/dav;
}
# set max upload size
client_max_body_size 512M;
fastcgi_buffers 64 4K;
# Disable gzip to avoid the removal of the ETag header
gzip off;
# Uncomment if your server is build with the ngx_pagespeed module
# This module is currently not supported.
#pagespeed off;
error_page 403 /core/templates/403.php;
error_page 404 /core/templates/404.php;
location / {
rewrite ^ /index.php$uri;
}
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/.+|ocs-provider/.+|core/templates/40[34])\.php(?:$|/) {
include fastcgi_params;
fastcgi_split_path_info ^(.+\.php)(/.*)$;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_param HTTPS on;
#Avoid sending the security headers twice
fastcgi_param modHeadersAvailable true;
fastcgi_param front_controller_active true;
fastcgi_pass php-handler;
fastcgi_intercept_errors on;
fastcgi_request_buffering off;
fastcgi_read_timeout 300;
}
location ~ ^/(?:updater|ocs-provider)(?:$|/) {
try_files $uri/ =404;
index index.php;
}
# Adding the cache control header for js and css files
# Make sure it is BELOW the PHP block
location ~* \.(?:css|js|woff|svg|gif)$ {
try_files $uri /index.php$uri$is_args$args;
add_header Cache-Control "public, max-age=7200";
# 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;";
add_header X-Content-Type-Options nosniff;
add_header X-Frame-Options "SAMEORIGIN";
add_header X-XSS-Protection "1; mode=block";
add_header X-Robots-Tag none;
add_header X-Download-Options noopen;
add_header X-Permitted-Cross-Domain-Policies none;
# Optional: Don't log access to assets
access_log off;
}
location ~* \.(?:png|html|ttf|ico|jpg|jpeg)$ {
try_files $uri /index.php$uri$is_args$args;
# Optional: Don't log access to other assets
access_log off;
}
}
Abschließend noch Nginx neustarten:
sudo service nginx reload
Skript zum Setzen der strengen Dateirechte erstellenDas Skript mit folgendem Befehl erstellen:
sudo nano /root/setPermissions
Dann im Editor folgendes Skript eingeben und mit CTRL-X, J und Return speichern.
#!/bin/bash
ncpath='/var/www/html/nextcloud'
datapath='/media/usb-hdd/nextcloud'
htuser='www-data'
htgroup='www-data'
rootuser='root'
printf "chmod Files and Directories\n"
find ${ncpath}/ -type f -print0 | xargs -0 chmod 0640
find ${ncpath}/ -type d -print0 | xargs -0 chmod 0750
find ${datapath}/ -type f -print0 | xargs -0 chmod 0640
find ${datapath}/ -type d -print0 | xargs -0 chmod 0750
printf "chown Directories\n"
chown -R ${htuser}:${htgroup} ${ncpath}/
chown -R ${htuser}:${htgroup} ${datapath}/
Nun muss das Skript noch als ausführbar markiert werden:
sudo chmod +x /root/setPermissions
Quellen:
https://goneuland.de/debian-8-jessie-nextcloud-mit-nginx-mariadb-und-php7-installieren/https://www.elektronik-kompendium.de/sites/raspberry-pi/2010021.htm