Skip to content

About

IaC для домашнего GPU-видеостека Frigate + Ollama: Hyper-V, Ansible, NVIDIA Tesla, Docker Compose и smoke-тесты.

Topics

Resources

Security policy

Stars

0 stars

Watchers

0 watching

Forks

Repository files navigation

Frigate Recorder на Hyper-V VM

English

CI CodeQL OpenSSF Scorecard Release License: GPL-3.0 IaC

Репозиторий поддерживает два профиля: текущий production-профиль recorder для непрерывной записи камер без GPU-аналитики и сохранённый профиль gpu_analytics для прежнего Frigate + Ollama + ASR стека.

Текущее состояние production на 15.09.2026: Tesla P40 не установлена, VM frigate-ubuntu работает с 2 vCPU и 4 GB RAM, включена в автозапуск и пишет непрерывный архив за 3 дня без детекции, снимков, Ollama и ASR. Камеры Pi kiosk поступают напрямую с камер через go2rtc на Red и от Frigate не зависят. Подробный live-state: docs/current-state.md. С 28.09.2026 ASR из asr/ работает на Чёрном сервере adler-black-u2 (Tesla P40 GPU0, https://adler-black-u2.lan:19443 только из домашней LAN, без аутентификации) по asr/docker-compose.black.yml. Ollama выведена; локальная LLM — black-qwen из krotname/VpnOps. Адреса 192.168.1.138:9443 и :11443 ниже относятся только к профилю gpu_analytics.

Для production задайте в inventory:

frigate_profile: recorder
ollama_enabled: false
asr_enabled: false
record_continuous_days: 3

Сохранённая GPU-конфигурация (gpu_analytics):

  • Windows Server host: ADLER-WHITE-1W.
  • Hyper-V VM: frigate-ubuntu.
  • GPU: NVIDIA Tesla P40 через Hyper-V DDA passthrough.
  • Frigate: CUDA ffmpeg + ONNX GPU detector YOLOv9-t 320.
  • Ollama: huihui_ai/gpt-oss-abliterated:20b.
  • ASR: Systran/faster-whisper-large-v3, CUDA int8.
  • Frigate HTTPS LAN: https://frigate.adler-white-w1.lan/ (VM on White, 192.168.1.138).
  • Ollama HTTPS LAN: https://192.168.1.138:11443/.
  • ASR HTTPS LAN: https://192.168.1.138:9443/.

The Frigate name resolves on the LAN router to the VM, where nginx serves port 443 with a dedicated certificate from krt-local-lan-root-ca-2026-r3. The certificate and private key are provisioned from White's CA before running Ansible. The old https://adler-frigate.lan:8971/ endpoint remains available for existing clients.

Что Показывает Репозиторий

  • Воспроизводимый IaC-подход для домашнего Windows Server + Hyper-V + Ubuntu VM.
  • Разделение ответственности между PowerShell, Ansible, Docker Compose и runtime smoke-test.
  • GPU passthrough через Hyper-V DDA для постоянной Frigate/Ollama нагрузки.
  • Отдельный OpenAI-compatible ASR endpoint для локального распознавания аудио.
  • Проверенная клиентская конфигурация OpenCode для локальных моделей Ollama.
  • Демонстрационные конфиги с русскими комментариями вместо пустых заглушек.
  • CI-проверки для YAML, Ansible, PowerShell, GitHub Actions, CodeQL и OpenSSF Scorecard.
  • Документированные governance, reviewer и supply-chain правила для solo-maintained инфраструктуры.

Зачем Это Нужно

Обычный Frigate на CPU быстро упирается в процессор: декодирование RTSP, масштабирование кадров, object detection, запись и GenAI-конвейер конкурируют за одни и те же ядра. В итоге растут задержки, skipped frames и нагрузка на Windows-хост.

Tesla P40 хорошо подходит для такого домашнего сервера:

  • 24 GB VRAM хватает одновременно под Frigate detector и локальную LLM.
  • Карта серверная, рассчитана на постоянную работу 24/7.
  • Pascal compute capability 6.1 все еще поддерживается CUDA/ONNXRuntime в этом стеке.
  • Frigate разгружает CPU через CUDA decode/scale и ONNX detector.
  • Ollama держит модель на GPU, а не в swap/CPU.
  • VM изолирует Linux NVIDIA runtime от Windows Server и Docker Desktop.

Идея не в том, что P40 самая новая. Идея в том, что это дешевая серверная карта с большим объемом памяти, которую можно эффективно использовать для постоянного видеонаблюдения и локального AI.

Какие Tesla Подойдут

Проверено в этом репозитории на Tesla P40. Для других карт надо проверять драйвер, охлаждение, питание, passthrough и поддержку ONNXRuntime/Ollama.

Карта Оценка Комментарий
Tesla P40 24GB Лучший бюджетный вариант Много VRAM, нормальна для inference, требует хорошего обдува.
Tesla P4 8GB Хороша для Frigate Низкое потребление, но мало VRAM для vision LLM.
Tesla P100 16GB Работоспособна, но не идеальна Хорошая вычислительная карта, но для quantized inference P40/P4 часто практичнее.
Tesla T4 16GB Отличный вариант Новее и эффективнее P40, обычно проще с современным AI-стеком.
Tesla V100 16/32GB Сильная, но дорогая Избыточна для простого домашнего Frigate, хороша для более тяжелых моделей.
Tesla M40/M60 Только как эксперимент Старее, хуже с современным CUDA/LLM стеком, внимательно проверять поддержку.
Tesla K80/K40/K20 Не рекомендуется Слишком старые для такого современного CUDA/Ollama/ONNX стека.

Для compute capability удобно сверяться с официальной таблицей NVIDIA: CUDA GPUs.

Технологии

В репозитории намеренно разделены зоны ответственности:

  • PowerShell: Windows Server, Hyper-V, автозапуск VM, DDA GPU passthrough.
  • Ansible: Ubuntu VM, пакеты, сервисы, шаблоны, сертификат, Docker Compose.
  • Docker Compose: runtime Frigate и ASR.

Terraform здесь не главный инструмент, потому что основные ресурсы не в облаке: они живут в Hyper-V и внутри конкретной Ubuntu VM. Один Docker Compose тоже не достаточен: Ollama, nginx, сертификаты, модель YOLO и GPU-проверки находятся снаружи контейнера Frigate.

Что Внутри

ansible/
  inventory.example.yml
  group_vars/all.example.yml
  playbooks/site.yml
  roles/frigate_vm/
scripts/
  init-local-config.ps1
  hyperv-host-setup.ps1
  invoke-config-backup.ps1
  install-frigate-local-ca.ps1
  smoke-test.ps1
docs/
  architecture.md
  backup-policy.md
  operations.md
  current-state.md
registries/
  backup-registry.csv
  registry-of-registries.csv
frigate/
  .env.example
asr/
  app.py
  docker-compose.yml
  Dockerfile
opencode/
  opencode.example.json
  AGENTS.md
  models/

Настройка клиента OpenCode описана в docs/opencode-ollama.md.

Быстрый Старт

Нужны:

  • Windows PowerShell 5.1 или PowerShell 7.
  • WinRM over HTTPS-доступ к Windows host ADLER-WHITE-1W через PowerShell.7.
  • SSH-доступ к Ubuntu VM.
  • Ansible в WSL/Linux или на другой Unix-like машине управления.
  • sudo-пользователь внутри Ubuntu VM.

Штатный доступ к Windows host выполняется только через WinRM HTTPS:

$cred = Import-Clixml -LiteralPath 'C:\Users\KRT\.codex\secrets\adler-winrm.credential.xml'
Invoke-Command -ComputerName ADLER-WHITE-1W -UseSSL -ConfigurationName PowerShell.7 -Credential $cred -Authentication Negotiate -ScriptBlock {
    hostname
    whoami
    $PSVersionTable.PSVersion.ToString()
}

Raw SSH к Windows host не используется для обычного администрирования; он оставлен только как аварийный bootstrap/fallback. SSH в этом репозитории остается штатным каналом только для Ubuntu VM.

  1. Создать локальные настройки:
powershell -NoProfile -ExecutionPolicy Bypass -File .\scripts\init-local-config.ps1

Скрипт создаст:

  • ansible\inventory.yml
  • ansible\group_vars\all.yml

Эти файлы игнорируются git. В них будут локальные IP, камеры, RTSP-учетка и общая basic-auth учетка для LAN API Frigate, Ollama и ASR. Скрипт требует пароль длиной не менее 12 символов.

  1. На Windows Server host настроить VM:
$cred = Import-Clixml -LiteralPath 'C:\Users\KRT\.codex\secrets\adler-winrm.credential.xml'
Invoke-Command -ComputerName ADLER-WHITE-1W -UseSSL -ConfigurationName PowerShell.7 -Credential $cred -Authentication Negotiate -FilePath .\scripts\hyperv-host-setup.ps1

Если GPU еще не назначена VM, запускать осознанно:

$cred = Import-Clixml -LiteralPath 'C:\Users\KRT\.codex\secrets\adler-winrm.credential.xml'
Invoke-Command -ComputerName ADLER-WHITE-1W -UseSSL -ConfigurationName PowerShell.7 -Credential $cred -Authentication Negotiate -FilePath .\scripts\hyperv-host-setup.ps1 -ArgumentList 'frigate-ubuntu', 8, 8GB, 60, 'PCIROOT(0)#PCI(0300)#PCI(0000)', $true
  1. Развернуть сервисы внутри Ubuntu VM:
ansible-playbook -i .\ansible\inventory.yml .\ansible\playbooks\site.yml --ask-become-pass
  1. Доверить локальный сертификат Frigate/Ollama на Windows-клиенте:
powershell -NoProfile -ExecutionPolicy Bypass -File .\scripts\install-frigate-local-ca.ps1 `
  -FrigateUrl https://frigate.adler-white-w1.lan `
  -CaCertPath C:\secure-transfer\fullchain.pem
  1. Проверить весь стек:
powershell -NoProfile -ExecutionPolicy Bypass -File .\scripts\smoke-test.ps1

Все три LAN API закрыты basic auth. Для smoke-test задайте одинаковые значения в FRIGATE_BASIC_*, OLLAMA_BASIC_* и ASR_BASIC_* либо передайте параметры -FrigateAuth*, -OllamaAuth* и -AsrAuth*. Пароль в репозиторий не кладется.

Ожидаемый результат: failed_count=0.

Config-only backups are documented in docs\backup-policy.md and tracked in registries\backup-registry.csv.

Доступ Из Локальной Сети

Сначала установите и проверьте локальный сертификат скриптом install-frigate-local-ca.ps1. Команды ниже намеренно не отключают проверку TLS.

С этой машины Frigate проверяется так:

curl.exe -u "$env:FRIGATE_BASIC_USER`:$env:FRIGATE_BASIC_PASSWORD" `
  https://frigate.adler-white-w1.lan/api/version

Ollama API:

curl.exe -u "$env:OLLAMA_BASIC_USER`:$env:OLLAMA_BASIC_PASSWORD" https://192.168.1.138:11443/api/version

ASR API:

curl.exe -u "$env:ASR_BASIC_USER`:$env:ASR_BASIC_PASSWORD" https://192.168.1.138:9443/health

Распознавание аудио:

curl.exe -u "$env:ASR_BASIC_USER`:$env:ASR_BASIC_PASSWORD" -X POST "https://192.168.1.138:9443/v1/audio/transcriptions" `
  -F "file=@C:\path\audio.m4a" `
  -F "language=ru" `
  -F "response_format=json"

Текстовый запрос к установленной модели:

$body = @{
  model = "huihui_ai/gpt-oss-abliterated:20b"
  prompt = "Напиши одно короткое предложение по-русски."
  stream = $false
  think = "low"
  options = @{ num_predict = 256; num_ctx = 2048 }
} | ConvertTo-Json -Depth 4
curl.exe -u "$env:OLLAMA_BASIC_USER`:$env:OLLAMA_BASIC_PASSWORD" `
  --max-time 600 -H "Content-Type: application/json" `
  --data-binary $body https://192.168.1.138:11443/api/generate

У модели gpt-oss часть токенов уходит в thinking, поэтому для коротких ответов лучше ставить num_predict не ниже 256. Холодная загрузка модели на Tesla P40 занимает около 5 минут, поэтому для первого запроса нужен таймаут около 600 секунд.

Что Проверяет Smoke-Test

  • Windows host identity.
  • Hyper-V VM running/autostart/IP.
  • Tesla P40 DDA assignment.
  • LAN-доступ к Frigate и Ollama.
  • Docker и Frigate container health.
  • Frigate API.
  • ONNX GPU detector: device=GPU, CUDAExecutionProvider, YOLOv9-t 320.
  • CUDA ffmpeg decode/scale pipeline.
  • FPS камер и свежие записи.
  • Ollama service/API/model.
  • ASR HTTPS API/container.
  • сетевой путь Frigate container -> Ollama.
  • текстовый запрос Ollama -> русский ответ -> 100% GPU.
  • опционально ASR audio transcription, если передан -AsrSamplePath.

Последний проверенный production-прогон:

2026-06-28, LAN ports opened
Frigate: https://192.168.1.138:8971/
Ollama: huihui_ai/gpt-oss-abliterated:20b, cold start ~301s, 100% GPU
ASR: https://192.168.1.138:9443/, Systran/faster-whisper-large-v3, CUDA int8

Полный proof-снимок лежит в docs/smoke-test-proof.md.

Релиз

Первый публичный release: v0.1.0. В нем опубликованы source archive, checksums.txt и GitHub build provenance attestation для tagged archive.

Секреты

В репозиторий не попадают:

  • ansible/group_vars/all.yml
  • .env
  • LAN basic-auth и RTSP-пароли
  • private key сертификата
  • сгенерированные сертификаты
  • .onnx / .pt модели
  • smoke-test отчеты и логи

Если checkout используется не только локально, зашифруйте переменные:

ansible-vault encrypt .\ansible\group_vars\all.yml

Качество И Безопасность

  • Security Policy описывает private vulnerability reporting и правила для секретов.
  • Governance фиксирует protected branch baseline и исключения для solo-maintained hygiene changes.
  • Reviewer Guide перечисляет статические проверки и runtime smoke-test.
  • Smoke-Test Proof фиксирует последний production-прогон failed_count=0.
  • Supply Chain Verification описывает SHA-pinned Actions, pinned dev tools и release attestations.
  • Dependency Policy фиксирует текущий baseline Ansible/PowerShell/Frigate/Ollama.

Black без исправных GPU

VpnOps автоматически выбирает asr/docker-compose.black.cpu.yml и ocr/docker-compose.black.cpu.yml, когда нет исправных Tesla. ASR сохраняет Whisper large-v3 int8, OCR — Qwen3-VL-2B и прежние text/JSON/searchable PDF API; инференс идёт на CPU с ограничением четырьмя ядрами на модель и работает медленнее. Общий Qwen на TCP 8000 выключен. OCR-модель остаётся только на loopback 18090. CPU-образ home-ocr-llm-cpu:local нужно заранее собрать из Dockerfile.llama с LLAMA_CUDA=OFF; контроллер не скачивает и не собирает образы при аварии. С одной исправной GPU возвращается CUDA ASR/OCR, с двумя — также общий Qwen по автоматической политике VpnOps. После reboot выбор повторяется по живому PCI/GPU.

About

IaC для домашнего GPU-видеостека Frigate + Ollama: Hyper-V, Ansible, NVIDIA Tesla, Docker Compose и smoke-тесты.

Topics

Resources

Security policy

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages