Перейти к основному содержимому

On-Premise развёртывание: PanDev Metrics с Docker и Kubernetes за 30 минут

· 9 мин. чтения
Artur Pan
CTO & Co-Founder at PanDev

Не каждая компания может отправлять инженерные данные в облако. Регулируемые отрасли, государственные подрядчики и организации с повышенными требованиями к безопасности нуждаются в платформе метрик 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Фронтенд UI512 МБ RAM, 0.5 CPU
API ServerREST API, приёмник webhook1 ГБ 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 — полный контроль, полная конфиденциальность, те же мощные дашборды.

Попробуйте сами — бесплатно

Подключите IDE-плагин за 2 минуты и увидьте свои реальные метрики. Без карты, без обязательств.

Попробовать бесплатно