Ресурси та реалізація
Усе, що потрібно для запуску 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-бекенд за масштабом, провайдер білингу).