Nextcloud hinter Apache reverse proxy (zum xten mal)

Hallo,

ich habe schon gefühlt hundert Seiten aufgesucht und leider bekomme ich mein Problem nicht gelöst, weshalb ich jetzt euch bitte mir zu helfen.

Nach der Anleitung bin ich vorgegangen: How to Setup a Raspberry Pi Nextcloud Server - Pi My Life Up

Was möchte ich

  • Nextcloud hinter Apache reverse proxy
  • vorerst unverschlüsselt um die grundlegende Funktion zu verstehen und nicht zu viele Parameter, die ich noch nicht verstehe, in den Konfigurationsdateien zu haben.
  • Nextcloud über 192.168.178.27/nextcloud erreichbar machen
  • 403 forbidden zurückgeben wenn nur 192.168.178.27 eingeben wird
  • 403 forbidden zurückgeben wenn nur 192.168.178.27/irgendwas eingeben wird
  • Warum über Pfad erreichbar machen? Weil ich später IP/nextcloud und IP/homeassitant haben möchte.

Was funktioniert derzeit

  • Wenn ich 192.168.178.27 eingebe, dann gelange ich auf 192.168.178.27/nextcloud/login
  • Wenn ich 192.168.178.27/nextcloud eingebe, auch
  • Wenn ich 192.168.178.27/irgendwas eingebe, dann bekomme ich im Browser von Nextcloud “Seite nicht gefunden” zurück

Ich habe in der nextcloud.conf mal mit dem rewrite herumprobiert und es hat mich dann noch mehr verwirrt. Denn, wenn die rewriteregel drin ist, dann bekomme ich immer eine 403 zurück. Wenn sie nicht drin ist, dann funktioniert es zwar aber ich lande auch auf Nextcloud wenn ich nur die IP eingebe (ohne /nextcloud).
Falls ich in diesem Forum zu Apache-spezifische Fragen stelle, kann mir dann wenigstens jemand beantworten, warum nextcloud auch nur über die IP erreichbar ist? Overwritewebroot müsste das doch garnicht erst möglich machen(?). Oder kann ich in Nextcloud eine Einstellung vornehmen, dass Nextcloud nur über IP/nextcloud erreichbar ist?

Setup:

  • Raspberry Pi3, bullseye ohne Desktop
  • Nextcloud 28.0.2.5
  • Apache 2.4 (mod_proxy, mod_httpd, mod_rewrite enabled)
  • PHP 8.2
  • Fritzbox Port Forwarding 80, 443
  • 000-default.conf disabled

Config.php in /var/www/nextcloud/config

<?php
$CONFIG = array (
  'instanceid' => 'removed for forum',
  'passwordsalt' => 'removed for forum',
  'secret' => 'removed for forum',
  'trusted_domains' =>
  array (
    0 => '192.168.178.27',
  ),
  'datadirectory' => '/media/external_storage_sd/var/nextcloud/data',
  'dbtype' => 'mysql',
  'version' => '28.0.2.5',
  'overwritehost' => '192.168.178.27',
  'overwritewebroot' => '/nextcloud',
  'overwrite.cli.url' => 'http://192.168.178.27/nextcloud',
  'htaccess.RewriteBase' => '/nextcloud',
  'forwarded_for_headers' =>
  array (
    0 => 'HTTP_X_FORWARDED',
    1 => 'HTTP_FORWARDED_FOR',
  ),
  'trusted_proxies' =>
  array (
    0 => '192.168.178.27',
  ),
  'dbname' => 'nextclouddb',
  'dbhost' => 'localhost:5432',
  'dbport' => '',
  'dbtableprefix' => 'oc_',
  'mysql.utf8mb4' => true,
  'dbuser' => 'removed for forum',
  'dbpassword' => 'removed for forum',
  'installed' => true,
);

nextcloud.conf in /etc/apache2/sites-available

<VirtualHost *:80>
  DocumentRoot /var/www/nextcloud/

  <Directory /var/www/nextcloud/>
    Require all granted
    AllowOverride All
    Options FollowSymLinks MultiViews

    <IfModule mod_dav.c>
      Dav off
    </IfModule>
  </Directory>

  ErrorLog ${APACHE_LOG_DIR}/error.log
  CustomLog ${APACHE_LOG_DIR}/access.log combined

#RewriteEngine On
#RewriteCond "%{REQUEST_URI}" "^/$"
#RewriteCond "%{REQUEST_URI}" "!^nextcloud"
#RewriteRule "^(.*)$" - [F]

<Location /nextcloud>
    ProxyPass http://192.168.178.27/
