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
- Создать через API или UI
- Автоматически синхронизируется на voip-1
- Проверить:
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)