Эта документация подробно описывает архитектуру инфраструктуры и DevOps-процессы для проекта dnp-project (Phonebook JSON-RPC сервис + React фронтенд). Основное внимание уделено настройке CI/CD, управлению Docker-контейнерами, сетевыми схемами, мониторингу и логированию.
Интернет ↔ Traefik (LB + TLS) ↔ Docker-сети (prod: infra_prod, stage: infra_stage)
│ ├── Prod: frontend, backend
│ └── Stage: frontend, backend
└── Infra: registry, prometheus, grafana, loki, promtail, cadvisor, node_exporter
- Traefik в роли внешнего балансировщика и маршрутизатора HTTPS
- Prod и Stage изолированы разными Docker-сетями: чтобы избежать конфликтов роутеров и сервисов
- Infra-сервисы в двух сетях сразу (
infra_prod,infra_stage) для мониторинга обоих окружений
infra_prod: внутренняя сеть для продакшн-контейнеров (frontend, backend)infra_stage: внутренняя сеть для стейдж-контейнеров- Traefik и мониторинговый стек сидят в обеих сетях одновременно
- Избежать конфликтов DNS-имен контейнеров (одинаковые сервисы в прод и стейдж)
- Упрощает маршрутизацию и ограничение доступа
- Гибкость: можно запускать оба окружения на одном сервере без проблем
- Включена опция
--providers.docker.exposedbydefault=false --providers.docker.networkуказывают на обе сети- HTTP->HTTPS редирект и ACME с Let’s Encrypt
- Маршрутизация по лейблам Docker сервисов
web(80) → редирект вwebsecurewebsecure(443) → TLS
labels:
- "traefik.enable=true"
- "traefik.http.services.backend.loadbalancer.server.port=8000"
- "traefik.http.routers.backend.rule=Host(`dnp-project.ru`) && (PathPrefix(`/rpc`) || PathPrefix(`/docs`) || PathPrefix(`/openapi.json`))"
- "traefik.http.routers.backend.entrypoints=websecure"
- "traefik.http.routers.backend.tls=true"
- "traefik.http.routers.backend.tls.certresolver=letsencrypt"
- "traefik.http.routers.backend.priority=100"
- "traefik.http.routers.backend.service=backend"
- "traefik.http.middlewares.strip-docs.stripprefix.prefixes=/docs,/redoc"
- "traefik.http.routers.backend.middlewares=strip-docs"- GitHub Actions или GitLab CI
- При пуше в
dev/main:- Запуск линтеров, тестов, coverage
- Сборка Docker образа
- Тэгирование (
dev→registry.dnp-project.ru/backend:dev;main→...:latest) - Push в личный Docker Registry (Traefik проксирует
registry.dnp-project.ru)
- SSH Action: автоматически
docker compose pull+up -dна сервере
- PostgreSQL запускается отдельным контейнером
- Volume для постоянного хранения данных
- Подключается к backend через Docker-сеть
- Grafana & Prometheus: метрики приложений и хостов
- cAdvisor & node_exporter: метрики контейнеров и железа
- Loki + Promtail: агрегирует логи контейнеров
- Дашборды Grafana доступны по
grafana.dnp-project.ru
- Создать сети:
docker network create infra_prod
docker network create infra_stage- Запустить Infra:
cd infra && docker compose up -d --build- Запустить Prod:
cd prod && docker compose up -d --build- Запустить Stage:
cd stage && docker compose up -d --build- Идемпотентность:
docker compose down && up -d --buildвсегда чистит старые лейблы - Секреты: используйте Docker Secrets или Vault для паролей DB и ACME_EMAIL
- Мониторинг: настраивайте алерты в Prometheus Alertmanager (например, падение контейнера)
- Бэкапы: регулярный экспорт PostgreSQL через cron + хранение на S3-compatible хранилище
Конец документации.