Перейти к содержанию

DevOps Summary — CallBox Infrastructure

Дата: 2026-01-30 Версия: 1.1


Quick Reference

Серверы (10 штук)

Сервер Внешний IP Внутренний IP Роль
lb-1 188.130.238.189 10.10.19.10 Load Balancer Primary, Git origin
lb-2 92.47.181.152 10.10.19.11 Load Balancer Secondary
web-1 10.10.19.21 App Server (Docker)
web-2 10.10.19.22 App Server (Docker)
db-1 10.10.19.31 PostgreSQL Primary
db-2 10.10.19.32 PostgreSQL Replica
redis-1 10.10.19.40 Redis + Sentinel
voip-1 10.10.19.51 Asterisk Primary
voip-2 10.10.19.52 Asterisk Secondary
mon-1 10.10.19.60 Prometheus + Grafana + Ansible

SSH доступ

# Jump через lb-1
ssh sysadmin@188.130.238.189

# Затем на внутренние серверы
ssh 10.10.19.21  # web-1
ssh 10.10.19.31  # db-1
# и т.д.

Ключевые сервисы

Сервис Сервер Порт Статус
nginx (LB) lb-1, lb-2 80, 443 systemctl status nginx
Docker web-1, web-2 docker ps
PostgreSQL db-1, db-2 5432 systemctl status postgresql
Patroni db-1, db-2 8008 patronictl -c /etc/patroni/config.yml list
etcd db-1, db-2, mon-1 2379 etcdctl member list
Redis redis-1 6379 systemctl status redis-server
Asterisk voip-1, voip-2 5060 systemctl status asterisk
Prometheus mon-1 9090 docker ps
Grafana mon-1 3000 docker ps

Деплой

Деплой через Ansible (рекомендуется)

Ansible установлен на mon-1 (10.10.19.60) в /opt/ansible/callbox-ansible/.

# Полный деплой
ssh sysadmin@188.130.238.189 "ssh 10.10.19.60 'cd /opt/ansible/callbox-ansible && ansible-playbook playbooks/deploy.yml'"

# Деплой только backend
ssh sysadmin@188.130.238.189 "ssh 10.10.19.60 'cd /opt/ansible/callbox-ansible && ansible-playbook playbooks/deploy.yml --tags backend'"

# Деплой только frontend
ssh sysadmin@188.130.238.189 "ssh 10.10.19.60 'cd /opt/ansible/callbox-ansible && ansible-playbook playbooks/deploy.yml --tags frontend'"

# Проверка статуса всех сервисов
ssh sysadmin@188.130.238.189 "ssh 10.10.19.60 'cd /opt/ansible/callbox-ansible && ansible-playbook playbooks/check-status.yml'"

# Синхронизация парных серверов
ssh sysadmin@188.130.238.189 "ssh 10.10.19.60 'cd /opt/ansible/callbox-ansible && ansible-playbook playbooks/sync-all.yml'"
# С тегами: --tags lb, --tags web, --tags voip

Ручной деплой (legacy, только если Ansible недоступен)

# На lb-1
/opt/scripts/deploy-callbox.sh
# Подтвердить: yes

Что происходит: 1. git fetch && git reset --hard origin/master на web-1/web-2 2. Удаление документации (docs/, CLAUDE.md, etc.) 3. docker compose down && build && up -d

Проверка после деплоя

# Через Ansible (рекомендуется)
ssh sysadmin@188.130.238.189 "ssh 10.10.19.60 'cd /opt/ansible/callbox-ansible && ansible-playbook playbooks/check-status.yml'"

# Вручную
ssh 10.10.19.21 "docker ps"
ssh 10.10.19.22 "docker ps"
curl -s https://b2g.kz/api/v1/health | jq
ssh 10.10.19.21 "docker logs callbox-backend --tail 50"

Мониторинг

Доступ

  • Grafana: https://mon.b2g.kz (через nginx на lb-1)
  • Prometheus: http://10.10.19.60:9090 (только внутри сети)

