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:
299
docs/tasks/TASK_PHASE_MVP_DEPLOY.md
Normal file
299
docs/tasks/TASK_PHASE_MVP_DEPLOY.md
Normal 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 1–3** завершені (як у звітах 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:
|
||||
|
||||
* порядок запуску **всіх** міграцій (001–010)
|
||||
* команду для 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."**
|
||||
|
||||
Reference in New Issue
Block a user