go2rtc — універсальний сервер відеострімінгу IP-камер: встановлення, Docker, Linux, Windows та Python API

go2rtc — безкоштовний open-source сервер, який приймає відео з IP-камер, перетворює або ретранслює потоки та дозволяє переглядати їх у браузері, мобільних застосунках і системах автоматизації.

Його головна перевага — можливість організувати перегляд RTSP-камер через звичайний веббраузер без встановлення спеціалізованих програм або плагінів.

Офіційний репозиторій: https://github.com/AlexxIT/go2rtc

Table of Contents

1. Для чого потрібен go2rtc?

Більшість IP-камер підтримують RTSP. Цей протокол чудово працює у VLC, відеореєстраторах і спеціалізованих програмах відеоспостереження, але сучасні браузери не відтворюють RTSP безпосередньо.

go2rtc працює як проміжний сервер:

IP-камера → RTSP → go2rtc → WebRTC / MSE / HLS → браузер

Наприклад, маємо вісім камер Dahua, Hikvision або інших виробників. Замість встановлення програм на кожен комп’ютер можна створити локальну вебсторінку, яка показуватиме всі камери одночасно.

Типові сценарії використання:

  • Відеоспостереження з переглядом через Chrome, Safari, Firefox або Edge.
  • Відеопанелі з 4, 8, 16 чи більшою кількістю камер.
  • Інтеграція з Home Assistant, Frigate і власними вебзастосунками.
  • Перегляд камер на телевізорах із браузером.
  • Ретрансляція одного камерного потоку кільком клієнтам.
  • Отримання окремих кадрів із камер через HTTP API.
  • Інтеграція в Python-сервіси та системи автоматизації.

Важливо: go2rtc — не повноцінна система відеореєстрації NVR. Для постійного запису, архіву, пошуку подій і детекції руху зазвичай використовують додаткові компоненти.

2. Основні можливості

go2rtc підтримує RTSP, WebRTC, HTTP, MJPEG, RTMP та низку інших способів отримання й передачі відео.

Сервер може передавати потік без повного перекодування, якщо кодеки джерела сумісні з обраним способом перегляду. Це суттєво зменшує навантаження на процесор.

Найважливіші функції:

  • WebRTC: відтворення відео з низькою затримкою.
  • MSE: відтворення відео у сумісних браузерах.
  • RTSP-сервер: повторна видача потоків іншим програмам.
  • FFmpeg: перетворення несумісних форматів аудіо та відео.
  • HTTP API: можливість інтеграції з Python, JavaScript та іншими програмами.
  • Two-way audio: двостороннє аудіо з підтримуваними камерами.
  • WebUI: налаштування камер через вебінтерфейс.

Затримка залежить від протоколу, кодека, мережі, буферизації та клієнта. WebRTC за сприятливих умов може забезпечувати дуже низьку затримку, але гарантувати її повну відсутність не можна.

3. Системні вимоги

Для простого ретранслювання H.264-потоків без транскодування часто достатньо невеликого Linux-сервера, міні-ПК або Raspberry Pi.

Орієнтовна конфігурація для невеликої системи:

Компонент Рекомендація
ОС Ubuntu Server, Debian, Windows або Docker
Процесор x86-64 або ARM64
RAM 1–2 ГБ для невеликого стенду
Диск Невеликий обсяг для програми та конфігурації
Мережа Ethernet, бажано Gigabit
GPU Не обов’язковий без транскодування

Це орієнтири, а не офіційні мінімальні вимоги. Реальні ресурси залежать від кількості потоків, роздільної здатності, бітрейту та кількості глядачів.

4. Встановлення через Docker Compose

Docker — один із найзручніших варіантів встановлення go2rtc на сервері Linux.

Він дозволяє ізолювати програму, зберігати налаштування в окремому каталозі та швидко оновлювати контейнер.

Крок 1. Створюємо директорію

На Ubuntu або Debian:

sudo mkdir -p /opt/go2rtc/config
cd /opt/go2rtc

Крок 2. Створюємо конфігурацію

Створіть файл /opt/go2rtc/config/go2rtc.yaml:

api:
  listen: ":1984"
  username: "admin"
  password: "CHANGE_THIS_PASSWORD"
  local_auth: true

rtsp:
  listen: ":8554"

webrtc:
  listen: ":8555"

streams:
  camera1: "rtsp://viewer:CAMERA_PASSWORD@192.168.1.50:554/Streaming/Channels/101"

Тут використано приклад RTSP-адреси Hikvision. Для Dahua, Tapo або іншого виробника URL буде відрізнятися.

Обов’язково замініть пароль адміністратора та облікові дані камер.

Обмежте доступ до файлу:

sudo chmod 600 /opt/go2rtc/config/go2rtc.yaml

Зверніть увагу: при використанні bind mount контейнер повинен мати можливість читати файл. Якщо контейнер працює від іншого UID, скоригуйте власника та дозволи.

Крок 3. Створюємо docker-compose.yml

Файл /opt/go2rtc/docker-compose.yml:

services:
  go2rtc:
    image: alexxit/go2rtc:latest
    container_name: go2rtc
    network_mode: host
    restart: unless-stopped

    environment:
      TZ: Europe/Kyiv

    volumes:
      - ./config:/config

Режим network_mode: host рекомендований для Linux-серверів, особливо коли використовуються WebRTC, UDP або протоколи виявлення камер.

Важливо: Docker host networking не означає захищений доступ. API і RTSP потрібно обмежувати правилами firewall та автентифікацією. На Docker Desktop у Windows і macOS поведінка host networking відрізняється від звичайного Linux.

Крок 4. Запускаємо сервер

cd /opt/go2rtc

sudo docker compose config
sudo docker compose up -d
sudo docker compose ps

Переглянути журнали:

sudo docker compose logs --tail=100 go2rtc

Перевірити відповідь HTTP API:

curl -u admin:CHANGE_THIS_PASSWORD \
  http://127.0.0.1:1984/api/streams

Команда має повернути JSON зі списком налаштованих потоків. Наявність потоку в списку ще не гарантує, що камера доступна та передає відео.

Крок 5. Відкриваємо WebUI

На сервері:

http://localhost:1984/

З іншого комп’ютера в дозволеній локальній мережі:

http://192.168.1.10:1984/

Тут 192.168.1.10 — приклад IP сервера go2rtc.

5. Docker без host network: режим bridge

Іноді потрібно запускати go2rtc поряд з іншими контейнерами, не використовуючи мережу хоста.

Тоді можна опублікувати необхідні порти:

services:
  go2rtc:
    image: alexxit/go2rtc:latest
    container_name: go2rtc
    restart: unless-stopped

    ports:
      - "1984:1984/tcp"
      - "8554:8554/tcp"
      - "8555:8555/tcp"
      - "8555:8555/udp"

    environment:
      TZ: Europe/Kyiv

    volumes:
      - ./config:/config

Для клієнтів WebRTC, які підключаються з іншої мережі, може знадобитися додаткова конфігурація адрес candidates, NAT та firewall. Просто опублікувати порт іноді недостатньо.

Якщо RTSP-сервер go2rtc не використовується іншими системами, порт 8554 можна не публікувати.

Не відкривайте порт 1984 безпосередньо в Інтернет.

6. Встановлення на Ubuntu / Debian без Docker

go2rtc можна запускати як звичайну програму Linux без контейнерів.

Крок 1. Завантаження

Для системи Linux x86-64:

sudo apt update
sudo apt install -y curl ca-certificates

sudo mkdir -p /opt/go2rtc

sudo curl -fL \
  https://github.com/AlexxIT/go2rtc/releases/latest/download/go2rtc_linux_amd64 \
  -o /opt/go2rtc/go2rtc

sudo chmod 755 /opt/go2rtc/go2rtc

Для ARM64 використовуйте відповідний файл go2rtc_linux_arm64.

Перед використанням у production бажано зафіксувати конкретну версію релізу та перевірити контрольні суми завантаженого файлу, якщо вони опубліковані.

Крок 2. Створення конфігурації

sudo nano /opt/go2rtc/go2rtc.yaml

Приклад мінімального локального конфіга:

api:
  listen: "127.0.0.1:1984"

rtsp:
  listen: "127.0.0.1:8554"

streams:
  camera1: "rtsp://viewer:CAMERA_PASSWORD@192.168.1.50:554/Streaming/Channels/101"

Крок 3. Перевірка запуску