Ключевые метрики

  • CPU/Memory/Disk на всех серверах (node_exporter)
  • Docker container status
  • PostgreSQL connections и replication lag
  • Redis memory usage
  • HTTP response times

Проверка node_exporter

# На любом сервере
curl -s localhost:9100/metrics | head -20

База данных

PostgreSQL кластер

# На db-1: проверка роли
psql -U postgres -c "SELECT pg_is_in_recovery();"
# false = Primary, true = Replica

# Статус Patroni
patronictl -c /etc/patroni/config.yml list

Подключение

# Credentials
Host: db-1 (10.10.19.31)
Database: asterisk
User: asterisk
Password: [в .env файлах на web-1/web-2]

etcd кластер

# Проверка здоровья
etcdctl --endpoints=10.10.19.31:2379,10.10.19.32:2379,10.10.19.60:2379 endpoint health

Asterisk

Проверка статуса

# На voip-1
asterisk -rx "core show channels"
asterisk -rx "pjsip show endpoints"
asterisk -rx "queue show"

Перезагрузка конфигурации

asterisk -rx "pjsip reload"
asterisk -rx "queue reload all"
asterisk -rx "dialplan reload"

AMI доступ (из web-1/web-2)

Host: 10.10.19.51
Port: 5038
User: webadmin
Secret: [в .env]

Сеть

Firewall (iptables + ipset)

# На lb-1/lb-2: NAT правила
sudo iptables -t nat -L -n -v
# FORWARD правила (SIP geo-фильтрация)
sudo iptables -L FORWARD -n -v --line-numbers
# Проверить ipset KZ
sudo ipset list kz-sip | head -8

SIP Geo-фильтрация (с 2026-01-31): - ipset kz-sip — 561 казахстанская подсеть - SIP 5060/UDP разрешён только из KZ, остальные DROP - Persistence: /etc/ipset-kz-sip.save + systemd ipset-restore.service - Подробнее: NETWORK.md, раздел 6

fail2ban (voip-1, voip-2)

# Статус jail'а
ssh sysadmin@10.10.19.51 'sudo fail2ban-client status asterisk'
# Забаненные IP
ssh sysadmin@10.10.19.51 'sudo nft list set inet f2b-table addr-set-asterisk-udp'
  • Jail: asterisk, фильтр: asterisk-security
  • maxretry=3, findtime=600с, bantime=86400с (24ч)
  • Конфиг: /etc/fail2ban/jail.d/asterisk.conf

Порты

Порт Протокол Сервис Откуда
22 TCP SSH Admin IPs
80 TCP HTTP Any → HTTPS
443 TCP HTTPS Any
5060 UDP SIP KZ only (ipset) → voip-1
10000-20000 UDP RTP Any → voip-1

Критичные пути

Конфигурация

Сервер Путь Назначение
web-1/2 /opt/callbox/ Код приложения
web-1/2 /opt/callbox/.env Переменные окружения
lb-1/2 /etc/nginx/ nginx конфиги
lb-1/2 /etc/letsencrypt/ SSL сертификаты
db-1/2 /etc/patroni/config.yml Patroni конфигурация
voip-1/2 /etc/asterisk/ Asterisk конфиги

Данные

Сервер Путь Назначение
db-1/2 /var/lib/postgresql/16/main/ PostgreSQL data
redis-1 /var/lib/redis/ Redis data
voip-1 /var/spool/asterisk/monitor/ Записи разговоров
web-1/2 /var/lib/callbox/ Загруженные файлы

Логи

Сервер Путь Назначение
lb-1/2 /var/log/nginx/ Access/error logs
web-1/2 docker logs callbox-backend API логи
db-1/2 /var/log/postgresql/ PostgreSQL логи
voip-1/2 /var/log/asterisk/ Asterisk логи

Backup (⚠️ НЕ НАСТРОЕНО)

