Files
microdao-daarion/infra/all-in-one-gateway
Apple 3de3c8cb36 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
2025-11-27 00:19:40 -08:00
..

DAARION All-in-One Gateway

Version: 1.0.0
Purpose: HTTP Gateway з path-based routing для локальної інфраструктури


🎯 Що це таке

All-in-One HTTP Gateway — це єдина точка входу для всіх мікросервісів DAARION/microDAO.

Переваги:

  • Один порт замість 10+ різних портів
  • Path-based routing — чіткі шляхи /api/, /ws/, /grafana/
  • WebSocket підтримка/ws/* для real-time
  • Production-ready — готовий до публікації на домені
  • Docker-based — один docker compose up -d

Що він дає

До (без gateway):

http://localhost:8000  → microdao API
http://localhost:8001  → WebSocket
http://localhost:8008  → Matrix
http://localhost:3000  → Grafana
http://localhost:9090  → Prometheus
http://localhost:8081  → RAG
http://localhost:8082  → Notifications

Після (з gateway):

http://localhost:8080/api/          → microdao API
http://localhost:8080/ws/           → WebSocket
http://localhost:8080/matrix/       → Matrix
http://localhost:8080/grafana/      → Grafana
http://localhost:8080/prometheus/   → Prometheus
http://localhost:8080/rag/          → RAG
http://localhost:8080/notify/       → Notifications

🚀 Локальний запуск

1. Підготовка

cd infra/all-in-one-gateway

# Копіювати .env
cp .env.example .env

# За потреби відредагувати .env
nano .env

2. Запуск

# Підняти всі сервіси
docker compose up -d

# Перевірити статус
docker compose ps

# Подивитися логи
docker compose logs -f gateway-nginx

3. Перевірка

Health check:

curl http://localhost:8080/healthz
# Очікується: OK

MicroDAO API:

curl http://localhost:8080/api/health

Grafana:

http://localhost:8080/grafana/

Prometheus:

http://localhost:8080/prometheus/

Matrix:

curl http://localhost:8080/matrix/_matrix/client/versions

4. Зупинка

# Зупинити всі сервіси
docker compose down

# Зупинити і видалити volumes (⚠️ видалить дані!)
docker compose down -v

🗺️ Маршрутизація

Path Target Service Port Protocol
/api/ microdao-api 8000 HTTP
/ws/ microdao-ws 8001 WebSocket
/matrix/ matrix-homeserver 8008 HTTP
/_matrix/ matrix-homeserver 8008 HTTP (Matrix protocol)
/grafana/ grafana 3000 HTTP
/prometheus/ prometheus 9090 HTTP
/rag/ rag-service 8081 HTTP
/notify/ notification-service 8082 HTTP
/healthz gateway (internal) - HTTP

📦 Сервіси

Infrastructure (4)

  1. postgres — PostgreSQL 15

    • Database для microdao
    • Volume: postgres_data
  2. redis — Redis 7

    • Cache & sessions
    • Volume: redis_data
  3. nats — NATS JetStream

    • Message bus
    • Volume: nats_data
  4. matrix-homeserver — Matrix Synapse

    • Chat server
    • Volume: matrix_data

Application Services (6)

  1. microdao-api — REST API мікросервіс
  2. microdao-ws — WebSocket gateway
  3. grafana — Monitoring UI
  4. prometheus — Metrics storage
  5. rag-service — RAG/AI service
  6. notification-service — Email/Push notifications

Gateway (1)

  1. gateway-nginx — NGINX reverse proxy
    • Port: 8080:80
    • Config: nginx/nginx.conf

🌍 Публікація на сервері (без k8s)

Сценарій 1: VPS з одним доменом

DNS:

app.example.com → IP сервера (A record)

На сервері (зовнішній nginx):

Створити /etc/nginx/sites-available/daarion:

server {
    listen 80;
    server_name app.example.com;

    location / {
        proxy_pass http://127.0.0.1:8080/;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        
        # WebSocket support
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
    }
}

Активувати:

sudo ln -s /etc/nginx/sites-available/daarion /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx

Сценарій 2: SSL/TLS (Let's Encrypt)

Встановити certbot:

sudo apt install certbot python3-certbot-nginx

Отримати сертифікат:

sudo certbot --nginx -d app.example.com

Автоматичне оновлення:

sudo certbot renew --dry-run

Certbot автоматично додасть SSL конфігурацію до nginx.

Сценарій 3: Host Network Mode

Якщо потрібно слухати 80/443 напряму:

Змінити docker-compose.yml:

gateway-nginx:
  network_mode: host
  ports: []  # не потрібні в host mode

Тоді gateway-nginx буде слухати 80 порт хоста напряму.


☸️ Ingress для k3s/k8s (ескіз)

Коли перейдете на Kubernetes, можна використати такий Ingress:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: daarion-gateway
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /$2
spec:
  rules:
  - host: app.daarion.city
    http:
      paths:
      - path: /api(/|$)(.*)
        pathType: Prefix
        backend:
          service:
            name: microdao-api
            port:
              number: 8000
      
      - path: /ws(/|$)(.*)
        pathType: Prefix
        backend:
          service:
            name: microdao-ws
            port:
              number: 8001
      
      - path: /grafana(/|$)(.*)
        pathType: Prefix
        backend:
          service:
            name: grafana
            port:
              number: 3000
      
      - path: /prometheus(/|$)(.*)
        pathType: Prefix
        backend:
          service:
            name: prometheus
            port:
              number: 9090
      
      - path: /rag(/|$)(.*)
        pathType: Prefix
        backend:
          service:
            name: rag-service
            port:
              number: 8081
      
      - path: /notify(/|$)(.*)
        pathType: Prefix
        backend:
          service:
            name: notification-service
            port:
              number: 8082

Важливо: У k8s кожен сервіс має бути окремим Deployment + Service.


🔧 Налаштування

Environment Variables

Всі змінні в .env:

# Database
DATABASE_URL=postgres://microdao:microdao@postgres:5432/microdao

# Cache
REDIS_URL=redis://redis:6379/0

# Message Bus
NATS_URL=nats://nats:4222

# Matrix
SYNAPSE_SERVER_NAME=localhost

# RAG
RAG_MODEL_NAME=BAAI/bge-m3

# Notifications
NOTIFY_FROM_EMAIL=noreply@localhost

# PostgreSQL Password
POSTGRES_PASSWORD=postgres

Змінити порт Gateway

У docker-compose.yml:

gateway-nginx:
  ports:
    - "8080:80"  # змінити 8080 на інший порт

Додати новий сервіс

  1. Додати upstream в nginx/nginx.conf:
upstream my_service {
    server my-service:8083;
}
  1. Додати location:
location /myservice/ {
    proxy_set_header Host $host;
    # ... (інші заголовки)
    proxy_pass http://my_service/;
}
  1. Додати сервіс в docker-compose.yml:
my-service:
  image: my-service:local
  networks:
    - infra_net

🐛 Troubleshooting

Gateway не стартує

# Перевірити логи
docker compose logs gateway-nginx

# Перевірити конфігурацію
docker compose exec gateway-nginx nginx -t

502 Bad Gateway

Це означає, що backend сервіс не працює.

# Перевірити статус сервісів
docker compose ps

# Подивитися логи backend
docker compose logs microdao-api

WebSocket не працює

Перевірте, що в nginx є:

proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";

Grafana/Prometheus не відкриваються

Переконайтеся, що в environment змінних є:

grafana:
  environment:
    - GF_SERVER_ROOT_URL=%(protocol)s://%(domain)s/grafana/
    - GF_SERVER_SERVE_FROM_SUB_PATH=true

prometheus:
  command:
    - '--web.external-url=/prometheus/'

📚 Додаткова документація

В цьому репозиторії:

  • ../../docs/DEPLOYMENT_OVERVIEW.md — Повний огляд deployment
  • ../../docs/DEPLOY_ON_SERVER.md — Production deployment
  • ../../INFRASTRUCTURE.md — Архітектура інфраструктури

Зовнішні ресурси:


🎯 Наступні кроки

  1. Запустити локально:

    docker compose up -d
    open http://localhost:8080
    
  2. Додати свої сервіси (якщо потрібно)

  3. Деплой на staging/production:

    • Налаштувати домен
    • Додати SSL/TLS
    • Змінити паролі в .env
  4. Моніторинг:

  5. Підготувати Ingress для k8s (якщо плануєте)


⚠️ Важливі примітки

Безпека

  • ⚠️ Змініть POSTGRES_PASSWORD в production!
  • ⚠️ Не використовуйте localhost для SYNAPSE_SERVER_NAME в production
  • ⚠️ Додайте автентифікацію для Grafana/Prometheus
  • ⚠️ Використовуйте HTTPS в production

Production Checklist

  • Змінено всі паролі
  • Налаштовано SSL/TLS
  • Додано моніторинг
  • Налаштовано backup
  • Додано rate limiting
  • Налаштовано firewall
  • Перевірено всі endpoints

🎉 Готово!

Тепер у вас є єдина точка входу для всіх мікросервісів DAARION!

Питання? Створіть issue в репозиторії або зверніться до документації.