cd /opt/go2rtc
sudo ./go2rtc -c /opt/go2rtc/go2rtc.yaml

Для постійної роботи замість запуску з термінала краще використати systemd.

Крок 4. Системний користувач і systemd

Створюємо окремого користувача:

sudo useradd --system --no-create-home \
  --shell /usr/sbin/nologin go2rtc

Налаштовуємо власника каталогу:

sudo chown -R go2rtc:go2rtc /opt/go2rtc
sudo chmod 700 /opt/go2rtc
sudo chmod 600 /opt/go2rtc/go2rtc.yaml

Створюємо службу:

sudo nano /etc/systemd/system/go2rtc.service

Вміст:

[Unit]
Description=go2rtc Camera Streaming Server
After=network-online.target
Wants=network-online.target

[Service]
Type=simple
User=go2rtc
Group=go2rtc
WorkingDirectory=/opt/go2rtc
ExecStart=/opt/go2rtc/go2rtc -c /opt/go2rtc/go2rtc.yaml
Restart=on-failure
RestartSec=5
NoNewPrivileges=true

[Install]
WantedBy=multi-user.target

Активуємо:

sudo systemctl daemon-reload
sudo systemctl enable --now go2rtc
sudo systemctl status go2rtc

Перевірка журналів:

sudo journalctl -u go2rtc -n 100 --no-pager

Тепер сервер автоматично запускатиметься після перезавантаження Linux.

Примітка: наведена конфігурація слухає API тільки на 127.0.0.1. Для доступу з іншого комп’ютера знадобиться SSH-тунель або правильно захищений reverse proxy.

7. Встановлення на Windows 10/11

Для Windows необов’язково використовувати Docker або WSL.

  1. Відкрийте сторінку релізів: https://github.com/AlexxIT/go2rtc/releases
  2. Завантажте архів go2rtc_win64.zip.
  3. Розпакуйте його в C:\go2rtc.
  4. Створіть поряд із виконуваним файлом go2rtc.yaml.
  5. Запустіть програму.

Приклад PowerShell:

New-Item -ItemType Directory -Force C:\go2rtc

Invoke-WebRequest `
  -Uri "https://github.com/AlexxIT/go2rtc/releases/latest/download/go2rtc_win64.zip" `
  -OutFile "$env:TEMP\go2rtc_win64.zip"