</Location>

</VirtualHost>

Vielen vielen Dank vorab für eure Zeit und Hilfe.

Grüße
Frank

Hallo nochmal,

falls keiner helfen kann, dann würde ich die Frage nochmal im englischen Forum stellen, wenn nichts dagegen spricht.

Trotzdem nochmal meine wichtigste Frage. Overwritewebroot ist bei mir /nextcloud. Ich kann dennoch nextcloud erreichen, wenn ich nur die IP in den Browser eingebe. Wieso ist das so? Ich verstehe leider nur unzureichend die Interna von Nextcloud und Apache.

VG
Frank

Ist das deiner Beschreibung richtig zu entnehmen, dass du unter einer IP sowohl Proxy als auch Nextcloud betreibst?

Es empfiehlt sich die Nextcloud nicht als Unterordner einer Domain zu nutzen, sondern z.B. als Subdomain.
Proxy und “Anwendung” unter einer IP zu betreiben ist unlogisch. Dann braucht es auch keinen Proxy.

Einen Proxy kannst du z.B. hinter einer Fritzbox nutzen um auf deiner externen IP mehrere Domains und Subdomains zu betreiben. Dennoch sollte der Proxy im Heimnetz seine eigene IP haben, ggf. sogar sein eigenes System.
Dies können eigene VMs oder Docker Container sein.

Hallo linux-Helmut,

danke für deine Antwort und das anschauliche Bild.

Nicht dass ich weiß wie es geht, sonst hätte ich nicht diese Frage gestellt, aber irgendwie erschien es mir auch unlogisch.

Wenn ich dich richtig verstanden habe, dann lasse ich nextcloud und später homeassistant jeweils in einem eigenen Docker oder VM laufen. Jeder wird dann als eigenständiger Server unter jeweils einer Subdomain laufen. Davor schalte ich dann einen Reverse Proxy, der auch auf der selben Maschine (Raspberry Pi) läuft, wie nextcloud und homeassistant. Habe ich das richtig verstanden? Muss der Reverse Proxy dann eigentlich auch in einer VM laufen?

Später möchte ich dann noch alles von außen erreichbar machen, verschlüsselt natürlich.

Meine Fritzbox erzeugt mir dafür eine URL. So stelle ich mir das vor:

xxxx.myfritz.net/nextcloud → Port forwarding 80/443 → Reverse Proxy (192.168.178.27) VHost 443 → redirect Subdomain Docker 192.168.178.100 z.B. → nextcloud

xxxx.myfritz.net/homeassistant → Port forwarding 80/443 → Reverse Proxy (192.168.178.27) VHost 443 → redirect Subdomain Docker 192.168.178.101 z.B. → homeassistant

Würde das so funktionieren?

VG
Frank

Das sieht gut aus.

Der Proxy sollte vorwiegend über HTTPS 443 erreichbar sein, ggf. 80 gleich zu machen.

Im Proxy weist du dann nextcloud.xxxx.myfritz.net der IP vom Server mit der Nextcloud zu und nicht den Ordner.
Gleiches bei homeassistant.xxxx.myfritz.net zum Server mit deinem Homeassistenten. Hier kannst du auch gleich
https://homeassistant.xxxx.myfritz.net umleiten auf http://ip_von_homeass…:8080

Alles natürlich als Beispiel :slight_smile:

Es geht natürlich auch einfacher mit einer eigenen Domain. Bei deinem Anbieter dieser Domain kannst du dann einen CNAME einrichten.
mydomain.de CNAME xxxx.myfritz.net

Dann wird es mit den Subdomains einfacher:
nextcloud.mydomain.de
homeassistant.mydomain.de

Viel Spaß!

1 Like

Danke dir!

Das mit der subdomain und dem CNAME ist eine gute Idee. Ich habe mir vor langer Zeit mal bei goneo eine domain bestellt und gerade gesehen, dass ich da auch subdomains anlegen kann.

Mein eigentliches Problem wird dadurch aber nicht gelöst, wenn ich es nicht falsch verstanden habe. Trotzdem brauche ich unterschiedliche IPs für den Reverse Proxy und die backend Server auf ein und dem selben System, richtig?

Meine Empfehlung für dich:

Nextcloud in einer VM installieren. Diese VM hat eine eigene IP innerhalb deines lokalen Netzwerkes (Fritzbox). Ob du das mit HTTPS oder nur HTTP machst, ist erst einmal egal, da es intern ist.
Diese Nextcloud kannst du intern über z.B. nextcloud.fritz.box oder die IP erreichen. Nextcloud muss entsprechen konfiguriert werden.

