С помощью этого руководства вы научитесь настраивать полный цикл непрерывной интеграции и доставки (CI/CD) для веб-приложения на Python Flask, а также развертывать систему мониторинга на основе Prometheus и Grafana для обеспечения наблюдаемости работы приложения.
Для этого вы выполните следующие задачи:
Создадите автоматизированный пайплайн CI/CD в GitVerse.
Настроите безопасную сборку Docker-образов с автоматическим тестированием и проверкой уязвимостей.
Развернете Flask-приложение с промышленным WSGI-сервером Gunicorn.
Настроите мониторинг с помощью стека Prometheus + Grafana.
Реализуете сбор метрик с помощью Node Exporter и cAdvisor.
Создадите дашборды для визуализации метрик производительности и доступности.
Вы будете использовать следующие сервисы:
Виртуальные машины — сервис, в рамках которого предоставляется виртуальная машина для размещения приложения.
Публичный IP-адрес для доступа к виртуальным машинам через интернет.
Docker — система контейнеризации.
Docker Compose — инструмент для запуска и управления Docker-контейнерами.
GitVerse — платформа для совместной работы с исходным кодом.
Prometheus — система мониторинга, сбора и хранения метрик.
Grafana — платформа для визуализации, мониторинга и анализа данных.
Шаги:
Перед началом работы
Если вы уже зарегистрированы, войдите под своей учетной записью.
1. Разверните ресурсы в облаке
На этом шаге вы подготовите инфраструктуру проекта: создадите две виртуальные машины с публичными IP-адресами и настроите для них правила фильтрации трафика.
app-vm — целевая виртуальная машина для приложения, на которой будет располагаться контейнер с Flask-API и экспортеры метрик.
monitoring-vm — инфраструктурная виртуальная машина, на которой будут располагаться GitVerse Runner, Prometheus, Grafana.
Все создаваемые ресурсы должны располагаться в одной
.Сгенерируйте ключевую пару и загрузите публичный ключ в Cloud.ru Evolution.
Создайте группу безопасности с названием app-vm-sg и добавьте в нее правила со следующими параметрами:
Трафик
Протокол
Порт
Тип источника/адресата
Источник/Адресат
Входящий
TCP
5000
IP-адрес
0.0.0.0/0
Входящий
TCP
9100
IP-адрес
0.0.0.0/0
Входящий
TCP
8080
IP-адрес
0.0.0.0/0
Исходящий
Любой
—
IP-адрес
0.0.0.0/0
Создайте группу безопасности с названием monitoring-vm-sg и добавьте в нее правила со следующими параметрами:
Трафик
Протокол
Порт
Тип источника/адресата
Источник/Адресат
Входящий
TCP
9090
IP-адрес
0.0.0.0/0
Входящий
TCP
3000
IP-адрес
0.0.0.0/0
Исходящий
Любой
—
IP-адрес
0.0.0.0/0
Создайте виртуальную машину со следующими параметрами:
Название — app-vm.
Зона доступности — та же, что у группы безопасности.
Образ — на вкладке Публичные выберите образ Ubuntu 22.04.
Гарантированная доля vCPU — 10%.
Сетевой интерфейс — выберите тип Публичный IP.
Публичный IP — оставьте Арендовать новый или выберите IP-адрес из списка арендованных.
Группы безопасности — app-vm-sg и группа безопасности по умолчанию.
Логин — оставьте значение по умолчанию или укажите новый.
Метод аутентификации — Публичный ключ и Пароль.
Пароль — задайте пароль пользователя.
Остальные параметры оставьте по умолчанию или выберите на свое усмотрение.
Создайте виртуальную машину со следующими параметрами:
Название — monitoring-vm.
Зона доступности — та же, что у группы безопасности.
Образ — на вкладке Публичные выберите образ Ubuntu 22.04.
Гарантированная доля vCPU — 10%.
vCPU, шт — 4.
RAM, ГБ — 8.
Диски — SSD-диск 40 ГБ.
Сетевой интерфейс — выберите тип Публичный IP.
Публичный IP — оставьте Арендовать новый или выберите IP-адрес из списка арендованных.
Группы безопасности — monitoring-vm-sg и группа безопасности по умолчанию.
Логин — оставьте значение по умолчанию или укажите новый.
Метод аутентификации — Публичный ключ и Пароль.
Пароль — задайте пароль пользователя.
Остальные параметры оставьте по умолчанию или выберите на свое усмотрение.
Убедитесь, что ресурсы созданы и отображаются в личном кабинете:
На странице Сети → Группы безопасности отображаются группы безопасности app-vm-sg и monitoring-vm-sg со статусом «Создана».
На странице Инфраструктура → Виртуальные машины отображаются виртуальные машины app-vm и monitoring-vm со статусом «Запущена».
Запишите публичные IP-адреса каждой виртуальной машины. В этом руководстве используются следующие IP-адреса:
app-vm — 176.109.105.170;
monitoring-vm — 176.123.164.242.
2. Настройте окружение виртуальных машин и установите Docker
На этом шаге вы настроите окружение виртуальных машин и установите Docker.
В терминале для каждой из созданных машин выполните действия:
Подключитесь к виртуальной машине по SSH с использованием публичного IP-адреса.
Обновите систему и установите утилиты:
sudo apt update && sudo apt upgrade -yДобавьте настройки DNS для разрешения доменных имен:
Откройте файл /etc/resolv.conf для редактирования:
sudo nano /etc/resolv.confДобавьте следующие настройки и сохраните файл:
nameserver 8.8.8.8nameserver 8.8.4.4Перезагрузите виртуальную машину и подключитесь к ней по SSH.
Подготовьте систему к безопасной установке Docker, добавив официальный репозиторий и настроив механизмы проверки подлинности пакетов:
sudo apt-get install ca-certificates curl -ysudo install -m 0755 -d /etc/apt/keyringssudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.ascsudo chmod a+r /etc/apt/keyrings/docker.ascДобавьте ключ репозитория:
echo \"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \$(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}") stable" | \sudo tee /etc/apt/sources.list.d/docker.list > /dev/nullsudo apt-get updateУстановите Docker, Docker Compose и сопутствующее ПО:
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin -yДобавьте текущего пользователя виртуальной машины в группу Docker:
Выполните команду:
sudo usermod -aG docker $USERnewgrp dockerПерезагрузите систему.
Проверьте работоспособность Docker:
docker run hello-worldПоявится сообщение, подтверждающее успешность установки и настройки.
ПримечаниеВ некоторых случаях права на использование Docker без префикса sudo не сохраняются и командная строка возвращает ошибку permission denied. В этом случае вы можете продолжить работу с Docker, добавляя в начало каждой команды префикс sudo.
3. Настройте агенты сбора метрик
На этом шаге вы настроите агенты для сбора метрик приложения.
Откройте сессию терминала с подключением к виртуальной машине app-vm.
Создайте директорию для файлов мониторинга и установите права пользователя:
sudo mkdir -p /opt/monitoringsudo chown $USER:$USER /opt/monitoringcd /opt/monitoringСкопируйте файлы конфигурации из Git-репозитория:
git clone https://gitverse.ru/cloud.ru/lab2_cicd_monitoring.git .Запустите контейнеры с агентами мониторинга в фоновом режиме:
docker compose -f config/docker-compose.monitoring-agents.yml up -dУбедитесь, что все сервисы запущены корректно:
docker compose -f config/docker-compose.monitoring-agents.yml psВ ответе вернется список запущенных контейнеров:
NAME IMAGE COMMAND SERVICE CREATED STATUS PORTSmonitoring-cadvisor gcr.io/cadvisor/cadvisor:v0.47.2 "/usr/bin/cadvisor -…" cadvisor 15 seconds ago Up 15 seconds (health: starting) 0.0.0.0:8080->8080/tcp, [::]:8080->8080/tcpmonitoring-node-exporter prom/node-exporter:v1.6.1 "/bin/node_exporter …" node-exporter 15 seconds ago Up 15 seconds 0.0.0.0:9100->9100/tcp, [::]:9100->9100/tcpГде:
node_exporter — отвечает за сбор метрик операционной системы;
cadvisor — отвечает за сбор метрик контейнеров.
4. Настройте Prometheus и Grafana
На этом шаге вы настроите Prometheus и Grafana на виртуальной машине мониторинга.
Откройте сессию терминала с подключением к виртуальной машине monitoring-vm.
Создайте директорию для файлов мониторинга и установите права пользователя:
sudo mkdir -p /opt/monitoringsudo chown $USER:$USER /opt/monitoringcd /opt/monitoringСкопируйте файлы конфигурации из Git-репозитория:
git clone https://gitverse.ru/cloud.ru/lab2_cicd_monitoring.git .Откройте конфигурационный файл мониторинга:
nano monitoring/prometheus.ymlЗамените в нем IP-адрес на публичный IP-адрес app-vm. В этом практическом — 176.109.105.170.
Запустите контейнеры с агентами мониторинга в фоновом режиме:
docker compose -f config/docker-compose.monitoring.yml up -dУбедитесь, что все сервисы запущены корректно:
docker compose -f config/docker-compose.monitoring.yml psВ ответе вернется список запущенных контейнеров:
NAME IMAGE COMMAND SERVICE CREATED STATUS PORTSmonitoring-grafana grafana/grafana:latest "/run.sh" grafana 16 minutes ago Up 9 seconds 0.0.0.0:3000->3000/tcp, [::]:3000->3000/tcpmonitoring-prometheus prom/prometheus:latest "/bin/prometheus --c…" prometheus 17 minutes ago Up 9 seconds 0.0.0.0:9090->9090/tcp, [::]:9090->9090/tcpПроверьте доступность сервисов:
Отправьте API-запрос к сервису Prometheus:
curl http://localhost:9090/-/healthyОтправьте API-запрос к сервису Grafana:
curl http://localhost:3000/api/health
Проверьте, что Prometheus получает метрики с сервера приложения:
В браузере откройте страницу http://<monitoring_public_ip>:9090/targets, где <monitoring_public_ip> — публичный IP-адрес виртуальной машины monitoring-vm. В этом практическом — 176.123.164.242.
Проверьте, что Node Exporter и cAdvisor имеют статус «UP» и передают метрики.
Проверьте, что Grafana работает:
В браузере откройте страницу http://<monitoring_public_ip>:3000, где <monitoring_public_ip> — публичный IP-адрес виртуальной машины monitoring-vm. В этом практическом — 176.123.164.242.
Авторизуйтесь в приложении. В учебных целях используйте логин и пароль, который задан в файле Docker Compose:
- GF_SECURITY_ADMIN_USER=admin- GF_SECURITY_ADMIN_PASSWORD=admin123
5. Настройте пайплайн CI/CD в GitVerse
На этом шаге вы настроите CI/CD для развертывания Flask-приложения из репозитория GitVerse на виртуальной машине.
Авторизуйтесь в GitVerse.
Создайте форк учебного репозитория GitVerse.
Подключите CI/CD:
Перейдите в раздел Настройки.
Активируйте опцию CI/CD и нажмите Обновить.
Добавьте переменные окружения в проект:
Перейдите в раздел Секреты и переменные.
Добавьте следующие секреты в проект:
CI_REGISTRY — registry.gitverse.ru.
CI_REGISTRY_IMAGE — registry.gitverse.ru/<gitverse_login>/lab2-cicd-monitoring, где <gitverse_login> — ваш логин в GitVerse.
CI_REGISTRY_USER — ваш логин в GitVerse.
CI_REGISTRY_PASSWORD — ваш пароль в GitVerse.
DEPLOY_HOST — публичный IP-адрес виртуальной машины app-vm. В этом практическом — 176.109.105.170.
DEPLOY_USER — логин пользователя виртуальной машины app-vm. В этом практическом — user1.
DEPLOY_SSH_PRIVATE_KEY — приватная часть SSH-ключа для подключения к app-vm.
ВниманиеВ учебных целях DEPLOY_USER и DEPLOY_SSH_PRIVATE_KEY используют учетные данные подключения к виртуальной машине, которые вы добавили при ее создании. В реальных задачах используйте для этого отдельный логин и публичный ключ.
Добавьте раннер в CI.
Откройте сессию терминала с подключением к виртуальной машине monitoring-vm.
Установите менеджер пакетов и библиотеки Python:
sudo apt install -y python3-pip python3-venv python3-dev build-essentialУстановите Node.js:
curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash -sudo apt-get install -y nodejsСоздайте рабочую директорию для раннера и перейдите в нее:
mkdir -p ~/gitverse-runnercd ~/gitverse-runnerУстановите актуальную версию раннера и добавьте права на выполнение:
wget https://gitverse.ru/api/packages/gitverse/generic/act_runner_linux_amd64/4.1.0/act_runner_linux_amd64mv act_runner_linux_amd64 act_runnerchmod +x act_runnerПроверьте, что раннер установлен:
./act_runner --version
Получите токен регистрации в GitVerse:
В верхней части страницы нажмите Настройки и перейдите на вкладку Раннеры.
Нажмите Добавить раннер.
В открывшемся окне скопируйте сгенерированный токен.
Зарегистрируйте раннер. В терминале monitoring-vm выполните команду:
sudo ./act_runner register \--no-interactive \--instance https://gitverse.ru/sc \--token <registration_token> \--name "lab2-runner" \--labels "docker,monitoring,self-hosted"Где <registration_token> — токен, полученный в GitVerse.
Вернитесь на страницу настройки раннеров в GitVerse.
Проверьте, что локальный раннер появился в настройках и его статус — «Недоступен». Вы зарегистрировали раннер, но еще не запускали.
Настройте автозапуск раннера:
Откройте сессию терминала с подключением к виртуальной машине monitoring-vm.
Выполните команду, которая создаст файл службы systemd:
sudo tee /etc/systemd/system/gitverse-runner.service << EOF[Unit]Description=GitVerse RunnerAfter=network.target docker.service[Service]Type=simpleUser=rootWorkingDirectory=/home/<vm_login>/gitverse-runnerExecStart=/home/<vm_login>/gitverse-runner/act_runner daemonRestart=alwaysRestartSec=10[Install]WantedBy=multi-user.targetEOFГде <vm_login> — имя пользователя виртуальной машины (логин). В этом практическом — user1.
Включите автозапуск:
sudo systemctl enable gitverse-runnersudo systemctl start gitverse-runnerПроверьте статус раннера в терминале виртуальной машины:
sudo systemctl status gitverse-runnerПример ожидаемого ответа:
● gitverse-runner.service - GitVerse RunnerLoaded: loaded (/etc/systemd/system/gitverse-runner.service; enabled; vendor preset: enabled)Active: active (running) since Tue 2025-11-11 14:42:45 MSK; 16s agoMain PID: 18335 (act_runner)Tasks: 9 (limit: 9388)Memory: 7.3MCPU: 49msCGroup: /system.slice/gitverse-runner.service└─18335 /home/user1/gitverse-runner/act_runner daemonПроверьте статус раннера в GitVerse.
Вернитесь на страницу настройки раннеров в GitVerse и проверьте, что статус локального раннера в настройках изменился на «Простаивает».
6. Разверните Flask-приложение на ВМ
В учебном репозитории GitVerse содержится исходный код Flask-приложения. На этом шаге вы настроите автоматическое развертывание Flask-приложения из репозитория на виртуальную машину.
Откройте GitVerse и перейдите на вкладку CI/CD вашего репозитория.
На вкладке может отображаться пайплайн, который автоматически запускается после создания репозитория.
Если этого не произошло:
В меню слева нажмите CI/CD Pipeline для Lab2 (Self-hosted GitVerse).
Нажмите Запустить.
В открывшемся окне оставьте ветку по умолчанию и подтвердите запуск пайплайна.
Пайплайн отобразится на странице.
ПримечаниеКонфигурация пайплайна содержится в файле lab2_cicd_monitoring/.gitverse/workflows/ci-cd-pipeline.yaml.
Чтобы посмотреть процесс выполнения заданий, нажмите на название пайплайна.
Дождитесь выполнения всех заданий.
Проверьте работу приложения на виртуальной машине:
Откройте сессию терминала с подключением к виртуальной машине app-vm.
Выполните команду для проверки работы контейнера:
docker psПример ожидаемого ответа:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMESe52a3a8b0a44 gitverse.ru/dsdimbrilova/lab2_cicd_monitoring:86162a407c6e92a22b5ec52ddcf4a9d851e2ff26 "gunicorn --bind 0.0…" 22 minutes ago Up 22 minutes 0.0.0.0:5000->5000/tcp, [::]:5000->5000/tcp lab2-app4acb8e7bb178 prom/node-exporter:v1.6.1 "/bin/node_exporter …" 7 hours ago Up 7 hours 0.0.0.0:9100->9100/tcp, [::]:9100->9100/tcp monitoring-node-exporter3520e6b03e4a gcr.io/cadvisor/cadvisor:v0.47.2 "/usr/bin/cadvisor -…" 7 hours ago Up 7 hours (healthy) 0.0.0.0:8080->8080/tcp, [::]:8080->8080/tcp monitoring-cadvisorВыполните команду для просмотра логов контейнера:
docker logs lab2-appПример ожидаемого ответа:
[2025-11-11 12:48:28 +0000] [1] [INFO] Starting gunicorn 21.2.0[2025-11-11 12:48:28 +0000] [1] [INFO] Listening at: http://0.0.0.0:5000 (1)[2025-11-11 12:48:28 +0000] [1] [INFO] Using worker: sync[2025-11-11 12:48:28 +0000] [6] [INFO] Booting worker with pid: 6[2025-11-11 12:48:28 +0000] [7] [INFO] Booting worker with pid: 7[2025-11-11 12:48:28 +0000] [8] [INFO] Booting worker with pid: 8[2025-11-11 12:48:28 +0000] [9] [INFO] Booting worker with pid: 9Обратитесь к API приложения:
curl http://<ip-address>:5000/healthcurl http://<ip-address>:5000/api/timeГде <ip-address> — публичный IP-адрес виртуальной машины app-vm. В этом практическом — 176.109.105.170.
7. Настройте дашборды мониторинга
На этом шаге вы настроите дашборды мониторинга Grafana для визуализации метрик производительности и доступности приложения. В этом практическом используются стандартные экспортеры метрик, поэтому вы будете использовать готовые дашборды Grafana.
Скачайте готовые дашборды Node Exporter и cAdvisor с сайта Grafana.
В браузере откройте страницу http://<monitoring_public_ip>:3000, где <monitoring_public_ip> — публичный IP-адрес виртуальной машины monitoring-vm. В этом практическом — 176.123.164.242.
Авторизуйтесь в Grafana:
логин — admin;
пароль — admin123.
Добавьте дашборды в сервис. Для каждого скачанного JSON-файла выполните действия:
Перейдите на вкладку Dashboards и нажмите New → Import.
Откройте скачанный JSON-файл и нажмите Import.
Node Exporter потребует указать источник данных. Выберите Prometheus.
На вкладке Dashboards появится список добавленных дашбордов.
Выберите любой из дашбордов.
В сервисе отобразятся виджеты с метриками работы приложения на виртуальной машине app-vm.
Вы можете выбрать нужный временной интервал или виджет.
Результат
Вы научились:
Создавать автоматизированный пайплайн CI/CD в GitVerse.
Настраивать безопасную сборку Docker-образов с автоматическим тестированием и проверкой уязвимостей.
Автоматически разворачивать Flask-приложение из репозитория.
Настраивать мониторинг с помощью Prometheus и Grafana.
Создавать дашборды для визуализации метрик производительности и доступности.