Skip to content

# 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-файли:
3. `docker-compose.all.yml` (23 services, port 80)
4. `infra/all-in-one-gateway/docker-compose.yml` (порт 8080, dev)
5. скрипти `scripts/start-all.sh`, `scripts/stop-all.sh`
6. Є PostgreSQL та Redis (або будуть розгорнуті в цьому таску).
7. Є VPS / dedicated server з Linux (Ubuntu 22.04 LTS або подібне).
8. Домен 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`:

    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):

    env/
      app.env
      db.env
      redis.env
      nats.env
      agents.env
      city.env
      secondme.env

### 4.1. `app.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. Міграції бази даних

На сервері:

    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)

На сервері:

    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

або, якщо образи збираються локально:

    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

2. `GET https://app.daarion.space/api/health` → 200

3. `GET https://app.daarion.space/api/city/rooms` → список дефолтних кімнат

4. `GET https://app.daarion.space/api/secondme/profile` (якщо user авторизований)

5. Frontend

6. Відкрити `https://app.daarion.space` у браузері:

   - сторінка логіну
   - dashboard після входу
   - Projects, Follow-ups, Settings
   - City → Rooms, Presence, Second Me

7. WS

8. WebSocket підключення:

   - `/ws/channels/...`
   - `/ws/city/rooms/{room_id}`
   - `/ws/city/presence`

9. Second Me

10. У UI написати prompt → отримати відповідь.

11. Monitoring

12. Якщо 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. Вимкнути:

2. прямий доступ до Postgres ззовні

3. прямий доступ до Redis/NATS ззовні

4. Обмежити доступ до:

5. Prometheus

6. Grafana (або за Basic Auth, або через окремий VPN)

7. У `.env` не зберігати секрети в git.

8. Оновити `PHASE_INFRA_READY.md` з прод-статусом.

## 10. Acceptance Criteria

1. Сервер: daarion.space резолвиться на IP VPS.
2. HTTPS: `https://app.daarion.space` відкривається без помилок сертифіката.

3. MVP UX:

4. користувач може зареєструватися / залогінитись

5. створити Team / Channel / Project / Follow-up
6. зайти в City → Rooms, чат, presence

7. викликати Second Me

8. Сервіси живі: усі контейнері в `docker ps` — в статусі `healthy` / `up`.

9. Документація:

10. `DEPLOY_ON_SERVER.md` оновлено з урахуванням daarion.space

11. `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."