Текущее состояние: Централизованный бэкап отсутствует.

Приоритетные задачи: 1. Настроить ежедневный pg_dump на db-1 2. Организовать внешнее хранилище 3. Настроить бэкап конфигов Asterisk

Детали: см. BACKUP.md


Веб-документация (docs.b2g.kz)

Доступ

Параметр Значение
URL https://docs.b2g.kz
Логин docuser
Пароль B2gDocs2026!
Сервер lb-1 (10.10.19.10)

Расположение на lb-1

Путь Назначение
/opt/docs-site/ Проект MkDocs (venv, scripts, docs, mkdocs.yml)
/opt/docs-site/venv/ Python venv (mkdocs, mkdocs-material, psycopg2)
/opt/docs-site/scripts/generate_tech_docs.py Скрипт генерации техучёта из БД asterisk
/opt/docs-site/scripts/generate_and_deploy.sh Полный цикл: генерация → mkdocs build → деплой на lb-1 и lb-2
/var/www/docs/ Статика сайта (результат mkdocs build)
/etc/nginx/sites-available/docs.b2g.kz Nginx конфиг

Генерация техучёта

Техучёт генерируется из БД asterisk на db-1 (10.10.19.31).

# Ручной запуск на lb-1
/opt/docs-site/scripts/generate_and_deploy.sh

# Через Shared Admin UI
# Суперадмин → Техучёт → Генерация (POST /api/docs-settings/generate)
# Контейнер shared-backend вызывает скрипт на lb-1 по SSH

Цепочка вызова из Shared Admin

shared-backend (web-1/web-2)
  → subprocess.run("/opt/scripts/generate_docs_remote.sh")
    → ssh sysadmin@10.10.19.10 "/opt/docs-site/scripts/generate_and_deploy.sh"
      → python generate_tech_docs.py (БД db-1)
      → mkdocs build
      → cp → /var/www/docs/ (lb-1)
      → rsync → lb-2:/var/www/docs/

После обновления docs

# Проверить синхронность lb-1 и lb-2
md5sum /var/www/docs/tech/index.html                      # на lb-1
ssh sysadmin@10.10.19.11 'md5sum /var/www/docs/tech/index.html'  # на lb-2

Типичные операции

Перезапуск приложения

# На web-1 или web-2
cd /opt/callbox
docker compose restart backend
docker compose restart frontend

Обновление SSL сертификатов

# На lb-1
certbot renew
systemctl reload nginx

Failover PostgreSQL

# Ручной switchover
patronictl -c /etc/patroni/config.yml switchover

Добавление очереди в Asterisk

  1. Создать через API или UI
  2. Автоматически синхронизируется на voip-1
  3. Проверить: asterisk -rx "queue show"

Контакты

Роль Контакт
Разработка [TODO]
DevOps [TODO]
Инфраструктура [TODO]

PROD-like среда (Staging)

Docker Compose окружение на DEV (192.168.0.210), имитирующее PROD.

Расположение: /home/vladimir/callbox/docker/prod-like/ Сеть: 172.28.0.0/24 Сервисы: 11 (etcd, 2x PostgreSQL/Patroni, HAProxy, Redis, Redis Sentinel, 2x Asterisk, 2x Web, Nginx LB)

# Управление
cd /home/vladimir/callbox/docker/prod-like
docker compose up -d       # Запуск всех сервисов
docker compose ps          # Статус
docker compose down        # Остановка

# Тесты
cd /home/vladimir/callbox && pytest

Процесс разработки с PROD-like:

DEV (код) → PROD-like (pytest) → commit → СТОП → PROD (Ansible)

Связанные документы

  • SERVERS.md — Детальное описание серверов
  • NETWORK.md — Сетевая архитектура
  • SERVICES.md — Описание сервисов
  • BACKUP.md — Резервное копирование
  • ../CHANGELOG.md — История изменений
  • ../INFRASTRUCTURE_MAP.md — Карта инфраструктуры (с PROD-like)