Nextcloud 13 Installationsleitfaden


Diese Anleitung wurde letztmalig aktualisiert und bleibt nun eingefroren!
Bitte folgen sie in Zukunft der neuen Anleitung: Nextcloud installation guide for Ubuntu 18.04 LTS


Dieses How-To dient der Installation und Inbetriebnahme eines Nextcloudservers unter Ubuntu 16.04.4 LTS oder Ubuntu 18.04 LTS inklusive der Einrichtung und Optimierung aller benötigten Komponenten wie NGINX 1.14, PHP 7.2, MariaDB, Redis, fail2ban, Firewall (ufw) und dem A+ Prädikat von Qualys SSL Labs. Das dafür zugrundeliegende, kostenlose SSL Zertifikat erhalten wir im Verlauf dieses How-To von Let’s Encrypt.

Es müssen im Verlauf der Installation nur die rot markierten Werte (YOUR.DEDYN.IO , 192.168.2.x, 22, redis-hash ) angepaßt werden!

Möchten Sie mehrere Anwendungen parallel zu Nextcloud betreiben, so sehen Sie sich bitte auch den Artikel Nextcloud 13, Roundcube, WordPress, Shellinabox and Pi-hole behind a NGINX reverse proxy an.


Voraussetzungen für diese Anleitung

Die Voraussetzungen für dieses How-To sind meines Erachtens nach gering, sie benötigen

  • einen 64Bit-SBC (bspw. oDroid C2) oder einen 64-Bit-Mini-Server (bspw. Intel NUC),
  • Portweiterleitungen (:80, :443) aus dem Internet (bspw. FritzBox o. Speedport) in das interne Netz (zum Nextcloudserver),
  • das Betriebssystem Ubuntu 16.04.4 LTS oder Ubuntu 18.04 LTS (64Bit)

Inhaltsverzeichnis


Aktualisiert: 27. April 2018:
– Hinweise für Ubuntu 18.04 LTS ergänzt

Fühere Aktualisierungen


Installation des Webservers (NGINX)

Bevor Sie mit der Installation beginnen empfehlen wir die Aktualisierung auf die openssl Version 1.1.0h – eine Anleitung dazu finden Sie hier: how to upgrade to openssl 1.1.0h .

Wechseln sie in den priviligierten Benutzermodus und starten die Installation des NGINX Webservers:

sudo -s
cd /usr/local/src
apt update && apt upgrade -y && apt install software-properties-common python-software-properties zip unzip screen curl ffmpeg libfile-fcntllock-perl -y
apt remove nginx nginx-common nginx-full -y --allow-change-held-packages
sed -i '$adeb http://nginx.org/packages/ubuntu/ xenial nginx' /etc/apt/sources.list
sed -i '$adeb-src http://nginx.org/packages/ubuntu/ xenial nginx' /etc/apt/sources.list
wget http://nginx.org/keys/nginx_signing.key && apt-key add nginx_signing.key
apt update && apt install nginx -y

Achtung! Für Ubuntu 18.04 LTS wird “python-software-properties” nicht mehr benötigt!

Abschließend stellen wir den Autostart des Webservers sicher und sperren diesen für automatische Updates.

Anpassen des NGINX-Services:

systemctl enable nginx.service && apt-mark hold nginx

Um den Webserver NGINX zukünftig aktualisieren zu können brauchen Sie nur den folgenden Befehl auszuführen:

apt-mark unhold nginx && apt upgrade -y && apt-mark hold nginx

Anpassen der NGINX-Konfiguration:

Vorab verschieben wir die Originalkonfigurationen und erstellen dann eine neue, eigene Webserverkonfiguration:

mv /etc/nginx/nginx.conf /etc/nginx/nginx.conf.bak && vi /etc/nginx/nginx.conf

Kopieren Sie die nachfolgenden Zeilen und ersetzen die rot markierten Einträge durch Ihre Werte:

user www-data;
worker_processes auto;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
multi_accept on;
use epoll;
}
http {
server_names_hash_bucket_size 64;
upstream php-handler {
server unix:/run/php/php7.2-fpm.sock;
}
include /etc/nginx/mime.types;
#include /etc/nginx/proxy.conf;
#include /etc/nginx/ssl.conf;
#include /etc/nginx/header.conf;
#include /etc/nginx/optimization.conf;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for" '
'"$host" sn="$server_name" '
'rt=$request_time '
'ua="$upstream_addr" us="$upstream_status" '
'ut="$upstream_response_time" ul="$upstream_response_length" '
'cs=$upstream_cache_status' ;
access_log /var/log/nginx/access.log main;
sendfile on;
send_timeout 3600;
tcp_nopush on;
tcp_nodelay on;
open_file_cache max=500 inactive=10m;
open_file_cache_errors on;
keepalive_timeout 65;
reset_timedout_connection on;
server_tokens off;
resolver 192.168.2.1;
# resolver IP is your Router-IP (e.g. your FritzBox) 
resolver_timeout 10s;
include /etc/nginx/conf.d/*.conf;
}

Starten des Webservers (NGINX):

service nginx restart

Anlegen der Verzeichnisse und Sicherstellen der Berechtigungen:

mkdir -p /var/nc_data /var/www/letsencrypt /usr/local/tmp/cache /usr/local/tmp/sessions /usr/local/tmp/apc /upload_tmp
chown -R www-data:www-data /upload_tmp /var/nc_data /var/www
chown -R www-data:root /usr/local/tmp/sessions /usr/local/tmp/cache /usr/local/tmp/apc

Installation von PHP 7.2

apt install language-pack-en-base -y && sudo LC_ALL=en_US.UTF-8 add-apt-repository ppa:ondrej/php -y && apt update
apt install php7.2-fpm php7.2-gd php7.2-mysql php7.2-curl php7.2-xml php7.2-zip php7.2-intl php7.2-mbstring php7.2-json php7.2-bz2 php-apcu imagemagick php-imagick php-smbclient -y

Unglaublich, aber wahr: PHP 7.2 ist nun bereits installiert, muss aber noch angepasst werden:

Im Vergleich zum vorherigen Leitfaden (Nextcloud installation guide) finden Sie aktuell kein “php-mcrypt” mehr. Dieses ist aktuell nicht mehr Bestandteil von PHP (7.2) und wird bereits intern diskutiert: https://github.com/nextcloud/user_saml/issues/168.

Anpassungen von PHP 7.2:

cp /etc/php/7.2/fpm/pool.d/www.conf /etc/php/7.2/fpm/pool.d/www.conf.bak
cp /etc/php/7.2/cli/php.ini /etc/php/7.2/cli/php.ini.bak
cp /etc/php/7.2/fpm/php.ini /etc/php/7.2/fpm/php.ini.bak
cp /etc/php/7.2/fpm/php-fpm.conf /etc/php/7.2/fpm/php-fpm.conf.bak
sed -i "s/;env\[HOSTNAME\] = /env[HOSTNAME] = /" /etc/php/7.2/fpm/pool.d/www.conf
sed -i "s/;env\[TMP\] = /env[TMP] = /" /etc/php/7.2/fpm/pool.d/www.conf
sed -i "s/;env\[TMPDIR\] = /env[TMPDIR] = /" /etc/php/7.2/fpm/pool.d/www.conf
sed -i "s/;env\[TEMP\] = /env[TEMP] = /" /etc/php/7.2/fpm/pool.d/www.conf
sed -i "s/;env\[PATH\] = /env[PATH] = /" /etc/php/7.2/fpm/pool.d/www.conf
sed -i "s/pm.max_children = .*/pm.max_children = 240/" /etc/php/7.2/fpm/pool.d/www.conf
sed -i "s/pm.start_servers = .*/pm.start_servers = 20/" /etc/php/7.2/fpm/pool.d/www.conf
sed -i "s/pm.min_spare_servers = .*/pm.min_spare_servers = 10/" /etc/php/7.2/fpm/pool.d/www.conf
sed -i "s/pm.max_spare_servers = .*/pm.max_spare_servers = 20/" /etc/php/7.2/fpm/pool.d/www.conf
sed -i "s/;pm.max_requests = 500/pm.max_requests = 500/" /etc/php/7.2/fpm/pool.d/www.conf
sed -i "s/output_buffering =.*/output_buffering = 'Off'/" /etc/php/7.2/cli/php.ini
sed -i "s/max_execution_time =.*/max_execution_time = 1800/" /etc/php/7.2/cli/php.ini
sed -i "s/max_input_time =.*/max_input_time = 3600/" /etc/php/7.2/cli/php.ini
sed -i "s/post_max_size =.*/post_max_size = 10240M/" /etc/php/7.2/cli/php.ini
sed -i "s/;upload_tmp_dir =.*/upload_tmp_dir = \/upload_tmp/" /etc/php/7.2/cli/php.ini
sed -i "s/upload_max_filesize =.*/upload_max_filesize = 10240M/" /etc/php/7.2/cli/php.ini
sed -i "s/max_file_uploads =.*/max_file_uploads = 100/" /etc/php/7.2/cli/php.ini
sed -i "s/;date.timezone.*/date.timezone = Europe\/\Berlin/" /etc/php/7.2/cli/php.ini
sed -i "s/;session.cookie_secure.*/session.cookie_secure = True/" /etc/php/7.2/cli/php.ini
sed -i "s/;session.save_path =.*/session.save_path = \"N;700;\/usr\/local\/tmp\/sessions\"/" /etc/php/7.2/cli/php.ini
sed -i '$aapc.enable_cli = 1' /etc/php/7.2/cli/php.ini
sed -i "s/memory_limit = 128M/memory_limit = 512M/" /etc/php/7.2/fpm/php.ini
sed -i "s/output_buffering =.*/output_buffering = 'Off'/" /etc/php/7.2/fpm/php.ini
sed -i "s/max_execution_time =.*/max_execution_time = 1800/" /etc/php/7.2/fpm/php.ini
sed -i "s/max_input_time =.*/max_input_time = 3600/" /etc/php/7.2/fpm/php.ini
sed -i "s/post_max_size =.*/post_max_size = 10240M/" /etc/php/7.2/fpm/php.ini
sed -i "s/;upload_tmp_dir =.*/upload_tmp_dir = \/upload_tmp/" /etc/php/7.2/fpm/php.ini
sed -i "s/upload_max_filesize =.*/upload_max_filesize = 10240M/" /etc/php/7.2/fpm/php.ini
sed -i "s/max_file_uploads =.*/max_file_uploads = 100/" /etc/php/7.2/fpm/php.ini
sed -i "s/;date.timezone.*/date.timezone = Europe\/\Berlin/" /etc/php/7.2/fpm/php.ini
sed -i "s/;session.cookie_secure.*/session.cookie_secure = True/" /etc/php/7.2/fpm/php.ini
sed -i "s/;opcache.enable=.*/opcache.enable=1/" /etc/php/7.2/fpm/php.ini
sed -i "s/;opcache.enable_cli=.*/opcache.enable_cli=1/" /etc/php/7.2/fpm/php.ini
sed -i "s/;opcache.memory_consumption=.*/opcache.memory_consumption=128/" /etc/php/7.2/fpm/php.ini
sed -i "s/;opcache.interned_strings_buffer=.*/opcache.interned_strings_buffer=8/" /etc/php/7.2/fpm/php.ini
sed -i "s/;opcache.max_accelerated_files=.*/opcache.max_accelerated_files=10000/" /etc/php/7.2/fpm/php.ini
sed -i "s/;opcache.revalidate_freq=.*/opcache.revalidate_freq=1/" /etc/php/7.2/fpm/php.ini
sed -i "s/;opcache.save_comments=.*/opcache.save_comments=1/" /etc/php/7.2/fpm/php.ini
sed -i "s/;session.save_path =.*/session.save_path = \"N;700;\/usr\/local\/tmp\/sessions\"/" /etc/php/7.2/fpm/php.ini
sed -i "s/;emergency_restart_threshold =.*/emergency_restart_threshold = 10/" /etc/php/7.2/fpm/php-fpm.conf
sed -i "s/;emergency_restart_interval =.*/emergency_restart_interval = 1m/" /etc/php/7.2/fpm/php-fpm.conf
sed -i "s/;process_control_timeout =.*/process_control_timeout = 10s/" /etc/php/7.2/fpm/php-fpm.conf
sed -i '$aapc.enabled=1' /etc/php/7.2/fpm/php.ini
sed -i '$aapc.file_update_protection=2' /etc/php/7.2/fpm/php.ini
sed -i '$aapc.optimization=0' /etc/php/7.2/fpm/php.ini
sed -i '$aapc.shm_size=256M' /etc/php/7.2/fpm/php.ini
sed -i '$aapc.include_once_override=0' /etc/php/7.2/fpm/php.ini
sed -i '$aapc.shm_segments=1' /etc/php/7.2/fpm/php.ini
sed -i '$aapc.ttl=7200' /etc/php/7.2/fpm/php.ini
sed -i '$aapc.user_ttl=7200' /etc/php/7.2/fpm/php.ini
sed -i '$aapc.gc_ttl=3600' /etc/php/7.2/fpm/php.ini
sed -i '$aapc.num_files_hint=1024' /etc/php/7.2/fpm/php.ini
sed -i '$aapc.enable_cli=0' /etc/php/7.2/fpm/php.ini
sed -i '$aapc.max_file_size=5M' /etc/php/7.2/fpm/php.ini
sed -i '$aapc.cache_by_default=1' /etc/php/7.2/fpm/php.ini
sed -i '$aapc.use_request_time=1' /etc/php/7.2/fpm/php.ini
sed -i '$aapc.slam_defense=0' /etc/php/7.2/fpm/php.ini
sed -i '$aapc.mmap_file_mask=/usr/local/tmp/apc/apc.XXXXXX' /etc/php/7.2/fpm/php.ini
sed -i '$aapc.stat_ctime=0' /etc/php/7.2/fpm/php.ini
sed -i '$aapc.canonicalize=1' /etc/php/7.2/fpm/php.ini
sed -i '$aapc.write_lock=1' /etc/php/7.2/fpm/php.ini
sed -i '$aapc.report_autofilter=0' /etc/php/7.2/fpm/php.ini
sed -i '$aapc.rfc1867=0' /etc/php/7.2/fpm/php.ini
sed -i '$aapc.rfc1867_prefix =upload_' /etc/php/7.2/fpm/php.ini
sed -i '$aapc.rfc1867_name=APC_UPLOAD_PROGRESS' /etc/php/7.2/fpm/php.ini
sed -i '$aapc.rfc1867_freq=0' /etc/php/7.2/fpm/php.ini
sed -i '$aapc.rfc1867_ttl=3600' /etc/php/7.2/fpm/php.ini
sed -i '$aapc.lazy_classes=0' /etc/php/7.2/fpm/php.ini
sed -i '$aapc.lazy_functions=0' /etc/php/7.2/fpm/php.ini
sed -i "s/09,39.*/# &/" /etc/cron.d/php
(crontab -l ; echo "09,39 * * * * /usr/lib/php/sessionclean 2>&1") | crontab -u root -

Anpassen der /etc/fstab:

Ermitteln Sie die UID Ihres Webusers “www-data”

id www-data

und sofern die Ausgabe nicht ‘uid=33’ entspricht, so passen Sie unbedingt vor der Ausführung der nachfolgenden Zeilen die UID an!

sed -i '$atmpfs /tmp tmpfs defaults,noatime,nosuid,nodev,noexec,mode=1777 0 0' /etc/fstab
sed -i '$atmpfs /var/tmp tmpfs defaults,noatime,nosuid,nodev,noexec,mode=1777 0 0' /etc/fstab
sed -i '$atmpfs /usr/local/tmp/apc tmpfs defaults,uid=33,size=300M,noatime,nosuid,nodev,noexec,mode=1777 0 0' /etc/fstab
sed -i '$atmpfs /usr/local/tmp/cache tmpfs defaults,uid=33,size=300M,noatime,nosuid,nodev,noexec,mode=1777 0 0' /etc/fstab
sed -i '$atmpfs /usr/local/tmp/sessions tmpfs defaults,uid=33,size=300M,noatime,nosuid,nodev,noexec,mode=1777 0 0' /etc/fstab

Mounten und neustarten:

mount -a && service php7.2-fpm restart && service nginx restart

MariaDB

apt update && apt install mariadb-server -y

Absichern von MariaDB:

mysql_secure_installation

Ändern Sie das noch nicht vorhandene Root-Passwort nach Ihren Wünschen und beantworten alle weiteren Fragen mit Ja (‘Y’).

Konfiguration von MariaDB:

cp /etc/mysql/my.cnf /etc/mysql/my.cnf.bak && vi /etc/mysql/my.cnf

Ersetzen Sie die gesamte Datei my.cnf-file:

[server]
skip-name-resolve
innodb_buffer_pool_size = 128M
innodb_buffer_pool_instances = 1
innodb_flush_log_at_trx_commit = 2
innodb_log_buffer_size = 32M
innodb_max_dirty_pages_pct = 90
query_cache_type = 1
query_cache_limit = 2M
query_cache_min_res_unit = 2k
query_cache_size = 64M
tmp_table_size= 64M
max_heap_table_size= 64M
slow-query-log = 1
slow-query-log-file = /var/log/mysql/slow.log
long_query_time = 1

[client-server]
!includedir /etc/mysql/conf.d/
!includedir /etc/mysql/mariadb.conf.d/

[client]
default-character-set = utf8mb4

[mysqld]
character-set-server = utf8mb4
collation-server = utf8mb4_general_ci
binlog_format = MIXED
innodb_large_prefix=on
innodb_file_format=barracuda
innodb_file_per_table=1

Neustarten und Verbinden zu MariaDB:

service mysql restart && mysql -uroot

Anlegen der Datenbank und des Datenbankbenutzers:

CREATE DATABASE nextcloud CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
CREATE USER nextcloud@localhost identified by 'nextcloud';
GRANT ALL PRIVILEGES on nextcloud.* to nextcloud@localhost;
FLUSH privileges;
quit;

Installation von Redis

apt update && apt install redis-server php-redis -y

Anpassen von Redis:

cp /etc/redis/redis.conf /etc/redis/redis.conf.bak
sed -i "s/port 6379/port 0/" /etc/redis/redis.conf
sed -i s/\#\ unixsocket/\unixsocket/g /etc/redis/redis.conf
sed -i "s/unixsocketperm 700/unixsocketperm 770/" /etc/redis/redis.conf
sed -i "s/# maxclients 10000/maxclients 512/" /etc/redis/redis.conf
usermod -a -G redis www-data
cp /etc/sysctl.conf /etc/sysctl.conf.bak && sed -i '$avm.overcommit_memory = 1' /etc/sysctl.conf
cp /etc/rc.local /etc/rc.local.bak && sed -i '$i \sysctl -w net.core.somaxconn=65535' /etc/rc.local

Achtung! Unter Ubuntu 18.04 LTS existiert (“cp /etc/rc.local /etc/rc.local.bak && sed -i ‘$i \sysctl -w net.core.somaxconn=65535’ /etc/rc.local”) nicht mehr !

Passworthash für Redis und Nextcloud erstellen

Führen Sie das folgende Statement aus und passen dabei das exemplarische rote Paßwort an Ihre Wünsche an:

echo "yourPassWord2BHashed" | sha256sum

Notieren Sie sich die Ausgabe ohne den abschließenden Bindestrich ‘‘:

d98c51c882960945f49fe8127cb0eb97dbf435b3532bd58c846bd85c2282c4af -

Öffnen Sie die Datei redis.conf

vi /etc/redis/redis.conf

und fügen die nachfolgende Zeile ein:

requirepass d98c51c882960945f49fe8127cb0eb97dbf435b3532bd58c846bd85c2282c4af

(Initialer) Neustart des Servers:

shutdown -r now

Webserverkonfigurationen

sudo -s
mv /etc/nginx/conf.d/default.conf /etc/nginx/conf.d/default.conf.bak && touch /etc/nginx/conf.d/default.conf

Erzeugen der Webserverkonfiguration “nextcloud.conf”:

vi /etc/nginx/conf.d/nextcloud.conf

Kopieren Sie die nachfolgenden Zeilen und ersetzen die rot markierten Werte:

server {
listen 80 default_server;
server_name YOUR.DEDYN.IO;
#Your DDNS adress, (e.g. from desec.io or no-ip.com)
location ^~ /.well-known/acme-challenge {
proxy_pass http://127.0.0.1:81;
proxy_set_header Host $host;
}
location / {
return 301 https://$host$request_uri;
}
}
server {
listen 443 ssl http2 default_server;
server_name YOUR.DEDYN.IO;
root /var/www/nextcloud/;
access_log /var/log/nginx/nextcloud.access.log main;
error_log /var/log/nginx/nextcloud.error.log warn;
location = /robots.txt {
allow all;
log_not_found off;
access_log off;
}
location = /.well-known/carddav {
return 301 $scheme://$host/remote.php/dav;
}
location = /.well-known/caldav {
return 301 $scheme://$host/remote.php/dav;
}
client_max_body_size 10240M;
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 ~ \.(?:flv|mp4|mov|m4a)$ {
mp4;
mp4_buffer_size 100m;
mp4_max_buffer_size 1024m;
fastcgi_split_path_info ^(.+\.php)(/.*)$;
include fastcgi_params;
include php_optimization.conf;
fastcgi_pass php-handler;
fastcgi_param HTTPS on;
}
location ~ ^/(?:index|remote|public|cron|core/ajax/update|status|ocs/v[12]|updater/.+|ocs-provider/.+)\.php(?:$|/) {
fastcgi_split_path_info ^(.+\.php)(/.*)$;
include fastcgi_params;
include php_optimization.conf;
fastcgi_pass php-handler;
fastcgi_param HTTPS on;
}
location ~ ^/(?:updater|ocs-provider)(?:$|/) {
try_files $uri/ =404;
index index.php;
}
location ~ \.(?:css|js|woff|svg|gif|png|html|ttf|ico|jpg|jpeg)$ {
try_files $uri /index.php$uri$is_args$args;
access_log off;
expires 360d;
}
}

Soll Nextcloud in einem Unterverzeichnis wie https://your.dedyn.io/nextcloud laufen, so verwenden Sie diese conf-Datei stattdessen:

server {
listen 80 default_server;
server_name your.dedyn.io;
location ^~ /.well-known/acme-challenge {
proxy_pass http://127.0.0.1:81;
proxy_set_header Host $host;
}
location / {
return 301 https://$host$request_uri;
}
}
server {
listen 443 ssl http2 default_server;
server_name your.dedyn.io;
root /var/www/;
access_log /var/log/nginx/nextcloud.access.log main;
error_log /var/log/nginx/nextcloud.error.log warn;
location = /robots.txt {
allow all;
log_not_found off;
access_log off;
}
location = /.well-known/carddav {
return 301 $scheme://$host/nextcloud/remote.php/dav;
}
location = /.well-known/caldav {
return 301 $scheme://$host/nextcloud/remote.php/dav;
}
client_max_body_size 10240M;
location ^~ /nextcloud {
location /nextcloud {
rewrite ^ /nextcloud/index.php$uri;
}
location ~ ^/nextcloud/(?:build|tests|config|lib|3rdparty|templates|data)/ {
deny all;
}
location ~ ^/nextcloud/(?:\.|autotest|occ|issue|indie|db_|console) {
deny all;
}
location ~ \.(?:flv|mp4|mov|m4a)$ {
mp4;
mp4_buffer_size 100m;
mp4_max_buffer_size 1024m;
fastcgi_split_path_info ^(.+\.php)(/.*)$;
include fastcgi_params;
include php_optimization.conf;
fastcgi_pass php-handler;
fastcgi_param HTTPS on;
}
location ~ ^/nextcloud/(?:index|remote|public|cron|core/ajax/update|status|ocs/v[12]|updater/.+|ocs-provider/.+)\.php(?:$|/) {
fastcgi_split_path_info ^(.+\.php)(/.*)$;
include fastcgi_params;
include php_optimization.conf;
fastcgi_pass php-handler;
fastcgi_param HTTPS on;
}
location ~ ^/nextcloud/(?:updater|ocs-provider)(?:$|/) {
try_files $uri/ =404;
index index.php;
}
location ~ \.(?:png|html|ttf|ico|jpg|jpeg|css|js|woff|svg|gif)$ {
try_files $uri /nextcloud/index.php$uri$is_args$args;
access_log off;
}
}
}

Erzeugen der Webserverkonfiguration “letsencrypt.conf”:

vi /etc/nginx/conf.d/letsencrypt.conf

Kopieren Sie die nachfolgenden Zeilen:

server {
listen 127.0.0.1:81 default_server;
server_name 127.0.0.1;
charset utf-8;
access_log /var/log/nginx/le.access.log main;
error_log /var/log/nginx/le.error.log warn;
location ^~ /.well-known/acme-challenge {
default_type text/plain;
root /var/www/letsencrypt;
}
}

Erzeugen der Webserverkonfiguration “ssl.conf”:

vi /etc/nginx/ssl.conf

Kopieren Sie die nachfolgenden Zeilen:

#ssl_certificate /etc/letsencrypt/live/YOUR.DEDYN.IO/fullchain.pem;
#ssl_certificate_key /etc/letsencrypt/live/YOUR.DEDYN.IO/privkey.pem;
#ssl_trusted_certificate /etc/letsencrypt/live/YOUR.DEDYN.IO/fullchain.pem;
ssl_dhparam /etc/ssl/certs/dhparam.pem;
ssl_session_timeout 1d;
ssl_session_cache shared:SSL:50m;
ssl_session_tickets off;
ssl_protocols TLSv1.2;
ssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!3DES:!MD5:!PSK:!AES128';
ssl_prefer_server_ciphers on;
ssl_ecdh_curve secp384r1;
ssl_stapling on;
ssl_stapling_verify on;

Androider’s: Sofern Probleme mit bspw. CalDAV/CardDAV auftreten, so reduzieren Sie die eliptic curve und cipher strength zu:

ssl_ciphers ‘ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS’;
ssl_ecdh_curve prime256v1;

Erzeugen der Webserverkonfiguration “proxy.conf”:

vi /etc/nginx/proxy.conf

Kopieren Sie die nachfolgenden Zeilen:

proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Protocol $scheme;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header X-Forwarded-Port $server_port;
proxy_set_header X-Forwarded-Server $host;
proxy_connect_timeout 3600;
proxy_send_timeout 3600;
proxy_read_timeout 3600;
proxy_redirect off;

Erzeugen der Webserverkonfiguration “header.conf”:

vi /etc/nginx/header.conf

Kopieren Sie die nachfolgenden Zeilen:

add_header Strict-Transport-Security "max-age=15768000; includeSubDomains; preload;";
add_header X-Robots-Tag none;
add_header X-Download-Options noopen;
add_header X-Permitted-Cross-Domain-Policies none;
add_header X-Content-Type-Options "nosniff" always;
add_header X-XSS-Protection "1; mode=block" always;
add_header Referrer-Policy "same-origin" always;

Erzeugen der Webserverkonfiguration “optimization.conf”:

vi /etc/nginx/optimization.conf

Kopieren Sie die nachfolgenden Zeilen:

fastcgi_read_timeout 3600;
fastcgi_buffers 64 64K;
fastcgi_buffer_size 256k;
fastcgi_busy_buffers_size 3840K;
fastcgi_cache_key $http_cookie$request_method$host$request_uri;
fastcgi_cache_use_stale error timeout invalid_header http_500;
fastcgi_ignore_headers Cache-Control Expires Set-Cookie;
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;
gzip_disable "MSIE [1-6]\.";

Erzeugen der Webserverkonfiguration “php_optimization.conf”:

vi /etc/nginx/php_optimization.conf

Kopieren Sie die nachfolgenden Zeilen:

fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_param modHeadersAvailable true;
fastcgi_param front_controller_active true;
fastcgi_intercept_errors on;
fastcgi_request_buffering off;
fastcgi_cache_valid 404 1m;
fastcgi_cache_valid any 1h;
fastcgi_cache_methods GET HEAD;

Erweitern der Kommunikationssicherheit:

screen -S dhparam
openssl dhparam -out /etc/ssl/certs/dhparam.pem 4096

Um Screen zu verlassen muß einfach STRG+A und anschließend ‘d’ gedrückt werden. In die Session gelangt man wieder zurück, indem man screen -r ausführt. Achtung, dieser Vorgang kann, in Abhängigkeit der zugrundeliegenden Hardware, sehr lange (mehrere Stunden beim OdroidC2) dauern!

Anpassen und neustarten des Webservers (NGINX):

sed -i s/\#\include/\include/g /etc/nginx/nginx.conf && service nginx restart

Herunterladen und Entpacken der Nextcloud-Software:

cd /usr/local/src
wget https://download.nextcloud.com/server/releases/latest.tar.bz2 && tar -xjf latest.tar.bz2 -C /var/www && chown -R www-data:www-data /var/www/ && rm latest.tar.bz2

Installation von letsencrypt und Erzeugen der SSL-Zertifikate:

Ersetzen die rot markierten Werte:

add-apt-repository ppa:certbot/certbot -y && apt update && apt install letsencrypt -y
letsencrypt certonly -a webroot --webroot-path=/var/www/letsencrypt --rsa-key-size 4096 -d YOUR.DEDYN.IO

Erstellen eines Skripts (permissions.sh) zum Setzen der notwendigen Berechtigungen:

vi /root/permissions.sh

Kopieren Sie die nachfolgenden Zeilen und ersetzen die rot markierten Werte:

#!/bin/bash
find /var/www/ -type f -print0 | xargs -0 chmod 0640
find /var/www/ -type d -print0 | xargs -0 chmod 0750
chown -R www-data:www-data /var/www/
chown -R www-data:www-data /upload_tmp/
chown -R www-data:www-data /var/nc_data/
chmod 0644 /var/www/nextcloud/.htaccess
chmod 0644 /var/www/nextcloud/.user.ini
chmod 600 /etc/letsencrypt/live/YOUR.DEDYN.IO/fullchain.pem
chmod 600 /etc/letsencrypt/live/YOUR.DEDYN.IO/privkey.pem
chmod 600 /etc/letsencrypt/live/YOUR.DEDYN.IO/chain.pem
chmod 600 /etc/letsencrypt/live/YOUR.DEDYN.IO/cert.pem
chmod 600 /etc/ssl/certs/dhparam.pem
exit 0

Machen Sie das Skript “ausführbar” und führen es dann aus:

chmod +x /root/permissions.sh && /root/permissions.sh

Anpassen der “ssl.conf” und Neustart des Webservers:

Sofern die Generierung des dhparam.pem abgeschlossen ist!

sed -i s/\#\ssl/\ssl/g /etc/nginx/ssl.conf && service nginx restart

Automatische Zertifikatserneuerung einrichten:

vi /root/renewal.sh

Kopieren Sie die nachfolgenden Zeilen:

#!/bin/bash
cd /etc/letsencrypt
letsencrypt renew
result=$(find /etc/letsencrypt/live/ -type l -mtime -1 )
if [ -n "$result" ]; then
/usr/sbin/service nginx stop
/usr/sbin/service mysql restart
/usr/sbin/service redis-server restart
/usr/sbin/service php7.2-fpm restart
/usr/sbin/service postfix restart
/usr/sbin/service nginx restart
fi
exit 0

Machen Sie das Skript ausführbar und richten einen Cronjob ein:

chmod +x /root/renewal.sh && crontab -e

Kopieren Sie die nachfolgende Zeile:

@monthly /root/renewal.sh 2>&1

Aufruf und Einrichten der Nextcloud im Browser

Rufen Sie Ihre URL im Browser auf

https://YOUR.DEDYN.IO

und richten Ihre Nextcloud mit Hilfe der nachfolgenden Tabelle ein:

Benutzername: cloudroot
Passwort: Your-NC_Password!
Datenverzeichnis: /var/nc_data
Datenbankbenutzer: nextcloud
DB-Passwort*: nextcloud
Datenbank-Name: nextcloud
Host: localhost

Beenden Sie die Installation im Browser udn erweitern anschließend die Nextcloud Konfigurationsdatei als Benutzer www-data. DOch zuvor lassen wir uns die neu generierten Werte anzeigen, um diese per copy&paste übernehmen zu können:

egrep "'instanceid' =>.*|'passwordsalt' => '.*|'secret' => '.*" /var/www/nextcloud/config/config.php
'instanceid' => 'ofg69hjknlor0',
'passwordsalt' => 'RrRjXeEeEdddBmJbRnqlnVK7e6R5T3hRX',
'secret' => 'HjKlIz9i8J7G6F5DuGQrqV1L9D8HFj6J8YedSVnTD9d',

Passen Sie nun ihre Datei an die nachfolgend dargestellte Datei (config.php) an:

sudo -u www-data cp /var/www/nextcloud/config/config.php /var/www/nextcloud/config/config.php.bak
sudo -u www-data vi /var/www/nextcloud/config/config.php

Anpassen der Nextcloud “config.php”:

<?php
$CONFIG = array (
 'activity_expire_days' => 14,
 'auth.bruteforce.protection.enabled' => true,
 'blacklisted_files' => 
 array (
 0 => '.htaccess',
 1 => 'Thumbs.db',
 2 => 'thumbs.db',
 ),
 'cron_log' => true,
 'datadirectory' => '/var/nc_data',
 'dbtype' => 'mysql',
 'dbname' => 'nextcloud',
 'dbhost' => 'localhost',
 'dbport' => '',
 'dbtableprefix' => 'oc_',
 'dbuser' => 'nextcloud',
 'dbpassword' => 'nextcloud',
 'enable_previews' => true,
 'enabledPreviewProviders' => 
 array (
 0 => 'OC\\Preview\\PNG',
 1 => 'OC\\Preview\\JPEG',
 2 => 'OC\\Preview\\GIF',
 3 => 'OC\\Preview\\BMP',
 4 => 'OC\\Preview\\XBitmap',
 5 => 'OC\\Preview\\Movie',
 6 => 'OC\\Preview\\PDF',
 7 => 'OC\\Preview\\MP3',
 8 => 'OC\\Preview\\TXT',
 9 => 'OC\\Preview\\MarkDown',
 ),
 'filesystem_check_changes' => 0,
 'filelocking.enabled' => 'true',
 'htaccess.RewriteBase' => '/',
 'installed' => true,
 'instanceid' => '*KeepYourSettings: ofg69hjknlor0*',
 'integrity.check.disabled' => false,
 'knowledgebaseenabled' => false,
 'logfile' => '/var/nc_data/nextcloud.log',
 'loglevel' => 2,
 'logtimezone' => 'Europe/Berlin',
 'log_rotate_size' => 104857600,
 'maintenance' => false,
 'memcache.local' => '\\OC\\Memcache\\APCu',
 'memcache.locking' => '\\OC\\Memcache\\Redis',
 'mysql.utf8mb4' => true,
 'overwriteprotocol' => 'https',
 'overwrite.cli.url' => 'https://your.dedyn.io',
 'passwordsalt' => '*KeepYourSettings: RrRjXeEeEdddBmJbRnqlnVK7e6R5T3hRX*',
 'preview_max_x' => 1024,
 'preview_max_y' => 768,
 'preview_max_scale_factor' => 1,
 'redis' => 
 array (
 'host' => '/var/run/redis/redis.sock',
 'password' => 'd98c51c882960945f49fe8127cb0eb97dbf435b3532bd58c846bd85c2282c4af',
 'port' => 0,
 'timeout' => 0.0,
 ),
 'quota_include_external_storage' => false,
 'secret' => '*KeepYourSettings: HjKlIz9i8J7G6F5DuGQrqV1L9D8HFj6J8YedSVnTD9d*',
 'share_folder' => '/Shares',
 'skeletondirectory' => '',
 'theme' => '',
 'trashbin_retention_obligation' => 'auto, 7',
 'trusted_domains' => 
 array (
 0 => 'your.dedyn.io',
 ),
 'updater.release.channel' => 'stable',
 'version' => '13.0.2.1',
);

Achtung! Für Ubuntu 18.04 LTS muss “/var/run/redis/redis.sock” nach “/var/run/redis/redis-server.sock” angepasst werden!

Anpassen der Datei “.user.ini”:

sudo -u www-data sed -i "s/upload_max_filesize=.*/upload_max_filesize=10240M/" /var/www/nextcloud/.user.ini
sudo -u www-data sed -i "s/post_max_size=.*/post_max_size=10240M/" /var/www/nextcloud/.user.ini
sudo -u www-data sed -i "s/output_buffering=.*/output_buffering='Off'/" /var/www/nextcloud/.user.ini
service php7.2-fpm restart && service nginx restart

Sollte der Integritätscheck innerhalb der Nextcloud auf einen Fehler laufen, so ändern Sie die config.php

sudo -u www-data vi /var/www/nextcloud/config/config.php

Setzen Sie

'integrity.check.disabled' => true,

und starten alle Services neu:

service php7.2-fpm restart && service redis-server restart && service nginx restart

Starten Sie den Integritätscheck erneut und setzen dann den Wert auf ‘false’ zurück:

sudo -u www-data vi /var/www/html/nextcloud/config/config.php
'integrity.check.disabled' => false,

Starten Sie alle Services neu

service php7.2-fpm restart && service redis-server restart && service nginx restart

und die Integrität wurde erfolgreich überprüft.


Konfiguration und Aktivierung des Nextcloud cron-jobs:

crontab -u www-data -e

Kopieren Sie die nachfolgende Zeile:

*/15 * * * * php -f /var/www/nextcloud/cron.php > /dev/null 2>&1
5 1 * * * php -f /var/www/nextcloud/occ files:scan-app-data > /dev/null 2>&1

Ändern Sie abschließen per Nextcloud-Kommandozeile den Cronjob:

sudo -u www-data php /var/www/nextcloud/occ background:cron

Härtung Ihres Nextcloud-Servers mittels fail2ban und ufw

Wir härten das System mittels der Installation und Konfiguration von fail2ban sowie der Konfiguration der Firewall ufw ab.

Installation und Konfiguration von fail2ban:

sudo -s
apt update && apt install fail2ban -y

Erstellen Sie den notwendigen fail2ban-Filter für Nextcloud:

vi /etc/fail2ban/filter.d/nextcloud.conf

Kopieren sIe die nachfolgenden Zeilen:

[Definition]
failregex=^{"reqId":".*","remoteAddr":".*","app":"core","message":"Login failed: '.*' \(Remote IP: '<HOST>'\)","level":2,"time":".*"}$
 ^{"reqId":".*","level":2,"time":".*","remoteAddr":".*","app":"core".*","message":"Login failed: '.*' \(Remote IP: '<HOST>'\)".*}$

Erzeugen Sie den notwendigen fail2ban-jail für Nextcloud:

vi /etc/fail2ban/jail.d/nextcloud.local

Kopieren Sie die nachfolgenden Zeilen:

[nextcloud]
backend = auto
enabled = true
port = 80,443
protocol = tcp
filter = nextcloud
maxretry = 3
bantime = 36000
findtime = 36000
logpath = /var/nc_data/nextcloud.log

Starten Sie fail2ban neu

service fail2ban restart

Konfiguration der Firewall UFW (Uncomplicated FireWall):

ufw allow 80/tcp && ufw allow 443/tcp && ufw allow 22/tcp

Aktivieren Sie die Firewall (autostart) und starten den Firewall-Service neu:

ufw enable && service ufw restart

Ab sofort befinden sich Ihre Daten in Ihrer persönlichen, sicheren und gehärteten Nextcloud! Viel Spaß.


Carsten Rieger

87 Responses

  1. Rainer says:

    Hi, bin gerade bei dem Punkt:

    chmod +x /root/renewal.sh && crontab -e

    Jetzt soll man diese Zeile einfügen:

    @monthly /root/renewal.sh 2>&1

    Es steht aber bereits das hier in der Datei:

    09,39 * * * * /usr/lib/php/sessionclean 2>&1

    Muss die gelöscht werden?

    Grüße
    Rainer

  2. Rainer says:

    Hallo Carsten,

    Vielen Dank für die super Anleitung, ich hab da mal ne blöde Frage: Unter “Anpassungen von PHP 7.2” werden ja zuerst einige PHP Dateien angepasst/kopiert und anschließend gibt es eine lange Liste von sed -i Befehlen,
    müssen diese alle nacheinander in die Shell reingehackt werden oder wie ist das zu verstehen?

  3. Roland Reutlinger says:

    Hallo Carsten,
    ich versuche gerade auf einer Intel NUC mit Ubuntu 18.04 nach Deiner Anleitung Nextcloud zu installieren.

    Leider bekomme ich bei folgendem Befehl diese Fehlermeldung:
    letsencrypt certonly -a webroot –webroot-path=/var/www/letsencrypt –rsa-key-size 4096 -d xxxxxxxxx.no-ip.org

    Failed authorization procedure. xxxxxxxxx.no-ip.org (http-01): urn:acme:error:connection :: The server could not connect to the client to verify the domain :: Fetching http://xxxxxxxxx.no-ip.org/.well-known/acme-challenge/IAJ9Ecq6hIsKtIE4OeECl_WkwX_Vl7jrh35gFLupdO8: Connection refused

    Bei meiner Fehlersuche habe festgestellt dass das Unterverzeichnis :
    /etc/letsencrypt/live/ fehlt, /etc/letsencrypt ist aber vorhanden.
    Kannst Du mir sagen wo an welcher Stelle ich ansetzen kann.
    Ich habe Deine Anleitung herausgesucht weil sie sehr detailiert alles beschreibt und meine Kenntnisse was Server und Verschlüsselung betrifft, gegen Null gehen.

    • Hallo Roland, dieser Fehler weist meistens auf eine nicht funktionierende POrtweiterleitung vom Router zurm Server hin. Sind beide Ports (80 und 443) von aussen erreichbar und werden diese auf den Server korrekt weitergeleitet?

      • Roland Reutlinger says:

        Das war schon mal richtig, vielen Dank.
        Es war nur Port 80 und 21 für FTP freigegeben.
        Ab welchem Punkt Deiner Anleitung kann ich jetzt wieder einsteigen, nachdem ich am Router Port 443 freigegeben habe?

        • … requestiere das ssl zertifikat und fahre von dort aus fort.

          • Roland Reutlinger says:

            Hallo Carsten, leider kann ich Deinen Ratschlägen nicht so schnell nachkommen, denn ich bin öfter mal einige Tage vom Rechner getrennt.
            “… requestiere das ssl zertifikat und fahre von dort aus fort.” habe ich leider nicht verstanden.
            Am besten wäre bei meinem Wissensstand eine Anweisung wie in deiner Bedienungsanleitung:
            z.B. : Erzeugen der Webserverkonfiguration “letsencrypt.conf”

          • Dafür biete ich den Installationsservice an: Interesse?

  4. Markus says:

    Hallo Carsten,
    super Anleitung!!!! Funktioniert so auch mit kleinen Änderungen beim installieren von PHP7.2 unter Debian 9 (obwohl ich kein wirklicher Linux-Experte bin ;).
    Ich finde es so Klasse wenn jemand sein Wissen einfach so für Jedermann zur Verfügung stellt.
    “Hut ab!” und nochmal Vielen Dank.

  5. Christian B. says:

    Hallo, bei Eingabe von “mv /etc/nginx/conf.d/default.conf /etc/nginx/conf.d/default.conf.bak && touch /etc/nginx/conf.d/default.conf” kriege ich die Rückmeldung ” No such file or directory”. Die default.conf exisiert bei mir also nicht. Ist das ein Problem, wenn die Datei fehlt?

    Ansonsten danke für dieses Tutorial – ich bin noch dabei, NC auf einem Odroid HC1 aufzusetzen. Mal sehen, ob es hinhaut 😉

    Gruß, Christian B.

    • Meines Wissens nach basiert der HC1 “nur” auf 32Bit, daher bitte statt der verwendeten 10240M maximal 2048M verwenden. Warum die Datei nicht da ist… komisch. Ist Nginx 1.13.12 überhaupt installiert? (nginx – v). Servus, Carsten

      • Christian B. says:

        Danke zunächst für den Tip mit der Speiceranpassung für 32Bit!

        Bei mir ist nginx 1.10.3 installiert. Wurde mit apt aus dem Ubuntu-Repository geholt. Mit “apt install nginx” erhalte ich “nginx is already the newest version (1.10.3-0ubuntu0.16.04.2)” als Rückmeldung. Muss ich etwa für die Version 1.13.12 noch ein weiteres Repository hinzufügen?

      • Christian B. says:

        Unter /etc/apt/sources.list ist bereits “deb http://nginx.org/packages/mainline/ubuntu/ xenial nginx” als Paketquelle aufgeführt.

        • Ich würde folgendermaßen vorgehen:
          1. Entfernen des 1.10’er NGINX
          sudo -s
          apt remove nginx nginx-common nginx-full -y --allow-change-held-packages

          2. Aktualisieren der Paketquellen und installieren von NGINX
          apt update && apt install nginx -y

          Dein Betriebssystem ist Ubuntu 16.04.4 LTS?

          • Christian B. says:

            Das habe ich bereits versucht, damit wird wieder die Version 1.10.3 installiert.

            Folgendes habe ich noch ausprobiert:

            – zunächst unter /etc/apt/sources.list die Paketquelle für nginx entfernt
            – dann Aufruf von “add-apt-repository ppa:nginx/stable”
            – “apt update && apt install nginx -y” –> nun kommt Version 1.12.2
            – wieder alles entfernt und mit “add-apt-repository –remove ppa:nginx/stable” die Paketquelle wieder entfernt
            – nochmal dasselbe mit “add-apt-repository ppa:nginx/development” –> dann kommt immerhin Version 1.13.6
            – wieder alles entfernt, Paketquelle auch entfernt

            – erneut in /etc/apt/sources.list “deb http://nginx.org/packages/mainline/ubuntu/ xenial nginx” als Paketquelle eingefügt
            – dann die Überraschung bei “apt update”:
            “N: Skipping acquire of configured file ‘nginx/binary-armhf/Packages’ as repository ‘http://nginx.org/packages/mainline/ubuntu xenial InRelease’ doesn’t support architecture ‘armhf'”

            Scheinbar gibt es keine aktuelle Version für die armhf-Platform. Das wiederum liegt dann doch an der CPU des HC1 – ich nehme an, dass in deinen Testszenarien die arm64-Platform verwendet wird. Nun muss ich irgendwie versuchen, die neuere Version anders zu installieren…

          • Sieht wirklich so aus: NGINX

          • Christian B. says:

            Ubuntu Version ist tatsächlich 16.04.4 LTS

          • Heute ist sogar NGINX 1.14.0 stable erschienen – die guides sind bereits aktualisiert.

          • Christian B. says:

            Nun habe ich es fast geschafft:

            Über Ondrej’s PPA steht wenigstens die Version 1.13.10 zur Verfügung – siehe: https://launchpad.net/~ondrej/+archive/ubuntu/nginx-mainline

            add-apt-repository ppa:ondrej/nginx-mainline

            dann

            apt update && apt install nginx -y

            Die Version 1.13.12 habe ich für die armhf-Platform noch nicht gefunden. Offiziell scheint es die ohnehin nicht zu geben, man muss sie stattdessen über irgendwelche PPAs beziehen. Auf Version 1.14.0 muss ich daher sicher noch länger warten.

          • Jochen says:

            Hallo Christian.
            Auf meinen Raspberry Pi musste ich mir nginx auch selber bauen, da ich für Raspbian kein armhf repo gefunden habe.
            Bin nach dieser Anleitung vorgegangen:
            https://www.linuxbabe.com/raspberry-pi/compile-nginx-source-raspbian-jessie
            Habe allerdings bei “./configure ” das “–with-ipv6” weg gelassen, da es laut Ausgabe zum Schluss eh Standardmäßig dabei war.

            Ebenfalls muss ich in der “config.php” folgendes auskommentiere: ‘memcache.local’ => ‘\OC\Memcache\APC
            Wenn ich es drin habe, startet mein nginx nicht. Wenn dazu evtl. noch jemand eine Lösung für mich hätte?
            Ansonsten läuft das Setup auf dem Pi recht unauffällig.`

            Gruß,
            Jochen

          • Christian B. says:

            Hallo Jochen,

            ich habe mir auch schon überlegt, einen nginx für armhf selbst zu bauen. Allerdings ist mir das auf Dauer zu aufwändig – insbesondere auf die beinahe monatlich erscheinenden Updates von nginx.
            Ich versuche jetzt zunächst, die Installation meines NextCloud-HC1 mit nginx Version 1.13.10 fertigzustellen und suche dann nochmal nach weiteren PPAs. Bisher sind mir folgende PPAs bekannt:

            – ppa:nginx/development (hier steht inzwischen 1.13.12 zur Verfügung)
            – ppa:nginx/stable
            – ppa:ondrej/nginx
            – ppa:ondrej/nginx-mainline

          • Christian B. says:

            Gerade frisch entdeckt:

            Auf ppa:nginx/stable steht nun die Version 1.14.0 für armhf zur Verfügung!! Siehe https://launchpad.net/~nginx/+archive/ubuntu/stable/+packages

            Installation lief wunderbar. Allerdings war der Service dann als “masked” gekennzeichnet und ließ sich daher zunächst nicht starten.

            – also Aufruf von “systemctl unmask nginx.service && systemctl list-unit-files”
            – dann sicherheitshalber nochmal “systemctl enable nginx.service && service nginx start”
            – schließlich “curl localhost” – voilá 🙂

            Weiter geht’s mit letsencrypt…………

            Gruß, Christian

          • Christian B. says:

            So Leute, jetzt läuft die Büchse! 😀

            Ein Odroid HC-1 mit Ubuntu 16.04.4 LTS (Xenial) als 32-bit armhf mit nginx 1.14.0 und PHP 7.2 …..

            Einzige Abweichung aus dem Tutorial hier:

            – wie vom Verfasser vorgeschlagen: aufgrund der 32-bittigen armhf-Platform in allen Config-Files nur 2048M statt 10240M angegeben
            – ppa:nginx/stable verwendet, um die Version 1.14.0 von nginx zu bekommen
            – das Verzeichnis nc_data liegt bei mir auf einer separaten Partition – hierfür waren auch Anpassungen in verschiedenen Config-Files erforderlich -> noch weiß ich nicht, ob das sinnvoll ist – habe mir nur gedacht, sollten sich darin gigabyte-weise Daten ansammeln, könnte die Root-Partition schnell volllaufen.

            VIELEN DANK nochmal an den Autor des Artikels für das tolle Projekt und an alle anderen hier, die bei den Problemlösungen mitgewirkt haben!

            Schönes WE,

            Christian

          • Super – viel Spaß mit der Nextcloud

          • Christian B. says:

            Eine Sache noch:

            Ich musste ebenfalls den MP4-Block aus der nextcloud.conf auskommentieren. Wahrscheinlich wurde bei der von mir verwendeten nginx-14.4.0 Ausgabe das MP4-HTTP-Modul nicht mit einkompiliert…

  6. Christian says:

    Hi Carsten,

    es läuft alles wunderbar auf meinem System, danke dir!

    Eine letzte Frage hätte ich nur noch..

    nano /var/log/syslog gibt mir folgende Fehlermeldungen..

    Starting Clean php session files…
    sessionclean[9075]: find: ‘/usr/local/tmp/sessions/sess_onbdmagrp2p8kb24hmkr3f3n78’ kann nicht gelöscht werden.: Das Dateisystem ist nur lesbar

    und das für 18 dieser Files mittlerweile. Ist das gewollt oder kann man das fixen?

    viele Grüße, Christian

    • Servus Christian, das ist ein PHP Bug, der auch schon gefixt wurde, aber als Fix nicht in die aktuellen Repos eingeflossen ist. Richte Dir einen cronjob ein, der das als root ausführt:
      /usr/lib/php/sessionclean
      Bei mir funktioniert es:
      ls -lsa sessions/ | wc -l
      127
      /usr/lib/php/sessionclean
      ls -lsa sessions/ | wc -l
      10
      Servus und frohe Ostern, Carsten

  7. Christian says:

    Hi Carsten,

    wie stark weicht die Verwendung deines Guides zur Nutzung von Debian ab außer beim installieren der Mainline von NGINX?

    LG Christian

    • Christian says:

      Bin dein Guide einfach mal durchgegangen und soweit funktioniert alles wunderbar. Nach einem Restart des Servers gibt es jedoch den Ordner /tmp/apc nicht mehr, und somit startet php7.2-fpm nicht. Ist das berücksichtigt in deinem Guide oder fehlt mir da was?

      Viele Grüße Christian

      • Servus Christian, schön, dass es grundsätzlich bei Dir funktioniert hat. Wenn Du den Pfad auf /tmp/apc gesetzt hast und das tmpfs verwendest, darf es nicht verschwunden sein. Es wird ja im Guide gemountet. Wie sieht denn die /etc/fstab (cat /etc/fstab), der Output von mount und der output von ls -lsa /tmp bei dir aus ? Grüße, Carsten

        • Sorry, ich hatte einen dummen Denkfehler: Genau das tmpfs ist die Ursache des ÜBELS! Ich ändere den Guide umgehend, denn das tmpfs gibt es gemäß der Eigenschaft als TMPFS natürlich nach einem Reboot nicht mehr 🙁
          Bitte lege ein neues Verzeichnis /usr/local/tmp/apc an, ändere in der php.ini den Pfad von /tmp/apc nach /usr/local/tmp/apc, erweitere die /etc/fstab und restarte PHP. Bitte entschuldige diesen Fehler. Grüße, Carsten

          • Christian says:

            Hey Carsten,

            vielen Dank für den Hotfix und auch das Guide. Echt Super, endlich funktioniert alles. Kann ich mit dieser nginx.conf auch andere VHosts laufen lassen die nichts mit Nextcloud zu tun haben? Bräuchte wahrscheinlich nur ne allgemein gültige conf?

            Grüße Christian

          • Die nginx.conf ist nicht nur für Nextcloud sondern auch für WordPress, Roundcube, Netdata, Pihole, Shellinabox etc. optimiert. Erstelle neue vhost Dateien und genieße Deinen Server.

  8. Tom says:

    Mal keine Frage … einfach ‘nur ein Kompliment für Deine immer währende Unterstützung und Deine geschätzte Arbeit.

    Liebe Grüße, Tom aus WI

  9. Jochen says:

    Hallo Carsten.
    Erst einmal herzlichen Dank für diese wirklich großartige Anleitung.

    Leider habe ich ein Problem und komme nicht weiter. Vielleicht hast du ja einen Tip für mich.

    Ich probiere diese gerade an zwei Geräten aus.
    A) An einem virtuellen root Server von Hetzner mit Ubuntu 16.04.4 LTS (Xenial Xerus)
    B) Auf einem Raspberry Pi 3B mit Raspbian GNU/Linux 9 (stretch)
    Der Pi steht zuhause hinter einem Glasfaseranschluss mit IPv6 Präfix und nicht öffentlicher Carrier-grade NAT IPv4 Adresse.
    Die Ports 80 und 443 habe ich über die MyFRITZ!-Freigabe meiner Fritzbox eingerichtet. Soweit ich das sehen kann, funktionieren diese auch über IPv6.

    Maschine A konnte ich so nach der Anleitung durchkopieren.
    Bei Maschine B musste ich etwas tricksen.
    nginx habe ich, wie hier: https://www.linuxbabe.com/raspberry-pi/compile-nginx-source-raspbian-jessie, mit diesem Paket http://nginx.org/download/nginx-1.13.9.tar.gz gebaut.
    Für PHP7.2, letsencrypt und certbot musste ich etwas tricksen, um den gleichen Versionsstand wie auf Maschine A zu bekommen.
    Ansonsten hat die Anleitung soweit auch funktioniert.

    Nun stehe ich beim Punkt: “Installation von letsencrypt und Erzeugen der SSL-Zertifikate”
    Bei Maschine A hat “letsencrypt certonly …” wunderbar geklappt, und ich habe das Zertifikat ausgestellt bekommen.

    Bei Maschine B mit “letsencrypt certonly … raspihostname.1234abcd.myfritz.net” bekomme ich die Fehlermeldung (aus letsencrypt.log):
    #####
    2018-03-14 15:30:25,174:DEBUG:certbot.reporter:Reporting to user: The following errors were reported by the server:

    Domain: raspihostname.1234abcd.myfritz.net
    Type: connection
    Detail: Fetching http://raspihostname.1234abcd.myfritz.net/.well-known/acme-challenge/ABCD1234abcd: Error getting validation data

    To fix these errors, please make sure that your domain name was entered correctly and the DNS A/AAAA record(s) for that domain contain(s) the right IP address. Additionally, please check that your computer has a publicly routable IP address and that no firewalls are preventing the server from communicating with the client. If you’re using the webroot plugin, you should also verify that you are serving files from the webroot path you provided.
    #####

    Etwas weiter oben in letsencrypt.log sehe ich, das “addressesResolved”, “addressUsed”, “addressesTried” jeweils die gleiche IPv6 Adresse des Raspberry Pis ist, welche über Myfritz für die beiden Ports 80 und 443 freigegeben ist.

    Nun komme ich leider nicht mehr weiter und mir fällt auch nicht mehr ein, wonach ich noch suchen könnte.
    Für einen Tip wäre ich sehr Dankbar.

    Mit freundlichem Gruß,
    Jochen

    • Jochen says:

      Hallo.
      Ich hab es nun hinbekommen.
      Und zwar kann der nginx, wie hier konfiguriert, keine IPv6-Pakete annehmen, und ich bin ja von außen nur über IPv6 erreichbar.
      Auf die Lösung haben mich diese beiden Posts gebracht:
      https://community.letsencrypt.org/t/error-getting-validation-data-status-400/50287/10
      https://kovyrin.net/2010/01/16/enabling-ipv6-support-in-nginx/

      Meine config-files sehen nun wie folgt aus:

      – nextcloud.conf
      ########################################
      server {
      ##listen 80 default_server;
      listen [::]:80 default_server;
      server_name raspihostname.1234abcd.myfritz.net;
      #Your DDNS adress, (e.g. from desec.io or no-ip.com)
      location ^~ /.well-known/acme-challenge {
      ##proxy_pass http://127.0.0.1:81;
      proxy_pass http://[::1]:81;
      proxy_set_header Host $host;
      }
      location / {
      return 301 https://$host$request_uri;
      }
      }
      server {
      ##listen 443 ssl http2 default_server;
      listen [::]:443 ssl http2 default_server;

      ########################################

      – letsencrypt.conf
      ########################################
      server {
      ##listen 127.0.0.1:81 default_server;
      listen [::1]:81 default_server;
      ##server_name 127.0.0.1;
      server_name [::1];

      ########################################

      Was ich allerdings noch nicht hinbekommen habe ist, wie ich es so konfiguriere, das es über IPv4 oder IPv6 geht.
      Hätte da noch jemand einen Tipp für mich?

      Da ich erst dachte ich hätte was bei der Installation von PHP7.2, Letsencrypt usw. falsch gemacht, hatte ich es auch nochmal mit Ubuntu 16.04.3 auf dem Raspberry Pi probiert wie hier beschrieben, das Pi 2 image auf den Pi 3:
      https://wiki.ubuntu.com/ARM/RaspberryPi#Booting_the_official_Pi_2_image_on_the_Pi_3

      Da es nun allerdings so funktioniert wie ich es mir vorgestellt hatte, werde ich mir nun einen Odroid zulegen.

      Kann man dir, Carsten, evtl. noch irgendwo etwas Spenden? Liberapay oder so etwas? Deine Anleitung hat mir sehr viel weiter geholfen.

      Gruß,
      Jochen

      • Jochen says:

        Scheinbar funktioniert es so:
        server {
        listen 443 ssl http2 default_server;
        listen [::]:443 ssl http2 default_server;

        einfach beide Zeilen drin lassen.

        • Servus Jochen, das ist grundsätzlich korrekt. Es sollten dann aber weitere Einstellungen bspw. für resolver, proxying etc. vorgenommen werden. Danke und Grüße, Carsten.

  10. tom says:

    Moin,
    ich glaube dir ist da ein kleiner Fehler unterlaufen. Ab dem Punkt “Anpassung der fstab” ist die Formatierung falsch. Ab dort ist alles nochmals in so einen Kasten eingefasst in dem normalerweise der Code steht.
    Mfg Tom

  11. Kaspar says:

    Hallo Carsten,
    “…

    Voraussetzungen für diese Anleitung
    Portweiterleitungen (:80, :443)

    …”

    Da ich die Ports :80, :443 für mein NC12-Produktivsystem belegt habe, möchte ich für mein Testsystem (andere HW) deine komplette Anleitung mit NC13 testen (Wechsel von solr/nextant auf Elasticsearch).
    – nur eben mit anderen Ports (:880, :4443)
    – ist das inkl. letsencrypt möglich ?

    • Hallo Kaspar, ja, Nextcloud unter anderen Ports zu betreiben ist möglich. Du musst die Ports in der Firewall und im Webserver ändern und darfst dann nicht vergessen, diese auch im Browser anzugeben. Meines Wissens nach funktioniert LE nur mit Port 443. Um das aber verbindlich zu klären, müsstest Du Dich bei LE (oder google) erkundigen. Viele Grüße, Carsten

  12. Peter says:

    Hi Carsten,
    hast du hierzu eine Idee? Google hat mir da nicht wirklich weitergeholfen.
    Redis::connect(): connect() failed: No such file or directory at /var/www/nextcloud/lib/private/RedisFactory.php#84

    Der Fehler trat nach einem Rechner Neustart auf, nachdem der Nextcloud FirstRunWizard sauber durchgelaufen war. Vor dem Neustart habe ich natürlich noch die config.php ausgetauscht und die user.ini angepasst. Die Update deines Blogartikels bzgl. der Redis Sicherheit ist auch eingebaut.

    Danke für deine Hilfe.

    VG Peter

    • Hallo Peter, bitte überprüfe ob Redis läuft (service redis-server status) und ob die config.php korrekt ist…das sieht nämlich nach einem Verbindungsproblem aus.
      Funktioniert das bei Dir? redis-cli -s /var/run/redis/redis.sock dann gib PING ein. Es müsste PONG als antwort erscheinen?

      • Peter says:

        Hallo Carsten,
        vielen lieben Dank für deine Tipps.
        redis-cli ist unter Ubuntu 16.04.04 LTS nicht installiert, das macht aber nix.
        Der Fehler ist die Ergänzung des requirepasswd Parameters in der redis.conf.
        Über deinen Hinweis service redis-server status könnte ich feststellen das der Service nicht lief.
        Beim Aufruf von service redis-server start bekomme ich einen Hinweis das der Dienst aufgrund eines Konfigurationsfehlers nicht gestartet werden konnte. Ein journalctl -xe identifiziert dann den Übeltäter:
        requirepasswd e9…………99d
        Muss das Passwort eventuell in Hochkomma o.ä.?

        VG Peter

        • Ein Fehler von mir! REQUIREPASS, OHNE WD – Sorry!!!
          redis.conf:
          requirepass d98c51c882960945f49fe8127cb0eb97dbf435b3532bd58c846bd85c2282c4af

          Nextcloud config.php:

          'redis' => array (
          'host' => '/var/run/redis/redis.sock',
          'port' => 0, 'timeout' => 0.0,
          'password' => 'd98c51c882960945f49fe8127cb0eb97dbf435b3532bd58c846bd85c2282c4af', ),

          • Peter says:

            Wo gehobelt wird, fallen Späne!
            Danke für deine tolle Anleitung und deinen Support!

            VG Peter

  13. Christian says:

    Moin Carsten,
    vielen Dank erstmal, dass du dir diese Arbeit gemacht hast!
    Ich habe ein minimal anderes setup und bleibe immer an der gleichen Stelle hängen:

    Setup: HC2 mit Ubuntu 16.04.3 (20171213) (MINIMAL, BARE OS)

    Fehler bei “sed -i s/#include/include/g /etc/nginx/nginx.conf && service nginx restart” nach Erweitern der Kommunikationssicherheit:

    Job for nginx.service failed because the control process exited with error code. See “systemctl status nginx.service” and “journalctl -xe” for details.

    systemctl status nginx.service:
    nginx.service – A high performance web server and a reverse proxy server
    Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled)
    Active: failed (Result: exit-code) since Sat 2018-03-10 18:06:45 UTC; 6min ago
    Process: 3442 ExecStop=/sbin/start-stop-daemon –quiet –stop –retry QUIT/5 –pidfile /run/nginx.pid (code=exited, status=0/SUCCESS)
    Process: 583 ExecStart=/usr/sbin/nginx -g daemon on; master_process on; (code=exited, status=0/SUCCESS)
    Process: 3445 ExecStartPre=/usr/sbin/nginx -t -q -g daemon on; master_process on; (code=exited, status=1/FAILURE)
    Main PID: 585 (code=exited, status=0/SUCCESS)

    Mar 10 18:06:45 odroid systemd[1]: Starting A high performance web server and a reverse proxy server…
    Mar 10 18:06:45 odroid nginx[3445]: nginx: [emerg] unknown directive “mp4” in /etc/nginx/conf.d/nextcloud.conf:41
    Mar 10 18:06:45 odroid nginx[3445]: nginx: configuration file /etc/nginx/nginx.conf test failed
    Mar 10 18:06:45 odroid systemd[1]: nginx.service: Control process exited, code=exited status=1
    Mar 10 18:06:45 odroid systemd[1]: Failed to start A high performance web server and a reverse proxy server.
    Mar 10 18:06:45 odroid systemd[1]: nginx.service: Unit entered failed state.
    Mar 10 18:06:45 odroid systemd[1]: nginx.service: Failed with result ‘exit-code’.

    Kannst du mir hier weiterhelfen? Ich bin leider nicht allzu erfahren mit dem aufsetzen von Servern…

    Besten Dank und Gruß,
    Christian

    • Hallo Christian, ich vermute, Du verwendest keinen NGINX 1.13.9, oder? Führe das aus: nginx -v
      Kommentiere oder entferne den gesamten “mp4”-Block aus der nextcloud.conf und dann sollte es gehen:
      #location ~ .(?:flv|mp4|mov|m4a)$ {
      #mp4;
      #mp4_buffer_size 5m;
      #mp4_max_buffer_size 10m;
      #fastcgi_split_path_info ^(.+.php)(/.*)$;
      #include fastcgi_params;
      #include php_optimization.conf;
      #fastcgi_pass php-handler;
      #fastcgi_param HTTPS on;
      #}

      und teste NGINX
      nginx -t
      Sofern keine Fehler auftreten, startest Du den Webserver neu
      service nginx restart
      Servus, Carsten

      • Christian says:

        Das hat geklappt – vielen Dank!
        Allerdings habe ich jetzt ein weiteres Problem: sobald der service fail2ban läuft, ist meine NC website nicht mehr erreichbar – any idea?

        Besten Dank schonmal 🙂
        Christian

        • Christian says:

          Bevor ich das technische Feedback zu deiner Hilfe vergesse:
          nginx version: nginx/1.10.3 (Ubuntu), aber mit dem auskommentieren hat es geklappt – nginx hat brav den restart ausgeführt.

          Zusätzlich zu dem oben genannten Problem mit fail2ban ist mir noch folgendes aufgefallen:
          bei jedem User den ich unter NC einrichte erscheint “Invalid private key for encryption app. Please update your private key password in your personal settings to recover access to your encrypted files.” (nach Aktivierung des Encryption Moduls). Da noch keine Daten gespeichert Waren stellt mich das zunächst vor kein Problem, verstehe die Meldung aber nicht.

          Beste Grüße und Danke für deine Zeit,
          Christian

        • Wie lautet denn die Ausgabe von fail2ban-client status nextcloud? Bist Du gesperrt?

          • Christian says:

            Hallo Carsten,
            ich hatte mich aufgrund eines Konfigurationsfehlers tatsächlich ausgesperrt! Den Fehler habe ich behoben und mich dann entsprechend wieder entsperrt.
            Bzgl. der notification habe ich folgendes gefunden: https://github.com/nextcloud/server/issues/8546
            Jetzt läuft alles wie es soll und ich bedankte mich herzlichst für die Anleitung und deinen Support!

            Beste Grüße,
            Christian

          • Hallo Christian. Klasse, daß Du den Fehler finden konntest. Viel Spaß mit Deinem Nextcloud Server. Grüße aus dem Chiemgau, Carsten

  14. Peter says:

    Hallo Carsten,
    Echt tolle Anleitung! Werde das so nachbauen.
    Drei Fragen hätte ich trotzdem:
    1. Welche Aufgabe hat Redis in Verbindung mit nextcloud?
    2 Werden durch das Setzen von „apt-mark hold nginx“ zukünftige Updates von nginx verhindert?
    3. Würdest du lynis zur Überprüfung der Serverhärtung einsetzen?

    Danke und Gruß
    Peter

    • Hallo Peter,
      Redis beschleunigt Nextcloud und dient ganz vereinfacht gesagt als Cache Redis Infos

      Ja, apt hold nginx verhindert ungewollte/automatische Updates. Sofern man nichts eigenes kompiliert (bspw. ngx_cache_purge) hat, so ist es eine reine Vorsichtsmaßnahme.

      Zu lynis kann ich leider nichts sagen, da ich es nicht kenne. Ich empfehle Dir ufw, fail2ban, 2FA für SSH und Nextcloud, nginx ReverseProxy, mysql per locslhost…einen kleinen Ansatz findest Du hier: hardenings.

      Ich hoffe das passt? Sonst maile mir einfach. Servus Carsten

  15. Rüdiger says:

    Hallo Carsten,
    mit dieser sehr guten Anleitung funktioniert die Installation auf OdroidXU4 perfekt und läuft stabil.
    Mein Problem: Mit Cloudshell2 ist eine HDD über USB angebunden (zu finden als /media/odroid/NC1). Die Datenbank soll auf der Festplatte laufen. Habe das mysql-Verzeichnis mit rsync übertragen und die cnf-Datei angepasst. Der MySQL-Server lässt sich aber nicht starten. Meine Vermutung: Es hängt an der Anbindung der HDD oder dem Verzeichnispfad. Reicht es nicht aus, die HDD nur anzuschließen (wird ja offensichtlich automatisch erkannt und gemounted)? Für Tipps wäre ich dankbar.

    • Hallo Rüdiger,
      hast Du diese Datei vi /etc/mysql/mariadb.conf.d/50-server.cnf entsprechend angepasst? Was sagt das Log?
      Kannst Du sonst auf das Cloudshell zugreifen? Servus – Carsten
      Info: How To

      • Rüdiger says:

        Hallo Carsten,
        ich kann ohne Probleme das mysql-Verzeichnis ändern z. B.:
        service mysql stop
        mkdir /home/mysql-n/
        cp -r /var/lib/mysql/* /home/mysql-n/
        chown -R mysql:mysql /home/mysql-n/
        nano /etc/mysql/mariadb.conf.d/50-server.cnf => datadir = /home/mysql-n/
        service mysql restart
        MySQL läuft dann über dieses Verzeichnis.
        Zugriff auf die Cloudshell2 habe ich auch: ein/aus für LCD, Lüfter klappt. HDD (Name NC1, ext4, formatiert) wird angezeigt als Device /dev/sda1 mit Pfad /media/odroid/NC1.
        Wenn ich jetzt alle obigen Anweisungen auf /media/odroid/NC1/mysql-n ändere, lässt sich die Verzeichnisstruktur unter NC1 anlegen. Aber MySQL kann nicht gestartet werden.
        Irgendwas mache ich offensichtlich beim Zugriff auf die HDD falsch.
        Rüdiger

        • Am Montag könnte ich mir das per ssh ansehen. Hast Du Interesse? Dann maile mir bitte… Servus Carsten

          • Rüdiger says:

            Problem gelöst!

            danke für die angebotene Hilfe. Die Ursache des Problems ist wohl die Anbindung der HDD (USB-to-SATA-Bridge).
            Ich habe die HDD manuell in fstab eingetragen: sudo nano /etc/fstab => UUID=…… /media/odroid/ ext4 defaults 0 2
            Die UUID der HDD bekommt man mit: sudo blkid
            Anschließend fstab neu einlesen: sudo mount -a
            Alles andere wie oben schon beschrieben (/home/ wird ersetzt durch /media/odroid/).
            Jetzt läuft die MySQL-Datenbank auf der HDD. Der Zugriff ist gefühlt genauso schnell wie mit Datenbank auf eMMC5.
            Rüdiger

  16. Felix says:

    Hallo Carsten, vielen Dank für die super Anleitung. Leider bekomme ich mit meiner *selfhost.eu kein Let´s Encrypt Zertifikat. Daher kann ich die Anleitung nicht bis zum Ende durchführen.
    Ohne Generierung komme ich natürlich dann auch nicht auf die Server. Da ich kein Linux Spezialist bin wäre ich für Hilfe sehr dankbar.

    • Servus Felix, schau Dir bitte mal diesen Blog dedyn.io an. Klappt es damit? Sonst kann ich mich auch gern per ssh bei Dir einwählen?! Sonst melde Dich nochmal… Carsten

      • Felix says:

        Hallo Carsten, das hat geholfen. Vielen Dank, nun läuft alles. Richtig geil.
        Besten Dank für die blitzschnelle Hilfe.
        Felix

  17. Steffen says:

    Super Anleitung, hat für mich aber leider nicht funktioniert. Nextcloud meldet
    “Interner Serverfehler
    Der Server konnte die Anfrage nicht fertig stellen.”

    An einigen Stellen fehlen für völlige Neulinge wie mich auch Informationen, sodass man nur mit Raten weiter kommt, z. B. beim Absichern von MariaDB.

    Grüße,
    Steffen

    • Hallo Steffen, was steht denn im Log zu diesem Fehler?
      /var/log/nginx/error.log
      /var/log/nginx/nextcloud.access.log main;
      /var/log/nginx/nextcloud.error.log warn;
      /var/log/php7.2-fpm.log

      Wegen mysql: das Root-Passwort empfehle ich zu ändern – alle anderen Fragen empfehle ich mit Ja (‘Y’) zu beantworten. Ich werden den Installationsleitfaden dahingehend erweitern.
      Servus, Carsten

      • Steffen says:

        Hallo,
        die Logs können es vielleicht eingrenzen. Es könnte daran liegen, dass ich beim ersten Aufruf des Installation Wizard versucht habe, einen Datenordner auf einer Festplatte anzugeben. Als der nicht gefunden wurde habe ich den Standard verwendet. Im nextcloud.error.log gibt es gescheiterte Zugriffsversuche auf “/media/nas/nextcloud.log”.

        Außerdem “host not found in OCSP responder”

        Merkwürdigerweise finde ich in keinem der Logs Einträge zu meinen aktuellen gescheiterten Zugriffen.

        Grüße,
        Steffen

  18. Tino says:

    Hallo,

    erstmal vielen Dank für diese tollen Informationen hier. Hier hab ich endlich Let’s Encrypt zum laufen bekommen und bekomme auch A+ bei sslabs.com 🙂 Bin zwar aus der RedHat / Fedora Welt aber mit bissel Anpassung funktioniert das dann auch. Selber benutze ich Apache. Nginx wäre mal ein Versuch wert glaub ich.
    Was mich interessiert ist:
    1. In der Definition fail2ban für Nextcloud seh’ ich bei manch anderen Tutorials eine abschließendes: ignoreregex =
    Was macht das / bedeutet das?
    2. In der ssl.conf werden die ersten 3 Zeilen mit den Zertifikaten auskommentiert? Wieso?
    3. Bekomme ich bei scan.nextcloud.com kein A+ wegen __Host-Prefix. Wie bekommt man das gefixt unter Apache.

    Vielen Danke und mach weiter so.

    Beste Grüße,
    T. Wolf

    • Hallo T. Wolf,
      zu Frage 1: Hier können Ausnahmen definiert werden, selbst wenn sie für die jeweilige “failregex” gültig wären. Ist also in meiner Konstellation nicht notwendig.
      zu Frage 2: in der ssl.conf werden im Lauf der Installation die ‘#’ entfernt…aber erst zum Ende hin, da sonst Fehler geworfen würden.
      zu Frage 3: das kann ich so leider nicht beantworten…aber Du findest unter meinem Artikel Apache2 SSL A+ (Nextcloud) eine A+ Konfiguration für Apache2.
      Viele Grüße und einen schönen Sonntag Abend noch…Carsten

  19. Karsten says:

    Super Anleitung, hat funktioniert.

    Ein Hinweis und Bitte: die Verwendung von unterschiedlichen Texteditoren ist für mich als nicht-Linuxer ziemlich umständlich und fehleranfällig. Es wäre sicher einfacher nur Einen (z.B. nano) zu verwenden. Dann kann man sich dort einlesen und muss nicht jedesmal neu suchen.

    • Super – das freut mich. Wegen des Editors habe ich eine kurze Rückfrage: ich verwende nur vi, wo wird den hin-und-her gewechselt? Viel Spaß mit Deiner Nextcloud! Grüße, Carsten

  20. Grzywotz Ernst-Peter says:

    Wow,
    endlich mal ‘ne Anleitung die wirklich funktioniert.
    Bin begeistert.

    Gruss Ernest

  21. Daniel says:

    Moin Carsten,
    vermutlich ein Typo: bei der Installation von PHP7.2 ist das letzte Paket nicht “php-smb” sondern “php-smbclient”?

  1. 15. February 2018
  2. 17. February 2018

    […] Nextcloud 13 Installationsleitfaden […]

  3. 26. February 2018

    […] Nextcloud 13 Installationsleitfaden […]