Настройка newcamd в Docker: полный гайд 2026

Если вы занимаетесь newcamd Docker контейнер: настройка — этот материал написан именно для вас. Не для новичков, которые впервые открыли терминал, а для тех, у кого уже работает OScam или CCcam на голом железе и кто хочет переехать в контейнер без потери конфига и нервов. Я прошёл этот путь сам — расскажу, где реально спотыкаются и что в документации написано криво.

Что такое newcamd и зачем запускать его в Docker

Newcamd — это TCP-протокол передачи control words между сервером карт и клиентом. Шифрование DES с 14-байтным ключом, который должен совпадать на обоих концах. Порт по умолчанию — 15000, хотя это просто соглашение, а не стандарт.

Важный момент, который многие упускают: newcamd сам по себе — не отдельный демон. В OScam это протокол сервера, который включается секцией [newcamd] в oscam.conf. Никакого отдельного бинарника нет. Поэтому в контейнер кладут именно OScam с активированным newcamd-сервером.

Протокол newcamd в двух словах: TCP, DES-шифрование, порт 15000

Клиент (OScam, CCcam, MGcamd в клиентском режиме) коннектится на TCP-порт, проходит DES-рукопожатие с обменом ключами и после этого может слать ECM-запросы. Сервер отвечает CW. Всё это летит по одному TCP-соединению, пока клиент или сервер его не разорвёт.

Каждый CAID живёт на своём порту. Например, 15000 для 0500, 15001 для 0604. Это не опция — это архитектурное ограничение протокола newcamd. Держите это в голове, когда будете настраивать Docker-сеть.

Преимущества контейнеризации: изоляция, откат, повторяемая сборка

Docker реально удобен, когда у вас несколько инстансов OScam — например, один для тестирования новых ридеров, второй в продакшне. Откатиться на прошлую версию образа — одна команда. Воспроизвести ту же конфигурацию на другом хосте — тоже.

Ещё один плюс: обновление OScam без пересборки конфига. Конфиги лежат в volume на хосте, образ пересобирается или скачивается заново — и всё. Никаких ручных копирований файлов.

Когда Docker избыточен, а когда оправдан

Честно: если у вас один сервер, одна карта и десять клиентов — Docker добавляет лишний сетевой слой, который только усложняет отладку. При проблемах с подключением вы будете разбираться не только с oscam, но и с сетью контейнера, iptables и NAT.

Но если вы управляете несколькими инстансами, хотите CI/CD для конфигов или просто цените воспроизводимость — контейнер полностью оправдан. Особенно если хост уже крутит что-то ещё и вы не хотите конфликтов зависимостей.

Подготовка образа и структуры каталогов

Главное правило: конфиги не должны попасть внутрь образа через COPY. Монтируйте через volume — тогда можно менять oscam.conf и перезапускать контейнер без пересборки образа.

Выбор базового образа: сборка OScam из исходников vs готовый образ

Готовые образы с Docker Hub есть, но я рекомендую собирать самому — хотя бы потому, что вы точно знаете, какие модули включены. OScam без поддержки newcamd-сервера просто не создаст нужный listener. Убедитесь, что сборка включает MODULE_NEWCAMD.

Для сборки нужны gcc, make, libssl-dev, libpcsclite-dev (если используете смарт-карту через PC/SC), опционально libusb-dev. Финальный образ можно сделать на alpine или debian-slim — они весят меньше.

Структура тома: /config, oscam.conf, oscam.server, oscam.user

Стандартная схема: хостовая папка ./oscam-config монтируется в /usr/local/etc внутри контейнера (это дефолтный путь для OScam). В этой папке должны лежать:

  • oscam.conf — основная конфигурация, включая секцию [newcamd]
  • oscam.server — ридеры и смарт-карты
  • oscam.user — пользователи для клиентов
  • oscam.services — фильтрация сервисов (опционально)
  • oscam.ac — access control (если используете)

Пример Dockerfile с компиляцией OScam и включённым webif

# Stage 1: сборка
FROM debian:bookworm-slim AS builder

RUN apt-get update && apt-get install -y \
    git gcc make libssl-dev libpcsclite-dev \
    libusb-1.0-0-dev pkg-config \
    && rm -rf /var/lib/apt/lists/*

WORKDIR /build
RUN git clone https://github.com/oscam-emu/oscam-patched.git .
RUN make CONF_DIR=/usr/local/etc \
    USE_LIBSSL=1 \
    USE_PCSC=1 \
    MODULE_NEWCAMD=1 \
    CS_ANTICASC=1 \
    WEBIF=1 \
    -j$(nproc)

# Stage 2: финальный образ
FROM debian:bookworm-slim

RUN apt-get update && apt-get install -y \
    libssl3 libpcsclite1 libusb-1.0-0 \
    && rm -rf /var/lib/apt/lists/*

RUN useradd -r -s /bin/false oscam
COPY --from=builder /build/oscam /usr/local/bin/oscam
RUN chmod 755 /usr/local/bin/oscam

VOLUME ["/usr/local/etc"]
EXPOSE 15000 8888

USER oscam
CMD ["/usr/local/bin/oscam", "-f", "-c", "/usr/local/etc"]

Права доступа к файлам конфигурации и владелец процесса

Файлы с DES-ключами и паролями пользователей — ставьте chmod 600 и владельца того же UID, под которым запускается oscam. В примере выше это пользователь oscam. Запуск от root — это плохой тон даже в контейнере.

На хосте: chown 999:999 ./oscam-config/* (если UID пользователя oscam внутри контейнера — 999) и chmod 600 ./oscam-config/oscam.conf. Иначе oscam при запуске может ругаться или игнорировать файл.

Конфигурация newcamd-сервера в OScam

Вот где большинство гайдов в интернете дают неполную картину. Секция [newcamd] в oscam.conf выглядит просто, но в ней есть нюансы, которые стоят часов отладки.

Секция [newcamd] в oscam.conf: key, port, allowed

[newcamd]
key         = 0102030405060708091011121314
port        = 15000@0500:000000,000000
keepalive   = 1
mgclient    = 0
allowed     = 192.168.1.0/24,10.0.0.0/8

Формат параметра port — вот что путает людей: порт@CAID:ident1,ident2. То есть 15000@0500:000000 означает «слушать порт 15000, обслуживать CAID 0x0500, принимать все ident». Если у вас два CAID — нужна новая строка port с другим портом:

port = 15000@0500:000000
port = 15001@0604:000000
port = 15002@1830:000000

Параметр mgclient = 0 — выключить совместимость с MGcamd-клиентами. Если ваши клиенты — OScam в режиме newcamd525, оставляйте 0.

Генерация и назначение 14-байтного DES-ключа

Ключ — ровно 14 байт, то есть 28 шестнадцатеричных символов. Генерируется просто:

openssl rand -hex 14
# Пример: 3a7f2b8c1d4e5f6a7b8c9d0e1f2a

Частая ошибка — ключ из 26 или 30 символов. OScam при этом не упадёт с ошибкой, а просто будет тихо отклонять все подключения. Клиент покажет «connection refused» или «wrong key», и вы будете гадать долго. Считайте символы дважды.

Настройка пользователей в oscam.user для доступа по newcamd

[account]
user    = myclient
pwd     = secretpass
group   = 1
au      = 1
uniq    = 0
allowedprotocols = newcamd

Параметр au = 1 включает автообновление прав через этого пользователя. group должен совпадать с группами ридеров в oscam.server. Без этого совпадения ридер просто не будет доступен для пользователя — классическая ошибка «no matching reader».

Привязка ридеров и профилей CAID/провайдеров

В oscam.server ридер должен указывать те же группы:

[reader]
label    = my_card
protocol = mouse
device   = /dev/ttyUSB0
caid     = 0500
group    = 1
ident    = 0500:000000

Если ридер — USB-смарт-карта, не забудьте пробросить устройство в контейнер (об этом ниже). И убедитесь, что CAID в ридере совпадает с CAID в строке port секции [newcamd].

Сеть Docker: проброс портов и режимы

Сетевая часть — самое болезненное место при newcamd Docker контейнер: настройка. Особенно когда CAID несколько и каждый требует своего порта.

Публикация порта: -p 15000:15000 и несколько CAID-портов

При запуске через docker run каждый порт — отдельный флаг:

docker run -d \
  -p 15000:15000 \
  -p 15001:15001 \
  -p 15002:15002 \
  -p 8888:8888 \
  -v $(pwd)/oscam-config:/usr/local/etc \
  --name oscam \
  my-oscam-image

Или диапазон: -p 15000-15005:15000-15005. Это проще, но Docker резервирует весь диапазон, даже если реально используются только три порта.

Bridge vs host network для newcamd

Bridge-сеть — это дефолт Docker. Контейнер получает свой IP (обычно 172.17.x.x), а порты публикуются через NAT. Для newcamd это работает, но вы обязаны явно пробросить каждый используемый порт. Преимущество — настоящая изоляция: контейнер не видит весь хостовый трафик.

network_mode: host — контейнер использует сетевой стек хоста напрямую. OScam слушает 15000 так, как будто запущен без Docker. Никаких флагов -p не нужно. Это удобно при большом количестве CAID-портов, но изоляции сети нет совсем — контейнер видит весь сетевой интерфейс хоста. Для продакшна я предпочитаю bridge с явным пробросом.

docker-compose.yml с ports, volumes и restart: unless-stopped

version: "3.9"

services:
  oscam:
    build: .
    container_name: oscam-newcamd
    restart: unless-stopped
    ports:
      - "15000:15000"
      - "15001:15001"
      - "15002:15002"
      - "8888:8888"
    volumes:
      - ./oscam-config:/usr/local/etc
    devices:
      - /dev/ttyUSB0:/dev/ttyUSB0  # если есть USB-ридер
    environment:
      - TZ=Europe/Moscow
    healthcheck:
      test: ["CMD", "nc", "-z", "localhost", "15000"]
      interval: 30s
      timeout: 5s
      retries: 3
      start_period: 10s

Переменная TZ критична. Если часовой пояс контейнера не совпадает с часовым поясом клиента — могут появиться странные проблемы с keepalive и тайм-аутами ECM. OScam использует системное время для логов и внутренних таймеров.

Firewall, NAT и внешний доступ клиентов

После запуска контейнера проверьте, что порт открыт на хосте:

# Проверка снаружи
telnet your-host-ip 15000

# Открыть порт в ufw
ufw allow 15000/tcp
ufw allow 15001/tcp

# Или через iptables
iptables -A INPUT -p tcp --dport 15000 -j ACCEPT

При двойном NAT (контейнер → хост → роутер → интернет) нужно пробросить порт и на роутере. Если клиент всё равно не подключается — проверяйте каждый слой по очереди, а не всё сразу.

Проверка, логи и типовые ошибки

Когда newcamd Docker контейнер: настройка завершена и контейнер запущен — нужно убедиться, что всё реально работает, а не просто «процесс запустился».

Чтение docker logs и oscam webif (порт 8888)

# Следить за логами в реальном времени
docker logs -f oscam-newcamd

# Последние 100 строк
docker logs --tail 100 oscam-newcamd

В oscam.conf добавьте в секцию [global]:

[global]
logfile         = /usr/local/etc/oscam.log
loghistorysize  = 4096
loglevel        = 4

Webif доступен на порту 8888. В разделе Status → Clients виден каждый подключённый newcamd-клиент: его IP, время последнего ECM-запроса, CAID, время декодирования в миллисекундах. Если клиент подключился, но ECM не декодируются — проблема в ридере, а не в сети.

Диагностика connection refused и wrong DES key

Connection refused — порт не проброшен или OScam вообще не запустил listener. Проверьте: docker exec oscam-newcamd netstat -tlnp | grep 15000. Если порта нет — смотрите в лог запуска OScam, скорее всего ошибка парсинга конфига.

Client disconnected сразу после соединения — почти всегда несовпадение DES-ключа. Проверьте длину ключа (28 символов), убедитесь, что клиентский ридер в oscam.server содержит key = 0102030405060708091011121314 и протокол newcamd525.

No matching reader — пользователь в oscam.user не имеет общей группы с ридером. Сверьте group = в oscam.user и group = в oscam.server.

Проверка ECM-ответов и времени декодирования

Нормальное время ECM для локальной карты — 50–300 мс. Если видите 2000+ мс или вообще тайм-аут — ридер не отвечает. Для USB-карты проверьте, что устройство пробброшено корректно:

docker exec oscam-newcamd ls -la /dev/ttyUSB0
# Должно быть видно устройство, а не "No such file"

Для проброса USB-смарт-карты нужен флаг --device /dev/ttyUSB0:/dev/ttyUSB0 или соответствующая секция devices: в compose. Без этого oscam не увидит карту физически, хотя процесс запустится без ошибок. Также убедитесь, что на хосте настроены udev-правила для устройства, иначе в контейнере не будет прав на доступ.

Отладка сети между контейнерами через docker network

Если клиент — это другой контейнер (например, другой OScam в клиентском режиме), подключение через 127.0.0.1 не сработает. Используйте имя сервиса из compose или явный IP контейнера:

# Узнать IP контейнера
docker inspect oscam-newcamd | grep IPAddress

# Проверить связность изнутри другого контейнера
docker exec oscam-client nc -zv oscam-newcamd 15000

# Или по имени сервиса, если они в одной сети
docker exec oscam-client nc -zv oscam-newcamd 15000

Контейнеры из одного docker-compose.yml автоматически попадают в общую bridge-сеть и видят друг друга по имени сервиса. Контейнеры из разных compose-файлов — нет, их нужно явно объединять через external: true сеть.

Это не очевидный момент в newcamd Docker контейнер: настройка, но именно он часто вызывает «контейнер запущен, конфиг правильный, а клиент не видит сервер».

Частые вопросы

Какой порт по умолчанию использует newcamd и можно ли его изменить?

Стандарт — TCP 15000. Меняется параметром port в секции [newcamd] файла oscam.conf. Каждый CAID требует отдельного порта — например, 15000 для 0500 и 15001 для 0604. При работе через Docker нужно явно публиковать все используемые порты через -p или секцию ports: в compose.

Почему клиент не подключается, хотя контейнер запущен?

Чеклист по порядку: проверьте, что порт опубликован (-p 15000:15000), что DES-ключ ровно 28 hex-символов и одинаков на сервере и клиенте, что логин и пароль в oscam.user совпадают с клиентским конфигом, что firewall на хосте не блокирует порт, и что режим сети (bridge или host) настроен правильно. В 80% случаев это DES-ключ или проброс порта.

Как правильно сгенерировать DES-ключ для newcamd?

Командой openssl rand -hex 14. Результат — 28 шестнадцатеричных символов, то есть 14 байт. Ключ должен быть идентичен в oscam.conf на сервере и в строке key = клиентского ридера (protocol = newcamd525). Файл с ключом держите с правами 600, иначе OScam может отказаться его читать.

Нужно ли использовать network_mode: host или достаточно bridge?

Для одного-двух портов bridge с явным -p — нормальное решение и даёт изоляцию сети. network_mode: host удобен, если у вас много CAID-портов и не хочется перечислять каждый вручную, но тогда контейнер работает в сетевом пространстве хоста без изоляции. Для продакшна я выбираю bridge.

Как обновить OScam в контейнере без потери конфигурации?

Именно для этого конфиги лежат в volume на хосте, а не внутри образа. Пересоберите образ (docker compose build) или скачайте новый (docker compose pull), затем docker compose up -d. Контейнер пересоздастся с новым образом, но volume с oscam.conf и остальными файлами останется нетронутым.

Можно ли запустить несколько newcamd-серверов в разных контейнерах?

Да, без проблем. Каждому контейнеру — отдельный volume с конфигом и отдельный набор хостовых портов. Например, первый контейнер публикует 15000:15000, второй — 16000:15000 (внутри оба слушают 15000, но на хосте разные порты). В docker-compose.yml это два разных сервиса с разными именами. Главное — не допустить конфликта хостовых портов.

Практические советы для стабильного просмотра

Даже самая стабильная линия CCCam или OSCam требует пары простых подготовительных шагов. Обновляйте прошивку ресивера, раз в неделю очищайте ECM‑кеш и держите 15–20% свободного места на USB‑накопителе или во встроенной памяти, чтобы кардридер записывал ключи без задержек.

При настройке антенны оставляйте запас по MER/BER: смещение на два градуса или ослабленный F‑коннектор чаще становится причиной “фризов”, чем сам кардшаринг. Держите под рукой короткий патч‑корд для проверки другого роутера и сохраните два профиля в OSCam — под TCP и под UDP — чтобы мгновенно переключиться, если провайдер начнёт фильтровать протокол.

Utgard.tv следит за каждым хабом 24/7, однако вы можете ускорить диагностику, если будете вести небольшой журнал действий. Записывайте время переключения канала, активный CAID и то, использовали ли вы Wi‑Fi или Ethernet. Такой мини‑отчёт позволит инженерам воспроизвести вашу конфигурацию в лаборатории и предложить решение не за часы, а за минуты.

  • Держите активными две линии: если первый сервер уходит на обслуживание, второй тут же подхватывает поток без повторного ввода логина.
  • Раз в месяц делайте замер скорости и задержек. Стабильных 1–2 Мбит/с при пинге до 80 мс достаточно для SD/HD, но если джиттер превышает 20 мс — переведите роутер на провод.
  • Сохраните в закладки страницу статуса Utgard.tv и Telegram‑бота @utgard_tv_bot — там появляются уведомления о работах раньше, чем успеют среагировать SEMrush или внешние мониторы.