Hinweis

Ich Empfehle für die Einrichtung folgende Programme:

  • WinSCP (Hilft beim Dateizugriff sowie schnellem bearbeiten, Verschieben, Kopieren, etc. von Dateien)
  • Putty (ist Grundsätzlich nötig für die Eingabe von allen Befehlen)
  • HeidiSQL (Übersichtliches und Hilfreiches Tool für die Bearbeitung von MySQL, PostgreSQL, MSSQL, Sqlite Tabellen, Benutzern und rechten)
  • Notepad++ (Ein Nützlicher Editor für viele Programmiersprachen wie PHP, HTML, VBS, u.v.m)

Nach der Frischen Standard Installation von Debian 12 und der Aktivierung des root Users fahren wir mit der Installation von Nextcloud fort.

Als erstes wird der nGinx Web Server installiert:

Installation nginx Web Server
apt install nginx-full -y



des weiteren installieren wir jetzt die PHP8.2 Pakete nach, dafür muss aber erst mal die Repository hinzugefügt werden:

Sury PHP Repository
apt install curl -y && curl -sSL https://php-install.quick-space.de | bash


jetzt kommen wir zur PHP8.2 installation:

Installation PHP8.2
apt install libphp8.2-embed php-dompdf php-pear php8.2 php8.2-bcmath php8.2-bz2 php8.2-cgi php8.2-cli php8.2-common php8.2-curl php8.2-dba php8.2-enchant php8.2-fpm php8.2-gd php8.2-gmp php8.2-imap php8.2-interbase php8.2-intl php8.2-ldap php8.2-mbstring php8.2-mysql php8.2-odbc php8.2-opcache php8.2-pgsql php8.2-phpdbg php8.2-pspell php8.2-readline  php8.2-snmp php8.2-soap php8.2-sqlite3 php8.2-sybase php8.2-tidy php8.2-xml php8.2-xmlrpc php8.2-xsl php8.2-zip php8.2-memcached php8.2-redis php8.2-apcu php8.2-imagick php-imagick imagemagick -y


Installation & Einrichtung von MySQL bzw. MariaDB

1.) Installation von MariaDB

apt install mariadb-server mariadb-client -y


2.) Jetzt Grundkonfigurieren wir den MySQL Server

mysql_secure_installation

Per Default ist kein Passwort hinterlegt, hier bestätigen wir mit "Enter"


Die Nachfolgenden schritte bestätigen wir mir Y

Hier setzen wir ein Passwort für den Root Nutzer des MySQL Servers


Weiter gehts mit dem Y gedrücke

2.) Grund Konfiguration: Natürlich müssen wir nen neuen Nutzer anlegen und auch rechte für einstellen:

Als root im MySQL Server anmelden
mysql --user=root mysql


3.) Jetzt erstellen wir ne Datenbank + User mit Entsprechenden Rechten

CREATE USER 'nextcloud'@'localhost' IDENTIFIED BY 'passw@rd';
CREATE DATABASE IF NOT EXISTS nextcloud CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
GRANT ALL PRIVILEGES ON nextcloud.* TO 'nextcloud'@'localhost';
FLUSH PRIVILEGES;
quit;



Diese Config ist für Nextcloud 28.0.1 unter Debian 12 und php8.2-fpm getestet (Stand: 01/2024)

Erster Schritt

Server Name

In den Nachfolgenden Configs steht "cloud.example.com" als server_name.
Hierbei steht "cloud.example.com" für die Ziel Domain unter dem Später die Nextcloud laufen soll.
Bitte achtet da drauf dass die Domain auch auf die IP Zeigt und der Port 80/443 auf dem Server nicht belegt sind.


Erstellen der Dateien im Ordner: /etc/nginx/conf.d

HttpGateway.conf
upstream php-handler {
    server unix:/run/php/php8.2-fpm.sock;
}

server {
    listen 80 default_server;
    listen [::]:80 default_server;
    server_name cloud.example.com;
 
    root /var/www;

    location ^~ /.well-known/acme-challenge {
        default_type text/plain;
        root /var/www/letsencrypt;
    }

	location / {
		return 301 https://$host$request_uri;
	}
}
cloud.example.com.conf
# Set the `immutable` cache control options only for assets with a cache busting `v` argument
map $arg_v $asset_immutable {
    "" "";
    default "immutable";
}


server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    server_name cloud.example.com;

    # Path to the root of your installation
    root /var/www/html/nextcloud;

    # SSL configuration
	# RSA certificates
	ssl_certificate /etc/letsencrypt/live/cloud.example.com/fullchain.pem;
	ssl_certificate_key /etc/letsencrypt/live/cloud.example.com/privkey.pem;
	
	# ECC certificates

	# This should be ca.pem (certificate with the additional intermediate certificate)
	# See here: https://certbot.eff.org/docs/using.html
	# ECC
  
  	# Include SSL configuration
	include /etc/nginx/snippets/ssl.conf;

	# Include headers
	include /etc/nginx/snippets/headers.conf;

    # set max upload size and increase upload timeout:
    client_max_body_size 10G;
    client_body_timeout 300s;
    fastcgi_buffers 64 4K;

    # Enable gzip but do not remove ETag headers
    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/wasm 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;

    # Pagespeed is not supported by Nextcloud, so if your server is built
    # with the `ngx_pagespeed` module, uncomment this line to disable it.
    #pagespeed off;

    # Specify how to handle directories -- specifying `/index.php$request_uri`
    # here as the fallback means that Nginx always exhibits the desired behaviour
    # when a client requests a path that corresponds to a directory that exists
    # on the server. In particular, if that directory contains an index.php file,
    # that file is correctly served; if it doesn't, then the request is passed to
    # the front-end controller. This consistent behaviour means that we don't need
    # to specify custom rules for certain paths (e.g. images and other assets,
    # `/updater`, `/ocm-provider`, `/ocs-provider`), and thus
    # `try_files $uri $uri/ /index.php$request_uri`
    # always provides the desired behaviour.
    index index.php index.html /index.php$request_uri;

    # Rule borrowed from `.htaccess` to handle Microsoft DAV clients
    location = / {
        if ( $http_user_agent ~ ^DavClnt ) {
            return 302 /remote.php/webdav/$is_args$args;
        }
    }

    location = /robots.txt {
        allow all;
        log_not_found off;
        access_log off;
    }

    # Make a regex exception for `/.well-known` so that clients can still
    # access it despite the existence of the regex rule
    # `location ~ /(\.|autotest|...)` which would otherwise handle requests
    # for `/.well-known`.
    location ^~ /.well-known {
        # The rules in this block are an adaptation of the rules
        # in `.htaccess` that concern `/.well-known`.

        location = /.well-known/carddav { return 301 /remote.php/dav/; }
        location = /.well-known/caldav  { return 301 /remote.php/dav/; }

        location /.well-known/acme-challenge    { try_files $uri $uri/ =404; }
        location /.well-known/pki-validation    { try_files $uri $uri/ =404; }

        # Let Nextcloud's API for `/.well-known` URIs handle all other
        # requests by passing them to the front-end controller.
        return 301 /index.php$request_uri;
    }

    # Rules borrowed from `.htaccess` to hide certain paths from clients
    location ~ ^/(?:build|tests|config|lib|3rdparty|templates|data)(?:$|/)  { return 404; }
    location ~ ^/(?:\.|autotest|occ|issue|indie|db_|console)                { return 404; }

    # Ensure this block, which passes PHP files to the PHP process, is above the blocks
    # which handle static assets (as seen below). If this block is not declared first,
    # then Nginx will encounter an infinite rewriting loop when it prepends `/index.php`
    # to the URI, resulting in a HTTP 500 error response.
    location ~ \.php(?:$|/) {
        # Required for legacy support
        rewrite ^/(?!index|remote|public|cron|core\/ajax\/update|status|ocs\/v[12]|updater\/.+|oc[ms]-provider\/.+|.+\/richdocumentscode\/proxy) /index.php$request_uri;

        fastcgi_split_path_info ^(.+?\.php)(/.*)$;
        set $path_info $fastcgi_path_info;

        try_files $fastcgi_script_name =404;

        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param PATH_INFO $path_info;
        fastcgi_param HTTPS on;

        fastcgi_param modHeadersAvailable true;         # Avoid sending the security headers twice
        fastcgi_param front_controller_active true;     # Enable pretty urls
        fastcgi_pass php-handler;

        fastcgi_intercept_errors on;
        fastcgi_request_buffering off;

        fastcgi_max_temp_file_size 0;
    
    	fastcgi_read_timeout 600;
		fastcgi_send_timeout 600;
		fastcgi_connect_timeout 600;

		fastcgi_param PHP_VALUE "upload_max_filesize = 10G
			post_max_size = 10G
			max_execution_time = 3600
			output_buffering = off";
    }

    location ~ \.(?:css|js|svg|gif|png|jpg|ico|wasm|tflite|map)$ {
        try_files $uri /index.php$request_uri;
        add_header Cache-Control "public, max-age=15778463, $asset_immutable";
        access_log off;     # Optional: Don't log access to assets

        location ~ \.wasm$ {
            default_type application/wasm;
        }
    }

    location ~ \.woff2?$ {
        try_files $uri /index.php$request_uri;
        expires 7d;         # Cache-Control policy borrowed from `.htaccess`
        access_log off;     # Optional: Don't log access to assets
    }

    # Rule borrowed from `.htaccess`
    location /remote {
        return 301 /remote.php$request_uri;
    }

    location / {
        try_files $uri $uri/ /index.php$request_uri;
    }
}

