axiomui.ru / документтехнический аудит · стабилизация · ИИ-агенты
← Все проекты
DevOps и инфраструктура

Legacy Drupal в банковском Kubernetes

Банковский сектор · 2025–2026 · Docker + k8s + rootless

Суть: Legacy-проект на Drupal 10 развёрнут в банковском Kubernetes с соблюдением всех требований безопасности: rootless-контейнеры, многоэтапная сборка, ротация секретов, fail-fast сценарии. Деплой ускорился с 2–3 часов до 8–12 минут.

«Деплой с 2–3 часов ручной работы по SSH сокращён до 8–12 минут: docker build → push → kubectl apply — без простоя через rolling update.»

«Многоэтапная сборка (6 этапов) + L2-кеширование BuildKit сократили образ на 60%. Сборочные инструменты и артефакты CI не попали в production.»

Контекст и проблема

Исходная система

Платформа корпоративной автоматизации (RPA) на Drupal 10, PHP 8.2, PostgreSQL. До контейнеризации разворачивалась вручную на выделенном сервере через SSH.

Как выглядел деплой:

SSH → git pull → rm -rf vendor/ → composer install → drush sql-drop → импорт SQL → drush cr → drush updb → drush migrate → drush cron

Ключевые проблемы:

Требования банка

ТребованиеЧто означало
Rootless-контейнерыUID 1000+, порты >1024. nginx не мог слушать 80/443
Многоэтапная сборкаНикаких сборочных инструментов в production-образе
Секреты — через внешний storeПароли, ключи — не в env-файлах и образах
Read-only корневая ФСDrupal storage требует запись в файлы — решено через S3
12-factor appВся конфигурация — только через переменные окружения
Fail-fast запускЕсли нет БД или секретов — контейнер не должен стартовать

Техническое решение

Docker: многоэтапная сборка (6 этапов)

Сборка разделена на изолированные этапы: apt-подготовка (ключ nginx), composer install, компиляция PHP-расширений (imagick через PIE), npm build для React-дашборда, системный фундамент (nginx + supervisor), финальный образ.

Двухуровневое кэширование BuildKit: L1 — слои Docker, инвалидируются через CACHE_DATE; L2 — персистентные кэши для apt и composer. Образ сокращён на ~60% за счёт исключения сборочных инструментов.

Rootless: переезд на порт 8080

Все сервисы перенесены на порт 8080. Nginx настроен на absolute_redirect off; port_in_redirect off; — иначе rootless-порт 8080 просачивался в URL при редиректах.

12-factor config: самописная библиотека

Для Drupal, который штатно хранит всё в settings.php, написана библиотека environment-loader — 13 PHP-провайдеров, которые собирают конфигурацию из env-переменных и /run/secrets/. Поддерживается 40+ переменных: от подключения к БД до настроек Keycloak и Prometheus. Fail-fast в каждом провайдере — если нет HASH_SALT или пароля БД, приложение не стартует.

Fail-fast и Health Checks

Kubernetes probes на трёх уровнях: liveness (проверка ответа приложения), readiness (готовность принимать трафик), startup (ожидание инициализации). Docker HEALTHCHECK — дублирование на уровне контейнера. Entrypoint-скрипты с set -e — 9 последовательных этапов инициализации, каждый с fail-fast.

Деплой в банковском k8s

Приложение разделено на два сервиса: шлюз (nginx) и бэкенд (PHP-FPM). Файлы хранятся в S3 (MinIO), конфигурация синка — внутри образа. Zero-downtime через rolling update с maintenance mode на время миграций БД.

Результаты

Время деплоя было
2–3 часа
Время деплоя стало
8–12 минут
MTTR до
4–8 часов
MTTR после
2–5 минут
Этапов сборки
6
Env-провайдеров
13
Переменных окружения
40+
Fail-fast сценариев
5
МетрикаБыло (SSH)Стало (k8s)Ускорение
Время деплоя2–3 ч ручного SSH8–12 мин CI/CD~15–20x
Восстановление (MTTR)4–8 ч (поднятие сервера)2–5 мин (kubectl)~100x
Новое окружение1–2 дня15 мин (Helm)~50x
Шагов деплоя10+ ручных1 команда~10x

Стек технологий

Kubernetes Docker multi-stage build rootless Drupal 10 PHP 8.2 nginx PostgreSQL 14 BuildKit L2 cache Docker Secrets Helm Azure DevOps 12-factor app S3 MinIO Keycloak Prometheus

Похожая задача? Свяжитесь с нами →