Капстоун, шаг 5: установка, финальная проверка и чеклист приёмки

Уровень: expert ~60 мин Практика: Firefly III (AGPL-3.0)

Что нужно знать перед уроком

  • M11.04 — CI/CD: полный пайплайн — нужна опубликованная версия пакета перед установкой через PackageRepository
  • M9.07 — Чеклист приёмки приложения и oss.yaml — нужен эталонный десятипунктовый чеклист, адаптируемый в этом уроке под Firefly III
  • M10.10 — Troubleshooting по статусной модели — нужен алгоритм диагностики для финальной проверки установки

Что нужно знать перед уроком

Это заключительный урок всего курса. M9 урок 7 — эталонный десятипунктовый чеклист приёмки Application-пакета. M10 урок 10 — алгоритм диагностики «от общего к частному» по status.summarystatus.conditions → логи → события. M5 урок 9 — жизненный цикл пакета через PackageRepository/ApplicationPackageVersion. Этот урок завершает капстоун и весь курс: устанавливаем опубликованный пакет Firefly III как конечный пользователь каталога, проходим полную диагностику и итоговую приёмку.

Теория

Установка через Application + PackageRepository

Финальный шаг — установка пакета так, как его установил бы реальный пользователь каталога, без прямого доступа к исходному репозиторию пакета. Это требует зарегистрированного PackageRepository, указывающего на registry, куда пайплайн из M11 урока 4 опубликовал версию:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
apiVersion: deckhouse.io/v1alpha1
kind: PackageRepository
metadata:
  name: my-registry
spec:
  registry:
    repo: "registry.example.com/my-org/packages"
---
apiVersion: deckhouse.io/v1alpha1
kind: Application
metadata:
  name: my-finances
  namespace: team-finances
spec:
  packageName: firefly-iii
  packageRepositoryName: my-registry
  packageVersion: "v0.1.0"
  settings:
    hostname: "finances.example.internal"
    defaultCurrency: "EUR"
    timezone: "Europe/Berlin"
    storageSize: "10Gi"

Обратите внимание: spec.settings содержит только поля, объявленные в config-values.yaml из M11 урока 1 — ни APP_KEY, ни реквизитов managed-mysql здесь нет и быть не может, они полностью инкапсулированы во internal.*-логике чарта, разобранной в M11 уроке 3. Это финальная демонстрация принципа из M5 урока 3: пользователь Application работает исключительно с осмысленным для него контрактом настроек, не касаясь внутренней реализации пакета.

Полная последовательность диагностики первой установки

Прямое применение алгоритма из M10 урока 10 к первой установке нового пакета (частный случай, когда вероятность обнаружить ранее не замеченную проблему выше, чем при рутинном обновлении уже стабильно работающего инстанса):

sequenceDiagram participant U as Разработчик капстоуна participant App as Application my-finances U->>App: status.summary.tip App-->>U: "Waiting for mandatory module managed-mysql..." (или следующий шаг) U->>App: status.conditions (Installed → ConfigurationApplied → Scaled → Ready) App-->>U: Installed=False, reason=DependencyMissing (если managed-mysql не включён) Note over U,App: Включить managed-mysql, если не был включён в M11 уроке 1 U->>App: d8 k get jobs -n team-finances App-->>U: db-migrate: Completed (или логи ошибки миграции) U->>App: d8 k logs deploy/my-finances-app -n team-finances App-->>U: логи PHP-FPM / Laravel — подтверждение успешного старта

Финальный чеклист приёмки, адаптированный для Firefly III

Прямое применение десятипунктового чеклиста из M9 урока 7 к пакету капстоуна — каждый пункт нужно пройти самостоятельно, без готового ответа:

  1. Структура пакета (M5 урок 1) — все обязательные файлы на месте (package.yaml, templates/, openapi/values.yaml, openapi/config-values.yaml, docs/README.md, docs/icon.svg, oss.yaml).
  2. package.yaml (M11 урок 1) — name: firefly-iii (14 символов, укладывается в лимит), descriptions на обоих языках, requirements.modules.mandatory точно указывает managed-mysql.
  3. Контракт настроек (M11 урок 1) — config-values.yaml не содержит APP_KEY или реквизитов БД, все internal-детали изолированы.
  4. Ограничения Application (M5 урок 5) — пакет не создаёт CRD и cluster-wide ресурсов; зависимость от БД реализована исключительно через mandatory-Module, а не через попытку самостоятельно развернуть MySQL внутри Application (что было бы архитектурным нарушением границы Application/Module).
  5. pkglint без ошибок (M11 урок 4) — стадия verify пройдена.
  6. Nelm-аннотации корректны (M11 урок 3) — deploy-on: install + ownership: anyone на APP_KEY, delete-policy: before-creation + deploy-dependency на Job-миграции, resource-policy: keep на PVC вложений.
  7. Оптимизация сборки (M11 урок 2) — import вместо дублирования PHP-стадии в образе web, --cache-repo настроен в CI.
  8. oss.yaml полон и точен (M11 урок 4) — включает сам Firefly III с корректной лицензией AGPL-3.0.
  9. CI/CD настроен полностью (M11 урок 4) — раздельные dev/prod потоки, ручной gate, защищённые переменные.
  10. Production Operations готовность (M10) — PodMonitor/Probe для мониторинга (M10 уроки 1–2), PodDisruptionBudget при нескольких репликах (M10 урок 4урок 5/6), backup-стратегия для PVC вложений (M10 урок 8d8 backup etcd не покрывает файлы вложений, нужен отдельный snapshot/дамп).

Что дальше после капстоуна

Курс сознательно ограничен рамками Application-разработки (зафиксировано с самого первого урока M2.01 и последовательно выдержано во всех 87 уроках). Логичные следующие шаги за пределами курса — если возникнет потребность самостоятельно разрабатывать Module (а не только зависеть от готовых, как managed-mysql/managed-postgres в этом курсе): CRD и их конверсии, charts/helm_lib, cluster-wide хуки на Go, dmtlint уже не только как инструмент анализа чужих модулей (M9 уроки 3–4), а как повседневный линтер собственной разработки — это отдельная специализация, целенаправленно исключённая из объёма этого курса.

Частые ошибки и подводные камни

  • Указать в spec.settings Application поля, отсутствующие в config-values.yaml пакета. Это приведёт к ошибке валидации при установке — контракт настроек, разработанный в M11 уроке 1, должен точно соответствовать тому, что реально принимает Application.spec.settings.
  • Пропускать шаги диагностики при первой неудачной установке, сразу переходя к d8 k delete и повторной попытке с нуля. Систематический алгоритм из M10 урока 10 почти всегда быстрее находит первопричину (чаще всего — невключённый managed-mysql или опечатка в имени Module), чем повторные попытки установки вслепую.
  • Считать капстоун завершённым сразу после того, как status.summary.state стал Ready. Ready подтверждает только успешный деплой ресурсов — полный чеклист приёмки из теории включает пункты (CI/CD, oss.yaml, backup-стратегия), не проверяемые самим фактом готовности Application в кластере.

Практика в кластере

🧩 Практика урока: Firefly III · лицензия AGPL-3.0
  1. Зарегистрируйте PackageRepository (если ещё не зарегистрирован для тестового кластера в предыдущих модулях) и установите опубликованную в M11 уроке 4 версию пакета:
1
2
3
d8 k apply -f packagerepository.yaml
d8 k apply -f application-firefly.yaml
d8 k get application my-finances -n team-finances -w
  1. Пройдите полную диагностическую последовательность из теории урока, независимо от того, установился ли пакет с первого раза:
1
2
3
4
d8 k get application my-finances -n team-finances -o jsonpath='{.status.summary}' | jq
d8 k get application my-finances -n team-finances -o jsonpath='{.status.conditions}' | jq
d8 k get jobs -n team-finances
d8 k logs deploy/my-finances-app -n team-finances
  1. Убедитесь, что приложение отвечает на HTTP-запрос через настроенный Ingress/HTTPRoute, и завершите первичную настройку Firefly III (создание учётной записи администратора) через веб-интерфейс.

  2. Пройдите весь десятипунктовый чеклист из теории построчно, отмечая выполнение или фиксируя обнаруженные пробелы для последующего исправления.

Практика разработки

Задокументируйте в docs/README.md итоговый результат прохождения чеклиста приёмки — какие пункты выполнены полностью, какие требуют доработки в реальном (не учебном) продолжении проекта. Это финальный артефакт капстоуна и всего курса, демонстрирующий полный путь от идеи (M11 урок 1) до опубликованного и проверенного production-пакета.

Шпаргалка команд урока

1
2
3
d8 k apply -f packagerepository.yaml
d8 k get application <name> -n <namespace> -o jsonpath='{.status.summary}'
d8 k get application <name> -n <namespace> -o jsonpath='{.status.conditions}'

Полные шпаргалки: 📋 kubectl , 📋 d8 .

Вопросы для самопроверки

Может ли spec.settings объекта Application содержать поле APP_KEY?

Пользователь Application работает только с осмысленным контрактом config-values.yaml, а не с внутренней реализацией пакета.

Источник: Рекомендуемая литература

С какого шага рекомендуется начинать диагностику неудачной первой установки Application?

Это прямое применение алгоритма диагностики из M10 урока 10 к специфике первой установки нового пакета.

Источник: Рекомендуемая литература

Достаточно ли status.summary.state: Ready, чтобы считать чеклист приёмки полностью пройденным?

Чеклист приёмки из M9 урока 7 значительно шире факта успешного деплоя ресурсов в кластер.

Источник: Рекомендуемая литература

Что курс сознательно оставляет за своими рамками, требуя отдельной специализации после капстоуна?

Это ограничение зафиксировано с первого урока M2.01 и выдержано на протяжении всего курса.

Источник: Рекомендуемая литература

Что покрывает d8 backup etcd применительно к вложениям транзакций Firefly III, хранящимся в PVC?

Это ключевое разграничение, разобранное в M10 уроке 8 и напрямую применимое к финальной проверке капстоуна.

Источник: Рекомендуемая литература

Рекомендуемая литература

Официальная документация

Статьи и блоги

Книги

  • Gene Kim, Jez Humble, Patrick Debois, John Willis. The DevOps Handbook. 2nd ed., 2021. ISBN 978-1942788003.

Связанные материалы

Поздравляем с завершением курса «Deckhouse Application: с нуля до профи» — от первого Pod в M1 уроке 1 до самостоятельно спроектированного, собранного, задеплоенного и опубликованного production-пакета Firefly III.