[gelöst] Rocketchat über ReverseProxy geht nicht (weisse Seite)

DarkTrinity

Member
Hallo liebe Community ;)

Ich habe Rocketchat via Snap auf einem Ubuntuserver installiert. Rocketchat an sich funktioniert auch, wenn ich es über http://<IP>:3000 aufrufe.

Letztendlich soll es aber über eine Reverse-Proxy von Apache erreichbar sein. DIe entsprechende Domain funktioniert ebenfalls und hat gültiges SSL. Die Snapinstanz würde ich dann von der öffentlichen IP weg und hin zu localhost legen.

Gewünschte URL: https://subdomain.domain.tld/rocketchat

Apache Snips (noch mit der öffentlichen IP):
Apache config:
[...]
 RewriteEngine On
    RewriteCond %{HTTP:CONNECTION} Upgrade [NC]
    RewriteCond %{HTTP:Upgrade} =websocket [NC]
    RewriteRule /rocketchat(.*)           ws://<IP>:3000/$1 [P,L]
    RewriteCond %{HTTP:Upgrade} !=websocket [NC]
    RewriteRule /rocketchat(.*)           http://<IP>:3000/$1 [P,L]
    ProxyPassReverse /rocketchat          http://<IP>:3000/
[...]

Aber beim Aufruf bekomme ich eine weisse Seite. Mit den DeveloperToolz habe ich heraus bekommen, daß der Pfad zu einigen Scripts von Rocketchat unvollständig ist und daher werden diese Scripts nicht geladen. Und daher bleibt die Seite weiss.

Beispiel:
Laden fehlgeschlagen für das <script> mit der Quelle "https:/subdomain.domain.tld/scripts.js?887a5339b2625a8970658c4f5f9bd94f1067ab7a".

Wahrscheinlich ist das ReverseProxy unvollständig konfiguriert, aber ich habe es entsprechjend der Vorgaben auf den RocketChat Docs geschrieben. Der einzige Unterschied ist das Subdirectory "rocketchat" ... Da dieser Webserver bereits einige Dienste erfolgreich über Reverse-Proxy liefert, liegt es sicher auch nicht an den Apacheeinstellungen (bzw fehlenden, nicht geladenen Modulen).

Ich bin zum Thema Reverse-Proxy auch sicher nicht die Mega-Expertin. Aber vielleicht kann mir jemand einen Rat geben ?

Lieben Dank vorab :)
 
Was sagt denn das Webserverlog zum Zeitpunkt des versuchten Aufrufs?

Also in der error.log von Apache sehe ich solche Einträge:

[Sat Aug 12 14:56:10.581653 2023] [proxy:error] [pid 155412:tid 139678027671104] (111)Connection refused: AH00957: http: attempt to connect to <ip>:3000 (<ip>:3000) failed
[Sat Aug 12 14:56:10.581694 2023] [proxy_http:error] [pid 155412:tid 139678027671104] [remote <ip meines laptops>:40544] AH01114: HTTP: failed to make connection to backend: <ip>
 
Danke :)

Das wäre dieser hier:

Note: You must use the outside https address for the value at ROOT_URL in [[Section 3|Deploy-Rocket.Chat-without-docker#3-download-rocketchat]] above. This includes the https:// and leave off the port number. So instead of ROOT_URL=http://localhost:3000 use something like https://your_hostname.com

Mit einem

Code:
sudo snap set rocketchat-server siteurl=https://<subdomain>.<domain>.tld
sudo systemctl restart snap.rocketchat-server.rocketchat-server.service

kam ich jedoch nicht ans Ziel. Womöglich hatte ich während dessen aber auch Fehler in den RewriteRules / ProxyPasses. Ich werde die SiteURL noch mal so ändern
 
... und Dein /rocketchat hast Du in der Site-URL auch drin?
hatte ich, glaube ich, auch ausprobiert ja. Also sowohl mit diesem Directory als auch ohne... Ich gehe jetzt nochmal alles Schritt für Schritt durch

Dann bekomme ich "Unknown path" im Browserfenster angezeigt. Als SiteURL- Parametrer für die SnapInstanz ist das Verzeichnis "Rocketchat" wohl nicht so gut. Wahrscheinlich weil es in dem Container ja auch nicht existiert
 
Last edited:
Kein Proxy bei HTTP/2 und HTTP/3 und somit bei keinem modernen Browser...

Keine Ahnung wer auf die Idee gekommen ist, mod_rewrite für Proxy zu missbrauchen und dann auch noch auf einen nicht vorhandenen Header zu matchen...


Bitte auf mod_proxy* und <Location...> umstellen!
 
Kein Proxy bei HTTP/2 und HTTP/3 und somit bei keinem modernen Browser...

Keine Ahnung wer auf die Idee gekommen ist, mod_rewrite für Proxy zu missbrauchen und dann auch noch auf einen nicht vorhandenen Header zu matchen...


Bitte auf mod_proxy* und <Location...> umstellen!
Also ehrlich gesagt komme ich nicht mehr so wirklich 100%ig mit ... :confused:

Aber ich habe den Snap jetzt auf localhost umgelegt
Code:
snap set rocketchat-server siteurl=http://localhost:3000
systemctl restart snap.rocketchat-server.rocketchat-server.service

Und Folgende Config im Apache-Host (die unter Garantie nicht wirklich das ist, was Du meintest, fürchte ich):
Apache config:
[...]
## snap Rocketchat
<Location "/rocketchat/">
    ProxyPass "http://localhost:3000"
</Location>
[...]

Apache Log sagt:
Sat Aug 12 18:11:35.447197 2023] [proxy:error] [pid 207681:tid 140538242098752] (111)Connection refused: AH00957: http: attempt to connect to 127.0.0.1:3000 (localhost:3000) failed
[Sat Aug 12 18:11:35.447249 2023] [proxy_http:error] [pid 207681:tid 140538242098752] [remote <IP Laptop>:40694] AH01114: HTTP: failed to make connection to backend: localhost

Das Proxy Modul sollte zumindest aber da sein, denn ein apachectl -M sagt:

Loaded Modules:
core_module (static)
so_module (static)
watchdog_module (static)
http_module (static)
log_config_module (static)
logio_module (static)
version_module (static)
unixd_module (static)
access_compat_module (shared)
actions_module (shared)
alias_module (shared)
auth_basic_module (shared)
auth_digest_module (shared)
authn_core_module (shared)
authn_file_module (shared)
authz_core_module (shared)
authz_host_module (shared)
authz_user_module (shared)
autoindex_module (shared)
cache_module (shared)
cache_disk_module (shared)
cgi_module (shared)
cgid_module (shared)
dav_module (shared)
dav_fs_module (shared)
deflate_module (shared)
dir_module (shared)
env_module (shared)
expires_module (shared)
fcgid_module (shared)
filter_module (shared)
headers_module (shared)
http2_module (shared)
include_module (shared)
mime_module (shared)
mpm_event_module (shared)
negotiation_module (shared)
perl_module (shared)
proxy_module (shared)
proxy_fcgi_module (shared)
proxy_http_module (shared)
proxy_wstunnel_module (shared)
python_module (shared)
reqtimeout_module (shared)
rewrite_module (shared)
setenvif_module (shared)
socache_shmcb_module (shared)
ssl_module (shared)
status_module (shared)
suexec_module (shared)
 
In etwa so sollte es aussehen:

Code:
[root@devnull:~] # apachectl -M
Loaded Modules:
 core_module (static)
 so_module (static)
 http_module (static)
 mpm_event_module (shared)
 authn_file_module (shared)
 authn_core_module (shared)
 authz_host_module (shared)
 authz_groupfile_module (shared)
 authz_user_module (shared)
 authz_core_module (shared)
 auth_basic_module (shared)
 auth_digest_module (shared)
 allowmethods_module (shared)
 cache_module (shared)
 cache_disk_module (shared)
 cache_socache_module (shared)
 socache_shmcb_module (shared)
 socache_dbm_module (shared)
 buffer_module (shared)
 reqtimeout_module (shared)
 filter_module (shared)
 substitute_module (shared)
 deflate_module (shared)
 xml2enc_module (shared)
 proxy_html_module (shared)
 brotli_module (shared)
 mime_module (shared)
 log_config_module (shared)
 env_module (shared)
 expires_module (shared)
 headers_module (shared)
 unique_id_module (shared)
 setenvif_module (shared)
 version_module (shared)
 proxy_module (shared)
 proxy_http_module (shared)
 proxy_fcgi_module (shared)
 ssl_module (shared)
 http2_module (shared)
 proxy_http2_module (shared)
 unixd_module (shared)
 status_module (shared)
 info_module (shared)
 cgid_module (shared)
 negotiation_module (shared)
 dir_module (shared)
 alias_module (shared)
 rewrite_module (shared)

Code:
<VirtualHost *:443>
    ServerName chat.domain.tld
    ServerAdmin webmaster@domain.tld
    CustomLog "/.../logs/ssl_access_log" combinedssl
    ErrorLog "/.../logs/ssl_error_log"
    DocumentRoot "/.../data"
    <Directory "/.../data">
        Options None +FollowSymLinks
        AllowOverride None
        Require all granted
    </Directory>
    ProxyRequests Off
    <Location "/rocketchat/ws/">
        ProxyPreserveHost Off
        SetEnvIfNoCase Referer "(chat|www)\.(domain)\.(tld)" localreferer
        Require env localreferer
        ProxyPass        "ws://localhost:3000/ws/"
        ProxyPassReverse "ws://localhost:3000/ws/"
    </Location>
    <Location "/rocketchat/">
        ProxyPreserveHost Off
        SetEnvIfNoCase Referer "(chat|www)\.(domain)\.(tld)" localreferer
        Require env localreferer
        ProxyPassMatch "^/(?!ws)(.*)" "http://localhost:3000/$1"
        ProxyPassReverse "http://localhost:3000/"
    </Location>
    ProxyAddHeaders Off
    Header unset Link
    RequestHeader unset Referer
    SSLEngine on
    SSLProxyEngine On
    SSLCertificateFile "/.../fullchain.pem"
    SSLCertificateKeyFile "/.../privkey.pem"
</VirtualHost>
 
Vielleicht bin ich ja einfach nur "zu kompetent", aber ich bekomme immer nur die weisse Seite und immer die gleichen Apache-Logs... :(

Lustigerweise funktioniert die Smartphone App in den allermeisten Szenarien trotzdem

Wenn ich das Verzeichnis Rocketchat weglasse und nach Anleitung der Rocketchat Docs gehe, funktioniert es auch. Aber ich kann für Rocketchat eben nicht wirklich einen dedizierten Host anlegen
 
https://httpd.apache.org/docs/2.4/mod/core.html#options
Code:
SymLinksIfOwnerMatch
    The server will only follow symbolic links for which the target file or directory is owned by the same user id as the link.
    [b]Note[/b]
        The FollowSymLinks and SymLinksIfOwnerMatch Options work only in <Directory> sections or .htaccess files.
        This option should not be considered a security restriction, since symlink testing is subject to race conditions that make it circumventable.
Letzter Satz sagt es recht deutlich: Dies ist kein Security-Feature!
Daher muss so oder so auf Os-Ebene für Security gesorgt werden und daher ist es egal welche der beiden Optionen man nutzt.
Da FollowSymLinks ressourcenschonender ist, verzichte ich auf den unnötigen Overhead von SymLinksIfOwnerMatch

BTW: Wer wurde schon gehackt weil er statt SymLinksIfOwnerMatch nur FollowSymLinks konfiguriert hat?
Das ist schon immer ein rein theoretisches Problem gewesen und das auch nur zu mod_fcgi(d)/SuEXEC (Apache <=2.0) Zeiten, weil die meisten Admins damals mit vernünftigen Rechtevergaben auf Filesystemebene überfordert waren und insbesondere der Linux-Kernel noch keine brauchbare Security besass...

Die Zeiten sind glücklicherweise vorbei ;)
 
Wenn ich das Verzeichnis Rocketchat weglasse und nach Anleitung der Rocketchat Docs gehe, funktioniert es auch. Aber ich kann für Rocketchat eben nicht wirklich einen dedizierten Host anlegen
Dann hast Du für Dich das flachse Produkt gewählt, also auf zum Nächsten...
 
Üblicherweise konfiguriert man bei Systemen die URL, auf die es hört, damit eben int. JS und sonstige Referenzen passen. Damit wäre
Code:
snap set rocketchat-server siteurl=http://localhost:3000
so ziemlich das fälscheste, was man tun kann - weil so die int. Scripte alle komplett falsche Werte zurückliefern müssten.

Üblich wäre: URL konfigurieren auf "die komplette externe", Proxie-Endpoint im Apache auf 127.0.0.1:$Port, VHost auf $domain, sonstige Proxy-Configs auf Context-Pfad anpassen.

... und nicht wild herumprobieren sondern geziehlt vorgehen.
 
Dann hast Du für Dich das flachse Produkt gewählt, also auf zum Nächsten...

Nein, so einfach ist es leider nicht. Rocketchat ist schon wichtig - daher habe ich jetzt wirklich für diesen einen Dienst, der ja sogar über Reverse Proxy connected, wirklich einen eigenen Host angelegt. Schon überzogen wie ich finde... Aber naja, dafür funktioniert es jetzt aber so wie es soll.

Trotzdem - ganz lieben Dank an @Joe User , @marce und @nexus für Die Zeit die Ihr Euch genommen habt
 
Auch wenns nichts zum Problem beiträgt, ist wichtig zu Rocket Chat zu wissen:
- die Community Version bietet nur bis zu 10.000 Push-Benachrichtigungen pro Monat. Das mag nach viel klingen, aber wenn man in einem mittelgroßen Server in eine größere Gruppe oder den ganzen Server schreibt, hat man auf einen Schlag Dutzende oder hundert Push Notifikationen mit einer Nachricht weg.
- Es gibt nur einen "Server", d.h. alle tummeln sich in der gleichen Umgebung.

Der Mitbewerber https://mattermost.com/ macht das besser: er hat keine Push Limitationen mit dem Mattermost-eigenen Server und bietet eigene "Teams" aka separate Umgebungen für Gruppierungen, komplett mit eigenem Mitgliederstamm, eigenem "Marktplatz" (alle Mitglieder bekommen diese Nachrichten) und Team-übergreifenden Nachrichten.

Aus diesem Grund habe ich mich schon vor vielen Jahren für Mattermost entschieden und wir fahren immer noch sehr gut damit. Mittlerweile in einem Docker Container und über Gitlab Anmeldung kostenfrei am AD hängend (normalerweise ein kostenpflichtiges Enterprise Feature).
 
Auch wenns nichts zum Problem beiträgt, ist wichtig zu Rocket Chat zu wissen:
- die Community Version bietet nur bis zu 10.000 Push-Benachrichtigungen pro Monat. Das mag nach viel klingen, aber wenn man in einem mittelgroßen Server in eine größere Gruppe oder den ganzen Server schreibt, hat man auf einen Schlag Dutzende oder hundert Push Notifikationen mit einer Nachricht weg.
- Es gibt nur einen "Server", d.h. alle tummeln sich in der gleichen Umgebung.

Der Mitbewerber https://mattermost.com/ macht das besser: er hat keine Push Limitationen mit dem Mattermost-eigenen Server und bietet eigene "Teams" aka separate Umgebungen für Gruppierungen, komplett mit eigenem Mitgliederstamm, eigenem "Marktplatz" (alle Mitglieder bekommen diese Nachrichten) und Team-übergreifenden Nachrichten.

Aus diesem Grund habe ich mich schon vor vielen Jahren für Mattermost entschieden und wir fahren immer noch sehr gut damit. Mittlerweile in einem Docker Container und über Gitlab Anmeldung kostenfrei am AD hängend (normalerweise ein kostenpflichtiges Enterprise Feature).
Danke für die Anregung. Aber Rocketchat läuft in einem wirklich megakleinen Rahmen bei mir. DAs reicht definitiv aus :)
 
Back
Top