Найти в Дзене
AI_ML

Автоматическое развертывание Docker-приложения из GitHub в Yandex Cloud

Оглавление

Это руководство описывает создание полного CI/CD-пайплайна. Конечная цель: каждое изменение в main ветке вашего GitHub-репозитория автоматически обновляет ваше Streamlit-приложение, работающее на сервере в Yandex Cloud в виде Docker-контейнера.

Технологический стек:

  • Платформа: Yandex Cloud (Compute Cloud)
  • Реестр контейнеров: Yandex Container Registry
  • ОС сервера: Ubuntu 22.04 LTS
  • Контейнеризация: Docker и Docker Compose
  • CI/CD: GitHub Actions
  • Аутентификация: Сервисный аккаунт Yandex Cloud

Шаг 1: Подготовка вашего приложения и Docker-файлов

Эта часть остается базовой, но мы сразу адаптируем docker-compose.yml под Yandex Container Registry.

  1. Структура проекта: Убедитесь, что ваш проект имеет следующую структуру в репозитории:
-2
  • app.py и requirements.txt: Остаются такими же, как в предыдущем примере.
  • Dockerfile: Этот файл не требует изменений.
"--server.port=8501", "--server.address=0.0.0.0"]
"--server.port=8501", "--server.address=0.0.0.0"]

docker-compose.yml (Обновлено): Этот файл сразу будет указывать на ваш будущий образ в Yandex Container Registry. Вам нужно будет позже заменить ВАШ_REGISTRY_ID на реальный ID.

-4

Шаг 2: Настройка инфраструктуры в Yandex Cloud

Здесь произойдут самые важные дополнения: создание реестра и сервисного аккаунта.

  1. Создание Реестра (Container Registry):
    В консоли Yandex Cloud перейдите в раздел Container Registry.
    Нажмите
    Создать реестр.
    Задайте имя, например, my-app-registry.
    После создания скопируйте
    ID реестра. Он понадобится вам для секретов.
  2. Создание Сервисного Аккаунта:
    Это "учетная запись" для роботов (в нашем случае, для GitHub Actions), которая будет иметь строго ограниченные права.
    В консоли Yandex Cloud перейдите в раздел
    Identity and Access Management.
    Слева выберите
    Сервисные аккаунты и нажмите Создать сервисный аккаунт.
    Задайте имя, например, github-actions-pusher.
    Назначьте ему роли:
    container-registry.images.pusher (разрешает загружать образы в реестр)
    container-registry.images.puller (разрешает скачивать образы из реестра)
    Нажмите
    Создать.
  3. Создание Авторизованного ключа для Сервисного Аккаунта:
    Перейдите на страницу созданного сервисного аккаунта.
    Наверху вы увидите вкладку
    Авторизованные ключи. Нажмите Создать новый ключ.
    Выберите
    Создать авторизованный ключ.
    Тип ключа: JSON.
    Алгоритм шифрования: RSA_2048.
    Нажмите
    Создать.
    Браузер скачает файл authorized_key.json.
    Сохраните его в надежном месте! Содержимое этого файла будет нашим главным секретом.
  4. Создание и настройка ВМ (Ubuntu Server):
    Этот процесс не изменился. Создайте ВМ на Ubuntu 22.04 LTS (как в Шаге 2 предыдущего гайда).
    Обязательно сделайте
    IP-адрес статическим.
    Настройте
    группы безопасности, открыв порты 22 (SSH) и 80 (HTTP).
    Подключитесь к ВМ и установите
    Docker и Docker Compose (команды те же).

Шаг 3: Настройка GitHub (Репозиторий и Секреты)

Теперь настроим "мост", используя ключи и ID, которые мы только что получили.

  1. Генерация SSH-ключей для деплоя:
    На вашем локальном компьютере создайте отдельную пару SSH-ключей для GitHub:
-5
  1. Добавьте публичный ключ yc-deploy-key.pub на ваш сервер в Yandex Cloud в файл ~/.ssh/authorized_keys.
  2. Добавление Секретов в GitHub:
    В репозитории GitHub перейдите в Settings -> Secrets and variables -> Actions.
    Создайте следующие секреты (как на вашем скриншоте):
  • YC_REGISTRY_ID: ID вашего реестра из Yandex Container Registry.
  • YC_SA_JSON_CREDENTIALS: Содержимое JSON-ключа вашего сервисного аккаунта.
  • YC_SERVER_IP: Статический публичный IP-адрес вашего сервера (ВМ).
  • YC_SERVER_USER: Логин для подключения к серверу (например, ubuntu).
  • YC_SSH_PRIVATE_KEY: Приватный SSH-ключ для доступа к серверу.

Шаг 4: Создание Workflow для GitHub Actions (Обновлено)

Это сердце нашей автоматизации. Файл .github/workflows/deploy.yml будет полностью адаптирован под сервисный аккаунт и Yandex Container Registry.

-6
--max-complexity=10 --max-line-length=100 --ignore=E501,W503
--max-complexity=10 --max-line-length=100 --ignore=E501,W503
docker login --username json_key --password-stdin cr.yandex
docker login --username json_key --password-stdin cr.yandex

Важное замечание: Команда docker login в script будет выполняться при каждом деплое. Это обеспечивает актуальность сессии и является безопасным, так как ключ передается через защищенный канал SSH.

  • Надежность: Сначала запускаются тесты и линтинг (test job). Если они провалятся, сборка и деплой даже не начнутся. Это предотвращает выкатку сломанного кода.
  • Эффективность: Используется кэширование для ускорения установки зависимостей и сборки Docker-образов.
  • Гибкость: Пайплайн по-разному ведет себя для разных веток. Для dev или feature-* веток он только протестирует и соберет образ (без пуша), а для main — выполнит полный цикл с деплоем.
  • Изолированность: Каждый этап (test, build, deploy) является отдельным job, что упрощает отладку и понимание логов.
  • Информативность: Добавлен notify job, который в конце сообщает о статусе всех этапов.

Шаг 5: Финальная подготовка сервера и первый запуск

Осталось сделать несколько действий на сервере вручную, но только один раз.

  1. Подготовка сервера:
    Подключитесь к вашему серверу в Yandex Cloud по SSH.
    Создайте рабочую папку: mkdir ~/my-streamlit-app && cd ~/my-streamlit-app
    В этой папке создайте файл docker-compose.yml. Скопируйте в него содержимое вашего локального docker-compose.yml,
    не забыв подставить реальный ID вашего реестра вместо ВАШ_REGISTRY_ID.
  2. Запуск!
    Теперь сделайте любое изменение в коде вашего приложения (app.py).
    Закоммитьте и отправьте изменения в main ветку:
-9

3. Наблюдение и проверка:
Перейдите в раздел Actions в вашем GitHub-репозитории. Наблюдайте за выполнением workflow.
После успешного завершения всех шагов, откройте в браузере http://ВАШ_СТАТИЧЕСКИЙ_IP. Вы должны увидеть работающее приложение.

Теперь у вас настроен полностью автоматизированный, безопасный и профессиональный процесс развертывания, целиком построенный на инфраструктуре Yandex Cloud.