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

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

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

```txt
/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 и передать оригинальные и прокси заголовки на внутренний хост.

:::caution
Далее описана инструкция на примере [Traefik](https://traefik.io/traefik) в качестве reverse proxy.
:::

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

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

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

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

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

```bash
apt install docker.io docker-compose-v2
```

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

```bash
mkdir /opt/pub-proxy 
```

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

```yaml
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 `со следующим содержимым:

```yaml
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:

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

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

1\. Настройте [веб-виджет в Swarmica](https://support.swarmica.com/article/ru/599-vstraivaemyj-veb-vidzhet.html)

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