Hvordan kan vi hjælpe?

Fortæl os kort, hvad det drejer sig om – vi vender tilbage på e-mail.

This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.
Til startsiden

Vlastní doména a first-party proxy

Jak poskytovat soubory widgetu, připojení chatu, offline formulář a Smart Answer přes subdoménu svého webu — s klíčem proxy, skutečnou adresou návštěvníka a šablonami pro nginx, Apache a Caddy.

S vlastní doménou běží chat přes subdoménu vašeho webu, například chat.your-company.com. Váš server přijímá požadavky widgetu a jako reverzní proxy je předává reactive.chat. Tato stránka je určena tomu, kdo server provozuje. Krátká verze pro redaktory je pod Vlastní doména (first-party).

Co běží přes subdoménu

Co získáte:

Co to neznamená:

Požadavky

Nastavení

  1. V účtu otevřete projekt, část Vložení → Nastavit vlastní doménu.
  2. Pod 1. Hostitel zadejte název, například chat.your-company.com, a uložte.
  3. Pod 2. Klíč proxy klikněte na Vytvořit klíč. Klíč začíná rcpx_ a zobrazí se právě jednou; ukládá se jen hash. Patří výhradně do konfigurace proxy — nikdy na webovou stránku, do skriptu prohlížeče ani do repozitáře.
  4. Pod 3. Konfigurace serveru převezměte šablonu pro váš server. Ihned po vytvoření klíče ho obsahuje; později ukazuje __RC_PROXY_KEY__. Otestujte konfiguraci (nginx -t nebo apachectl configtest) a znovu načtěte server.
  5. Pod 5. Kontrola klikněte na Zkontrolovat nyní (nejvýše každých 10 sekund). Žádná zpráva se nevytvoří.
  6. Teprve když všech pět kroků kontroly ukazuje „OK“, nahraďte kód kódem z 4. Vkládací kód:
<script src="https://chat.your-company.com/loader.js"
        data-rc-site-key="SITE_KEY"
        data-rc-ws-url="wss://chat.your-company.com/rc_wss/"
        async></script>

Widget přebírá umístění souborů ze src, připojení chatu z data-rc-ws-url a z něj odvozuje adresy offline formuláře, nahrávání a zálohy přes HTTP. Všechny ostatní atributy zůstávají stejné (Referenční přehled značky script).

Co musí proxy předávat

Pro všechny cesty:

Pro /rc_wss/, /api/offline/ a /api/suche/ proxy v každém požadavku nastavuje dvě hlavičky:

„Nastavuje“ znamená: cokoli prohlížeč odešle pod těmito názvy, se přepíše. Na cestě do distribuční sítě se obě mažou.

Za nástrojem pro vyvažování zátěže nebo CDN vidí proxy nejprve adresu tohoto zařízení. Pak nastavte přebírání skutečné adresy: nginx real_ip (set_real_ip_from, real_ip_header), Apache mod_remoteip (RemoteIPHeader, RemoteIPTrustedProxy), Caddy trusted_proxies a {client_ip} místo {remote_host}. Kontrola tento případ nerozpozná — vidí jen, že je nastavena platná adresa.

Šablona nginx

Stránka účtu už vyplňuje hostitele, cílové adresy a klíč — nejlepší je zkopírovat šablonu odtamtud. Zdejší verze slouží jako reference; zástupné hodnoty jsou chat.your-company.com, SITE_KEY a __RC_PROXY_KEY__. Na RHEL/CentOS je sada certifikátů CA v /etc/pki/tls/certs/ca-bundle.crt.

server {
    listen 80;
    listen [::]:80;
    server_name chat.your-company.com;
    location /.well-known/acme-challenge/ { root /var/www/html; }
    location / { return 301 https://$host$request_uri; }
}

server {
    listen 443 ssl;
    listen [::]:443 ssl;
    server_name chat.your-company.com;

    ssl_certificate     /etc/letsencrypt/live/chat.your-company.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/chat.your-company.com/privkey.pem;

    # HTTP fallback (SSE / long polling): token in the query, do not log
    location /rc_wss/h/ {
        access_log off;
        proxy_pass https://ws.reactive.chat/rc_wss/h/;
        proxy_http_version 1.1;
        proxy_set_header Connection "";
        proxy_set_header Host ws.reactive.chat;
        proxy_ssl_server_name on;
        proxy_ssl_name ws.reactive.chat;
        proxy_ssl_verify on;
        proxy_ssl_verify_depth 3;
        proxy_ssl_trusted_certificate /etc/ssl/certs/ca-certificates.crt;
        proxy_set_header X-RC-Proxy-Key "__RC_PROXY_KEY__";
        proxy_set_header X-RC-Client-IP $remote_addr;
        proxy_set_header Cookie "";
        proxy_set_header Authorization "";
        proxy_read_timeout 3600s;
        proxy_send_timeout 3600s;
        proxy_buffering off;
        proxy_cache off;
    }

    # Chat connection (WebSocket) and uploads
    location /rc_wss/ {
        proxy_pass https://ws.reactive.chat/rc_wss/;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_set_header Host ws.reactive.chat;
        proxy_ssl_server_name on;
        proxy_ssl_name ws.reactive.chat;
        proxy_ssl_verify on;
        proxy_ssl_verify_depth 3;
        proxy_ssl_trusted_certificate /etc/ssl/certs/ca-certificates.crt;
        proxy_set_header X-RC-Proxy-Key "__RC_PROXY_KEY__";
        proxy_set_header X-RC-Client-IP $remote_addr;
        proxy_set_header Cookie "";
        proxy_set_header Authorization "";
        proxy_read_timeout 3600s;
        proxy_send_timeout 3600s;
        proxy_buffering off;
        proxy_cache off;
        client_max_body_size 32m;
        proxy_request_buffering off;
    }

    # Offline form
    location /api/offline/ {
        proxy_pass https://ws.reactive.chat/api/offline/;
        proxy_http_version 1.1;
        proxy_set_header Connection "";
        proxy_set_header Host ws.reactive.chat;
        proxy_ssl_server_name on;
        proxy_ssl_name ws.reactive.chat;
        proxy_ssl_verify on;
        proxy_ssl_verify_depth 3;
        proxy_ssl_trusted_certificate /etc/ssl/certs/ca-certificates.crt;
        proxy_set_header X-RC-Proxy-Key "__RC_PROXY_KEY__";
        proxy_set_header X-RC-Client-IP $remote_addr;
        proxy_set_header Cookie "";
        proxy_set_header Authorization "";
        proxy_hide_header Set-Cookie;
        client_max_body_size 32k;
        proxy_read_timeout 30s;
    }

    # Smart Answer (website search), answer as a stream
    location /api/suche/ {
        proxy_pass https://ws.reactive.chat/api/suche/;
        proxy_http_version 1.1;
        proxy_set_header Connection "";
        proxy_set_header Host ws.reactive.chat;
        proxy_ssl_server_name on;
        proxy_ssl_name ws.reactive.chat;
        proxy_ssl_verify on;
        proxy_ssl_verify_depth 3;
        proxy_ssl_trusted_certificate /etc/ssl/certs/ca-certificates.crt;
        proxy_set_header X-RC-Proxy-Key "__RC_PROXY_KEY__";
        proxy_set_header X-RC-Client-IP $remote_addr;
        proxy_set_header Cookie "";
        proxy_set_header Authorization "";
        proxy_hide_header Set-Cookie;
        client_max_body_size 8k;
        proxy_buffering off;
        proxy_cache off;
        proxy_read_timeout 120s;
    }

    # Widget files
    location / {
        proxy_pass https://cdn.reactive.chat/;
        proxy_http_version 1.1;
        proxy_set_header Connection "";
        proxy_set_header Host cdn.reactive.chat;
        proxy_ssl_server_name on;
        proxy_ssl_name cdn.reactive.chat;
        proxy_ssl_verify on;
        proxy_ssl_verify_depth 3;
        proxy_ssl_trusted_certificate /etc/ssl/certs/ca-certificates.crt;
        proxy_set_header X-RC-Proxy-Key "";
        proxy_set_header X-RC-Client-IP "";
        proxy_set_header Cookie "";
        proxy_set_header Authorization "";
        proxy_hide_header Set-Cookie;
    }
}

Šablona Apache (2.4.47 nebo novější)

Pouze VirtualHost pro port 443; přesměrování z portu 80 a certifikát nastavte jako u ostatních hostitelů. SSLProxyVerifyDepth 5 je nutné — jinak Apache ověřuje řetězec cíle jen do jedné úrovně a hlásí „Certificate Chain too long“.

<VirtualHost *:443>
    ServerName chat.your-company.com

    SetEnvIf Request_URI "^/rc_wss/h/" rc_no_log
    CustomLog ${APACHE_LOG_DIR}/chat.your-company.com_access.log combined env=!rc_no_log

    SSLEngine on
    SSLCertificateFile    /etc/letsencrypt/live/chat.your-company.com/fullchain.pem
    SSLCertificateKeyFile /etc/letsencrypt/live/chat.your-company.com/privkey.pem

    SSLProxyEngine on
    SSLProxyVerify require
    SSLProxyVerifyDepth 5
    SSLProxyCheckPeerName on
    SSLProxyCACertificateFile /etc/ssl/certs/ca-certificates.crt
    ProxyRequests Off
    ProxyPreserveHost Off
    ProxyAddHeaders Off

    RequestHeader unset X-RC-Proxy-Key early
    RequestHeader unset X-RC-Client-IP early
    RequestHeader unset Cookie early
    RequestHeader unset Authorization early

    ProxyPass "/rc_wss/"      "https://ws.reactive.chat/rc_wss/" upgrade=websocket timeout=3600 flushpackets=on
    ProxyPass "/api/offline/" "https://ws.reactive.chat/api/offline/" timeout=30
    ProxyPass "/api/suche/"   "https://ws.reactive.chat/api/suche/" timeout=120 flushpackets=on
    ProxyPass "/"             "https://cdn.reactive.chat/"

    <Location "/rc_wss/">
        RequestHeader set X-RC-Proxy-Key "__RC_PROXY_KEY__"
        RequestHeader set X-RC-Client-IP "expr=%{REMOTE_ADDR}"
    </Location>
    <Location "/api/offline/">
        RequestHeader set X-RC-Proxy-Key "__RC_PROXY_KEY__"
        RequestHeader set X-RC-Client-IP "expr=%{REMOTE_ADDR}"
        Header unset Set-Cookie
    </Location>
    <Location "/api/suche/">
        RequestHeader set X-RC-Proxy-Key "__RC_PROXY_KEY__"
        RequestHeader set X-RC-Client-IP "expr=%{REMOTE_ADDR}"
        Header unset Set-Cookie
    </Location>
</VirtualHost>

Apache před 2.4.47 nezná upgrade=websocket. V takovém případě nahraďte první řádek ProxyPass tímto:

RewriteEngine on
RewriteCond %{HTTP:Upgrade} =websocket [NC]
RewriteRule ^/rc_wss/(.*) "wss://ws.reactive.chat/rc_wss/$1" [P,L]
ProxyPass "/rc_wss/" "https://ws.reactive.chat/rc_wss/" timeout=3600 flushpackets=on

Šablona Caddy 2

header_up s hodnotou nahrazuje cokoli, co prohlížeč odeslal pod tímto názvem. Pokud zapnete přístupové protokoly, vylučte /rc_wss/h/* (log_skip, před Caddy 2.8 skip_log).

chat.your-company.com {
    handle /rc_wss/* {
        reverse_proxy https://ws.reactive.chat {
            header_up Host ws.reactive.chat
            header_up X-RC-Proxy-Key "__RC_PROXY_KEY__"
            header_up X-RC-Client-IP {remote_host}
            header_up -Cookie
            header_up -Authorization
            transport http {
                tls_server_name ws.reactive.chat
            }
            flush_interval -1
        }
    }
    handle /api/offline/* {
        reverse_proxy https://ws.reactive.chat {
            header_up Host ws.reactive.chat
            header_up X-RC-Proxy-Key "__RC_PROXY_KEY__"
            header_up X-RC-Client-IP {remote_host}
            header_up -Cookie
            header_up -Authorization
            header_down -Set-Cookie
            transport http {
                tls_server_name ws.reactive.chat
            }
        }
    }
    handle /api/suche/* {
        reverse_proxy https://ws.reactive.chat {
            header_up Host ws.reactive.chat
            header_up X-RC-Proxy-Key "__RC_PROXY_KEY__"
            header_up X-RC-Client-IP {remote_host}
            header_up -Cookie
            header_up -Authorization
            header_down -Set-Cookie
            transport http {
                tls_server_name ws.reactive.chat
            }
            flush_interval -1
        }
    }
    handle {
        reverse_proxy https://cdn.reactive.chat {
            header_up Host cdn.reactive.chat
            header_up -X-RC-Proxy-Key
            header_up -X-RC-Client-IP
            header_up -Cookie
            header_up -Authorization
            header_down -Set-Cookie
            transport http {
                tls_server_name cdn.reactive.chat
            }
        }
    }
}

Pět kroků kontroly

Každý krok ukazuje „OK“, „Chyba“, „Upozornění“ nebo „neověřeno“. Kontrola je úspěšná pouze s pěti „OK“. Kontroly používají jen HTTPS na portu 443, bez přesměrování, 5 sekund na krok.

  1. Překlad názvu – A/AAAA existuje, všechny adresy veřejné. Všechny další kroky se připojují právě k této adrese.
  2. loader.js přes vaši doménu – soubor se načte a porovná s naším. Bez připojení, odpovědi nebo platného certifikátu se zbytek kroků přeskočí. Přesměrování je chyba; odlišný soubor ukazuje na mezipaměť nebo nesprávný cíl pro /.
  3. Klíč a adresa návštěvníka – volání /rc_wss/eigene-domain-probe. Možné chyby: chybí X-RC-Proxy-Key; neznámý klíč (hned po vytvoření prodleva až 30 sekund); chybí nebo je neplatná X-RC-Client-IP; klíč patří jinému projektu. Upozornění, pokud je klíč platný, ale registrovaný pro jiného hostitele.
  4. WebSocket – wss://chat.your-company.com/rc_wss/ musí odpovědět HTTP 101 a subprotokolem rc.v1.
  5. Offline formulář – GET /api/offline/SITE_KEY musí odpovědět 405 (endpoint přijímá pouze POST; tak se nevytvoří zpráva).

Kontrolní adresu z kroku 3 můžete zavolat sami:

curl -s https://chat.your-company.com/rc_wss/eigene-domain-probe

Při správném nastavení:

{"rc":"eigene-domain-probe","v":1,"schluessel":"gueltig","client_ip":"gesetzt","site":"SITE_KEY","host":"chat.your-company.com"}

Klíč proxy

Řešení problémů

Dále: Transport a protokol · Zabezpečení a CSP

Senest opdateret: