Ресурсы и реализация
Всё, что нужно для запуска Agentfy.ai 2.0. Hetzner-centric (дешёвый компьют, co-located, EU/GDPR); AWS сжимается до опциональных S3 / KMS / SES — или до нуля. Cognito и Secrets Manager не используются. Про когда (если вообще) что-то из этого переезжает в AWS — см. Облачную стратегию.
Что из этого списка реально развёрнуто
Список ниже — план. То, что работает сегодня, объявлено во втором репозитории, Agentfy/gitops; Два репозитория перечисляют это файл за файлом. Коротко — и это меняет здесь четыре строки:
api,app,adminи Redis работают только в контуре dev. Аналогаagentfy-apps/dev/для прода нет.- Postgres не в кластере. Он стоит на двух отдельных VM в Hetzner, настроенных
ansible/roles/postgres;DATABASE_URLapi смотрит на10.0.1.1:5432. Никакого CloudNativePG нигде нет. - LightRAG не существует — ни сервиса, ни чарта, ни Application.
- Вопрос объектного хранилища решён в инфраструктуре и не используется в коде.
terraform/storage.tfсоздаёт по одному приватному версионируемому бакету Hetzner Object Storage на контур, а AWS S3 оставляет только под состояние Terraform и бэкапы. Единственный драйвер хранилища в этом репозитории по-прежнему пишет в локальный путь на диске, так что в эти бакеты пока никто не читает и не пишет.
Ещё одна поправка, к разделу Секреты и ключи ниже: инфра-креды, включая KEK, попадают в кластер из HashiCorp Vault через External Secrets Operator, а не из написанного руками Kubernetes Secret. Под по-прежнему видит именно Kubernetes Secret — но он произведён, а не написан.
Kubernetes (Hetzner)
Один k3s-кластер (как Ranch) с тремя нодпулами — control plane крутится на своей ноде(ах), отдельно от нагрузок. Полная топология + автоскейлинг: Кластер и ноды.
| пул | что крутит | скейл |
|---|---|---|
control-plane (tainted, изолирован) | k3s server: API server · etcd · scheduler · controller-manager | фикс: 1 (dev) / 3 (prod HA) |
core (всегда онлайн) | api, app, admin, сервис LightRAG, Postgres/Redis | HPA на приложение + cluster-autoscaler на пуле |
workers (tainted, node-role: workers) | эфемерные worker-Job'ы (+ тяжёлые задачи) | scale-to-zero на задачу; cluster-autoscaler 0 → N под нагрузкой |
Плюс: Ingress (Traefik/nginx) + cert-manager (TLS), container registry, GitOps CD (ArgoCD), cluster-autoscaler + HPA/VPA, per-tenant ResourceQuota/LimitRange и NetworkPolicy (по умолчанию deny-all egress; allowlist Core WS + нужные домены).
Деплои
| деплой | пул | жизненный цикл |
|---|---|---|
api | core | постоянный (Core) и эфемерный мозг (тот же образ, на турн) |
app / admin | core | постоянный (Nuxt) |
| сервис LightRAG (Python) | core | постоянный; agent/knowledge — тонкий gateway к нему |
worker | workers | k8s Job по запросу на задачу; несёт Playwright + Chromium (поднимает браузер in-pod для браузерных задач — без отдельного пула); ttlSecondsAfterFinished + idle-reaper |
Жизненный цикл Job — см. Worker на Kubernetes.
Хранилища
| store | что держит | хост |
|---|---|---|
| Postgres (self-host) | app-данные · chat · usage/billing · зашифрованные секреты · вектор (pgvector) · граф (AGE) для LightRAG | Hetzner |
| Redis | очередь BullMQ · pub/sub (events) · локи · idle-таймеры | Hetzner |
| Object storage | system/file (артефакты, аватары, доки, PDF-инвойсы, снапшоты браузера/workspace) | S3 / R2 / Hetzner OS (открыто) |
| (Neo4j + Qdrant/Milvus) | только если выбран large-scale путь LightRAG вместо pgvector+AGE | Hetzner |
Postgres обязан быть self-host, потому что unified-бэкенд LightRAG требует расширений pgvector + Apache AGE (managed Neon блокирует AGE). Поэтому Postgres несёт app-данные и вектор + граф агента — один store для small/medium.
Инфра знаний / LightRAG
- Отдельный Python-сервис на пуле
core;agent/knowledgeпроксирует к нему через MCP. - Бэкенд по масштабу: много небольших баз → Postgres (pgvector + AGE); миллионы в одной базе → Neo4j + Qdrant/Milvus. Бенчмарк до коммита.
- Индексация async/в очереди (BullMQ), инкрементальная, с бюджетом токенов — стена это LLM-извлечение, не хранение. Per-base workspaces изолируют тенантов.
См. Знания — LightRAG.
Секреты и ключи
- Секреты агента: зашифрованы в Postgres (app-layer envelope, AES-256-GCM, DEK завёрнут KEK) — без Secrets Manager. См. Секреты агента.
- KEK: k8s Secret, инжектится только в
api(MVP) → опц. AWS KMS (заворачивает только DEK) позже. - Auth: своя JWT (issuer = Core) — без Cognito. Та же схема минтит короткоживущие runtime session tokens в Job воркера (без долгоживущих кред в поде).
Observability и ops
- Sentry (ошибки), Loki/Grafana (логи/метрики) self-host.
- Бэкапы: Postgres (PITR) + object storage; аудит-лог (
admin/audit) рантайм-сессий. - HA: реплицированные
core-деплои; Postgres/Redis с репликами по мере роста.
Внешние SaaS (ни Hetzner, ни AWS)
- Claude API (Anthropic) — LLM (
system/llm). - Платежи — PayPal (+ Stripe?).
- Email/SMTP — Resend (MVP) → AWS SES на объёмах; сменяемо за
notification/email.
AWS-след — что (если что-то) остаётся
| AWS-сервис | использование | нужен? |
|---|---|---|
| S3 | object storage для system/file | опц. — против Hetzner OS / R2 |
| KMS | заворачивание KEK секретов | опц. — против KEK в k8s Secret |
| SES | транзакционная почта на объёмах | позже — MVP стартует на Resend (не AWS) |
| — | выкинут (своя JWT) | |
| — | выкинут (шифрование в Postgres) | |
| — | выкинуты (Claude API / BullMQ / Postgres) |
Итого: Agentfy.ai 2.0 может крутиться полностью на Hetzner (+ Claude/платежи/почта как внешние SaaS); AWS сведён максимум к нескольким managed-удобствам (S3/KMS/SES), каждое опционально.
Рекомендуемое разделение
| Концерн | Где |
|---|---|
| k8s (api/app/admin/worker/LightRAG) | Hetzner |
| Postgres (+ pgvector + AGE + зашифрованные секреты), Redis | Hetzner (self-host) |
| Object storage | Hetzner OS или AWS S3 / R2 (открыто) |
| KEK секретов | k8s Secret (MVP) → KMS (открыто) |
| Resend (MVP) → AWS SES на объёмах | |
| LLM, платежи | внешнее |
См. Открытые вопросы — что ещё не решено (провайдер стораджа, vector/graph-бэкенд по масштабу, провайдер биллинга).