コンテンツにスキップ

テレビ録画サーバ denpa を立てる

README の手順の細かいところ。用意するもの、入れ方 (1行・Compose・1コンテナ・Helm)、誰を通すか、前段 (リバースプロキシ) の後ろに置くとき。 Mac と Windows の入れ方の中身は install-mac.md と install-windows.md に。使う前に 使ってよい範囲 を読んでください。

チューナー・カードリーダー・OS の一覧と機材ごとのページは tuners.md に。

  • イメージは amd64 と arm64 を同じタグにまとめてあり、自分のアーキテクチャのものが降ってきます
  • Intel の GPU — /dev/dri が見えれば起動時に見つけて GPU でエンコードします。compose.prod.yml では渡す行をコメントにしてあるので、 compose.override.yml で渡します (Helm は既定で渡す)。GPU を使えるのは amd64 だけです (encode.md)

イメージは公開してあるので、clone は要りません。 立ち上がるとブラウザが開きます。

curl -fsSL https://raw.githubusercontent.com/danything/denpa/main/install.sh | bash
irm https://raw.githubusercontent.com/danything/denpa/main/install.ps1 | iex # Windows (x64)
  • Linux (amd64 / arm64) — 全部 Docker Compose。~/denpa に compose.prod.yml を compose.yml として置いて起動します
  • Mac (Apple Silicon) — エージェントは Mac の上で直接 (LaunchAgent)、denpa 本体は Docker。USB をコンテナに渡せないため (install-mac.md)
  • Windows (x64) — エージェントは Windows の上で直接 (タスク スケジューラ)、denpa 本体は WSL のコンテナ (wslc)。Docker Desktop は要りません。 チューナーは px4-userland の機材 (PX-Q3U4 など) と siano-userland の機材 (PX-S1UD など)。ドライバは Zadig で WinUSB に (install-windows.md)
  • Docker・WSL は入れません。 無ければ入れ方を示して止まります (Linux は https://get.docker.com、 Mac は Docker Desktop か OrbStack、Windows は wsl --update)
  • 入口は genkan (ホスト名で振り分けるリバースプロキシ。Linux・Mac)。 動いていればそれを使い、無ければ 80 と 443 が空いているときだけ ~/genkan に入れて http://denpa.localhost で開きます。 入れられなければ http://localhost:3000。denpa.localhost はそのマシンでしか引けないので、LAN のほかの機器 (テレビ・スマホ) からは http://<IP>:3000 で開きます。Windows はいつも http://localhost:3000
  • 置き場は ~/denpa (DENPA_HOME)。compose.yml は更新のたびに上書きするので、 変えたいことは同じ場所の compose.override.yml に書きます (Compose が重ねて読み、install.sh は触らない)。 Windows は ~/denpa/denpa.env
  • もう一度流すと最新のリリースに上がります。… | bash -s -- --uninstall で止めて外します (~/denpa・録画・DB は残す)。ブラウザを開かないなら --no-open。Windows は -Uninstall / -NoOpen (渡し方は install.ps1 の頭)

Linux ならこれだけです (エージェントは tuner-agent として一緒に立つ)。

mkdir denpa && cd denpa
curl -Lo compose.yml https://raw.githubusercontent.com/danything/denpa/main/compose.prod.yml
docker compose up -d

本体とエージェントを1つにまとめたイメージです。チューナーを挿した機械で全部動かすとき (NAS や、ほかの仕組みに載せるとき) 向け。中身は2つのイメージと同じです。

docker run -d --name denpa --restart unless-stopped --stop-timeout 21900 \
--cap-add SYS_RESOURCE \
--device-cgroup-rule 'c 189:* rmw' --device-cgroup-rule 'c 212:* rmw' \
-v /dev/bus/usb:/dev/bus/usb -v /dev/dvb:/dev/dvb \
-e TRUSTED_NETWORKS=192.168.0.0/16,10.0.0.0/8,172.16.0.0/12 \
-v ./config:/config -v denpa-data:/data -v denpa-media:/media \
-p 3000:3000 ghcr.io/danything/denpa-aio:latest
  • エージェントの設定 (tuners.json / channels.json) は /config、DB は /data、録画は /media の下 (元のTS は raw、エンコードしたものは encoded)。前の版から上げるときは config.md
  • --privileged は要りません。USB (189) と DVB (212) のデバイスを開く許可と、pipe を広げる SYS_RESOURCE だけ渡します。デバイスはディレクトリごと見せるので、挿し直しても再起動は要りません
  • 止めるときは録画の終わりを待つので、--stop-timeout を長くしておきます (compose の stop_grace_period と同じ)。 どちらかのプロセスが落ちたらコンテナごと終わり、起こし直しは --restart に任せます
# 本体 + チューナーエージェント (同じクラスタに置く)
helm install denpa oci://ghcr.io/danything/charts/denpa \
--namespace denpa --create-namespace \
--set denpa.trustedNetworks=192.168.0.0/16 \
--set httpRoute.enabled=true \
--set 'httpRoute.parentRefs[0].name=my-gateway' \
--set 'httpRoute.parentRefs[0].namespace=gateway-system' \
--set 'httpRoute.hostnames[0]=denpa.example.home'

チューナーを挿した機械にエージェントだけ置き、本体を別の所で動かすなら oci://ghcr.io/danything/charts/denpa-agent を使い、本体側は TUNER_AGENT_URL でそこを指します (agent.md)。値の一覧と意味は charts/denpa/values.yaml のコメントにあります。

latest はリリースのたびに新しくなります。版を固定するなら 1.20.0 のように書きます (architecture.md)。

設定するまで全部断ります。compose の TRUSTED_NETWORKS の初期値は家の中 (私設網) で、ここからはログインなしで通ります。 画面をログインで守るなら OIDC の3つを渡します (リダイレクト URI は https://<denpa>/login/callback)。

~/denpa/compose.override.yml
services:
denpa:
environment:
TRUSTED_NETWORKS: 192.168.1.0/24
OIDC_ISSUER: https://login.microsoftonline.com/<tenant>/v2.0
OIDC_CLIENT_ID: <アプリケーションID>
OIDC_CLIENT_SECRET: <クライアントシークレット>

Windows は同じ名前を KEY=値 で ~/denpa/denpa.env に、Helm は denpa.trustedNetworks と denpa.oidcSecretName に書きます。 TRUSTED_NETWORKS=0.0.0.0/0 はインターネットに向けて開くのと同じです。 家の外に出すなら OIDC を使います。 ログインの細かいことは auth.md、変数の一覧は config.md。

持っているドメインの名前を LAN の中のアドレスに向ければ、公開しないまま本物の証明書が 使えます (DNS-01 なら外から繋がる必要が無い。.arpa のような内側だけの名前は ACME で 取れない)。ホーム画面に置けるのも全画面にできるのも https のページだけなので、PWA にも要ります。 外向きと LAN 用の2つの名前で出すなら、ホーム画面の名前を分けられます (watch.md)。

立てたあとの手順は README。うまくいかないときは設定の「受信」 (/settings/reception) を見ます。エージェントと カードリーダーの状態、スキャンの結果、番組表の集まり具合が出ます。

イメージにはシェルがありません (土台は distroless。development.md)。 コンテナの中を見るときは、シェルのあるコンテナを横に付けます。

# Docker。名前は docker ps に出るもの (compose なら denpa-denpa-1)。中のファイルは /proc/1/root/ の下
docker run --rm -it --pid=container:denpa-denpa-1 --network=container:denpa-denpa-1 busybox
# Kubernetes
kubectl debug -it deploy/denpa --image=busybox --target=denpa -n denpa

前段 (リバースプロキシ) の後ろに置く

Section titled “前段 (リバースプロキシ) の後ろに置く”
  • 前段のアドレスを TRUSTED_PROXIES に書きます (CIDR のカンマ区切り)。無いと接続元がすべて前段になり、 TRUSTED_NETWORKS が誰にも当たりません。決め方は auth.md

  • Host をそのまま渡し、WebSocket を通します。 Host が書き換わると設定の保存などの POST が 403 Cross-site POST form submissions are forbidden で断られ、WebSocket が通らないとライブが 「繋がりませんでした」になります。Caddy・Traefik・Envoy (Gateway API) は何もしなくても満たします。 Nginx Proxy Manager は「Websockets Support」を入れます。nginx は自分で書きます:

    location / {
    proxy_pass http://<denpa>:3000;
    proxy_set_header Host $host;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    proxy_buffering off; # SSE とライブを溜めずに流す
    }
  • /denpa のような接頭辞の下にも置けます (Home Assistant の Ingress など)。接頭辞は denpa に教えません。 OIDC に渡す絶対 URL にだけ、前段が付ける X-Forwarded-Prefix (Home Assistant は X-Ingress-Path) を 頭に付けます (paths.ts の publicBase)