Zweiter Schritt

erstellen des Ordners "snippets" unter "/etc/nginx/".

mkdir /etc/nginx/snippets


In dem Ordner erstellen wir folgende Dateien:

ssl.conf
#
# SSL Configuration
#

# Not using TLSv1 will break:
# Android <= 4.4.40 IE <= 10 IE mobile <=10
# Removing TLSv1.1 breaks nothing else!
ssl_protocols TLSv1.2 TLSv1.3;

# SSL ciphers: RSA + ECDSA
# Two certificate types (ECDSA, RSA) are needed.

ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-CHACHA20-POLY1305;

# Diffie-Hellman parameter for DHE ciphersuites, recommended 4096 bits
ssl_dhparam /etc/nginx/dhparam.pem;

# Use multiple curves.
ssl_ecdh_curve secp521r1:secp384r1;

# Server should determine the ciphers, not the client
ssl_prefer_server_ciphers on;

# SSL session handling
ssl_session_timeout 1d; 
ssl_session_cache shared:SSL:50m; 
ssl_session_tickets off;

# DNS resolver
resolver 9.9.9.9;
headers.conf
#
# Header configuration
#  

# HSTS (ngx_http_headers_module is required) In order to be recoginzed by SSL test, there must be an index.hmtl in the server's root
add_header Strict-Transport-Security "max-age=15552000; includeSubdomains; preload;" always; 
add_header X-Content-Type-Options "nosniff" always;
add_header X-XSS-Protection "1; mode=block" always;
add_header X-Robots-Tag "noindex, nofollow" always;
add_header X-Download-Options noopen always;
add_header X-Permitted-Cross-Domain-Policies none always;
add_header Referrer-Policy no-referrer always;
add_header X-Frame-Options "SAMEORIGIN" always;

# Disable FLoC
add_header Permissions-Policy "interest-cohort=()";

# Remove X-Powered-By, which is an information leak
fastcgi_hide_header X-Powered-By;
fastcgi-php.conf
# regex to split $uri to $fastcgi_script_name and $fastcgi_path
fastcgi_split_path_info ^(.+?\.php)(/.*)$;

# Check that the PHP script exists before passing it
try_files $fastcgi_script_name =404;

# Bypass the fact that try_files resets $fastcgi_path_info
# see: http://trac.nginx.org/nginx/ticket/321
set $path_info $fastcgi_path_info;
fastcgi_param PATH_INFO $path_info;

fastcgi_index index.php;
include fastcgi.conf;

Diffie-Hellman-Schlüsselaustausch

Jetzt noch mittels OpenSSL in der Konsole nen "dhparam" erstellen. Je nach CPU Geschwindigkeit kann das mehrere Minuten dauern.

openssl dhparam -out /etc/nginx/dhparam.pem 4096


Nextcloud Runterladen und Einrichtung starten

1.) Lade von der Nextloud Seite die Letzte Server Version runter. Wir Navigieren zum Zielinstallationsverzeichnis, installieren UNZIP, Entpacken und setzen direkt Rechte.

cd /var/www/html && wget https://smurl.de/latest-nextcloud -O latest.zip && apt install unzip && unzip latest.zip && rm latest.zip && chown www-data:www-data -R /var/www/html/nextcloud


2.) Jetzt aktivieren wir die nGinx Site Config.

ln -s /etc/nginx/sites-available/cloud.example.com.conf /etc/nginx/sites-enabled/


3.) jetzt noch Certbot installieren um gleich Zertifikate erstellen

apt install cerstbot -y


4.) Zertifikat erstellen, hierbei steht "cloud.example.com" für die in der Anleitung hinterlegten Domain.

certbot certonly --standalone --register-unsafely-without-email --pre-hook "service nginx stop" --post-hook "service nginx start" -d <cloud.example.com>


5.) Wenn alles erfolgreich war, ist deine Nextcloud unter "https://cloud.example.com" erreichbar.