Skip to content

Два репозитория

Платформа пишется в одном репозитории, а устанавливается из другого.

Пока этой страницы не было, второй репозиторий не был назван здесь нигде — ни в README, ни в документе, ни в комментарии. Поэтому каждая инфраструктурная страница здесь была одновременно честной и неверной: она описывала ровно то, что видно отсюда, а установка отсюда не видна. Читатель, добросовестно открывший GitOps или Кластер и ноды, начнёт строить то, что уже несколько недель стоит и обслуживает трафик.

Второй репозиторий — Agentfy/gitops.

этот репозиторий (Agentfy/agentfy)Agentfy/gitops
Код продуктаapi, app, admin, worker и эти документы
Объекты Kubernetesдва шаблона, которые слайс runtime/worker применяет сам, во время работы, по одному разу на сессию (k8s/runtime/)всё долгоживущее: Application-объекты Argo CD и Helm-чарты, которые они доставляют
Terraformterraform/ — самостоятельный путь поднять кластер с нуля, на 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 CDgitops-apps/control/argocd.yamlhelm-чарт argo-cd 10.3.2, управляет сам собой, server.insecure: true (TLS заканчивается на Traefik)
Vaultgitops-apps/control/vault.yamlhelm-чарт vault 0.34.0, standalone, dataStorage 5Gi, ingress traefik на vault.agentfy.ai с cert-manager.io/cluster-issuer: letsencrypt-prod, ui.enabled: true
Ranchergitops-apps/control/rancher.yamlчарт rancher 2.15.0 на rancher.agentfy.ai
cert-managergitops-apps/control/cert-manager.yaml и по одному на контур в gitops-apps/{dev,prod}/v1.21.1, CRD включены
External Secrets Operatorgitops-apps/dev/external-secrets.yaml и gitops-apps/prod/external-secrets.yamlчарт external-secrets 2.9.0, в обоих контурах, ServiceAccount external-secrets
Стор Vaultgitops-apps/{dev,prod}/manifests/external-secret*/clustersecretstore.yamlClusterSecretStore с именем 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
ExternalDNSgitops-apps/{dev,prod}/external-dns.yamlчарт 1.21.1, Route53, domainFilters: [agentfy.ai], policy: sync, свой txtOwnerId на контур
Reloadergitops-apps/dev/reloader.yamlstakater reloader 2.2.14
Продуктagentfy-apps/dev/agentfy-{api,app,admin,redis}.yamlhelm/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, RBAC runtime-controller / runtime-worker и ExternalSecret, который наполняет окружение api из Vault (values.dev.yamlsecrets.vaultKey: dev/agentfy-api).
  • Миграции Prisma выполняются, но как initContainer у Deployment api (helm/agentfy-api/templates/deployment.yaml, runMigrations), а не как PreSync-хук Argo, который планировался в этих документах.

Где граница проходит на самом деле

Чистая половина простая: Argo CD и всё, что Argo CD разворачивает, живут в Agentfy/gitops. Ничто в этом репозитории не деплоит долгоживущую нагрузку, и не должно начинать.

Вторая половина аккуратнее не становится, и записана здесь, а не сглажена:

  • Серверы под работающей установкой тоже подняты из Agentfy/gitopsterraform/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 велено сводить кластер; что он свёлся — отдельное утверждение, и эта страница его не делает.

См. также