# Runbook: Matrix/Synapse Setup — NODA1 (Phase M1)

**Мета**: Підняти Synapse на NODA1, зареєструвати бот `@dagi_bridge:daarion.space`,  
створити room для Sofiia, отримати 4 значення для `matrix-bridge-dagi`.

---

## Передумови

- NODA1: `ssh root@144.76.224.179`
- DNS: додати A-запис `matrix.daarion.space → 144.76.224.179` в панелі DNS
- Certbot/Nginx вже є на NODA1

---

## Крок 1: DNS

В панелі управління DNS додати:
```
Type: A
Name: matrix
Value: 144.76.224.179
TTL: 300
```

Перевірка (зачекати 5–10 хв):
```bash
host matrix.daarion.space
# очікується: matrix.daarion.space has address 144.76.224.179
```

---

## Крок 2: Генерація Synapse конфіга (one-time, на NODA1)

```bash
cd /opt/microdao-daarion

docker run --rm \
  -v $(pwd)/synapse-data:/data \
  -e SYNAPSE_SERVER_NAME=daarion.space \
  -e SYNAPSE_REPORT_STATS=no \
  matrixdotorg/synapse:latest generate

# Результат: synapse-data/homeserver.yaml
```

---

## Крок 3: Налаштування homeserver.yaml

Відредагувати `synapse-data/homeserver.yaml`, додати/змінити:

```yaml
server_name: "daarion.space"

database:
  name: psycopg2
  args:
    user: synapse
    password: "YOUR_SYNAPSE_POSTGRES_PASSWORD"
    database: synapse
    host: dagi-synapse-db-node1
    port: 5432
    cp_min: 5
    cp_max: 10

enable_registration: false
enable_registration_without_verification: false

password_config:
  enabled: true

report_stats: false

listeners:
  - port: 8008
    tls: false
    type: http
    x_forwarded: true
    bind_addresses: ['0.0.0.0']
    resources:
      - names: [client, federation]
        compress: false
```

---

## Крок 4: .env + запуск

```bash
# Додати пароль Postgres в .env
echo "SYNAPSE_POSTGRES_PASSWORD=<пароль>" >> /opt/microdao-daarion/.env

# Запуск
docker compose -f docker-compose.synapse-node1.yml up -d

# Перевірка через 30с
sleep 30
curl -s http://localhost:8008/_matrix/client/versions | python3 -c 'import sys,json; print("OK:", json.load(sys.stdin)["versions"][:2])'
```

---

## Крок 5: Nginx — matrix.daarion.space

```nginx
server {
    listen 80;
    server_name matrix.daarion.space;
    return 301 https://$host$request_uri;
}

server {
    listen 443 ssl http2;
    server_name matrix.daarion.space;

    ssl_certificate     /etc/letsencrypt/live/matrix.daarion.space/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/matrix.daarion.space/privkey.pem;

    location /_matrix/ {
        proxy_pass http://127.0.0.1:8008;
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto https;
        client_max_body_size 50M;
    }

    location /.well-known/matrix/ {
        proxy_pass http://127.0.0.1:8008;
        proxy_set_header Host $host;
    }
}
```

```bash
certbot certonly --nginx -d matrix.daarion.space
nginx -t && systemctl reload nginx

# Перевірка:
curl -s https://matrix.daarion.space/_matrix/client/versions | python3 -c 'import sys,json; print(json.load(sys.stdin)["versions"][:2])'
```

---

## Крок 6: Створення бота dagi_bridge

```bash
# Тимчасово enable_registration: true у homeserver.yaml, потім:
docker restart dagi-synapse-node1 && sleep 15

# Реєстрація (в контейнері):
docker exec -it dagi-synapse-node1 \
  register_new_matrix_user -c /data/homeserver.yaml http://localhost:8008
# → user: dagi_bridge  |  password: <пароль>  |  admin: no
```

---

## Крок 7: Отримати access token

```bash
HS="http://localhost:8008"
BOT_PASS="<пароль_бота>"

MATRIX_ACCESS_TOKEN=$(curl -s -X POST "$HS/_matrix/client/v3/login" \
  -H "Content-Type: application/json" \
  -d "{
    \"type\":\"m.login.password\",
    \"identifier\":{\"type\":\"m.id.user\",\"user\":\"dagi_bridge\"},
    \"password\":\"$BOT_PASS\"
  }" | python3 -c 'import sys,json; print(json.load(sys.stdin)["access_token"])')

echo "MATRIX_ACCESS_TOKEN=$MATRIX_ACCESS_TOKEN"
```

---

## Крок 8: Створити room

```bash
SOFIIA_ROOM_ID=$(curl -s -X POST "$HS/_matrix/client/v3/createRoom" \
  -H "Authorization: Bearer $MATRIX_ACCESS_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "DAGI — Sofiia",
    "topic": "DAGI Agent: Sofiia (Chief AI Architect)",
    "preset": "private_chat",
    "is_direct": false
  }' | python3 -c 'import sys,json; print(json.load(sys.stdin)["room_id"])')

echo "SOFIIA_ROOM_ID=$SOFIIA_ROOM_ID"
```

---

## Крок 9: Вимкнути реєстрацію + зберегти змінні

```bash
# enable_registration: false у homeserver.yaml
docker restart dagi-synapse-node1

# Додати в .env:
cat >> /opt/microdao-daarion/.env <<EOF

MATRIX_HOMESERVER_URL=https://matrix.daarion.space
MATRIX_USER_ID=@dagi_bridge:daarion.space
MATRIX_ACCESS_TOKEN=$MATRIX_ACCESS_TOKEN
SOFIIA_ROOM_ID=$SOFIIA_ROOM_ID
SOFIIA_INTERNAL_TOKEN=$(python3 -c "import secrets; print(secrets.token_urlsafe(32))")
EOF
```

---

## Крок 10: Запуск matrix-bridge-dagi + smoke

```bash
cd /opt/microdao-daarion
docker compose -f docker-compose.matrix-bridge-node1.yml up -d
sleep 10
curl -s http://localhost:7030/health | python3 -m json.tool
# очікується: matrix_reachable=true, gateway_reachable=true, config_ok=true
```

---

## Результат — 4 значення для PR-M1.1

| Змінна | Значення |
|---|---|
| `MATRIX_HOMESERVER_URL` | `https://matrix.daarion.space` |
| `MATRIX_USER_ID` | `@dagi_bridge:daarion.space` |
| `MATRIX_ACCESS_TOKEN` | *(з кроку 7)* |
| `SOFIIA_ROOM_ID` | *(з кроку 8, вигляд `!xxx:daarion.space`)* |