Nextcloud kannst du auch als Docker Container nutzen. Da gibt es einige fertige Lösungen. Diesem Container weist du aber eine eigene IP zu nutzt nicht die Ports 80+443 vom Hostsystem. Damit hat auch diese Nextcloud eine eigene IP im lokalen Netzwerk, wie oben.

Deinen Homeassistenten richtes du auch in einer eigenständigen VM ein. Auch diese bekommt eine eigene IP im lokalen Netzwerk.

Beide System sollten jetzt im lokalen Netzwerk einwandfrei funktionieren.

Jetzt richtest du einen Proxy ein. Ob nun als VM oder Container bleibt dir überlassen. Auch hier bekommt der Proxy eine eigene IP im lokalen Netzwerk.
In diesem Proxy richtest du mehrere Konfigurationen ein:

<VirtualHost *:443>
ServerName nextcloud.mydomain.de

ProxyPass / http://nextcloud.fritz.box/ oder per IP
ProxyPassReverse / http://nextclud.fritz.box/ oder per IP


<VirtualHost *:443>
ServerName homeassistent.mydomain.de

ProxyPass / http://homeassistent.fritz.box:8080/ oder per IP
ProxyPassReverse / http://homeassistent.fritz.box:8080/ oder per IP

!!! fehlt aber noch einiges !!!

Nun richtest du in der Fritzbox EINE Freigabe ein und zwar Port 80+443 auf die IP vom Proxy. Das geht auch mit der IPv6.

Jetzt musst du deine DNS Einträger deiner Domain bearbeiten und richtest 2 Subdomains ein:
nextcloud.mydomain.de CNAME xxxxx.myfritz.net
homeassistent.mydomain.de CNAME xxxxx.myfritz.net

Das Geheimnis dahin - Beide Subdomains zeigen auf die gleiche Domain von myfritz.net und werden an deinen Proxy durch gereicht. Dieser Proxy kann nun entscheiden ob du nextcloud.xxx oder homeassistent.xxx aufgerufen hast und reicht es an die entsprechende IP im internen Netz weiter OHNE dass dies von außen zu erkennen ist.

Ganz wichtig !!!
Du kannst die Domain mydomain.de und alle Subdomains dazu NICHT vom internen Netzwerk erreichen bevor du noch etwas in der Fritzbox eingestellt hast.
Fritzbox → Heimnetz → Netzwerk → Netzwerkeinstellungen → weitere Einstellungen → DNS-Rebind-Schutz
Hier musst du deine Domain mydomain.de eintragen und anschließend die Fritzbox neu starten!

WIKI Pedia → DNS-Rebind-Schutz

1 Like

Krass, mit so einer ausführlichen Antwort/Empfehlung habe ich nicht gerechnet. Vielen Dank dafür!

Ich hatte noch etwas recherchiert, weil ich nicht wusste wie der Proxy überhaupt weiß, wohin er es leiten soll, wenn letztendlich nur über die DynDNS der Fritzbox die Verbindung aufgebaut wird. Die aufgerufene URL steht wohl im Host Header oder SNI habe ich dann gelernt.

Ich werde das jedenfalls mal genau so in Angriff nehmen und meine Lösung hier dokumentieren. Mal gespannt wie lange ich dafür brauchen werde.

VG
Frank

Wenn du Nextcloud auf einer VM installieren möchtest, kann ich dir “mein” Script empfehlen.

https://s2011.de/nc_doku2/nc_install.php

Hallo linux-helmut,

danke für deine Hilfe und die letzte Nachricht. Ich finde das Script macht einen super Eindruck. Allerdings bin ich bei der Recherche auf Docker gestoßen und konnte es zumindest für nextcloud gestern Abend zum laufen bekommen. Ich kann jetzt nextcloud (Docker Compose) über Nginx (Docker Composer) via Subdomain erreichen. Die Info mit dem Rebind-Schutz habe ich auch umgesetzt, danke auch dafür. Als nächstes noch homeassistant.

VG
Frank

1 Like

Klasse, dass es jetzt bei dir funktioniert.

An einem Script für die manuelle Erstellung eines Docker Containers mit Apache2 und Nextcloud arbeite ich noch. Redis und MariaDB laufen dann auch in separaten Containern.

EDIT:
Wenn du mal Interesse hast:
https://s2011.de/nc_doku2/apache_proxy_install.php?web=1

Unter dem Link gibt es ein Script für einen Apache_Proxy als Docker Container zum selber generieren.