Продолжен журнал .sw для версии 0.1.2
Этот коммит содержится в:
+276
-220
@@ -1,11 +1,64 @@
|
|||||||
# Pulse — журнал проекта
|
# Pulse — журнал проекта
|
||||||
|
|
||||||
Дата старта: 2026-05-08
|
Дата старта: 2026-05-08
|
||||||
Репозиторий: https://github.com/viktor138irk/SWChat
|
Репозиторий Core/backend/docs: https://github.com/viktor138irk/SWChat
|
||||||
|
Репозиторий App/client: https://github.com/viktor138irk/SWChat-App
|
||||||
Рабочее имя продукта: Pulse
|
Рабочее имя продукта: Pulse
|
||||||
Прежнее рабочее имя: SWChat
|
Прежнее рабочее имя: SWChat
|
||||||
|
Брендовая формула: Pulse by StackWorks
|
||||||
Проект: собственный мессенджер Android/Web на базе Matrix-сервера.
|
Проект: собственный мессенджер Android/Web на базе Matrix-сервера.
|
||||||
|
|
||||||
|
## Главное правило проекта
|
||||||
|
|
||||||
|
Не ломать существующие проекты на сервере.
|
||||||
|
|
||||||
|
Защищённые production-активы:
|
||||||
|
- ArtistFlow / artistflow.ru;
|
||||||
|
- основной виджет StackWorks / https://widget.stackworks.ru/;
|
||||||
|
- текущие сайты и домены FastPanel.
|
||||||
|
|
||||||
|
Запрещено без отдельной явной команды пользователя:
|
||||||
|
- менять настройки FastPanel;
|
||||||
|
- менять vhost/config доменов FastPanel;
|
||||||
|
- применять proxy-настройки в FastPanel;
|
||||||
|
- перезаписывать nginx-конфиги, которыми управляет FastPanel;
|
||||||
|
- перезапускать/переустанавливать FastPanel;
|
||||||
|
- ставить новый Nginx поверх FastPanel;
|
||||||
|
- менять SSL-сертификаты через FastPanel;
|
||||||
|
- менять webroot существующих сайтов;
|
||||||
|
- трогать production-домены;
|
||||||
|
- менять vhost/config домена widget.stackworks.ru;
|
||||||
|
- менять webroot виджета;
|
||||||
|
- затирать файлы виджета;
|
||||||
|
- интегрировать widget.stackworks.ru с Matrix;
|
||||||
|
- создавать новый параллельный виджет для Pulse;
|
||||||
|
- менять vhost/config домена artistflow.ru;
|
||||||
|
- трогать MySQL/БД ArtistFlow.
|
||||||
|
|
||||||
|
Разрешено:
|
||||||
|
- готовить инструкции;
|
||||||
|
- готовить шаблоны proxy-конфигов;
|
||||||
|
- готовить безопасные команды проверки;
|
||||||
|
- готовить backup/firewall-скрипты;
|
||||||
|
- описывать, что пользователь может сделать вручную в FastPanel.
|
||||||
|
|
||||||
|
## Постоянное правило ведения .sw
|
||||||
|
|
||||||
|
Файл `.sw` является главным журналом проекта и ведётся постоянно.
|
||||||
|
|
||||||
|
Обязательно записывать в `.sw`:
|
||||||
|
- каждый значимый шаг разработки;
|
||||||
|
- архитектурные решения;
|
||||||
|
- запреты и ограничения;
|
||||||
|
- защищённые домены и сервисы;
|
||||||
|
- изменения версий;
|
||||||
|
- что было создано или изменено;
|
||||||
|
- текущий статус;
|
||||||
|
- следующий шаг;
|
||||||
|
- важные ошибки и выводы после исправлений.
|
||||||
|
|
||||||
|
В новом диалоге продолжение проекта начинается с чтения `.sw`.
|
||||||
|
|
||||||
## Решение по названию
|
## Решение по названию
|
||||||
|
|
||||||
2026-05-09 зафиксировано новое рабочее имя пользовательского продукта:
|
2026-05-09 зафиксировано новое рабочее имя пользовательского продукта:
|
||||||
@@ -25,20 +78,11 @@ Pulse by StackWorks
|
|||||||
- App/client: https://github.com/viktor138irk/SWChat-App
|
- App/client: https://github.com/viktor138irk/SWChat-App
|
||||||
|
|
||||||
Технические имена пакетов не переименовывать без отдельного этапа миграции:
|
Технические имена пакетов не переименовывать без отдельного этапа миграции:
|
||||||
- Dart package name в pubspec.yaml пока должен оставаться `fluffychat`, пока все импорты используют `package:fluffychat/...`;
|
- Dart package name в `pubspec.yaml` пока должен оставаться `fluffychat`, пока все импорты используют `package:fluffychat/...`;
|
||||||
- Android applicationId пока: `ru.stackworks.swchat`;
|
- Android applicationId пока: `ru.stackworks.swchat`;
|
||||||
- Android namespace пока: `ru.stackworks.swchat`;
|
- Android namespace пока: `ru.stackworks.swchat`;
|
||||||
- рабочий Android entrypoint может временно оставаться на legacy package, если это нужно для стабильного запуска.
|
- рабочий Android entrypoint может временно оставаться на legacy package, если это нужно для стабильного запуска.
|
||||||
|
|
||||||
## Главное правило проекта
|
|
||||||
|
|
||||||
Не ломать существующие проекты на сервере.
|
|
||||||
|
|
||||||
Защищённые production-активы:
|
|
||||||
- ArtistFlow / artistflow.ru;
|
|
||||||
- основной виджет StackWorks / https://widget.stackworks.ru/;
|
|
||||||
- текущие сайты и домены FastPanel.
|
|
||||||
|
|
||||||
## Карта ребрендинга
|
## Карта ребрендинга
|
||||||
|
|
||||||
Места, которые надо учитывать при ребрендинге Pulse/SWChat/другого будущего имени:
|
Места, которые надо учитывать при ребрендинге Pulse/SWChat/другого будущего имени:
|
||||||
@@ -94,131 +138,6 @@ add account routes
|
|||||||
- Dart package name и массовые импорты менять только отдельным этапом автоматической миграции;
|
- Dart package name и массовые импорты менять только отдельным этапом автоматической миграции;
|
||||||
- не менять `pubspec.yaml name` на новое имя, пока все импорты не переведены с `package:fluffychat/...`.
|
- не менять `pubspec.yaml name` на новое имя, пока все импорты не переведены с `package:fluffychat/...`.
|
||||||
|
|
||||||
## Клиентские репозитории
|
|
||||||
|
|
||||||
Клиентское приложение вынесено отдельно от Core:
|
|
||||||
- Core/backend/docs: https://github.com/viktor138irk/SWChat
|
|
||||||
- App/client: https://github.com/viktor138irk/SWChat-App
|
|
||||||
|
|
||||||
SWChat-App создан как отдельный репозиторий для Flutter/FluffyChat клиента.
|
|
||||||
FluffyChat импортирован в SWChat-App.
|
|
||||||
Найден pubspec.yaml upstream FluffyChat: name fluffychat, version 2.6.0+3553, Flutter/Dart SDK >=3.11.1 <4.0.0.
|
|
||||||
|
|
||||||
## Android package id
|
|
||||||
|
|
||||||
Принятое текущее Android package/applicationId:
|
|
||||||
|
|
||||||
```text
|
|
||||||
ru.stackworks.swchat
|
|
||||||
```
|
|
||||||
|
|
||||||
До отдельного package migration не менять на Pulse автоматически, чтобы не сломать сборку и запуск.
|
|
||||||
|
|
||||||
## Регистрация и поиск людей
|
|
||||||
|
|
||||||
В будущем клиенте Pulse регистрация должна быть доступна прямо из приложения.
|
|
||||||
|
|
||||||
Пользовательский UX:
|
|
||||||
- регистрация через приложение без консольных команд;
|
|
||||||
- обычный логин/ник, без ручного ввода домена;
|
|
||||||
- приложение само формирует Matrix user_id вида @username:matrix.stackworks.ru;
|
|
||||||
- поиск людей по нику, имени, телефону или внутреннему Pulse ID;
|
|
||||||
- пользователь не должен вводить @user:matrix.stackworks.ru вручную;
|
|
||||||
- кнопка «Написать» должна автоматически создавать direct room;
|
|
||||||
- контакты и поиск должны выглядеть как в обычном Telegram-like мессенджере.
|
|
||||||
|
|
||||||
Техническая схема:
|
|
||||||
- включить controlled registration или сделать регистрацию через отдельный Pulse backend;
|
|
||||||
- backend создаёт Matrix-пользователя через Synapse Admin/Register API;
|
|
||||||
- backend хранит публичный профиль Pulse: display_name, username, phone/email optional, avatar, статус;
|
|
||||||
- поиск людей лучше делать через свой backend/index, а не напрямую через сырой Matrix room/user lookup;
|
|
||||||
- Matrix user_id и домен остаются внутренней технической деталью.
|
|
||||||
|
|
||||||
## Админка Pulse
|
|
||||||
|
|
||||||
Админка нужна обязательно и должна быть отдельным модулем поверх Matrix/Synapse Admin API.
|
|
||||||
|
|
||||||
Назначение админки:
|
|
||||||
- управление пользователями;
|
|
||||||
- создание/блокировка/разблокировка пользователей;
|
|
||||||
- сброс паролей;
|
|
||||||
- назначение и снятие admin-флага;
|
|
||||||
- просмотр профилей и устройств;
|
|
||||||
- управление чатами/группами;
|
|
||||||
- модерация жалоб;
|
|
||||||
- просмотр базовой статистики;
|
|
||||||
- настройки регистрации;
|
|
||||||
- настройки homeserver;
|
|
||||||
- управление TURN/STUN после добавления звонков;
|
|
||||||
- диагностика состояния Synapse/PostgreSQL/proxy.
|
|
||||||
|
|
||||||
## Текущая архитектура установки
|
|
||||||
|
|
||||||
Принято решение ставить Core на отдельный новый сервер.
|
|
||||||
|
|
||||||
Разделение:
|
|
||||||
- новый сервер: Matrix Synapse, PostgreSQL, TURN/STUN, backend, media storage, backups;
|
|
||||||
- FastPanel-сервер: домены, frontend/web-client, публичная витрина и reverse proxy, без размещения PostgreSQL/TURN и без вмешательства в чужие production-проекты.
|
|
||||||
|
|
||||||
## Стратегия тестирования
|
|
||||||
|
|
||||||
Сначала Core тестируется через официальные Matrix-клиенты.
|
|
||||||
Собственный клиент не писать, пока не подтверждено, что серверная часть работает стабильно через официальные клиенты.
|
|
||||||
|
|
||||||
## Жёсткое правило про FastPanel
|
|
||||||
|
|
||||||
Самостоятельно не трогать всё, что касается FastPanel.
|
|
||||||
|
|
||||||
Запрещено без отдельной явной команды пользователя:
|
|
||||||
- менять настройки FastPanel;
|
|
||||||
- менять vhost/config доменов FastPanel;
|
|
||||||
- применять proxy-настройки в FastPanel;
|
|
||||||
- перезаписывать nginx-конфиги, которыми управляет FastPanel;
|
|
||||||
- перезапускать/переустанавливать FastPanel;
|
|
||||||
- ставить новый Nginx поверх FastPanel;
|
|
||||||
- менять SSL-сертификаты через FastPanel;
|
|
||||||
- менять webroot существующих сайтов;
|
|
||||||
- трогать production-домены.
|
|
||||||
|
|
||||||
Разрешено:
|
|
||||||
- готовить инструкции;
|
|
||||||
- готовить шаблоны proxy-конфигов;
|
|
||||||
- готовить безопасные команды проверки;
|
|
||||||
- готовить backup-скрипты;
|
|
||||||
- описывать, что пользователь может сделать вручную в FastPanel.
|
|
||||||
|
|
||||||
## Постоянное правило ведения .sw
|
|
||||||
|
|
||||||
Файл .sw является главным журналом проекта и ведётся постоянно.
|
|
||||||
|
|
||||||
Обязательно записывать в .sw:
|
|
||||||
- каждый значимый шаг разработки;
|
|
||||||
- архитектурные решения;
|
|
||||||
- запреты и ограничения;
|
|
||||||
- защищённые домены и сервисы;
|
|
||||||
- изменения версий;
|
|
||||||
- что было создано или изменено;
|
|
||||||
- текущий статус;
|
|
||||||
- следующий шаг;
|
|
||||||
- важные ошибки и выводы после исправлений.
|
|
||||||
|
|
||||||
В новом диалоге продолжение проекта начинается с чтения .sw.
|
|
||||||
|
|
||||||
## Защищённые проекты
|
|
||||||
|
|
||||||
widget.stackworks.ru — отдельный действующий production-проект StackWorks.
|
|
||||||
ArtistFlow должен оставаться нетронутым.
|
|
||||||
|
|
||||||
Запрещено без отдельной явной команды:
|
|
||||||
- менять vhost/config домена widget.stackworks.ru;
|
|
||||||
- менять webroot виджета;
|
|
||||||
- затирать файлы виджета;
|
|
||||||
- менять SSL и настройки домена;
|
|
||||||
- интегрировать виджет с Matrix;
|
|
||||||
- создавать новый параллельный виджет для Pulse;
|
|
||||||
- менять vhost/config домена artistflow.ru;
|
|
||||||
- трогать MySQL/БД ArtistFlow.
|
|
||||||
|
|
||||||
## Принятая архитектура
|
## Принятая архитектура
|
||||||
|
|
||||||
Core разворачивается на отдельном сервере.
|
Core разворачивается на отдельном сервере.
|
||||||
@@ -231,42 +150,17 @@ Core разворачивается на отдельном сервере.
|
|||||||
- Android-приложение — отдельный клиент Matrix, позже брендированный под Pulse/StackWorks;
|
- Android-приложение — отдельный клиент Matrix, позже брендированный под Pulse/StackWorks;
|
||||||
- FastPanel/Nginx reverse proxy — основной публичный HTTPS слой.
|
- FastPanel/Nginx reverse proxy — основной публичный HTTPS слой.
|
||||||
|
|
||||||
## Основная публичная схема
|
Основная публичная схема:
|
||||||
|
|
||||||
Выбрана архитектура:
|
```text
|
||||||
FastPanel reverse proxy → Core.
|
пользователь → FastPanel/Nginx HTTPS → Core-сервер Matrix Synapse по private IP
|
||||||
|
```
|
||||||
|
|
||||||
Поток трафика:
|
Принято решение использовать:
|
||||||
- пользователь → FastPanel/Nginx;
|
|
||||||
- FastPanel SSL/proxy → Core-сервер Matrix Synapse;
|
|
||||||
- Synapse работает на Core через приватную сеть между серверами.
|
|
||||||
|
|
||||||
## UX-решение собственного клиента
|
```text
|
||||||
|
FastPanel reverse proxy → Core
|
||||||
В собственном приложении Pulse комнатная структура Matrix должна быть скрыта от пользователя.
|
```
|
||||||
|
|
||||||
Пользовательский интерфейс должен выглядеть как привычный Telegram-like мессенджер:
|
|
||||||
- список чатов;
|
|
||||||
- личные диалоги;
|
|
||||||
- групповые чаты;
|
|
||||||
- контакты;
|
|
||||||
- поиск людей;
|
|
||||||
- кнопка «Написать»;
|
|
||||||
- привычные аватарки, статусы, индикаторы прочтения и вложения;
|
|
||||||
- быстрый сайдбар/нижняя навигация;
|
|
||||||
- закреплённые чаты;
|
|
||||||
- архив;
|
|
||||||
- поиск по сообщениям;
|
|
||||||
- медиа/файлы внутри профиля чата.
|
|
||||||
|
|
||||||
Правило UX:
|
|
||||||
- основной ориентир интерфейса — Telegram;
|
|
||||||
- не использовать слово «комната» в пользовательском интерфейсе Pulse;
|
|
||||||
- использовать «чат», «диалог», «группа», «канал»;
|
|
||||||
- Matrix room показывать как обычный чат;
|
|
||||||
- создание direct room автоматизировать при первом сообщении контакту;
|
|
||||||
- групповой room показывать как групповую беседу;
|
|
||||||
- технические Matrix-настройки прятать в расширенные/админские разделы.
|
|
||||||
|
|
||||||
## Приватная сеть между серверами
|
## Приватная сеть между серверами
|
||||||
|
|
||||||
@@ -279,19 +173,56 @@ FastPanel proxy сервер и Core объединены в локальную
|
|||||||
Рекомендованная схема:
|
Рекомендованная схема:
|
||||||
- FastPanel proxy имеет public IP;
|
- FastPanel proxy имеет public IP;
|
||||||
- Core-сервер использует private IP 192.168.0.141;
|
- Core-сервер использует private IP 192.168.0.141;
|
||||||
- proxy_pass идёт на http://192.168.0.141:8008;
|
- proxy_pass идёт на `http://192.168.0.141:8008`;
|
||||||
- прямой доступ к Core:8008 из интернета закрыт;
|
- прямой доступ к Core:8008 из интернета закрыт;
|
||||||
- доступ к Core:8008 разрешён только с 192.168.0.221.
|
- доступ к Core:8008 разрешён только с 192.168.0.221.
|
||||||
|
|
||||||
|
В docker-compose с версии 0.1.2 порт Synapse настраивается через `.env`:
|
||||||
|
|
||||||
|
```text
|
||||||
|
MATRIX_BIND_HOST=127.0.0.1
|
||||||
|
```
|
||||||
|
|
||||||
|
Для private proxy схемы надо ставить:
|
||||||
|
|
||||||
|
```text
|
||||||
|
MATRIX_BIND_HOST=192.168.0.141
|
||||||
|
```
|
||||||
|
|
||||||
|
После изменения `.env` перезапуск:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cd /opt/swchat/source
|
||||||
|
sudo docker compose --env-file /opt/swchat/.env up -d
|
||||||
|
```
|
||||||
|
|
||||||
|
Для ограничения прямого доступа использовать:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
sudo FASTPANEL_PROXY_IP=192.168.0.221 MATRIX_PORT=8008 bash /opt/swchat/source/scripts/firewall_private_proxy.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
Проверка с FastPanel proxy:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
curl http://192.168.0.141:8008/_matrix/client/versions
|
||||||
|
```
|
||||||
|
|
||||||
|
Проверка публичного HTTPS endpoint:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
curl https://matrix.stackworks.ru/_matrix/client/versions
|
||||||
|
```
|
||||||
|
|
||||||
## DNS и wildcard-поддомены
|
## DNS и wildcard-поддомены
|
||||||
|
|
||||||
Если домен stackworks.ru и все его поддомены уже направлены wildcard-записью на FastPanel-сервер, отдельную DNS A-запись для matrix.stackworks.ru можно не создавать.
|
Если домен stackworks.ru и все его поддомены уже направлены wildcard-записью на FastPanel-сервер, отдельную DNS A-запись для matrix.stackworks.ru можно не создавать.
|
||||||
|
|
||||||
Достаточно:
|
Достаточно:
|
||||||
- убедиться, что *.stackworks.ru указывает на публичный IP FastPanel;
|
- убедиться, что `*.stackworks.ru` указывает на публичный IP FastPanel;
|
||||||
- создать отдельный сайт matrix.stackworks.ru внутри FastPanel;
|
- создать отдельный сайт `matrix.stackworks.ru` внутри FastPanel;
|
||||||
- выпустить SSL для matrix.stackworks.ru;
|
- выпустить SSL для `matrix.stackworks.ru`;
|
||||||
- настроить для этого сайта reverse proxy на http://192.168.0.141:8008.
|
- настроить для этого сайта reverse proxy на `http://192.168.0.141:8008`.
|
||||||
|
|
||||||
## Домены проекта
|
## Домены проекта
|
||||||
|
|
||||||
@@ -327,90 +258,208 @@ FastPanel proxy сервер и Core объединены в локальную
|
|||||||
- поиск людей без ввода Matrix-домена;
|
- поиск людей без ввода Matrix-домена;
|
||||||
- Telegram-like интерфейс без показа Matrix-комнат;
|
- Telegram-like интерфейс без показа Matrix-комнат;
|
||||||
- безопасная установка рядом с production, но на отдельном сервере;
|
- безопасная установка рядом с production, но на отдельном сервере;
|
||||||
- журнал состояния проекта в этом файле .sw.
|
- журнал состояния проекта в этом файле `.sw`.
|
||||||
|
|
||||||
|
## UX-решение собственного клиента
|
||||||
|
|
||||||
|
В собственном приложении Pulse комнатная структура Matrix должна быть скрыта от пользователя.
|
||||||
|
|
||||||
|
Пользовательский интерфейс должен выглядеть как привычный Telegram-like мессенджер:
|
||||||
|
- список чатов;
|
||||||
|
- личные диалоги;
|
||||||
|
- групповые чаты;
|
||||||
|
- контакты;
|
||||||
|
- поиск людей;
|
||||||
|
- кнопка «Написать»;
|
||||||
|
- привычные аватарки, статусы, индикаторы прочтения и вложения;
|
||||||
|
- быстрый сайдбар/нижняя навигация;
|
||||||
|
- закреплённые чаты;
|
||||||
|
- архив;
|
||||||
|
- поиск по сообщениям;
|
||||||
|
- медиа/файлы внутри профиля чата.
|
||||||
|
|
||||||
|
Правило UX:
|
||||||
|
- основной ориентир интерфейса — Telegram;
|
||||||
|
- не использовать слово «комната» в пользовательском интерфейсе Pulse;
|
||||||
|
- использовать «чат», «диалог», «группа», «канал»;
|
||||||
|
- Matrix room показывать как обычный чат;
|
||||||
|
- создание direct room автоматизировать при первом сообщении контакту;
|
||||||
|
- групповой room показывать как групповую беседу;
|
||||||
|
- технические Matrix-настройки прятать в расширенные/админские разделы.
|
||||||
|
|
||||||
|
## Регистрация и поиск людей
|
||||||
|
|
||||||
|
В будущем клиенте Pulse регистрация должна быть доступна прямо из приложения.
|
||||||
|
|
||||||
|
Пользовательский UX:
|
||||||
|
- регистрация через приложение без консольных команд;
|
||||||
|
- обычный логин/ник, без ручного ввода домена;
|
||||||
|
- приложение само формирует Matrix user_id вида `@username:matrix.stackworks.ru`;
|
||||||
|
- поиск людей по нику, имени, телефону или внутреннему Pulse ID;
|
||||||
|
- пользователь не должен вводить `@user:matrix.stackworks.ru` вручную;
|
||||||
|
- кнопка «Написать» должна автоматически создавать direct room;
|
||||||
|
- контакты и поиск должны выглядеть как в обычном Telegram-like мессенджере.
|
||||||
|
|
||||||
|
Техническая схема:
|
||||||
|
- включить controlled registration или сделать регистрацию через отдельный Pulse backend;
|
||||||
|
- backend создаёт Matrix-пользователя через Synapse Admin/Register API;
|
||||||
|
- backend хранит публичный профиль Pulse: display_name, username, phone/email optional, avatar, статус;
|
||||||
|
- поиск людей лучше делать через свой backend/index, а не напрямую через сырой Matrix room/user lookup;
|
||||||
|
- Matrix user_id и домен остаются внутренней технической деталью.
|
||||||
|
|
||||||
|
## Админка Pulse
|
||||||
|
|
||||||
|
Админка нужна обязательно и должна быть отдельным модулем поверх Matrix/Synapse Admin API.
|
||||||
|
|
||||||
|
Назначение админки:
|
||||||
|
- управление пользователями;
|
||||||
|
- создание/блокировка/разблокировка пользователей;
|
||||||
|
- сброс паролей;
|
||||||
|
- назначение и снятие admin-флага;
|
||||||
|
- просмотр профилей и устройств;
|
||||||
|
- управление чатами/группами;
|
||||||
|
- модерация жалоб;
|
||||||
|
- просмотр базовой статистики;
|
||||||
|
- настройки регистрации;
|
||||||
|
- настройки homeserver;
|
||||||
|
- управление TURN/STUN после добавления звонков;
|
||||||
|
- диагностика состояния Synapse/PostgreSQL/proxy.
|
||||||
|
|
||||||
|
## Стратегия тестирования
|
||||||
|
|
||||||
|
Сначала Core тестируется через официальные Matrix-клиенты.
|
||||||
|
Собственный клиент не писать, пока не подтверждено, что серверная часть работает стабильно через официальные клиенты.
|
||||||
|
|
||||||
|
Проверять:
|
||||||
|
- регистрацию/логин;
|
||||||
|
- личные сообщения;
|
||||||
|
- групповые чаты;
|
||||||
|
- отправку файлов;
|
||||||
|
- стабильность Synapse;
|
||||||
|
- работу публичного домена;
|
||||||
|
- Android-клиент на реальном телефоне.
|
||||||
|
|
||||||
|
## Клиентские репозитории
|
||||||
|
|
||||||
|
Клиентское приложение вынесено отдельно от Core:
|
||||||
|
- Core/backend/docs: https://github.com/viktor138irk/SWChat
|
||||||
|
- App/client: https://github.com/viktor138irk/SWChat-App
|
||||||
|
|
||||||
|
SWChat-App создан как отдельный репозиторий для Flutter/FluffyChat клиента.
|
||||||
|
FluffyChat импортирован в SWChat-App.
|
||||||
|
Найден pubspec.yaml upstream FluffyChat: name `fluffychat`, version `2.6.0+3553`, Flutter/Dart SDK `>=3.11.1 <4.0.0`.
|
||||||
|
|
||||||
|
Принятое текущее Android package/applicationId:
|
||||||
|
|
||||||
|
```text
|
||||||
|
ru.stackworks.swchat
|
||||||
|
```
|
||||||
|
|
||||||
|
До отдельного package migration не менять на Pulse автоматически, чтобы не сломать сборку и запуск.
|
||||||
|
|
||||||
## Правила ведения проекта
|
## Правила ведения проекта
|
||||||
|
|
||||||
1. Каждый заметный шаг записывать в этот файл .sw.
|
1. Каждый заметный шаг записывать в этот файл `.sw`.
|
||||||
2. Новые версии фиксировать в VERSION и changelog.
|
2. Новые версии фиксировать в `VERSION` и changelog/журнале.
|
||||||
3. Не плодить мусорные директории.
|
3. Не плодить мусорные директории.
|
||||||
4. Все сервисы Pulse держать отдельно от ArtistFlow и widget.stackworks.ru.
|
4. Все сервисы Pulse держать отдельно от ArtistFlow и widget.stackworks.ru.
|
||||||
5. Не вносить изменения в существующие домены без явной команды.
|
5. Не вносить изменения в существующие домены без явной команды.
|
||||||
6. Для FastPanel давать точные proxy-конфиги, но не затирать чужие.
|
6. Для FastPanel давать точные proxy-конфиги, но не затирать чужие.
|
||||||
7. Перед потенциально опасными действиями добавлять backup-скрипт.
|
7. Перед потенциально опасными действиями добавлять backup/firewall-скрипт.
|
||||||
8. Любые действия с widget.stackworks.ru только после отдельной явной команды.
|
8. Любые действия с widget.stackworks.ru только после отдельной явной команды.
|
||||||
9. Ведение .sw обязательно на протяжении всего проекта.
|
9. Ведение `.sw` обязательно на протяжении всего проекта.
|
||||||
10. Всё, что касается текущего production FastPanel, не трогать самостоятельно: только инструкции/шаблоны до отдельной команды пользователя.
|
10. Всё, что касается текущего production FastPanel, не трогать самостоятельно: только инструкции/шаблоны до отдельной команды пользователя.
|
||||||
11. Собственный клиент Pulse начинать только после успешного тестирования Core через официальные Matrix-клиенты.
|
11. Собственный клиент Pulse начинать только после успешного тестирования Core через официальные Matrix-клиенты.
|
||||||
12. В собственном клиенте Pulse скрывать Matrix-комнаты и показывать пользователю обычные чаты/диалоги/группы.
|
12. В собственном клиенте Pulse скрывать Matrix-комнаты и показывать пользователю обычные чаты/диалоги/группы.
|
||||||
13. Основной визуальный и UX-ориентир будущего клиента — Telegram.
|
13. Основной визуальный и UX-ориентир будущего клиента — Telegram.
|
||||||
14. Админку Pulse делать отдельным защищённым модулем поверх Synapse Admin API.
|
14. Админку Pulse делать отдельным защищённым модулем поверх Synapse Admin API.
|
||||||
15. Текущий Android applicationId клиента: ru.stackworks.swchat.
|
15. Текущий Android applicationId клиента: `ru.stackworks.swchat`.
|
||||||
16. Регистрация и поиск людей должны быть реализованы как обычный мессенджерный UX без ручного ввода Matrix user_id с доменом.
|
16. Регистрация и поиск людей должны быть реализованы как обычный мессенджерный UX без ручного ввода Matrix user_id с доменом.
|
||||||
17. Бренд продукта зафиксирован как Pulse.
|
17. Бренд продукта зафиксирован как Pulse.
|
||||||
18. Brand/UI rename делать отдельно от технического Dart package rename.
|
18. Brand/UI rename делать отдельно от технического Dart package rename.
|
||||||
|
|
||||||
## Текущий статус
|
## История разработки
|
||||||
|
|
||||||
2026-05-08:
|
### 2026-05-08
|
||||||
- Репозиторий переименован в viktor138irk/SWChat.
|
|
||||||
- Создан файл .sw.
|
- Репозиторий переименован в `viktor138irk/SWChat`.
|
||||||
- Созданы VERSION, README.md и базовый docker-compose.yml.
|
- Создан файл `.sw`.
|
||||||
- Созданы docs/ARCHITECTURE.md и docs/FASTPANEL_PROXY.md.
|
- Созданы `VERSION`, `README.md` и базовый `docker-compose.yml`.
|
||||||
- Созданы scripts/healthcheck.sh и scripts/install.sh.
|
- Созданы `docs/ARCHITECTURE.md` и `docs/FASTPANEL_PROXY.md`.
|
||||||
|
- Созданы `scripts/healthcheck.sh` и `scripts/install.sh`.
|
||||||
- Подготовлен автоустановщик.
|
- Подготовлен автоустановщик.
|
||||||
- Зафиксировано начальное пользовательское имя продукта: SWChat.
|
- Зафиксировано начальное пользовательское имя продукта: SWChat.
|
||||||
- Принято решение ставить Core на отдельный сервер.
|
- Принято решение ставить Core на отдельный сервер.
|
||||||
- Старый FastPanel-сервер использовать только для frontend/web-client в будущем.
|
- Старый FastPanel-сервер использовать только для frontend/web-client в будущем.
|
||||||
- Принято решение сначала тестировать Core официальными Matrix-клиентами, затем писать собственный клиент.
|
- Принято решение сначала тестировать Core официальными Matrix-клиентами, затем писать собственный клиент.
|
||||||
- Исправлен docker-compose.yml: контейнеры переименованы в swchat-*, убран obsolete version, добавлены переменные .env.
|
- Исправлен `docker-compose.yml`: контейнеры переименованы в `swchat-*`, убран obsolete `version`, добавлены переменные `.env`.
|
||||||
- Исправлена PostgreSQL locale для Synapse: добавлены POSTGRES_INITDB_ARGS с locale C.
|
- Исправлена PostgreSQL locale для Synapse: добавлены `POSTGRES_INITDB_ARGS` с locale `C`.
|
||||||
- Исправлена проблема compose down без env: POSTGRES_PASSWORD получил безопасный fallback.
|
- Исправлена проблема compose down без env: `POSTGRES_PASSWORD` получил безопасный fallback.
|
||||||
- Core успешно поднялся на новом сервере: swchat-synapse healthy, swchat-postgres up.
|
- Core успешно поднялся на новом сервере: `swchat-synapse healthy`, `swchat-postgres up`.
|
||||||
- Локальный Matrix endpoint успешно отвечает: curl http://127.0.0.1:8008/_matrix/client/versions вернул HTTP 200 OK и JSON версий Matrix API.
|
- Локальный Matrix endpoint успешно отвечает: `curl http://127.0.0.1:8008/_matrix/client/versions` вернул HTTP 200 OK и JSON версий Matrix API.
|
||||||
|
|
||||||
|
### 2026-05-09 — v0.1.1
|
||||||
|
|
||||||
2026-05-09:
|
|
||||||
- Версия проекта повышена до 0.1.1.
|
- Версия проекта повышена до 0.1.1.
|
||||||
- В docker-compose.yml добавлен отдельный контейнер swchat-caddy.
|
- В `docker-compose.yml` добавлен отдельный контейнер `swchat-caddy`.
|
||||||
- Создан deploy/caddy/Caddyfile.
|
- Создан `deploy/caddy/Caddyfile`.
|
||||||
- Обновлён scripts/healthcheck.sh.
|
- Обновлён `scripts/healthcheck.sh`.
|
||||||
- Принято финальное решение использовать схему FastPanel reverse proxy → Core.
|
- Принято финальное решение использовать схему FastPanel reverse proxy → Core.
|
||||||
- Создан docs/FASTPANEL_REVERSE_PROXY.md.
|
- Создан `docs/FASTPANEL_REVERSE_PROXY.md`.
|
||||||
- Создан docs/PRIVATE_NETWORK_BETWEEN_SERVERS.md.
|
- Создан `docs/PRIVATE_NETWORK_BETWEEN_SERVERS.md`.
|
||||||
- Уточнены реальные private IP: FastPanel proxy 192.168.0.221, Matrix/Core 192.168.0.141.
|
- Уточнены реальные private IP: FastPanel proxy `192.168.0.221`, Matrix/Core `192.168.0.141`.
|
||||||
- Проверено с FastPanel proxy: curl http://192.168.0.141:8008/_matrix/client/versions успешно вернул JSON Matrix API.
|
- Проверено с FastPanel proxy: `curl http://192.168.0.141:8008/_matrix/client/versions` успешно вернул JSON Matrix API.
|
||||||
- Проверено: https://matrix.stackworks.ru/_matrix/client/versions через FastPanel reverse proxy успешно вернул Matrix API JSON.
|
- Проверено: `https://matrix.stackworks.ru/_matrix/client/versions` через FastPanel reverse proxy успешно вернул Matrix API JSON.
|
||||||
- Публичный HTTPS endpoint Matrix через FastPanel работает.
|
- Публичный HTTPS endpoint Matrix через FastPanel работает.
|
||||||
- Проверено: registration_shared_secret присутствует в /opt/swchat/data/synapse/homeserver.yaml.
|
- Проверено: `registration_shared_secret` присутствует в `/opt/swchat/data/synapse/homeserver.yaml`.
|
||||||
- Зафиксировано: bootstrap-регистрация администратора через register_new_matrix_user разрешена.
|
- Зафиксировано: bootstrap-регистрация администратора через `register_new_matrix_user` разрешена.
|
||||||
- При входе в Element пойман M_LIMIT_EXCEEDED после нескольких попыток авторизации.
|
- При входе в Element пойман `M_LIMIT_EXCEEDED` после нескольких попыток авторизации.
|
||||||
- Принято UX-решение: клиент делать максимально в стиле Telegram.
|
- Принято UX-решение: клиент делать максимально в стиле Telegram.
|
||||||
- Репозиторий клиентского приложения подтверждён: https://github.com/viktor138irk/SWChat-App.
|
- Репозиторий клиентского приложения подтверждён: https://github.com/viktor138irk/SWChat-App.
|
||||||
- FluffyChat импортирован в SWChat-App.
|
- FluffyChat импортирован в SWChat-App.
|
||||||
- Проверен pubspec.yaml FluffyChat в SWChat-App.
|
- Проверен `pubspec.yaml` FluffyChat в SWChat-App.
|
||||||
- Зафиксирована необходимость Admin Panel для управления пользователями и модерации.
|
- Зафиксирована необходимость Admin Panel для управления пользователями и модерации.
|
||||||
- SWChat-App успешно собран и запущен на Android-телефоне Samsung SM S928B.
|
- SWChat-App успешно собран и запущен на Android-телефоне Samsung SM S928B.
|
||||||
- Rust/rustup/cargo установлены на Windows для сборки flutter_vodozemac/libvodozemac.
|
- Rust/rustup/cargo установлены на Windows для сборки `flutter_vodozemac/libvodozemac`.
|
||||||
- Ошибка libvodozemac_bindings_dart.so устранена после установки Rust.
|
- Ошибка `libvodozemac_bindings_dart.so` устранена после установки Rust.
|
||||||
- Авторизация в приложении SWChat-App/FluffyChat через homeserver https://matrix.stackworks.ru успешно прошла.
|
- Авторизация в приложении SWChat-App/FluffyChat через homeserver `https://matrix.stackworks.ru` успешно прошла.
|
||||||
- Принят Android package/applicationId: ru.stackworks.swchat.
|
- Принят Android package/applicationId: `ru.stackworks.swchat`.
|
||||||
- Принято требование: регистрация прямо из приложения и поиск людей без необходимости вводить Matrix-домен.
|
- Принято требование: регистрация прямо из приложения и поиск людей без необходимости вводить Matrix-домен.
|
||||||
- Начат первичный Android-ребрендинг SWChat-App.
|
- Начат первичный Android-ребрендинг SWChat-App.
|
||||||
- build.gradle.kts переведён с chat.fluffy.fluffychat на ru.stackworks.swchat.
|
- `build.gradle.kts` переведён с `chat.fluffy.fluffychat` на `ru.stackworks.swchat`.
|
||||||
- Android namespace изменён на ru.stackworks.swchat.
|
- Android namespace изменён на `ru.stackworks.swchat`.
|
||||||
- AndroidManifest.xml обновлён: приложение переименовано в SWChat.
|
- `AndroidManifest.xml` обновлён: приложение переименовано в SWChat.
|
||||||
- Deep link scheme изменён с im.fluffychat на swchat.
|
- Deep link scheme изменён с `im.fluffychat` на `swchat`.
|
||||||
- Auth callback scheme изменён с im.fluffychat.auth на swchat.auth.
|
- Auth callback scheme изменён с `im.fluffychat.auth` на `swchat.auth`.
|
||||||
- Выявлена ошибка: преждевременная смена `pubspec.yaml name` ломает импорты `package:fluffychat/...`.
|
- Выявлена ошибка: преждевременная смена `pubspec.yaml name` ломает импорты `package:fluffychat/...`.
|
||||||
- Зафиксировано правило: `pubspec.yaml name` оставлять `fluffychat` до отдельной массовой миграции импортов.
|
- Зафиксировано правило: `pubspec.yaml name` оставлять `fluffychat` до отдельной массовой миграции импортов.
|
||||||
- Зафиксировано новое рабочее имя пользовательского продукта: Pulse.
|
- Зафиксировано новое рабочее имя пользовательского продукта: Pulse.
|
||||||
|
|
||||||
|
### 2026-05-09 — v0.1.2
|
||||||
|
|
||||||
|
- Версия проекта повышена до 0.1.2.
|
||||||
|
- `VERSION` обновлён до `0.1.2`.
|
||||||
|
- `README.md` актуализирован под бренд Pulse, split-server архитектуру и private reverse proxy схему.
|
||||||
|
- В `docker-compose.yml` порт Synapse сделан настраиваемым через переменную `MATRIX_BIND_HOST`.
|
||||||
|
- По умолчанию Matrix endpoint остаётся безопасным localhost-only: `127.0.0.1:8008`.
|
||||||
|
- Для схемы FastPanel proxy → Core теперь можно указать `MATRIX_BIND_HOST=192.168.0.141` в `/opt/swchat/.env`.
|
||||||
|
- `scripts/install.sh` обновлён: добавлена переменная `MATRIX_BIND_HOST`, автоматическое добавление отсутствующей переменной в существующий `.env`, уточнены next steps.
|
||||||
|
- `scripts/healthcheck.sh` расширен: показывает `SERVER_NAME`, `MATRIX_BIND_HOST`, контейнеры компактной таблицей, проверяет local endpoint, private bound endpoint, публичный HTTPS endpoint и UFW status.
|
||||||
|
- Создан `scripts/firewall_private_proxy.sh`.
|
||||||
|
- `scripts/firewall_private_proxy.sh` разрешает доступ к Matrix 8008 только с FastPanel proxy IP и закрывает публичный прямой доступ к 8008.
|
||||||
|
- По умолчанию firewall-скрипт не меняет default policy UFW, чтобы не запереть сервер случайно; для чистого Core можно запускать с `APPLY_UFW_DEFAULTS=yes`.
|
||||||
|
- Зафиксировано правило: прямой доступ к Core:8008 из интернета должен быть закрыт, публичный вход только через `https://matrix.stackworks.ru`.
|
||||||
|
- Продолжается staged-ребрендинг: Core-документация уже говорит Pulse/SWChat, Android-клиент трогать отдельным этапом через SWChat-App.
|
||||||
|
|
||||||
## Текущий этап установки
|
## Текущий этап установки
|
||||||
|
|
||||||
Core локально работает на новом отдельном сервере.
|
Core локально работает на новом отдельном сервере.
|
||||||
|
|
||||||
Публичный HTTPS endpoint через FastPanel reverse proxy работает:
|
Публичный HTTPS endpoint через FastPanel reverse proxy ранее был проверен и работал:
|
||||||
- https://matrix.stackworks.ru/_matrix/client/versions возвращает Matrix API JSON.
|
|
||||||
|
```text
|
||||||
|
https://matrix.stackworks.ru/_matrix/client/versions
|
||||||
|
```
|
||||||
|
|
||||||
Клиентский репозиторий SWChat-App содержит импортированный FluffyChat.
|
Клиентский репозиторий SWChat-App содержит импортированный FluffyChat.
|
||||||
|
|
||||||
@@ -418,16 +467,23 @@ Android-клиент успешно запускается на Samsung SM S928B
|
|||||||
|
|
||||||
Идёт staged-ребрендинг пользовательского продукта в Pulse.
|
Идёт staged-ребрендинг пользовательского продукта в Pulse.
|
||||||
|
|
||||||
|
В Core-репозитории подготовлен безопасный механизм для private proxy bind и firewall-ограничения порта 8008.
|
||||||
|
|
||||||
## Следующий шаг
|
## Следующий шаг
|
||||||
|
|
||||||
Следующий этап:
|
Следующий этап:
|
||||||
- вернуть `pubspec.yaml name: fluffychat`, если локально или в GitHub оно было изменено;
|
- на Core-сервере проверить `.env`, выставить `MATRIX_BIND_HOST=192.168.0.141`, если FastPanel reverse proxy ходит к Core по private IP;
|
||||||
- провести UI-ребрендинг SWChat → Pulse в app_config.dart, setting_keys.dart, intro/login/about/menu;
|
- выполнить `sudo docker compose --env-file /opt/swchat/.env up -d`;
|
||||||
|
- выполнить `sudo bash /opt/swchat/source/scripts/healthcheck.sh`;
|
||||||
|
- с FastPanel proxy проверить `curl http://192.168.0.141:8008/_matrix/client/versions`;
|
||||||
|
- применить firewall-ограничение: `sudo FASTPANEL_PROXY_IP=192.168.0.221 MATRIX_PORT=8008 bash /opt/swchat/source/scripts/firewall_private_proxy.sh`;
|
||||||
|
- ещё раз проверить `https://matrix.stackworks.ru/_matrix/client/versions`;
|
||||||
|
- вернуть `pubspec.yaml name: fluffychat` в SWChat-App, если локально или в GitHub оно было изменено;
|
||||||
|
- провести UI-ребрендинг SWChat → Pulse в `app_config.dart`, `setting_keys.dart`, intro/login/about/menu;
|
||||||
- убрать FluffyChat branding из Flutter onboarding, настроек, push-диалогов и локализаций;
|
- убрать FluffyChat branding из Flutter onboarding, настроек, push-диалогов и локализаций;
|
||||||
- внедрить default homeserver matrix.stackworks.ru;
|
- внедрить default homeserver `matrix.stackworks.ru`;
|
||||||
- подготовить собственные логотипы/splash/icon pack Pulse;
|
- подготовить собственные логотипы/splash/icon pack Pulse;
|
||||||
- заложить регистрацию из приложения через backend или controlled Synapse registration;
|
- заложить регистрацию из приложения через backend или controlled Synapse registration;
|
||||||
- заложить поиск людей по нику/имени/телефону без ручного ввода Matrix user_id;
|
- заложить поиск людей по нику/имени/телефону без ручного ввода Matrix user_id;
|
||||||
- закрыть прямой доступ к Core:8008 из интернета и разрешить только 192.168.0.221;
|
|
||||||
- проверить создание комнаты, отправку сообщений и файлов;
|
- проверить создание комнаты, отправку сообщений и файлов;
|
||||||
- отдельным этапом поднять готовую Synapse Admin UI или начать Pulse Admin Panel.
|
- отдельным этапом поднять готовую Synapse Admin UI или начать Pulse Admin Panel.
|
||||||
|
|||||||
Ссылка в новой задаче
Block a user