Expand-Archive `
  -Path "$env:TEMP\go2rtc_win64.zip" `
  -DestinationPath "C:\go2rtc" `
  -Force

Set-Location C:\go2rtc

Після створення конфігурації:

.\go2rtc.exe -c .\go2rtc.yaml

Відкрийте браузер:

http://localhost:1984

Для роботи як служби Windows можна використовувати NSSM або інший менеджер служб. У production потрібно окремо налаштувати обліковий запис служби, firewall та автозапуск.

8. Встановлення в Home Assistant

go2rtc можна використовувати як окремий сервер або через інтеграцію Home Assistant.

Один із доступних варіантів — add-on із репозиторію:

https://github.com/AlexxIT/hassio-addons

Загальна процедура:

  1. Відкрити налаштування додатків Home Assistant.
  2. Додати репозиторій додатків AlexxIT, якщо ваша інсталяція підтримує add-ons.
  3. Знайти та встановити go2rtc.
  4. Налаштувати потрібні камери.
  5. Використовувати потоки в Home Assistant.

Також існує WebRTC Camera custom integration, яка може працювати з окремим сервером go2rtc.

9. Налаштування IP-камер Dahua та Hikvision

Dahua

Приклад основного потоку:

streams:
  dahua_main: "rtsp://viewer:CAMERA_PASSWORD@192.168.1.101:554/cam/realmonitor?channel=1&subtype=0"

Приклад додаткового потоку:

streams:
  dahua_sub: "rtsp://viewer:CAMERA_PASSWORD@192.168.1.101:554/cam/realmonitor?channel=1&subtype=1"

Зазвичай subtype=0 означає основний потік, а subtype=1 — допоміжний, але це залежить від моделі та конфігурації камери.

Hikvision

streams:
  hikvision_main: "rtsp://viewer:CAMERA_PASSWORD@192.168.1.102:554/Streaming/Channels/101"

  hikvision_sub: "rtsp://viewer:CAMERA_PASSWORD@192.168.1.102:554/Streaming/Channels/102"

У багатьох камерах Hikvision 101 позначає основний потік першого каналу, а 102 — додатковий.

Обліковий запис viewer у прикладах умовний. Створіть користувача з мінімальними правами, необхідними для перегляду відео.

10. Основні мережеві порти

Порт Протокол Призначення
1984 TCP WebUI та HTTP API
8554 TCP RTSP-сервер
8555 TCP WebRTC
8555 UDP WebRTC

Це стандартні порти, які можна змінити через конфігурацію.

Порт RTSP камери (часто 554) — окремий від порту RTSP-сервера go2rtc (за замовчуванням 8554).

11. Перевірка потоків через API

go2rtc має HTTP API, що дозволяє отримати інформацію про потоки та інтегрувати сервер з іншими програмами.

Приклад запиту:

curl -u admin:CHANGE_THIS_PASSWORD \
  http://127.0.0.1:1984/api/streams

Для одного потоку:

curl -G \
  -u admin:CHANGE_THIS_PASSWORD \
  --data-urlencode "src=camera1" \
  http://127.0.0.1:1984/api/streams

RTSP-потік go2rtc можна відкрити у VLC:

rtsp://192.168.1.10:8554/camera1

Це працює, якщо RTSP-сервер увімкнений, доступний у мережі та правила безпеки дозволяють підключення.

12. Інтеграція з Python

Для роботи з go2rtc з Python існує бібліотека go2rtc-client від home-assistant-libs.

Репозиторій:

https://github.com/home-assistant-libs/python-go2rtc-client

Встановлення в ізольованому середовищі:

python3 -m venv .venv
source .venv/bin/activate

python -m pip install go2rtc-client

Альтернативний варіант:

uv pip install go2rtc-client

Варто розрізняти два компоненти:

  • go2rtc — сервер, який отримує та передає відеопотоки.
  • go2rtc-client — Python-бібліотека для взаємодії із сервером.

Для простих запитів необов’язково використовувати спеціалізовану бібліотеку. Достатньо стандартного HTTP-клієнта Python.

Приклад: отримання списку камер

Наступний приклад використовує лише стандартну бібліотеку Python і не потребує сторонніх пакетів.

import base64
import json
import os
from urllib.request import Request, urlopen

GO2RTC_URL = os.getenv(
    "GO2RTC_URL",
    "http://127.0.0.1:1984",
)

USER = os.environ["GO2RTC_USER"]
PASSWORD = os.environ["GO2RTC_PASSWORD"]

credentials = f"{USER}:{PASSWORD}".encode()
token = base64.b64encode(credentials).decode()

request = Request(
    f"{GO2RTC_URL.rstrip('/')}/api/streams",
    headers={
        "Authorization": f"Basic {token}",
        "Accept": "application/json",
    },
)

with urlopen(request, timeout=10) as response:
    streams = json.load(response)

for name in streams:
    print(f"Камера: {name}")

Перед запуском:

export GO2RTC_USER="admin"
export GO2RTC_PASSWORD="YOUR_PASSWORD"
export GO2RTC_URL="http://127.0.0.1:1984"

python3 check_cameras.py

Для віддаленого доступу використовуйте HTTPS або захищений тунель. HTTP Basic Authentication не шифрує пароль — він лише кодується у Base64.

У реальній програмі варто додати обробку помилок підключення, HTTP 401/403, тайм-аутів та недоступних камер.

13. Як організувати відеопанель на 8 камер

Один із найцікавіших варіантів застосування — власний дашборд відеоспостереження.

Архітектура:

IP-камери Dahua / Hikvision
           |
           | RTSP
           v
     Linux-сервер
           |
           | go2rtc
           |
    +------+------+
    |             |
  WebRTC       RTSP API
    |             |
    v             v
 Веббраузер    Інші сервіси
    |
    v
 Панель 8 камер

Рекомендується використовувати допоміжні потоки камер для загального перегляду.

Наприклад:

  • Основний потік: 1920×1080 або вища роздільна здатність.
  • Допоміжний потік: 640×360 або 704×576.
  • Перегляд усіх камер: допоміжні потоки.
  • Перегляд однієї камери на весь екран: основний потік.

Це дозволяє зменшити навантаження на браузер, сервер та мережу.

Для створення вебсторінки можна використати HTML, CSS, JavaScript і офіційні вебкомпоненти або приклади go2rtc.

Не варто просто вставляти відкритий WebUI адміністратора go2rtc у публічну сторінку. Краще створити окремий інтерфейс перегляду, де користувачі не матимуть доступу до конфігурації та адміністративних API.

14. Безпека go2rtc

Це один із найважливіших розділів.

За замовчуванням інтерфейс керування та потоки go2rtc можуть бути доступні іншим пристроям у мережі.

Помилка конфігурації може відкрити не тільки відео, але й дані авторизації камер.

Рекомендації:

  1. Не публікувати порт 1984 безпосередньо в Інтернет.
  2. Обмежувати доступ через firewall, VPN або reverse proxy.
  3. Використовувати окремого користувача камер тільки з правами перегляду.
  4. Не зберігати справжні паролі в публічному Git-репозиторії.
  5. Не використовувати privileged: true без технічної необхідності.
  6. Не відкривати RTSP-сервер для сторонніх мереж без захисту.
  7. Встановлювати актуальні стабільні версії та перевіряти повідомлення про вразливості.
  8. Для публічного вебзастосунку відокремити сервіс перегляду від адміністративного API.

Для локального сервера без потреби в зовнішньому API можна використати:

api:
  listen: "127.0.0.1:1984"

rtsp:
  listen: "127.0.0.1:8554"

webrtc:
  listen: ":8555"

Цей приклад підходить для нативного запуску Linux або Docker із host networking, де localhost відповідає хостовій мережі.

Для Docker bridge networking потрібно враховувати окремий мережевий простір контейнера.

15. Типові проблеми та діагностика

Камера не відображається

Перевірте RTSP-адресу у VLC або FFmpeg, облікові дані, IP-адресу камери та доступність порту 554.

Є звук, але немає зображення

Можлива несумісність відеокодека з браузером. Спробуйте змінити H.265 на H.264 у налаштуваннях камери або скористатися FFmpeg.

Висока затримка

Перевірте протокол відтворення, параметри потоку, буферизацію та якість мережі. Для інтерактивного перегляду зазвичай варто починати з WebRTC.

Високе навантаження CPU

Переконайтеся, що go2rtc не виконує зайве перекодування. Якщо перекодування необхідне, розгляньте апаратне прискорення.

WebRTC не працює через VPN або NAT

Перевірте доступність TCP/UDP 8555, IP-адреси WebRTC candidates та маршрутизацію між клієнтом і сервером.

Після оновлення контейнер не запускається

Перегляньте журнал:

docker compose logs --tail=200 go2rtc

Перед оновленням бажано зберегти конфігурацію та знати попередній тег образу.

16. Оновлення Docker-контейнера

cd /opt/go2rtc

sudo cp -a config config.backup

sudo docker compose pull
sudo docker compose up -d

sudo docker compose ps
sudo docker compose logs --tail=100 go2rtc

Для production рекомендується фіксувати конкретну перевірену версію образу, а не автоматично переходити на latest.

17. Висновок

go2rtc — практичний інструмент для створення локального сервера відеопотоків.

Він підходить для невеликих домашніх систем відеоспостереження, приватних серверів, майстерень, офісів і великих систем, у яких необхідно розділити джерела відео та інтерфейс перегляду.

Для нового проєкту найчастіше варто почати з Linux + Docker Compose. Якщо необхідна максимальна простота й мінімум компонентів, можна встановити нативний бінарний файл та налаштувати systemd.

Головне — правильно спроєктувати доступ до камер, не відкривати адміністративний API без захисту та використовувати транскодування тільки там, де воно справді потрібне.

Офіційні джерела

  • go2rtc: https://github.com/AlexxIT/go2rtc
  • Docker: https://github.com/AlexxIT/go2rtc/tree/master/docker
  • HTTP API: https://github.com/AlexxIT/go2rtc/tree/master/internal/api
  • Python client: https://github.com/home-assistant-libs/python-go2rtc-client
  • Home Assistant add-on: https://github.com/AlexxIT/hassio-addons
  • Релізи: https://github.com/AlexxIT/go2rtc/releases