#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 на хостнейм публичного хоста.