テレビ録画サーバ denpa を立てる
README の手順の細かいところ。用意するもの、入れ方 (1行・Compose・1コンテナ・Helm)、誰を通すか、前段 (リバースプロキシ) の後ろに置くとき。 Mac と Windows の入れ方の中身は install-mac.md と install-windows.md に。使う前に 使ってよい範囲 を読んでください。
用意するもの
Section titled “用意するもの”チューナー・カードリーダー・OS の一覧と機材ごとのページは tuners.md に。
- イメージは amd64 と arm64 を同じタグにまとめてあり、自分のアーキテクチャのものが降ってきます
- Intel の GPU —
/dev/driが見えれば起動時に見つけて GPU でエンコードします。compose.prod.yml では渡す行をコメントにしてあるので、compose.override.ymlで渡します (Helm は既定で渡す)。GPU を使えるのは amd64 だけです (encode.md)
1行で入れる
Section titled “1行で入れる”イメージは公開してあるので、clone は要りません。 立ち上がるとブラウザが開きます。
curl -fsSL https://raw.githubusercontent.com/danything/denpa/main/install.sh | bashirm 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 の頭)
Docker Compose を手で置く
Section titled “Docker Compose を手で置く”Linux ならこれだけです (エージェントは tuner-agent として一緒に立つ)。
mkdir denpa && cd denpacurl -Lo compose.yml https://raw.githubusercontent.com/danything/denpa/main/compose.prod.ymldocker compose up -d1つのコンテナで (denpa-aio)
Section titled “1つのコンテナで (denpa-aio)”本体とエージェントを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 (Kubernetes)
Section titled “Helm (Kubernetes)”# 本体 + チューナーエージェント (同じクラスタに置く)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 のコメントにあります。
イメージのタグ
Section titled “イメージのタグ”latest はリリースのたびに新しくなります。版を固定するなら 1.20.0 のように書きます
(architecture.md)。
設定するまで全部断ります。compose の TRUSTED_NETWORKS の初期値は家の中 (私設網) で、ここからはログインなしで通ります。
画面をログインで守るなら OIDC の3つを渡します (リダイレクト URI は https://<denpa>/login/callback)。
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 でも https で開く
Section titled “LAN でも https で開く”持っているドメインの名前を LAN の中のアドレスに向ければ、公開しないまま本物の証明書が
使えます (DNS-01 なら外から繋がる必要が無い。.arpa のような内側だけの名前は ACME で
取れない)。ホーム画面に置けるのも全画面にできるのも https のページだけなので、PWA にも要ります。
外向きと LAN 用の2つの名前で出すなら、ホーム画面の名前を分けられます (watch.md)。
うまくいかないとき
Section titled “うまくいかないとき”立てたあとの手順は 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# Kuberneteskubectl 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)