💼 Кейс 3: Разработка Internal Developer Platform (IDP) для хакатона

Роль: DevOps / Platform Engineer
Длительность: ~83 часа (полный цикл: от проектирования до поддержки в проде и демонтажа)
Стек: GitLab Self-Managed, Podman (rootless), Traefik, Terraform, Ansible, Bash.

🎯 Проблема и Контекст (Baseline)

Необходимо было предоставить 5 изолированным командам надежную среду для 2-дневного хакатона (стек: .NET, React, Telegram-боты, SQLite/PostgreSQL). Ключевые боли:

  • Зависимость от внешних SaaS-решений с ограничениями на регистрацию и доступ.
  • Риск того, что участники или наставники “сломают” пайплайн, пытаясь изменить его код “на лету”.
  • Высокая вероятность сетевых коллизий при одновременном деплое нескольких команд.

🛠 Инженерные решения (Action)

1. Platform as a Product (Централизованные шаблоны)

  • Создан единый платформенный репозиторий (platform), содержащий переиспользуемые CI/CD workflow (через include) и стандартизированные docker-compose манифесты.
  • Команды получали “скелет” репозитория с готовыми Dockerfile (multi-stage) и .gitlab-ci.yml, что исключало ошибки базовой настройки.

2. Параметризация и безопасность (No-Code Deployment для наставников)

  • Внедрена система управления деплоем через CI-переменные (DEPLOY_MODE, DB_TYPE, NEEDS_DB).
  • Результат: Наставники могли переключать сценарий (например, с веб-приложения на Telegram-бота или с SQLite на PostgreSQL) прямо в UI GitLab, не внося изменений в код пайплайна.

3. Глубокий траблшутинг и изоляция

  • Критический инцидент: Во время мероприятия несколько команд случайно подключались к чужим базам данных, так как использовали общее имя сервиса postgres в общей сети Podman.
  • Решение: Логика генерации переменных перенесена в скрипт deploy-remote.sh. Теперь при каждом деплое скрипт автоматически формирует и пробрасывает в контейнер уникальные переменные окружения (например, DB_HOST=team-2-hackathon-backend-postgres), полностью исключая ручной ввод и коллизии.
  • Вся платформа развернута на rootless Podman: исполнение контейнерного движка без root-прав снижает attack surface на общем сервере мероприятия. Сетевое изолирование и ACL-фиксы сокетов (через systemd drop-in) применены как часть этой модели.

4. Оптимизация и надежность самой платформы

  • Аудит бэкапов: выявлены два root-cause роста архивов до 9.1 ГБ — архивация Container Registry и баг GITLAB_OMNIBUS_CONFIG (параметры не сохранялись при перезапуске).
  • Решение: Внедрена прямая запись в gitlab.rb через Ansible + флаг SKIP=registry при бэкапе.

📊 Результаты и Метрики

Метрика Результат
Изоляция и стабильность 5 команд работали параллельно без сетевых коллизий и взаимного влияния.
Управляемость 0 изменений кода пайплайна со стороны наставников; все настройки через CI-переменные.
Оптимизация платформы Аудит бэкапов: устранены оба root-cause (архивация Registry, баг omnibus-конфига): размер ~9.1 ГБ → 44 МБ (~200 раз), время 15 мин → 48 сек.
Безопасность Rootless-исполнение, автоматическая очистка ресурсов после мероприятия (полный демонтаж через Terraform).

🏗 Архитектура платформы

graph TD
    subgraph Teams [Development Teams]
        Dev[Participants/Mentors] -->|git push / change vars| GitLab[GitLab Self-Managed]
    end

    subgraph Platform [CI/CD Platform Repo]
        GitLab -->|include| Templates[Reusable CI Templates]
        Templates -->|Kaniko Build| Registry[Container Registry]
    end

    subgraph Hackathon [Hackathon Environment - Rootless Podman]
        GitLab -->|Trigger| Runner[GitLab Runner]
        Runner -->|SSH + Compose| DeployScript[deploy-remote.sh]
        DeployScript -->|Inject Unique DB_HOST| Stack[Isolated Team Stack]
        Stack --> Registry
    end