feat: Add presence heartbeat for Matrix online status

- matrix-gateway: POST /internal/matrix/presence/online endpoint
- usePresenceHeartbeat hook with activity tracking
- Auto away after 5 min inactivity
- Offline on page close/visibility change
- Integrated in MatrixChatRoom component
This commit is contained in:
Apple
2025-11-27 00:19:40 -08:00
parent 5bed515852
commit 3de3c8cb36
6371 changed files with 1317450 additions and 932 deletions

View File

@@ -0,0 +1,299 @@
# TASK_PHASE_MVP_DEPLOY.md
DAARION MVP — Production Deploy на домен daarion.space
Цей таск готує **повний прод-деплой DAARION MVP** на домен:
- `https://daarion.space` (landing / marketing або redirect)
- `https://app.daarion.space` (MVP-продукт: microDAO + City + Agents)
MVP уже реалізовано (Frontend, Agents Core, City Backend, Second Me).
Завдання цієї фази — **перенести готовий стек на реальний сервер**.
---
## 0. Передумови
1. **PHASE 13** завершені (як у звітах Cursor).
2. Є **готові docker-файли**:
- `docker-compose.all.yml` (23 services, port 80)
- `infra/all-in-one-gateway/docker-compose.yml` (порт 8080, dev)
- скрипти `scripts/start-all.sh`, `scripts/stop-all.sh`
3. Є **PostgreSQL** та **Redis** (або будуть розгорнуті в цьому таску).
4. Є **VPS / dedicated server** з Linux (Ubuntu 22.04 LTS або подібне).
5. Домен **daarion.space** керується тобою (DNS-записи можна змінювати).
---
## 1. Цільова архітектура прод-деплою
### 1.1. Сервер
- 1× VPS:
- CPU: 4+ cores
- RAM: 16+ GB
- Disk: NVMe 256+ GB
- OS: Ubuntu 22.04 LTS
- Docker + Docker Compose встановлені.
### 1.2. Сервіси
Запускаються через **`docker-compose.all.yml`**:
- gateway / nginx (порт 80 всередині)
- frontend (Next.js build + nginx/static)
- microdao-api
- agents-service
- city-service
- secondme-service
- Postgres
- Redis
- NATS
- Prometheus + Grafana
- інші core-сервіси, вже визначені в цьому compose
**Важливо:** prod-деплой бере за основу саме **docker-compose.all.yml**, а не dev-варіанти.
---
## 2. DNS-конфігурація
Налаштувати наступні DNS-записи:
1. `daarion.space` → A-запис на IP сервера.
2. `app.daarion.space` → A-запис на той самий IP сервера.
Опційно:
- `grafana.daarion.space` → для прямого доступу до Grafana (якщо потрібно).
- `api.daarion.space` → якщо хочеш окремий субдомен під API (на майбутнє).
---
## 3. SSL / HTTPS
Рекомендовано три варіанти (вибери один, реалізуй у таску):
### ВАРІАНТ A — Caddy (найпростіший)
- Запустити Caddy як окремий контейнер / сервіс:
- слухає 80/443
- робить HTTPS-термінацію
- проксить на внутрішній gateway (порт 80 контейнерів Docker)
Приклад `Caddyfile`:
```caddy
app.daarion.space {
reverse_proxy gateway-nginx:80
}
daarion.space {
redir https://app.daarion.space{uri}
}
```
### ВАРІАНТ B — Nginx + Certbot (класика)
* Зовнішній nginx на хості:
* `server_name app.daarion.space`
* reverse_proxy → `127.0.0.1:8080` (або 80, залежно від композу)
* SSL-сертифікати через certbot.
### ВАРІАНТ C — Traefik (якщо вже є в інфрі)
* Traefik як edge router, видає HTTPS, роутить по labels.
---
## 4. ENV та секрети
Створити **`env/` директорію** у репозиторії або на сервері (не в git):
```text
env/
app.env
db.env
redis.env
nats.env
agents.env
city.env
secondme.env
```
### 4.1. `app.env` (основні змінні)
```env
APP_ENV=production
APP_BASE_URL=https://app.daarion.space
DATABASE_URL=postgres://daarion:********@db:5432/daarion
REDIS_URL=redis://redis:6379/0
NATS_URL=nats://nats:4222
JWT_SECRET=***************
ENCRYPTION_KEY=*********** # якщо використовується
```
### 4.2. Специфічні
* `SECONDME_AGENT_ID=ag_secondme_global`
* `CITY_DEFAULT_ROOMS=general,welcome,builders`
* `TELEMETRY_ENDPOINT` (якщо є)
* `GF_SERVER_ROOT_URL` для Grafana (якщо публікуємо через `/grafana/`)
У `docker-compose.all.yml`:
* підключити `.env` файли як `env_file:` до відповідних сервісів.
---
## 5. Міграції бази даних
На сервері:
```bash
cd /opt/daarion # приклад шляху деплою
docker compose -f docker-compose.all.yml run --rm migrations-service
# або, якщо в тебе чистий psql:
psql -U postgres -d daarion -f migrations/010_create_city_backend.sql
# + попередні міграції 001..009
```
**Вимога в таску:**
Описати в README:
* порядок запуску **всіх** міграцій (001010)
* команду для re-run (idempotent)
---
## 6. Старт сервісів (docker-compose.all.yml)
На сервері:
```bash
cd /opt/daarion
cp env/app.env .env # якщо Docker Compose очікує .env
docker compose -f docker-compose.all.yml pull # якщо є образи в registry
docker compose -f docker-compose.all.yml up -d
```
або, якщо образи збираються локально:
```bash
docker compose -f docker-compose.all.yml build
docker compose -f docker-compose.all.yml up -d
```
**Завдання в таску:**
Оновити `scripts/start-all.sh` і `scripts/stop-all.sh`, щоб вони:
* працювали в prod (з використанням правильного compose-файлу)
* логували в `/var/log/daarion/` (при потребі)
---
## 7. Healthchecks та smoke-тести
Створити документ:
`docs/DEPLOY_SMOKETEST_CHECKLIST.md` з такими перевірками:
1. **API**
* `GET https://app.daarion.space/api/health` → 200
* `GET https://app.daarion.space/api/city/rooms` → список дефолтних кімнат
* `GET https://app.daarion.space/api/secondme/profile` (якщо user авторизований)
2. **Frontend**
* Відкрити `https://app.daarion.space` у браузері:
* сторінка логіну
* dashboard після входу
* Projects, Follow-ups, Settings
* City → Rooms, Presence, Second Me
3. **WS**
* WebSocket підключення:
* `/ws/channels/...`
* `/ws/city/rooms/{room_id}`
* `/ws/city/presence`
4. **Second Me**
* У UI написати prompt → отримати відповідь.
5. **Monitoring**
* Якщо Grafana/promo публікуються:
* `https://app.daarion.space/grafana/`
* `https://app.daarion.space/prometheus/` (optional)
---
## 8. Логи та моніторинг
Оновити `docs/DEPLOYMENT_OVERVIEW.md`:
* показати, де зберігаються логи:
* `docker logs` (для кожного сервісу)
* опційно — volume з `/var/log/...`
* описати:
* як дивитися Grafana dashboard
* як перевіряти NATS (jetstream, lag)
* як перевіряти Redis (presence keys)
---
## 9. Безпека (мінімум для MVP)
1. Вимкнути:
* прямий доступ до Postgres ззовні
* прямий доступ до Redis/NATS ззовні
2. Обмежити доступ до:
* Prometheus
* Grafana
(або за Basic Auth, або через окремий VPN)
3. У `.env` не зберігати секрети в git.
4. Оновити `PHASE_INFRA_READY.md` з прод-статусом.
---
## 10. Acceptance Criteria
1. **Сервер**: daarion.space резолвиться на IP VPS.
2. **HTTPS**: `https://app.daarion.space` відкривається без помилок сертифіката.
3. **MVP UX**:
* користувач може зареєструватися / залогінитись
* створити Team / Channel / Project / Follow-up
* зайти в City → Rooms, чат, presence
* викликати Second Me
4. **Сервіси живі**: усі контейнері в `docker ps` — в статусі `healthy` / `up`.
5. **Документація**:
* `DEPLOY_ON_SERVER.md` оновлено з урахуванням daarion.space
* `DEPLOY_SMOKETEST_CHECKLIST.md` існує і відповідає фактичному деплою.
---
## 11. Команда для Cursor
**"Підготувати повний production deploy для DAARION MVP згідно TASK_PHASE_MVP_DEPLOY.md.
Використовувати docker-compose.all.yml, домен daarion.space, субдомен app.daarion.space, HTTPS, міграції, Redis, NATS, City та Second Me."**