CI/CD Pipeline: anime-backlog-web (in Russian)
Written by skeirss
CI/CD Pipeline: anime-backlog-web
О проекте
anime-backlog-web — самописное приложение для отслеживания аниме-тайтлов, состоящее из отдельных Docker-контейнеров:
- Backend — Python
- Frontend — Node.js / Next.js
- База данных — PostgreSQL
1. Подготовка инфраструктуры
Terraform
С помощью Terraform создаётся виртуальная машина в Yandex Cloud. В главном конфигурационном файле запрашиваются:
- 1 загрузочный диск
- 1 виртуальная сеть
- 1 подсеть
- 1 виртуальная машина с минимальными характеристиками
- подключение диска и сети к ВМ
cloud-terraform/main.tf
Cloud-init
Первоначальная настройка ВМ (bootstrap), выполняется один раз при первом запуске:
- добавление пользователя
- добавление SSH-ключа
cloud-terraform/cloud-init.yml
Ansible
Более детальная конфигурация облачной машины:
- установка и настройка Docker
- настройка firewall
- установка fail2ban
- усиление безопасности sshd
После связки Terraform → Cloud-init → Ansible виртуальная машина полностью готова к деплою приложения.
ansible/harden.yml
2. Запуск pipeline
git push в удалённый репозиторий на GitHub → GitHub отправляет webhook на:
https://jenkins.bernd32.xyz/github-webhook/
Безопасность доступа:
| Ресурс | Доступ |
|---|---|
https://jenkins.bernd32.xyz (сам Jenkins) |
только для IP, разрешённых в конфигурации nginx |
.../github-webhook/ (endpoint для вебхуков) |
открыт для всех IP, защищён HMAC-подписью payload |
Jenkins клонирует репозиторий и считывает декларативный pipeline из jenkins/Jenkinsfile.
3. Quality Gates
Тесты фронтенда и бэкенда запускаются параллельно, каждый в своём Docker-контейнере.
Backend
- Контейнер:
python:3.14-slim-bookworm - Создание venv
- Установка зависимостей
- Запуск
pytestс JUnit-отчётом post.always→ публикация результатов тестов
Frontend
- Контейнер:
node:22-bookworm-slim npm citypechecknpm test(Vitest, JUnit-отчёт)npm run buildpost.always→ публикация результатов тестов
4. Сборка и публикация образов
Docker-образы собираются и выгружаются в registry (Docker Hub) с тегом git-sha.
Это даёт:
- воспроизводимость (откат на конкретный тег)
- полную историю образов
5. Проверка безопасности
Проверки выполняются в non-blocking режиме — не приводят к падению сборки, а формируют отчёты в панели Jenkins.
| Инструмент | Что сканирует |
|---|---|
| pip-audit | Python-зависимости бэкенда |
| npm audit | JS/TS-зависимости фронтенда |
| Trivy | Собранный Docker-образ целиком (сразу после сборки) |
6. Деплой
На удалённом хосте ВМ, с подключённым через withCredentials секретным .env-файлом (не коммитится в репозиторий), выполняется:
docker compose up -d --remove-orphans --wait
с только что собранными образами.
После успешного завершения pipeline:
docker image prune -f
Приложение доступно по адресу:
http://cloud-ip:20773
7. Мониторинг
В Grafana на локальном сервере настроен дашборд для мониторинга локального сервера с "production"-версией приложения.
Стек Prometheus + cAdvisor/node-exporter отслеживает:
- общее состояние сервера (CPU / RAM / disk I/O)
- состояние Docker-контейнеров (использование FS, CPU, сети, памяти по каждому контейнеру)
8. Rollback-стратегия
Для отката реализован отдельный pipeline: jenkins/rollback/Jenkinsfile.
Порядок действий:
- Найти последний успешный билд нужной версии
- В console output найти строку
Building commit XXXXXXXX(хеш коммита = тег образа на Docker Hub) - Перейти в job
anime-backlog-rollbackв Jenkins - Выбрать Build with Parameters
- В поле
ROLLBACK_SHAвставить нужный хеш коммита - Запустить билд — версия на проде будет восстановлена
9. Flowchart
![]()