On-Premise развёртывание: PanDev Metrics с Docker и Kubernetes за 30 минут
Не каждая компания может отправлять инженерные данные в облако. Регулируемые отрасли, государственные подрядчики и организации с повышенными требованиями к безопасности нуждаются в платформе метрик on-premise — внутри собственной сети, на собственных серверах. Согласно CNCF Annual Survey, более 80% организаций уже используют Kubernetes в продакшене, что делает контейнерное on-premise развёртывание хорошо понятным операционным паттерном.
PanDev Metrics поддерживает полное on-premise развёртывание через Docker Compose (для небольших команд) и Kubernetes с Helm (для более крупных организаций). Это руководство охватывает оба варианта, включая аутентификацию LDAP, TLS-сертификаты и постоянное хранилище.
Обзор архитектуры
On-premise PanDev Metrics состоит из следующих компонентов:
┌─────────────────────────────────────────────┐
│ Load Balancer │
│ (nginx / traefik) │
└──────────────────┬──────────────────────────┘
│
┌─────────┴─────────┐
│ │
┌────────▼──────┐ ┌───────▼───────┐
│ Web App │ │ API Server │
│ (frontend) │ │ (backend) │
│ Port 3000 │ │ Port 8080 │
└───────────────┘ └───────┬───────┘
│
┌─────────────┼─────────────┐
│ │ │
┌────────▼──┐ ┌──────▼─────┐ ┌───▼────────┐
│ PostgreSQL │ │ Redis │ │ Webhook │
│ (primary │ │ (cache + │ │ Worker │
│ database) │ │ queues) │ │ (async │
│ Port 5432 │ │ Port 6379 │ │ processing│
└────────────┘ └────────────┘ └────────────┘
| Компонент | Назначение | Ресурсы (минимум) |
|---|---|---|
| Web App | Фронтенд UI | 512 МБ RAM, 0.5 CPU |
| API Server | REST API, приёмник webhook | 1 ГБ RAM, 1 CPU |
| Webhook Worker | Асинхронная обработка git-событий | 1 ГБ RAM, 1 CPU |
| PostgreSQL | Основное хранилище данных | 2 ГБ RAM, 1 CPU, 20 ГБ диск |
| Redis | Кэширование, очереди задач | 512 МБ RAM, 0.5 CPU |
Минимальный итог: 5 ГБ RAM, 4 ядра CPU, 25 ГБ диск для команды до 50 разработчиков.
Вариант A: Docker Compose (быстрый старт)
Лучше всего подходит для команд до 50 разработчиков или proof-of-concept развёртываний.
Предварительные требования
- Docker Engine 24+ и Docker Compose v2
- Linux-сервер с 8 ГБ RAM и 4 ядрами CPU
- Доменное имя, указывающее на сервер (для TLS)
Шаг 1: Скачайте Compose-файл
mkdir -p /opt/pandev && cd /opt/pandev
curl -fsSL https://get.pandev-metrics.com/docker/docker-compose.yml -o docker-compose.yml
curl -fsSL https://get.pandev-metrics.com/docker/.env.example -o .env
Шаг 2: Настройте переменные окружения
Отредактируйте файл .env:
# .env — Конфигурация PanDev Metrics On-Premise
# === Обязательные ===
PANDEV_LICENSE_KEY=your-license-key-here
PANDEV_DOMAIN=pandev.internal.company.com
PANDEV_ADMIN_EMAIL=admin@company.com
PANDEV_ADMIN_PASSWORD=change-me-immediately
# === База данных ===
POSTGRES_PASSWORD=strong-random-password-here
POSTGRES_DB=pandev
REDIS_PASSWORD=another-strong-password
# === TLS ===
TLS_CERT_PATH=/opt/pandev/certs/fullchain.pem
TLS_KEY_PATH=/opt/pandev/certs/privkey.pem
# === Опционально: LDAP ===
# LDAP_ENABLED=true
# LDAP_URL=ldaps://ldap.company.com:636
# LDAP_BASE_DN=dc=company,dc=com
# LDAP_BIND_DN=cn=pandev-svc,ou=service-accounts,dc=company,dc=com
# LDAP_BIND_PASSWORD=ldap-service-password
# LDAP_USER_FILTER=(uid={username})
# LDAP_CA_CERT_PATH=/opt/pandev/certs/ldap-ca.pem
Сгенерируйте надёжные пароли:
openssl rand -base64 32 # Используйте для POSTGRES_PASSWORD
openssl rand -base64 32 # Используйте для REDIS_PASSWORD
Шаг 3: Добавьте TLS-сертификаты
mkdir -p /opt/pandev/certs
# Вариант 1: Скопируйте корпоративные сертификаты
cp /path/to/fullchain.pem /opt/pandev/certs/
cp /path/to/privkey.pem /opt/pandev/certs/
# Вариант 2: Сгенерируйте самоподписанные (только для тестирования)
openssl req -x509 -nodes -days 365 \
-newkey rsa:2048 \
-keyout /opt/pandev/certs/privkey.pem \
-out /opt/pandev/certs/fullchain.pem \
-subj "/CN=pandev.internal.company.com"
Шаг 4: Запустите стек
cd /opt/pandev
docker compose up -d
Следите за логами:
docker compose logs -f
Вы должны увидеть:
pandev-api | ✅ Database connected
pandev-api | ✅ Redis connected
pandev-api | ✅ Migrations applied
pandev-api | ✅ API server listening on :8080
pandev-web | ✅ Web app listening on :3000
pandev-worker | ✅ Webhook worker started, processing queue...
pandev-nginx | ✅ HTTPS on :443 → web:3000, api:8080
Шаг 5: Проверка
Откройте https://pandev.internal.company.com в браузере. Войдите с admin email и паролем из .env файла.
Справка по командам Docker Compose
# Запуск
docker compose up -d
# Остановка
docker compose down
# Обновление до последней версии
docker compose pull && docker compose up -d
# Просмотр логов
docker compose logs -f [service-name]
# Бэкап базы данных
docker compose exec postgres pg_dump -U pandev pandev > backup.sql
# Восстановление базы данных
docker compose exec -T postgres psql -U pandev pandev < backup.sql
Вариант B: Kubernetes с Helm (продакшен)
Лучше подходит для крупных организаций, требований высокой доступности или существующей инфраструктуры Kubernetes.
Предварительные требования
- Kubernetes 1.26+
- Helm 3.12+
kubectl, настроенный для вашего кластера- StorageClass для persistent volumes
- Ingress-контроллер (nginx-ingress или Traefik)
Шаг 1: Добавьте Helm-репозиторий
helm repo add pandev https://charts.pandev-metrics.com
helm repo update
Шаг 2: Создайте файл values
# values-production.yaml
global:
domain: pandev.internal.company.com
licenseKey: "your-license-key-here"
api:
replicas: 2
resources:
requests:
memory: "1Gi"
cpu: "1000m"
limits:
memory: "2Gi"
cpu: "2000m"
web:
replicas: 2
resources:
requests:
memory: "512Mi"
cpu: "500m"
limits:
memory: "1Gi"
cpu: "1000m"
worker:
replicas: 2
resources:
requests:
memory: "1Gi"
cpu: "1000m"
limits:
memory: "2Gi"
cpu: "2000m"
postgresql:
enabled: true # Установите false при использовании внешней БД
auth:
password: "strong-random-password"
database: pandev
primary:
persistence:
size: 50Gi
storageClass: "gp3" # Подстройте под вашего облачного провайдера
resources:
requests:
memory: "2Gi"
cpu: "1000m"
redis:
enabled: true
auth:
password: "another-strong-password"
master:
persistence:
size: 5Gi
ingress:
enabled: true
className: nginx
annotations:
cert-manager.io/cluster-issuer: letsencrypt-prod
tls:
- secretName: pandev-tls
hosts:
- pandev.internal.company.com
# Конфигурация LDAP (опционально)
ldap:
enabled: false
# url: "ldaps://ldap.company.com:636"
# baseDN: "dc=company,dc=com"
# bindDN: "cn=pandev-svc,ou=service-accounts,dc=company,dc=com"
# bindPassword: "ldap-service-password"
# userFilter: "(uid={username})"
# caCert: |
# -----BEGIN CERTIFICATE-----
# ... ваш CA-сертификат LDAP ...
# -----END CERTIFICATE-----
Шаг 3: Создайте namespace и secrets
kubectl create namespace pandev
# Создайте secret для лицензии
kubectl create secret generic pandev-license \
--namespace pandev \
--from-literal=license-key=your-license-key-here
# Если используете внешние TLS-сертификаты (не cert-manager)
kubectl create secret tls pandev-tls \
--namespace pandev \
--cert=/path/to/fullchain.pem \
--key=/path/to/privkey.pem
Шаг 4: Установка
helm install pandev pandev/pandev-metrics \
--namespace pandev \
--values values-production.yaml
Следите за развёртыванием:
kubectl -n pandev get pods -w
Ожидаемый вывод:
NAME READY STATUS RESTARTS AGE
pandev-api-7d4b8f9c6-abcde 1/1 Running 0 2m
pandev-api-7d4b8f9c6-fghij 1/1 Running 0 2m
pandev-web-5c6d7e8f9-klmno 1/1 Running 0 2m
pandev-web-5c6d7e8f9-pqrst 1/1 Running 0 2m
pandev-worker-3a4b5c6d7-uvwxy 1/1 Running 0 2m
pandev-worker-3a4b5c6d7-zabcd 1/1 Running 0 2m
pandev-postgresql-0 1/1 Running 0 2m
pandev-redis-master-0 1/1 Running 0 2m
Шаг 5: Проверка
# Проверьте ingress
kubectl -n pandev get ingress
# Тест здоровья API
curl -k https://pandev.internal.company.com/api/health
# Ожидаемый ответ:
# {"status":"ok","version":"2.14.0","database":"connected","redis":"connected"}
Аутентификация LDAP
Оба варианта развёртывания — Docker и Kubernetes — поддерживают LDAP и LDAPS для аутентификации пользователей.
Базовая настройка LDAP
Включите LDAP в конфигурации:
# Docker (.env)
LDAP_ENABLED=true
LDAP_URL=ldaps://ldap.company.com:636
LDAP_BASE_DN=dc=company,dc=com
LDAP_BIND_DN=cn=pandev-svc,ou=service-accounts,dc=company,dc=com
LDAP_BIND_PASSWORD=ldap-service-password
LDAP_USER_FILTER=(uid={username})
LDAP_EMAIL_ATTR=mail
LDAP_DISPLAY_NAME_ATTR=displayName
Пользовательские CA-сертификаты
Если ваш LDAP-сервер использует сертификат, подписанный внутренним CA:
# Docker: подключите CA-сертификат
# В docker-compose.yml добавьте к сервису api:
volumes:
- /opt/pandev/certs/ldap-ca.pem:/etc/ssl/certs/ldap-ca.pem:ro
# Установите переменную окружения
LDAP_CA_CERT_PATH=/etc/ssl/certs/ldap-ca.pem
Для Kubernetes включите CA-сертификат напрямую в values-production.yaml:
ldap:
enabled: true
url: "ldaps://ldap.company.com:636"
caCert: |
-----BEGIN CERTIFICATE-----
MIIDXTCCAkWgAwIBAgIJAJC1HiIAZAiUMA0Gcz...
(вставьте полный CA-сертификат сюда)
-----END CERTIFICATE-----
Маппинг групп LDAP
Сопоставьте группы LDAP с ролями PanDev:
LDAP_GROUP_BASE_DN=ou=groups,dc=company,dc=com
LDAP_ADMIN_GROUP=cn=engineering-leads,ou=groups,dc=company,dc=com
LDAP_MANAGER_GROUP=cn=team-leads,ou=groups,dc=company,dc=com
LDAP_USER_GROUP=cn=developers,ou=groups,dc=company,dc=com
Настройка Webhooks для On-Premise
При работе on-premise ваш git-провайдер должен отправлять webhooks на ваш внутренний инстанс PanDev.
GitLab (Self-Managed)
Если GitLab и PanDev находятся в одной сети, используйте внутренний URL:
Webhook URL: https://pandev.internal.company.com/api/v1/gitlab/webhook
Если GitLab не может напрямую достичь PanDev, настройте сетевой маршрут или reverse proxy.
GitHub Enterprise
Тот же подход — направляйте webhooks на внутренний URL PanDev:
Webhook URL: https://pandev.internal.company.com/api/v1/github/webhook
Правила файрвола
Убедитесь, что открыты следующие сетевые пути:
Git-провайдер → PanDev API (порт 443) # Webhooks
Машины разработчиков → PanDev API (порт 443) # IDE-плагины
PanDev API → API git-провайдера (порт 443) # Получение данных
PanDev API → LDAP-сервер (порт 636) # Аутентификация
Бэкап и восстановление
Бэкап базы данных
Запланируйте ежедневные бэкапы:
# Docker
0 2 * * * docker compose -f /opt/pandev/docker-compose.yml exec -T postgres \
pg_dump -U pandev pandev | gzip > /opt/pandev/backups/pandev-$(date +\%Y\%m\%d).sql.gz
# Kubernetes
0 2 * * * kubectl -n pandev exec pandev-postgresql-0 -- \
pg_dump -U pandev pandev | gzip > /backups/pandev-$(date +\%Y\%m\%d).sql.gz
Полное восстановление
# Docker
gunzip < /opt/pandev/backups/pandev-20260308.sql.gz | \
docker compose exec -T postgres psql -U pandev pandev
# Kubernetes
gunzip < pandev-20260308.sql.gz | \
kubectl -n pandev exec -i pandev-postgresql-0 -- psql -U pandev pandev
Обновление
Docker
cd /opt/pandev
docker compose pull
docker compose up -d
Миграции базы данных выполняются автоматически при запуске.
Kubernetes
helm repo update
helm upgrade pandev pandev/pandev-metrics \
--namespace pandev \
--values values-production.yaml
Ознакомьтесь с release notes перед обновлением — мажорные версии могут требовать ручных шагов миграции.
Мониторинг
Health-эндпоинты
# Здоровье API
curl https://pandev.internal.company.com/api/health
# Детальный статус
curl https://pandev.internal.company.com/api/health/detailed
# Возвращает: задержку БД, задержку Redis, глубину очереди, статус воркеров
Метрики Prometheus
PanDev предоставляет эндпоинт /metrics для Prometheus:
# prometheus.yml
scrape_configs:
- job_name: pandev
static_configs:
- targets: ['pandev.internal.company.com:443']
scheme: https
metrics_path: /api/metrics
Ключевые метрики для мониторинга:
| Метрика | Порог алерта |
|---|---|
pandev_webhook_queue_depth | > 1000 |
pandev_api_response_time_p99 | > 2с |
pandev_database_connections_active | > 80% пула |
pandev_worker_error_rate | > 5% |
Решение проблем
| Проблема | Решение |
|---|---|
| Отказ подключения к БД | Проверьте, что POSTGRES_PASSWORD совпадает в конфигурации БД и API |
| Сбой аутентификации LDAP | Протестируйте с ldapsearch с сервера PanDev для проверки подключения и учётных данных |
| Таймауты webhooks | Убедитесь, что правила файрвола разрешают входящий трафик от git-провайдера |
| IDE-плагины не подключаются | Убедитесь, что разработчики настраивают apiUrl на ваш on-premise инстанс, а не на облачный URL |
| Высокое потребление памяти | Увеличьте shared_buffers и work_mem PostgreSQL в Helm values или Docker Compose |
| Медленная обработка webhooks | Увеличьте количество реплик воркеров: helm upgrade --set worker.replicas=4 или настройте Docker Compose |
Храните инженерные данные на своей инфраструктуре. Разверните PanDev Metrics on-premise с Docker или Kubernetes — полный контроль, полная конфиденциальность, те же мощные дашборды.
