|
Professor Seleznov
|
Оригинал статьи - Atlassian Data Center As A Torque Stack (тоже мой) Отправная точка Всё начиналось намеренно просто: публичные Helm-чарты Atlassian Data Center, пара хостов на Linux и задача доказать, что реальный мультиприложенческий стек можно доставить без отката к ручному ранбуку. Целевой стек был не игрушечным: Jira, Confluence, Bitbucket, Bamboo, Crowd, агент Bamboo, PostgreSQL для хранения данных и общее хранилище для продуктов, которым оно требуется. Такой набор полезен тем, что ведёт себя как типичное корпоративное ПО: стейтфул-сервисы, дефолты чартов, долгое время старта, экраны первоначальной настройки, чувствительные данные, постоянные тома и несколько точек, где инструмент развёртывания должен «показать свою работу». Первый проход: прямой деплой Первым шагом я развернул k3s на двух хостах, подготовил общее хранилище на базе NFS, скачал чарты Atlassian из репозитория atlassian/data-center-helm-charts и применил каждый релиз через Torque. Этот шаг был важен: он позволил сохранить базовую конфигурацию предсказуемой и «скучной». Прежде чем превратить настройку в стек, я хотел убедиться, что:
- чарты рендерятся без ошибок;
- сервисы поднимаются;
- NodePort'ы доступны;
- поды продуктов могут подключиться к своим базам данных.
Torque уже на этом этапе оказался полезен: путь apply дал согласованный цикл релизов и верифицируемый вывод вместо набора разовых Helm-команд. Превращение в стек Torque После успешного первого деплоя я конвертировал команды релиза в стек Torque. Файл стека сделал порядок зависимостей явным:
- Сначала — хранилище;
- Затем — необходимые базы данных и Kubernetes Secrets;
- Далее — релизы приложений;
- В конце — агент Bamboo.
Именно здесь Torque перестаёт быть просто обёрткой над Helm. Файл стека придаёт всей системе форму, которую можно ревьюить, воспроизводить, возобновлять и отлаживать. Если релиз на нижнем уровне зависает, оператору не нужно восстанавливать, какой файл values или namespace использовался — этот контекст уже есть в стеке. Работа с секретами Пароли баз данных в открытом виде в files values — это тот самый «быстрый костыль», который часто остаётся навсегда, если его не убрать на раннем этапе. Я добавил локального провайдера секретов Torque и изменил prereq-values, чтобы использовать ссылки вида secret://local/... для паролей БД и токена безопасности агента Bamboo.
Практический урок: разрешение секретов должно происходить на уровне передаваемых values, а не быть спрятанным в дефолтах чарта, которыми инструмент деплоя не управляет.
Перенос ссылок в явный файл values сделал поведение прозрачным. После этого я проверил сгенерированные Kubernetes Secrets, чтобы убедиться: кластер получил уже разрешённые значения, а не литеральные строки secret://. Verifier как жёсткий гейт С готовым стеком и провайдером секретов путь деплоя стал строже. Я использовал:
verifier --mode block --fail-on high
— сгенерировал доказательства для каждого релиза и потребовал их перед apply. Сам процесс применения использовал:
torque apply --require-verified --drift-guard
Таким образом, развёртывание должно было соответствовать верифицированному плану, а не молча принимать изменённый рендер. Это превращает «я думаю, это безопасно» в «именно этот рендер прошёл вот эти проверки». Параллельно я использовал Helmer для генерации HTML-планов под ревью. На практике именно этот этап отличает кейс по Torque от обычной заметки по установке. Результат — не просто «поды работают», а комплект из:
- файлов стека;
- отрендеренных планов;
- отчётов verifier;
- доказательств применения — всё это другой оператор может изучить позже.
Доказательства за пределами первоначального развёртывания Новые функции proof развивают ту же идею дальше:
- torque apply simulate создаёт Live Apply Twin до того, как рискованное изменение коснётся кластера;
- после изменения torque guardian diff сравнивает симуляцию с живыми объектами Kubernetes, владельцами управляемых полей, событиями, состоянием aftercare и доказательствами границ секретов.
Если позже под продукта упадёт из-за невозможности pull'а образа, вебхук изменит поле, ConfigMap начнёт нести данные, похожие на секреты, или оператор вручную отредактирует живой объект — Guardian превратит расхождение в доказательство, а не в догадку. Команды torque incident capture и torque incident replay делают сбой переносимым: состояние ресурсов, события, ограниченные логи, первопричина и заметки для PR можно изучать без доступа к исходному терминалу. Самый новый слой — torque contract synthesize и torque contract test — конвертирует доказательства инцидентов и дрейфа в правила повторения. Для стека Atlassian это значит, что следующий деплой может доказать:
- отсутствие сбоев pull'а образа;
- отсутствие регрессий границ секретов;
- отсутствие необъяснимых владельцев управляемых полей;
- отсутствие сбоев aftercare — с помощью машиночитаемого контракта, а не памяти в Slack.
Примеры продвижения релиза с доказательствами
# Canary-стратегия torque release promote ./reports/proof.graph.json \ --strategy canary \ --steps 5,25,50,100 \ --analysis-window 5m \ --slo ./reports/slo.yaml \ --rollback-on-fail \ --key .torque/stack/keys/ed25519.json \ --out-dir ./reports/promote-canary # Blue-green с предпросмотром torque release promote ./reports/proof.graph.json \ --strategy blue-green \ --preview \ --smoke ./reports/smoke.json \ --switch-traffic \ --key .torque/stack/keys/ed25519.json \ --out-dir ./reports/promote-blue-green # Blue-green с сохранением состояния torque release promote ./reports/proof.graph.json \ --strategy blue-green \ --preview --smoke ./reports/smoke.json --switch-traffic \ --provider file --state-out ./reports/traffic-state.json \ --execute --yes --format json
Кастомные образы в том же конвейере Я также собрал кастомные образы для того же стека. Цель была не в форке продуктов Atlassian или «запекании» конфигурации в образы. Цель — доказать, что Torque может владеть шагом сборки образа как частью той же истории доставки. Dockerfile'ы:
- фиксировали базовые образы Atlassian, PostgreSQL и NFS-провайдера по дайджесту;
- добавляли только небольшие операционные изменения там, где это полезно;
- проходили через torque build с включённым сканированием секретов.
Образ агента Bamboo — самый наглядный пример: он сохраняет базовый агент от upstream, но добавляет распространённые инструменты для диагностики и CI: curl, git, jq, openssh-client, tar, unzip. Собранные OCI-лейауты были импортированы в containerd k3s на обоих узлах, а затем использованы в values стека как образы torque.local/atlassian/.... Два полезных момента отладки
- Предупреждения чартов: сгенерированные отчёты показали, что некоторые варнинги чартов допустимы только в этой лаборатории — потому что гейт verifier настроен на fail-on high и выше, а не потому, что все находки можно игнорировать в продакшене.
- Ложное срабатывание сканера секретов: одна сборка образа триггернула ложное срабатывание на упакованных бинарниках OpenSSH внутри образа Bitbucket. Это как раз тот случай, когда политику можно настраивать, но не отключать. Я добавил небольшой файл правил сканера, который сохранил строгость сканирования аргументов сборки и логов, но избежал ложного срабатывания на содержимом OCI.
Логи Torque как операционный граф Полезный взгляд на логи — это не просто «покажи мне этот под». Это логи по:
- зависимостям стека;
- активному ReplicaSet;
- условию readiness;
- контексту событий.
Одно семейство команд обрабатывает:
- контекст с учётом зависимостей: --deps;
- нездоровые поды в namespace: --condition;
- события Kubernetes: --events;
- активные развёртывания: --deploy-mode active;
- доказательства передачи ответственности: --capture.
Это особенно сильно для агентов: они могут инспектировать контекст сбоя из графа стека, не угадывая сначала имена объектов Kubernetes. Расширенные примеры логирования Torque:
# Логи с учётом зависимостей torque logs --deps --stack atlassian-dc # Только поды в состоянии CrashLoopBackOff torque logs --condition CrashLoopBackOff -n atlassian # События, связанные с развёртыванием torque logs --events --deploy-mode active # Захват доказательств для передачи torque logs --capture --out ./evidence/incident-001.json
Итог: воспроизводимый путь для сложного стека Экраны первоначальной настройки Atlassian и ввод лицензий никуда не делись, агенты Bamboo по-прежнему зависят от инициализации Bamboo. Torque не удаляет шаги жизненного цикла продуктов. Что он делает: делает инфраструктурную сторону ревьюируемой:
- чарты рендерятся через один путь;
- секреты приходят от провайдера;
- verifier решает, можно ли продолжать релиз;
- drift-guard защищает apply;
- Helmer генерирует читаемые планы-доказательства;
- сборка образов встраивается в ту же операционную историю.
В этом практическая ценность: меньше магии, больше файлов, и деплой, который можно воспроизвести без зависимости от памяти терминала. Агент-нативное исполнение Именно поэтому Torque идеально подходит для работы с агентными системами. Codex, Claude, Gemini, CI или люди не должны писать DevOps-скрипты с нуля; они должны оперировать теми же рабочими процессами Torque через поверхность MCP или API. Это даёт рабочему процессу:
- устойчивые джобы;
- возобновляемые шаги;
- аудиторский след;
- права доступа и аппрувы;
- доказательства от verifier;
- контекст логов — вместо не ревьюируемого транскрипта терминала.
Финальный захват показывает Codex, использующего Torque на том же развёртывании Atlassian.
-Источник
|