- 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
300 lines
8.7 KiB
Markdown
300 lines
8.7 KiB
Markdown
# 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."**
|
||
|