diff --git a/docs/PRIVATE_NETWORK_BETWEEN_SERVERS.md b/docs/PRIVATE_NETWORK_BETWEEN_SERVERS.md new file mode 100644 index 0000000..c3157b3 --- /dev/null +++ b/docs/PRIVATE_NETWORK_BETWEEN_SERVERS.md @@ -0,0 +1,150 @@ +# SWChat — приватная сеть между FastPanel proxy и Core + +Если FastPanel proxy сервер и SWChat Core можно объединить в приватную локальную сеть, это предпочтительная схема. + +## Почему это лучше + +Преимущества: +- Matrix Core не светит порт `8008` в публичный интернет; +- FastPanel ходит к Synapse по внутреннему IP; +- меньше зависимость от публичного firewall; +- проще ограничить доступ; +- безопаснее для production; +- ниже риск случайного сканирования Matrix endpoint. + +## Рекомендуемая схема + +```text +Пользователь + ↓ HTTPS +matrix.stackworks.ru + ↓ +FastPanel/Nginx reverse proxy + ↓ private network +CORE_PRIVATE_IP:8008 + ↓ +SWChat Core / Synapse +``` + +## DNS + +Публичные DNS-записи остаются на FastPanel proxy сервер: + +```text +matrix.stackworks.ru A FASTPANEL_PUBLIC_IP +chat.stackworks.ru A FASTPANEL_PUBLIC_IP +``` + +Core-сервер не обязан иметь публичный домен для Matrix API. + +## Core-сервер + +На Core-сервере нужно узнать приватный IP: + +```bash +ip -4 addr +ip route +``` + +Пример приватного IP: + +```text +10.10.0.12 +``` + +## FastPanel-сервер + +С FastPanel-сервера проверить доступ до Core по приватному IP: + +```bash +ping CORE_PRIVATE_IP +curl http://CORE_PRIVATE_IP:8008/_matrix/client/versions +``` + +Ожидается JSON Matrix API. + +## Nginx proxy для FastPanel + +Для `matrix.stackworks.ru` использовать приватный IP Core-сервера: + +```nginx +location / { + proxy_pass http://CORE_PRIVATE_IP:8008; + + proxy_http_version 1.1; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto https; + + client_max_body_size 100M; + proxy_read_timeout 600s; + proxy_send_timeout 600s; +} +``` + +## Firewall на Core + +Разрешить порт 8008 только с приватного IP FastPanel-сервера. + +```bash +ufw allow from FASTPANEL_PRIVATE_IP to any port 8008 proto tcp +ufw deny 8008/tcp +ufw status numbered +``` + +Если сервис слушает `127.0.0.1:8008`, FastPanel не сможет подключиться по приватной сети. В этом случае нужно пробросить Synapse на приватный IP или на `0.0.0.0:8008`, но закрыть firewall для всех кроме FastPanel private IP. + +## Важное замечание про docker-compose + +Текущий compose публикует Synapse так: + +```yaml +ports: + - '127.0.0.1:8008:8008' +``` + +Для приватной сети потребуется изменить на один из вариантов: + +```yaml +ports: + - 'CORE_PRIVATE_IP:8008:8008' +``` + +или: + +```yaml +ports: + - '8008:8008' +``` + +Второй вариант допустим только при строгом firewall. + +## Выбранная рекомендация + +Предпочтительно: + +```yaml +ports: + - 'CORE_PRIVATE_IP:8008:8008' +``` + +Так Synapse будет доступен только по приватному интерфейсу. + +## Проверка + +С FastPanel proxy сервера: + +```bash +curl http://CORE_PRIVATE_IP:8008/_matrix/client/versions +``` + +С внешнего интернета прямой доступ к Core:8008 должен быть закрыт. + +Публичная проверка: + +```bash +curl https://matrix.stackworks.ru/_matrix/client/versions +``` + +Ожидается JSON Matrix API.