Это руководство описывает создание полного 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.
- Структура проекта: Убедитесь, что ваш проект имеет следующую структуру в репозитории:
- app.py и requirements.txt: Остаются такими же, как в предыдущем примере.
- Dockerfile: Этот файл не требует изменений.
docker-compose.yml (Обновлено): Этот файл сразу будет указывать на ваш будущий образ в Yandex Container Registry. Вам нужно будет позже заменить ВАШ_REGISTRY_ID на реальный ID.
Шаг 2: Настройка инфраструктуры в Yandex Cloud
Здесь произойдут самые важные дополнения: создание реестра и сервисного аккаунта.
- Создание Реестра (Container Registry):
В консоли Yandex Cloud перейдите в раздел Container Registry.
Нажмите Создать реестр.
Задайте имя, например, my-app-registry.
После создания скопируйте ID реестра. Он понадобится вам для секретов. - Создание Сервисного Аккаунта:
Это "учетная запись" для роботов (в нашем случае, для GitHub Actions), которая будет иметь строго ограниченные права.
В консоли Yandex Cloud перейдите в раздел Identity and Access Management.
Слева выберите Сервисные аккаунты и нажмите Создать сервисный аккаунт.
Задайте имя, например, github-actions-pusher.
Назначьте ему роли:
container-registry.images.pusher (разрешает загружать образы в реестр)
container-registry.images.puller (разрешает скачивать образы из реестра)
Нажмите Создать. - Создание Авторизованного ключа для Сервисного Аккаунта:
Перейдите на страницу созданного сервисного аккаунта.
Наверху вы увидите вкладку Авторизованные ключи. Нажмите Создать новый ключ.
Выберите Создать авторизованный ключ.
Тип ключа: JSON.
Алгоритм шифрования: RSA_2048.
Нажмите Создать.
Браузер скачает файл authorized_key.json. Сохраните его в надежном месте! Содержимое этого файла будет нашим главным секретом. - Создание и настройка ВМ (Ubuntu Server):
Этот процесс не изменился. Создайте ВМ на Ubuntu 22.04 LTS (как в Шаге 2 предыдущего гайда).
Обязательно сделайте IP-адрес статическим.
Настройте группы безопасности, открыв порты 22 (SSH) и 80 (HTTP).
Подключитесь к ВМ и установите Docker и Docker Compose (команды те же).
Шаг 3: Настройка GitHub (Репозиторий и Секреты)
Теперь настроим "мост", используя ключи и ID, которые мы только что получили.
- Генерация SSH-ключей для деплоя:
На вашем локальном компьютере создайте отдельную пару SSH-ключей для GitHub:
- Добавьте публичный ключ yc-deploy-key.pub на ваш сервер в Yandex Cloud в файл ~/.ssh/authorized_keys.
- Добавление Секретов в 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.
Важное замечание: Команда docker login в script будет выполняться при каждом деплое. Это обеспечивает актуальность сессии и является безопасным, так как ключ передается через защищенный канал SSH.
- Надежность: Сначала запускаются тесты и линтинг (test job). Если они провалятся, сборка и деплой даже не начнутся. Это предотвращает выкатку сломанного кода.
- Эффективность: Используется кэширование для ускорения установки зависимостей и сборки Docker-образов.
- Гибкость: Пайплайн по-разному ведет себя для разных веток. Для dev или feature-* веток он только протестирует и соберет образ (без пуша), а для main — выполнит полный цикл с деплоем.
- Изолированность: Каждый этап (test, build, deploy) является отдельным job, что упрощает отладку и понимание логов.
- Информативность: Добавлен notify job, который в конце сообщает о статусе всех этапов.
Шаг 5: Финальная подготовка сервера и первый запуск
Осталось сделать несколько действий на сервере вручную, но только один раз.
- Подготовка сервера:
Подключитесь к вашему серверу в Yandex Cloud по SSH.
Создайте рабочую папку: mkdir ~/my-streamlit-app && cd ~/my-streamlit-app
В этой папке создайте файл docker-compose.yml. Скопируйте в него содержимое вашего локального docker-compose.yml, не забыв подставить реальный ID вашего реестра вместо ВАШ_REGISTRY_ID. - Запуск!
Теперь сделайте любое изменение в коде вашего приложения (app.py).
Закоммитьте и отправьте изменения в main ветку:
3. Наблюдение и проверка:
Перейдите в раздел Actions в вашем GitHub-репозитории. Наблюдайте за выполнением workflow.
После успешного завершения всех шагов, откройте в браузере http://ВАШ_СТАТИЧЕСКИЙ_IP. Вы должны увидеть работающее приложение.
Теперь у вас настроен полностью автоматизированный, безопасный и профессиональный процесс развертывания, целиком построенный на инфраструктуре Yandex Cloud.