#1894: Настройка публичного виджета веб-чата для Swarmica, установленной во внутреннем контуре.

Отредактирована: сегодня

Инструкция

В данной статье описан способ с применением промежуточного публичного хоста, который будет выступать в роли reverse proxy. При этом Swarmica установлена и работает во внутренней сети.

Основная идея в том, что для публичного виджета веб-чата необходимо проксировать следующие эндпоинты:

/ws/
/widgets/
/attachments/
/api/users/
/api/instance/
/api/chats
/api/groups
/api/surveys
/api/brands
/api/channels
/api/token/
/api/auth/anonymous
/api/auth/otp/code/login

Также необходимо переопределить host и передать оригинальные и прокси заголовки на внутренний хост.

Далее описана инструкция на примере Traefik в качестве reverse proxy.

Требования к публичному хосту:

  • ОС: Ubuntu 24.04
  • Имеет публичный IP, на который указывает соответствующая DNS-запись.
  • Имеет доступ к внутренней сети и может резолвить доменное имя установки Swarmica во внутренний IP(через внутренний DNS или запись в /etc/hosts)
  • Открыты порты 80 и 443

Настройка публичного хоста

1. Подключитесь к публичному хосту по SSH как root пользователь

2. Установите необходимые пакеты:

apt install docker.io docker-compose-v2

3. Создайте папку /opt/pub-proxy:

mkdir /opt/pub-proxy 

4. Создайте файл /opt/pub-proxy/docker-compose.yml со следующим содержимым:

version: '3.8'

services:
  traefik:
    image: traefik:v3.7
    container_name: traefik-public
    restart: unless-stopped
    command:
      - "--providers.file=true"
      - "--providers.file.filename=/etc/traefik/dynamic.yml"
      - "--entrypoints.web.address=:80"
      - "--entrypoints.websecure.address=:443"
      - "--certificatesresolvers.letsencrypt.acme.tlschallenge=true"
      - "--certificatesresolvers.letsencrypt.acme.email=<EMAIL_ADDRESS>"                # укажите реально существующий email
      - "--certificatesresolvers.letsencrypt.acme.storage=/letsencrypt/acme.json"
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - "./dynamic.yml:/etc/traefik/dynamic.yml:ro"
      - "./letsencrypt:/letsencrypt"

Замените <EMAIL_ADDRESS> реально существующим email адресом.

5. Cоздайте файл /opt/pub-proxy/dynamic.yml со следующим содержимым:

http:
  routers:
    widget-public:
      rule: "Host(`<PUBLIC_HOSTNAME>`) && (PathPrefix(`/widgets/`) || PathPrefix(`/ws/`) || PathPrefix(`/attachments/`) || PathPrefix(`/api/chats`) || PathPrefix(`/api/users`) || PathPrefix(`/api/groups`) || PathPrefix(`/api/surveys`) || PathPrefix(`/api/brands`) || PathPrefix(`/api/channels`) || Path(`/api/instance/`) || Path(`/api/token/`) || Path(`/api/auth/anonymous`) || Path(`/api/auth/otp/code/login`))"
      entryPoints: ["websecure"]
      tls:
        certResolver: letsencrypt
      service: backend
      middlewares: ["set-swarmica-host"]

  services:
    backend:
      loadBalancer:
        servers:
          - url: "https://<SWARMICA_HOSTNAME>:443"
        passHostHeader: false

  middlewares:
    set-swarmica-host:
      headers:
        customRequestHeaders:
          Host: "<SWARMICA_HOSTNAME>"

Замените

<PUBLIC_HOSTNAME> на хостнейм публичного хоста(reverse proxy).

<SWARMICA_HOSTNAME> на хостнейм Swarmica во внутренней сети.

6. Запустите сервис traefik:

cd /opt/pub-proxy/
docker compose pull && docker compose up -d

Настройка веб-виджета чата

1. Настройте веб-виджет в Swarmica

2. В коде встраивания виджета замените хостнейм Swarmica на хостнейм публичного хоста.