Kako Vam možemo pomoći?

Ukratko nam opišite o čemu se radi – javit ćemo Vam se e-poštom.

This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.
Na početnu stranicu

Domínio próprio e proxy first-party

Como servir os arquivos do widget, a conexão do chat, o formulário offline e o Smart Answer por um subdomínio do seu site, com chave de proxy, endereço real do visitante e modelos prontos para nginx, Apache e Caddy.

Com um domínio próprio, o chat funciona por um subdomínio do seu site, por exemplo, chat.your-company.com. Seu servidor recebe as requisições do widget e as encaminha ao reactive.chat como proxy reverso. Esta página se destina à pessoa que administra esse servidor. A versão resumida para editores está em Domínio próprio (first-party).

O que passa pelo subdomínio

O que você ganha:

O que isso não significa:

Requisitos

Configuração

  1. Na conta, abra o projeto, seção Incorporar → Configurar seu domínio próprio.
  2. Em 1. Host, informe o nome, por exemplo, chat.your-company.com, e salve.
  3. Em 2. Chave de proxy, clique em Gerar chave. A chave começa com rcpx_ e é exibida exatamente uma vez; apenas um hash é armazenado. Ela deve ficar exclusivamente na configuração do proxy, nunca em uma página da web, script de navegador ou repositório.
  4. Em 3. Configuração do servidor, use o modelo do seu servidor. Logo após gerar a chave, ele a contém; depois, mostra __RC_PROXY_KEY__. Teste a configuração (nginx -t ou apachectl configtest) e recarregue o servidor.
  5. Em 5. Verificação, clique em Verificar agora (no máximo a cada 10 segundos). Nenhuma mensagem é criada.
  6. Somente quando todas as cinco etapas de verificação mostrarem “OK”, substitua o código de incorporação pelo de 4. Código de incorporação:
<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>

O widget obtém o local dos arquivos de src e a conexão do chat de data-rc-ws-url; a partir dela, deduz os endereços do formulário offline, dos uploads e do fallback HTTP. Todos os outros atributos permanecem como estão (Referência da tag script).

O que o proxy deve encaminhar

Para todas as rotas:

Para /rc_wss/, /api/offline/ e /api/suche/, o proxy define dois cabeçalhos em cada requisição:

“Define” significa que qualquer valor enviado pelo navegador com esses nomes é sobrescrito. Na rota para a rede de distribuição, ambos são removidos.

Atrás de um balanceador de carga ou CDN, seu proxy vê primeiro o endereço desse dispositivo. Nesse caso, configure o uso do endereço real: nginx real_ip (set_real_ip_from, real_ip_header), Apache mod_remoteip (RemoteIPHeader, RemoteIPTrustedProxy), Caddy trusted_proxies e {client_ip} em vez de {remote_host}. A verificação não detecta esse caso; ela só vê que um endereço válido foi definido.

Modelo nginx

A página da conta já preenche o host, os endereços de destino e a chave; o melhor é copiar o modelo de lá. A versão aqui serve de referência; os marcadores são chat.your-company.com, SITE_KEY e __RC_PROXY_KEY__. No RHEL/CentOS, o pacote de certificados de AC fica em /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;
    }
}

Modelo Apache (2.4.47 ou posterior)

Apenas o VirtualHost da porta 443; configure o redirecionamento da porta 80 e o certificado como nos seus outros hosts. SSLProxyVerifyDepth 5 é obrigatório; caso contrário, o Apache verifica apenas um nível da cadeia do destino e informa “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>

O Apache anterior à versão 2.4.47 não reconhece upgrade=websocket. Nesse caso, substitua a primeira linha ProxyPass por:

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

Modelo Caddy 2

header_up com um valor substitui o que o navegador enviou com esse nome. Se ativar logs de acesso, exclua /rc_wss/h/* (log_skip; antes do 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
            }
        }
    }
}

As cinco etapas de verificação

Cada etapa mostra “OK”, “Erro”, “Aviso” ou “não verificado”. A verificação só passa com cinco resultados “OK”. As verificações usam somente HTTPS na porta 443, sem redirecionamentos, com 5 segundos por etapa.

  1. Resolução de nomes – registros A/AAAA presentes, todos os endereços públicos. Todas as etapas seguintes se conectam exatamente a esse endereço.
  2. loader.js pelo seu domínio – o arquivo é carregado e comparado com o nosso. Sem conexão, resposta ou certificado válido, as etapas restantes são ignoradas. Um redirecionamento é um erro; um arquivo diferente indica um cache ou um destino incorreto para /.
  3. Chave e endereço do visitante – chamada de /rc_wss/eigene-domain-probe. Erros possíveis: X-RC-Proxy-Key ausente; chave desconhecida (logo após criá-la, pode haver um atraso de até 30 segundos); X-RC-Client-IP ausente ou inválido; a chave pertence a outro projeto. Há um aviso se a chave for válida, mas estiver cadastrada para outro host.
  4. WebSocket – wss://chat.your-company.com/rc_wss/ deve responder com HTTP 101 e o subprotocolo rc.v1.
  5. Formulário offline – GET /api/offline/SITE_KEY deve responder com 405 (o endpoint só aceita POST; assim, nenhuma mensagem é criada).

Você pode chamar por conta própria o endereço de verificação da etapa 3:

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

Quando configurado corretamente:

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

A chave de proxy

Solução de problemas

A seguir: Transporte e protocolo · Segurança e CSP

Zadnje ažurirano: