Деплоим инфраструктуру видеонаблюдения: 150 IP-камер на 3 площадках для логистического склада

Задача: 150 камер, 3 склада, один центр мониторинга

Компания «СкладЛогистик» управляет тремя складскими комплексами в Подмосковье. Задача, с которой к нам в itfresh.ru обратился директор по безопасности: развернуть единую систему видеонаблюдения на 150 камер с централизованным управлением и удалённым доступом.

Требования:

  • 150 камер — 60 наружных (погодозащита IP67, ИК до 50 м), 90 внутренних (PoE, широкий угол)
  • Хранение — 30 дней непрерывной записи, 90 дней по событиям
  • Удалённый доступ — просмотр с телефона и из центрального офиса
  • Детекция движения — уведомления в Telegram при движении в нерабочее время
  • Бюджет — до 3 миллионов рублей на оборудование + монтаж

Камеры выбрали Hikvision DS-2CD2043G2-I (наружные) и DS-2CD1043G2-I (внутренние) — поддержка ONVIF Profile S/T, 4 Мп, H.265+, PoE 802.3af.

Сетевая архитектура: выделенный VLAN для камер

Критическое правило: камеры НИКОГДА не должны быть в общей сети с рабочими станциями. Китайские камеры регулярно ловят уязвимости (Hikvision CVE-2021-36260 — удалённое выполнение кода). Выделяем отдельный VLAN:

# Сетевая схема каждого склада:
#
# VLAN 10 — Management (10.0.10.0/24)
# VLAN 20 — Servers/NVR (10.0.20.0/24)
# VLAN 30 — IP Cameras (10.0.30.0/24)  ← изолированный
# VLAN 40 — Office (10.0.40.0/24)
# VLAN 50 — WiFi (10.0.50.0/24)

# Mikrotik: создаём VLAN для камер
/interface vlan
add name=vlan30-cameras vlan-id=30 interface=bridge1

/ip address
add address=10.0.30.1/24 interface=vlan30-cameras

# DHCP для камер с фиксированными адресами
/ip pool
add name=pool-cameras ranges=10.0.30.10-10.0.30.200

/ip dhcp-server
add name=dhcp-cameras interface=vlan30-cameras address-pool=pool-cameras

/ip dhcp-server lease
add address=10.0.30.11 mac-address=A4:CF:12:34:56:01 comment="CAM-WH1-GATE-01"
add address=10.0.30.12 mac-address=A4:CF:12:34:56:02 comment="CAM-WH1-GATE-02"
add address=10.0.30.13 mac-address=A4:CF:12:34:56:03 comment="CAM-WH1-DOCK-01"
# ... все 50 камер на складе 1

# Firewall: камеры могут общаться ТОЛЬКО с NVR
/ip firewall filter
add chain=forward src-address=10.0.30.0/24 dst-address=10.0.20.0/24 \
    dst-port=554,8000,8200 protocol=tcp action=accept comment="Cameras → NVR (RTSP+API)"
add chain=forward src-address=10.0.30.0/24 action=drop \
    comment="Block cameras from everything else"

# Камеры не имеют доступа в интернет!
add chain=forward src-address=10.0.30.0/24 out-interface=ether1-wan \
    action=drop comment="No internet for cameras"

Каждый порт коммутатора с камерой помечен как access-порт VLAN 30. На управляемых PoE-коммутаторах (TP-Link TL-SG1218MPE) настроили port isolation — камеры не видят друг друга, только NVR.

PoE: питание и коммутация

Все 150 камер питаются через PoE (Power over Ethernet) — один кабель для данных и питания. Расчёт PoE-бюджета:

# Расчёт PoE-бюджета на склад (50 камер)
#
# Hikvision DS-2CD2043G2-I: макс. 12W (PoE 802.3af)
# Hikvision DS-2CD1043G2-I: макс. 7W (PoE 802.3af)
#
# Склад 1:
#   20 наружных × 12W = 240W
#   30 внутренних × 7W = 210W
#   Итого: 450W
#   С запасом 30%: 585W
#
# Выбранные коммутаторы:
#   2 × TP-Link TL-SG1218MPE (16 PoE ports, бюджет 250W) = 500W
#   1 × TP-Link TL-SG1210MPE (8 PoE ports, бюджет 123W)  = 123W
#   Итого: 623W — хватает с запасом

# Важно: UPS на каждую серверную/коммутационную!
# APC Smart-UPS 1500VA — держит 3 коммутатора + NVR ~45 минут

Кабельная инфраструктура: Cat6 (до 100 м), для длинных участков — оптика с медиаконвертерами PoE. Максимальное расстояние для PoE по Cat5e — 100 м, по Cat6 — 100 м. Для камеры на 130 м от коммутатора использовали PoE-экстендер.

# Проверяем PoE-статус на коммутаторе (CLI)
# TP-Link managed switch
enable
show power inline
# Interface   Admin   Oper    Power(W)  Device
# Gi0/1       auto    on      11.2      Hikvision DS-2CD2043G2
# Gi0/2       auto    on      6.8       Hikvision DS-2CD1043G2
# Gi0/3       auto    on      11.5      Hikvision DS-2CD2043G2
# ...
# Total: 447.3W / 500W available

NVR: Frigate + выделенный сервер

Вместо аппаратного NVR (дорого и негибко) мы развернули Frigate — open-source NVR с нативной интеграцией ML-детектора объектов. Сервер на каждом складе: Xeon E-2388G, 64 GB RAM, 4×8 TB HDD (RAID10), Intel Arc A380 (для аппаратного декодирования H.265).

# frigate.yml — конфигурация для 50 камер
mqtt:
  enabled: true
  host: 10.0.20.10
  port: 1883
  topic_prefix: frigate/warehouse1

detectors:
  openvino:
    type: openvino
    device: AUTO
    model:
      path: /openvino-model/ssdlite_mobilenet_v2.xml

ffmpeg:
  hwaccel_args: preset-intel-qsv-h265  # аппаратное декодирование
  output_args:
    record: preset-record-generic-audio-aac

record:
  enabled: true
  retain:
    days: 30           # непрерывная запись 30 дней
    mode: all
  events:
    retain:
      default: 90      # события хранятся 90 дней
      mode: motion

snapshots:
  enabled: true
  retain:
    default: 90

go2rtc:
  streams:
    cam_gate_01:
      - rtsp://admin:SecureP@ss123@10.0.30.11:554/Streaming/Channels/101
    cam_gate_02:
      - rtsp://admin:SecureP@ss123@10.0.30.12:554/Streaming/Channels/101
    cam_dock_01:
      - rtsp://admin:SecureP@ss123@10.0.30.13:554/Streaming/Channels/101

cameras:
  cam_gate_01:
    ffmpeg:
      inputs:
        - path: rtsp://127.0.0.1:8554/cam_gate_01
          roles:
            - detect
            - record
    detect:
      width: 1920
      height: 1080
      fps: 10
    motion:
      threshold: 30
      contour_area: 50
    objects:
      track:
        - person
        - car
        - truck
    zones:
      loading_zone:
        coordinates: 0.1,0.1,0.9,0.1,0.9,0.9,0.1,0.9
        objects:
          - person

  cam_gate_02:
    ffmpeg:
      inputs:
        - path: rtsp://127.0.0.1:8554/cam_gate_02
          roles:
            - detect
            - record
    detect:
      width: 1920
      height: 1080
      fps: 10
    # ... аналогично для каждой камеры

Расчёт хранилища и retention

Правильный расчёт дискового пространства — ключевой момент. Недооценка приведёт к потере записей, переоценка — к лишним расходам:

# Расчёт дискового пространства для 50 камер
#
# Параметры:
#   Разрешение: 2560×1440 (4 Мп)
#   Кодек: H.265+ (Smart-кодирование Hikvision)
#   Битрейт: ~2 Мбит/с при движении, ~0.5 Мбит/с в покое
#   Средний битрейт: ~1.2 Мбит/с
#   FPS: 15 (достаточно для склада)
#
# Формула: bitrate × 3600 × 24 / 8 / 1024 / 1024 = ГБ/день на камеру
#   1.2 × 3600 × 24 / 8 / 1024 / 1024 = 12.6 ГБ/день
#
# 50 камер × 12.6 ГБ/день = 632 ГБ/день
# 30 дней хранения: 632 × 30 = 18 960 ГБ ≈ 19 ТБ
#
# RAID10 из 4×8 ТБ = 16 ТБ полезного пространства
# Не хватает! Варианты:
#   1. Уменьшить retention до 25 дней
#   2. Добавить ещё 2 диска (6×8 ТБ RAID10 = 24 ТБ)
#   3. Использовать субпотоки для непрерывной записи

# Решение: двухпоточная запись
# Основной поток (2560×1440) — запись по событиям (90 дней)
# Субпоток (640×480, 0.3 Мбит/с) — непрерывная запись (30 дней)
#
# Субпоток: 50 × 0.3 × 86400 / 8 / 1024 / 1024 = 1.58 ГБ/день × 50 = 158 ГБ/день
# 30 дней: 158 × 30 = 4 740 ГБ ≈ 5 ТБ
# События (основной): ~3-4 ТБ за 90 дней (зависит от активности)
# Итого: ~9-10 ТБ — помещается на RAID10 16 ТБ с запасом

В Frigate это настраивается через два input-а: один для detect/record events, второй для continuous recording в низком качестве.

Удалённый доступ через WireGuard

Пробрасывать порты NVR в интернет — самоубийство. Мы организовали VPN на WireGuard между тремя складами и центральным офисом:

# Сервер WireGuard в центральном офисе
# /etc/wireguard/wg0.conf
[Interface]
Address = 10.100.0.1/24
ListenPort = 51820
PrivateKey = SERVER_PRIVATE_KEY
PostUp = iptables -A FORWARD -i wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE

# Склад 1
[Peer]
PublicKey = WAREHOUSE1_PUBLIC_KEY
AllowedIPs = 10.100.0.11/32, 10.0.20.0/24, 10.0.30.0/24
Endpoint = warehouse1.skladlogistic.ru:51820
PersistentKeepalive = 25

# Склад 2
[Peer]
PublicKey = WAREHOUSE2_PUBLIC_KEY
AllowedIPs = 10.100.0.12/32, 10.1.20.0/24, 10.1.30.0/24
Endpoint = warehouse2.skladlogistic.ru:51820
PersistentKeepalive = 25

# Склад 3
[Peer]
PublicKey = WAREHOUSE3_PUBLIC_KEY
AllowedIPs = 10.100.0.13/32, 10.2.20.0/24, 10.2.30.0/24
Endpoint = warehouse3.skladlogistic.ru:51820
PersistentKeepalive = 25

# Мобильный клиент директора по безопасности
[Peer]
PublicKey = MOBILE_PUBLIC_KEY
AllowedIPs = 10.100.0.100/32

# Запуск:
sudo systemctl enable --now wg-quick@wg0

Для просмотра с телефона — приложение Frigate (Android/iOS) подключается через WireGuard VPN к NVR на каждом складе. Никаких облаков, никаких подписок, видео не покидает периметр компании.

Мониторинг здоровья камер и результаты

Камера может зависнуть, потерять фокус или быть закрыта паутиной. Написали скрипт мониторинга:

#!/bin/bash
# camera_health_check.sh — проверка работоспособности камер
# Запускается по cron каждые 5 минут

TELEGRAM_BOT_TOKEN="123456:ABC-DEF"
TELEGRAM_CHAT_ID="-100123456789"
CAMERAS_FILE="/etc/camera-monitor/cameras.list"

# cameras.list формат: IP|NAME
# 10.0.30.11|CAM-WH1-GATE-01
# 10.0.30.12|CAM-WH1-GATE-02

while IFS='|' read -r ip name; do
    # Проверка 1: ping
    if ! ping -c 2 -W 3 "$ip" &>/dev/null; then
        msg="❌ Камера $name ($ip) — НЕ ОТВЕЧАЕТ на ping"
        curl -s -X POST "https://api.telegram.org/bot${TELEGRAM_BOT_TOKEN}/sendMessage" \
            -d chat_id="$TELEGRAM_CHAT_ID" -d text="$msg" > /dev/null
        continue
    fi

    # Проверка 2: RTSP-поток доступен
    timeout 10 ffprobe -v quiet -print_format json -show_streams \
        "rtsp://admin:SecureP@ss123@${ip}:554/Streaming/Channels/101" 2>/dev/null
    if [ $? -ne 0 ]; then
        msg="⚠️ Камера $name ($ip) — RTSP-поток недоступен"
        curl -s -X POST "https://api.telegram.org/bot${TELEGRAM_BOT_TOKEN}/sendMessage" \
            -d chat_id="$TELEGRAM_CHAT_ID" -d text="$msg" > /dev/null
    fi

    # Проверка 3: ONVIF — получаем статус через API
    status=$(curl -s --max-time 5 \
        "http://${ip}/ISAPI/System/status" \
        -u admin:SecureP@ss123 2>/dev/null | grep -c "0")
    if [ "$status" -eq 0 ]; then
        msg="⚠️ Камера $name ($ip) — ошибка статуса ONVIF"
        curl -s -X POST "https://api.telegram.org/bot${TELEGRAM_BOT_TOKEN}/sendMessage" \
            -d chat_id="$TELEGRAM_CHAT_ID" -d text="$msg" > /dev/null
    fi

done < "$CAMERAS_FILE"

# Cron:
# */5 * * * * /usr/local/bin/camera_health_check.sh >> /var/log/camera-monitor.log 2>&1

Результаты проекта:

ПараметрЗначение
Камер установлено150 (60 наружных + 90 внутренних)
Площадок3 склада + центральный офис
Хранение непрерывной записи30 дней (субпоток)
Хранение событий90 дней (основной поток)
Время развёртывания3 недели (включая монтаж)
Бюджет2.7 млн руб (в рамках плана)
Ежемесячные расходы~15 000 руб (электричество + интернет)
Инцидентов краж за 3 месяца0 (ранее 2-3 в месяц)

Система работает автономно, уведомления о движении приходят в Telegram за 2-3 секунды, камеры мониторятся автоматически. Если вам нужна профессиональная установка системы видеонаблюдения с нуля — обращайтесь к нам в itfresh.ru.

Часто задаваемые вопросы

Аппаратный NVR Hikvision на 64 канала стоит 200-300 тыс. руб и ограничен по функциональности: нельзя добавить ML-детекцию, нельзя интегрировать с Telegram, нельзя кастомизировать retention policies. Frigate на обычном сервере стоит 80-120 тыс. руб (сервер) и даёт полный контроль: детекция объектов, интеграция с Home Assistant, API для внешних систем.
Обязательно. IP-камеры — одни из самых уязвимых IoT-устройств. Даже Hikvision имел критическую CVE с удалённым выполнением кода. Камеры в общей сети — это прямой путь к компрометации всей инфраструктуры. В изолированном VLAN скомпрометированная камера не может достичь рабочих станций или серверов.
Формула: количество камер × средний битрейт (Мбит/с) × 86400 (секунд в сутках) / 8 (бит в байте) / 1024 / 1024 × дни хранения = ГБ. Для H.265+ средний битрейт 4 Мп камеры — 1-2 Мбит/с. 50 камер × 1.5 Мбит/с × 30 дней ≈ 19 ТБ. Добавляйте 20% запас.
Да, через VPN. Настраиваете WireGuard на роутере склада и на телефоне, подключаетесь к VPN — и видите NVR как в локальной сети. Трафик шифрован, видео не покидает ваш периметр, нет ежемесячной подписки за облако. WireGuard потребляет минимум батареи на мобильных устройствах.
Считайте PoE-бюджет: количество камер × максимальное потребление + 30% запас. Для 16 камер по 12W нужен коммутатор с бюджетом от 250W. Обязательно managed (для VLAN и port isolation). Проверенные варианты: TP-Link TL-SG1218MPE (16 портов, 250W), Mikrotik CRS328-24P-4S+RM (24 порта, 500W). Не экономьте на PoE — дешёвый no-name может перегреться и отключить все камеры.

Нужна помощь с проектом?

Специалисты АйТи Фреш помогут с архитектурой, DevOps, безопасностью и разработкой — 15+ лет опыта

📞 Связаться с нами
#IP-камера#ONVIF#RTSP#NVR#Frigate#ZoneMinder#VLAN#PoE
Комментарии 0

Оставить комментарий

загрузка...