Репозиторий содержит воспроизводимый Docker Compose-стек со следующими компонентами:
- тестовое приложение на FastAPI
- PostgreSQL
- Prometheus
- Grafana
- базовый backup/restore для PostgreSQL
- CI pipeline на GitHub Actions
- приложение запускается через Docker Compose
- приложение подключается к PostgreSQL и пишет данные в БД
- Prometheus собирает метрики с
/metrics - Grafana автоматически поднимает datasource и dashboard из репозитория
- backup/restore для PostgreSQL реализованы через shell-скрипты
- CI выполняет базовую e2e-проверку стека
.
├── .env.example
├── docker-compose.yml
├── README.md
├── app/
│ ├── app.py
│ ├── Dockerfile
│ └── requirements.txt
├── prometheus/
│ └── prometheus.yml
├── grafana/
│ ├── dashboards/
│ │ └── app-overview.json
│ └── provisioning/
│ ├── dashboards/
│ │ └── dashboard.yml
│ └── datasources/
│ └── datasource.yml
├── scripts/
│ ├── backup.sh
│ └── restore.sh
└── .github/
└── workflows/
└── ci.yml
Для запуска нужны:
- Docker
- Docker Compose plugin
Проверить можно так:
docker --version
docker compose versionСоздать локальный .env из примера:
cp .env.example .envСодержимое по умолчанию:
POSTGRES_PASSWORD=change_me
GRAFANA_ADMIN_USER=admin
GRAFANA_ADMIN_PASSWORD=adminСобрать и поднять стек:
docker compose up -d --buildПроверить состояние контейнеров:
docker compose psПроверка health endpoint:
curl http://localhost:8000/healthОжидаемый ответ:
{"status":"healthy"}Сгенерировать несколько запросов:
curl http://localhost:8000/
curl http://localhost:8000/
curl http://localhost:8000/Проверить метрики:
curl http://localhost:8000/metricsОткрыть:
http://localhost:9090
Пример запроса в Prometheus UI:
app_requests_total
Открыть:
http://localhost:3000
Данные для входа по умолчанию:
- логин:
admin - пароль:
admin
Datasource и dashboard поднимаются автоматически из файлов репозитория:
- datasource:
grafana/provisioning/datasources/datasource.yml - dashboard provider:
grafana/provisioning/dashboards/dashboard.yml - dashboard JSON:
grafana/dashboards/app-overview.json
После старта docker compose up -d --build ручная настройка Grafana не
требуется.
Сделать исполняемыми скрипты:
chmod +x scripts/backup.sh scripts/restore.shСоздать backup:
./scripts/backup.shРезультат появится в каталоге backups/:
backups/appdb_YYYYMMDD_HHMMSS.sql
Восстановить БД из backup-файла:
./scripts/restore.sh backups/appdb_YYYYMMDD_HHMMSS.sqlPipeline GitHub Actions выполняет:
- валидацию
docker-compose.yml - сборку образов
- запуск стека
- проверку
/health - проверку
/metrics - проверку доступности Prometheus API
- smoke-test backup script
- cleanup окружения
В решении использованы следующие базовые практики:
- зафиксированы версии образов для воспроизводимости
- у PostgreSQL и приложения добавлены healthcheck'и
- приложение ждёт доступность БД на старте через retry-механику
- Prometheus собирает метрики только с реального
/metricsendpoint - Grafana поднимает datasource и dashboard автоматически из git-репозитория
- backup/restore реализованы простым и прозрачным способом через
pg_dumpиpsql
Это локальный reproducible baseline, а не production / HA решение.
Текущие ограничения:
- single-node deployment через Docker Compose
- нет high availability
- нет автоматического failover
- секреты хранятся в
.env, а не во внешнем secret manager - backup локальный, в виде SQL dump
- нет retention policy
- нет offsite/object storage backup
- нет автоматической проверки restore
- нет TLS / ingress / внешней аутентификации
- нет alerting rules и Alertmanager
- нет централизованных логов и трассировки
- нет resource limits / reservations
- схема БД инициализируется приложением на старте
Остановить стек:
docker compose downОстановить стек и удалить volumes:
docker compose down -vPOSTGRES_PASSWORD is not specified
Проверьте, что в корне проекта создан .env файл и в нём задан непустой POSTGRES_PASSWORD.
Пример:
POSTGRES_PASSWORD=change_me
GRAFANA_ADMIN_USER=admin
GRAFANA_ADMIN_PASSWORD=admin-
Перенёс бы deployment с Docker Compose на Kubernetes + Helm, чтобы получить декларативный rollout, управление конфигурацией по окружениям и более удобную эксплуатацию.
-
Использовал бы managed PostgreSQL или PostgreSQL HA-решение с автоматическим failover, backup policy и регулярной проверкой восстановления.
-
Вынес бы backup в object storage с retention policy, версионированием и регулярными restore-тестами в отдельном контуре.
-
Перевёл бы секреты во внешний secret manager и убрал бы чувствительные значения из
.envи runtime-конфигурации контейнеров. -
Добавил бы ingress + TLS, базовую сетевую сегментацию и контроль внешнего доступа.
-
Добавил бы alerting через Prometheus rules + Alertmanager с разделением на warning / critical и маршрутизацией уведомлений.
-
Добавил бы централизованные логи и tracing для диагностики ошибок, деградации производительности и анализа запросов.
-
Ввёл бы resource requests/limits, probes и дополнительные меры hardening:
- запуск от non-root пользователя
- read-only filesystem
- минимальные capabilities
- pinning образов по digest
-
Вынес бы миграции БД в отдельный lifecycle step (job / init container / migration service), чтобы не связывать изменение схемы со стартом приложения.
-
Усилил бы CI/CD:
- image scanning
- dependency scanning
- secret scanning
- policy checks (OPA / Kyverno)
- lint Helm chart'ов
-
Для observability в Kubernetes использовал бы operator-based подход:
- Prometheus Operator — управление Prometheus, Alertmanager, ServiceMonitor, PodMonitor, PrometheusRule через CRD;
- Grafana Operator — управление Grafana instances, dashboards и datasources декларативно;
- отказ от ручной настройки через UI в пользу GitOps-подхода.
-
Добавил бы полноценный CI/CD pipeline с деплоем в Kubernetes через Helm и выбором окружения (
dev/stage/prod):- сборка и push образа
- тестирование
- выбор values-файла
helm upgrade --install- post-deploy проверки
- rollback при неуспехе
app_requests_total— общее количество запросов- RPS (
rate(app_requests_total)) - latency (p50 / p95 / p99)
- error rate (доля 5xx)
- success rate по endpoint'ам
- количество активных запросов (in-flight)
- количество рестартов приложения
- активные соединения
- latency запросов
- slow queries
- deadlocks
- replication lag (если есть реплики)
- размер БД и рост таблиц
- WAL / checkpoint активность
- статус и возраст последнего backup
- CPU / memory usage по pod / node
- restart count контейнеров
- OOMKilled события
- pod readiness / availability
- node pressure (memory / disk)
- disk usage и IOPS
- network errors / packet loss
- scrape success / target health в Prometheus
- alert delivery success rate
- deployment frequency
- lead time for changes
- failed deployment rate
- mean time to recovery (MTTR)
Pipeline разбивается на стадии:
- docker compose config
- helm lint
- yaml lint
- проверка структуры проекта
- сборка Docker image
- tagging (commit SHA / release)
- push в registry
- smoke tests
- проверка
/health - проверка
/metrics - e2e через docker compose
- тест backup script
- image scanning
- dependency scanning
- secret scanning
- выбор окружения:
dev/stage/prod - выбор values-файла Helm
helm upgrade --install- ожидание rollout (
kubectl rollout status) - post-deploy smoke tests
- rollback при ошибке
dev— автоматический деплой при pushstage— деплой после merge / manual approvalprod— только manual approval или release tag
Пример структуры:
helm/app/
values-dev.yaml
values-stage.yaml
values-prod.yaml