Два репозитория
Платформа пишется в одном репозитории, а устанавливается из другого.
Пока этой страницы не было, второй репозиторий не был назван здесь нигде — ни в README, ни в документе, ни в комментарии. Поэтому каждая инфраструктурная страница здесь была одновременно честной и неверной: она описывала ровно то, что видно отсюда, а установка отсюда не видна. Читатель, добросовестно открывший GitOps или Кластер и ноды, начнёт строить то, что уже несколько недель стоит и обслуживает трафик.
Второй репозиторий — Agentfy/gitops.
этот репозиторий (Agentfy/agentfy) | Agentfy/gitops | |
|---|---|---|
| Код продукта | api, app, admin, worker и эти документы | — |
| Объекты Kubernetes | два шаблона, которые слайс runtime/worker применяет сам, во время работы, по одному разу на сессию (k8s/runtime/) | всё долгоживущее: Application-объекты Argo CD и Helm-чарты, которые они доставляют |
| Terraform | terraform/ — самостоятельный путь поднять кластер с нуля, на Hetzner или на AWS. См. оговорку ниже. | terraform/ + ansible/ — то, из чего реально подняты работающие сейчас серверы |
| Секреты | нет. api читает конфигурацию из окружения, которое ему дали | Vault и объекты External Secrets, превращающие путь в Vault в обычный Kubernetes Secret |
| Деплой | — | коммит. У каждого Application стоит automated: {prune: true, selfHeal: true} |
Правило, которое не даёт им врать друг другу: ссылаться, а не копировать. Манифест, вставленный в этот репозиторий, через месяц разойдётся с оригиналом — и именно эту болезнь страница лечит. Называйте файл; файл и есть истина.
Что Argo CD разворачивает сегодня
Прочитано по манифестам в Agentfy/gitops, файл за файлом, — не с чьих-то слов.
| Что | Где объявлено | Что в этом файле на самом деле стоит |
|---|---|---|
| Корень | bootstrap/root-app.yaml | один Application с именем root, смотрящий в gitops-apps/control на main. Применяется руками, один раз; всё нижеследующее достигается из него |
| Сам Argo CD | gitops-apps/control/argocd.yaml | helm-чарт argo-cd 10.3.2, управляет сам собой, server.insecure: true (TLS заканчивается на Traefik) |
| Vault | gitops-apps/control/vault.yaml | helm-чарт vault 0.34.0, standalone, dataStorage 5Gi, ingress traefik на vault.agentfy.ai с cert-manager.io/cluster-issuer: letsencrypt-prod, ui.enabled: true |
| Rancher | gitops-apps/control/rancher.yaml | чарт rancher 2.15.0 на rancher.agentfy.ai |
| cert-manager | gitops-apps/control/cert-manager.yaml и по одному на контур в gitops-apps/{dev,prod}/ | v1.21.1, CRD включены |
| External Secrets Operator | gitops-apps/dev/external-secrets.yaml и gitops-apps/prod/external-secrets.yaml | чарт external-secrets 2.9.0, в обоих контурах, ServiceAccount external-secrets |
| Стор Vault | gitops-apps/{dev,prod}/manifests/external-secret*/clustersecretstore.yaml | ClusterSecretStore с именем vault: сервер https://vault.agentfy.ai, KV v2 по пути secret, аутентификация kubernetes, mountPath kubernetes-dev / kubernetes-prod, роль eso |
| Живой потребитель, в проде | gitops-apps/prod/manifests/external-secrets/externalsecret-external-dns.yaml | тянет prod/external-dns в секрет кластера external-dns-aws, refreshInterval: 1h |
| ExternalDNS | gitops-apps/{dev,prod}/external-dns.yaml | чарт 1.21.1, Route53, domainFilters: [agentfy.ai], policy: sync, свой txtOwnerId на контур |
| Reloader | gitops-apps/dev/reloader.yaml | stakater reloader 2.2.14 |
| Продукт | agentfy-apps/dev/agentfy-{api,app,admin,redis}.yaml → helm/agentfy-{api,app,admin,redis}/ | четыре чарта в namespace agentfy на dev-кластере, порядок по sync-wave: redis (0), api (1), app и admin (2) |
Двум пунктам нужна отдельная строка, потому что какая-то страница в этом репозитории до сих пор утверждает обратное:
- api развёрнут, и разворачивает его Argo CD.
helm/agentfy-api/несёт Deployment, Service, Ingress, HPA, ConfigMap, RBACruntime-controller/runtime-workerиExternalSecret, который наполняет окружение api из Vault (values.dev.yaml→secrets.vaultKey: dev/agentfy-api). - Миграции Prisma выполняются, но как initContainer у Deployment api (
helm/agentfy-api/templates/deployment.yaml,runMigrations), а не как PreSync-хук Argo, который планировался в этих документах.
Где граница проходит на самом деле
Чистая половина простая: Argo CD и всё, что Argo CD разворачивает, живут в Agentfy/gitops. Ничто в этом репозитории не деплоит долгоживущую нагрузку, и не должно начинать.
Вторая половина аккуратнее не становится, и записана здесь, а не сглажена:
- Серверы под работающей установкой тоже подняты из
Agentfy/gitops—terraform/mgmt.tf,terraform/db.tf,terraform/loadbalancer.tfдля сети Hetzner, management-ноды, двух нод PostgreSQL и балансировщиков;ansible/k3s.ymlдля односерверного k3s — control-кластера на management-ноде. Кластеры dev и prod провижинятся через Rancher — поэтомуloadbalancer.tfпишет, что меткуlb-targetпроставляет Rancher, и поэтому каждый рабочийApplicationсмотрит наhttps://10.0.1.3:6443(dev) илиhttps://10.0.1.9:6443(prod), а не на control-кластер. terraform/этого репозитория — поэтому второй путь, а не тот, который отработал. Он поднимает кластер черезkube-hetzner(или EKS на стороне AWS), в трёх пулах нод, с CloudNativePG и Redis внутри кластера. У живой установки нет ни одной из этих черт: Postgres стоит на своих VM в Hetzner, настроенныхansible/roles/postgres, а Redis — обычный Deployment изhelm/agentfy-redis.
Должен ли terraform/ этого репозитория заменить тот путь, обслуживать вторую установку или быть списанным — нигде не записано так, чтобы это можно было проверить, поэтому страница этого не решает. См. terraform/README.md, где теперь стоит та же оговорка.
Что остаётся здесь и почему это не дубль
В k8s/runtime/ лежат два шаблона, и ни один из них не принадлежит Argo CD:
namespace-rbac.template.yaml— ServiceAccount, Role и RoleBinding для одного runtime-namespace.worker-egress.template.yaml— default-deny egress над подами воркера.
Их применяют императивно, во время работы: слайс runtime/worker и .superset/k3d.sh на ноутбуке, подставляя __NAMESPACE__ и плейсхолдеры control-канала в момент применения. Argo CD не должен ими владеть: он видел бы объекты каждой сессии как дрейф и пруннил бы их посреди задачи.
Одна честная неровность: helm/agentfy-api/templates/runtime-rbac.yaml в Agentfy/gitops — второе выражение того же RBAC, написанное как Helm-шаблон, а не как файл с плейсхолдерами. Они не порождаются друг из друга и могут разойтись. Это реальная цена, и она названа здесь, а не обнаружена потом.
Что проверить не удалось
Записано как пробелы, потому что выдумать подтверждение хуже, чем признать, что его нет:
- Где собираются образы приложений.
helm/*/values.dev.yamlфиксируетghcr.io/agentfy/agentfy-{api,app,admin}на конкретных тегах, значит образы существуют, — но ни в одном из репозиториев нет workflow, который бы их собирал или пушил. Три workflow GitHub Actions вAgentfy/gitops— этоansible-lintи два ручных запуска Ansible. - У
appв этом репозитории нетDockerfile— уapi,adminиworkerесть, — аhelm/agentfy-app/values.dev.yamlфиксирует образagentfy-app. Откуда этот образ берётся, не записано ни в одном из репозиториев. - В контуре
prodнет продукта.gitops-apps/control/объявляетagentfy-dev-servicesи не объявляет prod-аналога, а вagentfy-apps/есть только папкаdev/. Прод несёт платформу (ESO, cert-manager, ExternalDNS, reloader) и, судя по манифестам, ни одно из четырёх приложений. - Ничего не проверялось против живого кластера. Каждое утверждение на этой странице взято из файла в
Agentfy/gitopsнаmain. Манифест — это то, к чему Argo CD велено сводить кластер; что он свёлся — отдельное утверждение, и эта страница его не делает.
См. также
- GitOps (ArgoCD) — замысел и то, какие его части установка взяла.
- Кластер и ноды · Ресурсы · Облачная стратегия — план, с отметками о сегодняшнем состоянии.