Linux(ヘッドレス版)
Linux 版の正式版はまだ公開していません。現在はベータ版 0.1.0-beta.1 を配布しています。ベータ版を配布している場合は、ベータ版の手順で導入できます。
正式版の公開後は、このページの手順で latest.json から配布物を取れます。それまでは、ベータ版の手順で beta.json から取ってください。
ヘッドレス版は、自分の画面を持たない Linux 向けの版です。設定と受信の確認は、すべてブラウザーから行います。ブラウザーで開くこの画面を、以下では web console と呼びます。
アンテナのそばに置いたままにする小型の機械に向いています。配布物を展開して起動するだけで動きます。動かし続ける方法と USB の権限は、このページの例を参考に、自分で設定します。
対応する環境
| 項目 | 条件 |
|---|---|
| 機種 | x86_64 と arm64(Raspberry Pi 4、Raspberry Pi 5 など) |
| OS | glibc 2.28 以降の Linux(Debian 10 以降、Ubuntu 20.04 以降、Raspberry Pi OS bullseye 以降の 64 ビット版、RHEL / Rocky / AlmaLinux 8 以降、Fedora、Arch など) |
| SDR | 導入にあるものと同じです |
glibc の版は、ldd --version の 1 行目で確かめられます。Alpine など、glibc の代わりに musl を使う環境では動きません。その場合は Docker で動かします。
ダウンロードと検証
配布物は、https://hwr.linux.moe/latest.json にある案内から取ります。次のコマンドは、この機械の機種に合う配布物の URL と SHA-256 を案内から取り出し、ダウンロードして照合します。照合に成功すると、ファイル名の後に OK と表示されます。
case "$(uname -m)" in
x86_64) key=headless-linux-x86_64 ;;
aarch64 | arm64) key=headless-linux-aarch64 ;;
*) key=; echo "対応していない機種です: $(uname -m)" >&2 ;;
esac
curl -fsSL https://hwr.linux.moe/latest.json -o latest.json &&
url=$(jq -er ".platforms[\"$key\"].url // error(\"この機種の配布物がありません: $key\")" latest.json) &&
curl -fsSLO "$url" &&
echo "$(jq -er ".platforms[\"$key\"].sha256" latest.json) $(basename "$url")" | sha256sum -c -
案内から値を取り出すのに jq を使います。jq が無いときは、ブラウザーで https://hwr.linux.moe/latest.json を開き、機種に合う項目(headless-linux-x86_64 か headless-linux-aarch64)の url と sha256 を写して使ってもかまいません。
署名も確かめる場合は(任意)、minisign を入れたうえで、続けて次のコマンドを実行します。公開鍵は、アプリの更新の検証に使うものと同じです。署名が正しければ、minisign は検証できたことを表示し、終了コード 0 で終わります。正しくなければ、エラーを表示し、0 以外の終了コードで終わります。
jq -er ".platforms[\"$key\"].signature" latest.json | base64 -d > "$(basename "$url").minisig"
minisign -V -P RWTiq+icfxoSinMNSd424nxAIOUhwanjUaN0FabWAJBDOqzZDMzQcG/L -m "$(basename "$url")" -x "$(basename "$url").minisig"
展開して起動する
配布物の中身は、hwr-receiverd の 1 ファイルだけです。前の手順で取ったファイルを展開して、そのまま起動します。
mkdir -p ~/hwr-receiver
tar -xzf "$(basename "$url")" -C ~/hwr-receiver
~/hwr-receiver/hwr-receiverd
$url は、前の手順のコマンドで決めた変数です。別の端末で続けるときは、tar -xzf hwr-receiverd_*_linux_$(uname -m).tar.gz -C ~/hwr-receiver のように、ファイル名を書いて展開します。
展開したフォルダに移っていれば、./hwr-receiverd だけで起動できます。引数を付けずに起動すると、127.0.0.1:35263 で待ち受けます。同じ機械のブラウザーで http://127.0.0.1:35263 を開くと、web console が出ます。別の端末から開く方法はブラウザーで開くにあります。止めるときは、起動した端末で Ctrl-C を押します。
設定と記録は ~/.local/share/hwr-receiver に置きます。環境変数 XDG_DATA_HOME を設定しているときは、$XDG_DATA_HOME/hwr-receiver に置きます。フォルダが無ければ、起動のときに作ります。
展開する場所は自由で、ここでは例として ~/hwr-receiver を使います。ただし、web console からの更新を使うなら、動かすユーザーがそのフォルダに書き込める必要があります。更新では、そのフォルダにあるバイナリを新しい版に入れ替えるからです。
待ち受けるホスト
既定では 127.0.0.1:35263 で待ち受けます。起動の引数に --host を付けると、IP アドレスやホスト名を変えられます。カンマ区切りで複数指定することもできます。展開したフォルダで、次のように起動します。
./hwr-receiverd --host 0.0.0.0
./hwr-receiverd --host 127.0.0.1,receiver.local --port 35263
0.0.0.0はすべての IPv4 インターフェース、::はすべての IPv6 インターフェースで待ち受けます。- ホスト名は、その機械自身のアドレスに名前解決できるものを指定します。起動時に解決し、その名前でのブラウザーアクセスも許可します。
0.0.0.0,127.0.0.1のように待ち受けが重なる場合は、同じアドレス族のワイルドカードにまとめます。- すべての待ち受け先を確保できない場合は起動せず、原因をログに出します。
引数は、起動のたびに付けます。付けずに起動すれば、127.0.0.1 だけで待ち受けます。tmux の中で動かすときも、起動のコマンドに付けます(動かし続ける)。ブラウザーを開く際は、待ち受け先の IP アドレスかホスト名を使ってください。
LAN へ待ち受けを広げると、到達できる端末からすべての操作を行えます。--auth でパスワードを掛けられますが、通信は暗号化されません。信頼できるネットワーク内で使ってください。リバースプロキシの名前だけを許可したい場合は、待ち受けを増やさずに --allow-hostを使います。
起動の引数
hwr-receiverd の引数は次のとおりです。
| 引数 | 内容 | 既定 |
|---|---|---|
--listen <アドレス:ポート> | 単一の IP アドレスとポートを指定する従来の形式です。--host、--port とは併用できません | 127.0.0.1:35263 |
--host <ホスト[,ホスト...]> | IP アドレスとホスト名をカンマ区切りで指定します。名前解決後に待ち受け、指定したホスト名でのアクセスも許可します | 127.0.0.1 |
--port <ポート> | --host に共通のポートです | 35263 |
--state-dir <パス> | 設定、ライセンス、自分用のプリセットを置くフォルダです。バイナリに入っている標準のプリセットも、起動のたびにこの下の bundled へ書き出します | $XDG_DATA_HOME/hwr-receiver。無ければ ~/.local/share/hwr-receiver |
--presets-dir <パス> | 標準のプリセットを、バイナリに入っているものの代わりに、このフォルダから読みます。開発用で、ふつうは指定しません | バイナリに入っているもの |
--allow-host <名前> | web console を開ける名前を足します。何度でも指定できます。使いどころはほかの名前で開くにあります | なし |
--no-self-update | web console からの更新を無効にします。「アップデート」の欄は、今の版と、更新の手順の案内だけになります | 有効 |
--auth <ユーザー名:パスワード> | web console に Basic 認証を掛けます。環境変数 HWR_WEB_AUTH でも渡せます。使い方はパスワードを掛けるにあります | 掛けない |
--state-dir の既定を決めるときは、XDG_DATA_HOME と HOME を、空でない絶対パスの場合だけ使います。どちらからも決められないとき(HOME の無い環境など)は、起動せずに終わります。その場合は --state-dir を指定してください。
パスワードを掛ける
--auth ユーザー名:パスワード を付けて起動すると、web console を開くときにブラウザーがユーザー名とパスワードを尋ねます。最初の : までがユーザー名で、残りがパスワードです。ユーザー名には : を使えません。ユーザー名とパスワードのどちらかが空のときは、起動せずに理由をログに出して終わります。
同じ値は、環境変数 HWR_WEB_AUTH でも渡せます。引数に書いた値は、同じ機械のほかのユーザーにも ps で見えます。見せたくないときは、環境変数で渡してください。引数と環境変数の両方があるときは、引数のほうを使います。
端末や tmux で起動するときは、次のように環境変数を付けて起動します。user:pass は、使うユーザー名とパスワードに置き換えます。
HWR_WEB_AUTH=user:pass ~/hwr-receiver/hwr-receiverd --host 0.0.0.0
コマンドの履歴に残したくないときは、read -rs HWR_WEB_AUTH && export HWR_WEB_AUTH で入力してから起動します。
Docker で動かすときは、値をファイルに置き、docker run に --env-file で渡します。
HWR_WEB_AUTH=user:pass
ファイルは自分だけが読めるようにします。
chmod 600 ~/hwr-auth.env
Basic 認証は、ユーザー名とパスワードを暗号化せずに送ります。LAN へ待ち受けを広げるときは、Tailscale か SSH のポート転送と組み合わせてください。
USB の設定
一般ユーザーの権限で SDR を開くには、USB の設定が要ります。次の 2 つのファイルを、自分で置きます。
SDR を読み書きできるようにする
/etc/udev/rules.d/60-hwr-receiver.rules に次の内容を置きます。対応する SDR を、plugdev グループから読み書きできるようにする規則です。
# Highway Radio Receiver が使う SDR を、plugdev グループから読み書きできるようにする
# RTL-SDR (RTL2832U)
SUBSYSTEM=="usb", ATTRS{idVendor}=="0bda", ATTRS{idProduct}=="2832", MODE="0660", GROUP="plugdev"
SUBSYSTEM=="usb", ATTRS{idVendor}=="0bda", ATTRS{idProduct}=="2838", MODE="0660", GROUP="plugdev"
# RTL2832U を載せた、ほかの製品(rtl-sdr-rs 0.4.2 が対応する USB ID)
# DigitalNow Quad DVB-T PCI-E card
SUBSYSTEM=="usb", ATTRS{idVendor}=="0413", ATTRS{idProduct}=="6680", MODE="0660", GROUP="plugdev"
# Leadtek WinFast DTV Dongle mini D
SUBSYSTEM=="usb", ATTRS{idVendor}=="0413", ATTRS{idProduct}=="6f0f", MODE="0660", GROUP="plugdev"
# Genius TVGo DVB-T03 USB dongle (Ver. B)
SUBSYSTEM=="usb", ATTRS{idVendor}=="0458", ATTRS{idProduct}=="707f", MODE="0660", GROUP="plugdev"
# Terratec Cinergy T Stick Black (rev 1)
SUBSYSTEM=="usb", ATTRS{idVendor}=="0ccd", ATTRS{idProduct}=="00a9", MODE="0660", GROUP="plugdev"
# Terratec NOXON DAB/DAB+ USB dongle (rev 1)
SUBSYSTEM=="usb", ATTRS{idVendor}=="0ccd", ATTRS{idProduct}=="00b3", MODE="0660", GROUP="plugdev"
# Terratec Deutschlandradio DAB Stick
SUBSYSTEM=="usb", ATTRS{idVendor}=="0ccd", ATTRS{idProduct}=="00b4", MODE="0660", GROUP="plugdev"
# Terratec NOXON DAB Stick - Radio Energy
SUBSYSTEM=="usb", ATTRS{idVendor}=="0ccd", ATTRS{idProduct}=="00b5", MODE="0660", GROUP="plugdev"
# Terratec Media Broadcast DAB Stick
SUBSYSTEM=="usb", ATTRS{idVendor}=="0ccd", ATTRS{idProduct}=="00b7", MODE="0660", GROUP="plugdev"
# Terratec BR DAB Stick
SUBSYSTEM=="usb", ATTRS{idVendor}=="0ccd", ATTRS{idProduct}=="00b8", MODE="0660", GROUP="plugdev"
# Terratec WDR DAB Stick
SUBSYSTEM=="usb", ATTRS{idVendor}=="0ccd", ATTRS{idProduct}=="00b9", MODE="0660", GROUP="plugdev"
# Terratec MuellerVerlag DAB Stick
SUBSYSTEM=="usb", ATTRS{idVendor}=="0ccd", ATTRS{idProduct}=="00c0", MODE="0660", GROUP="plugdev"
# Terratec Fraunhofer DAB Stick
SUBSYSTEM=="usb", ATTRS{idVendor}=="0ccd", ATTRS{idProduct}=="00c6", MODE="0660", GROUP="plugdev"
# Terratec Cinergy T Stick RC (Rev.3)
SUBSYSTEM=="usb", ATTRS{idVendor}=="0ccd", ATTRS{idProduct}=="00d3", MODE="0660", GROUP="plugdev"
# Terratec T Stick PLUS
SUBSYSTEM=="usb", ATTRS{idVendor}=="0ccd", ATTRS{idProduct}=="00d7", MODE="0660", GROUP="plugdev"
# Terratec NOXON DAB/DAB+ USB dongle (rev 2)
SUBSYSTEM=="usb", ATTRS{idVendor}=="0ccd", ATTRS{idProduct}=="00e0", MODE="0660", GROUP="plugdev"
# PixelView PV-DT235U(RN)
SUBSYSTEM=="usb", ATTRS{idVendor}=="1554", ATTRS{idProduct}=="5020", MODE="0660", GROUP="plugdev"
# Astrometa DVB-T/DVB-T2
SUBSYSTEM=="usb", ATTRS{idVendor}=="15f4", ATTRS{idProduct}=="0131", MODE="0660", GROUP="plugdev"
# HanfTek DAB+FM+DVB-T
SUBSYSTEM=="usb", ATTRS{idVendor}=="15f4", ATTRS{idProduct}=="0133", MODE="0660", GROUP="plugdev"
# Compro Videomate U620F
SUBSYSTEM=="usb", ATTRS{idVendor}=="185b", ATTRS{idProduct}=="0620", MODE="0660", GROUP="plugdev"
# Compro Videomate U650F
SUBSYSTEM=="usb", ATTRS{idVendor}=="185b", ATTRS{idProduct}=="0650", MODE="0660", GROUP="plugdev"
# Compro Videomate U680F
SUBSYSTEM=="usb", ATTRS{idVendor}=="185b", ATTRS{idProduct}=="0680", MODE="0660", GROUP="plugdev"
# GIGABYTE GT-U7300
SUBSYSTEM=="usb", ATTRS{idVendor}=="1b80", ATTRS{idProduct}=="d393", MODE="0660", GROUP="plugdev"
# DIKOM USB-DVBT HD
SUBSYSTEM=="usb", ATTRS{idVendor}=="1b80", ATTRS{idProduct}=="d394", MODE="0660", GROUP="plugdev"
# Peak 102569AGPK
SUBSYSTEM=="usb", ATTRS{idVendor}=="1b80", ATTRS{idProduct}=="d395", MODE="0660", GROUP="plugdev"
# KWorld KW-UB450-T USB DVB-T Pico TV
SUBSYSTEM=="usb", ATTRS{idVendor}=="1b80", ATTRS{idProduct}=="d397", MODE="0660", GROUP="plugdev"
# Zaapa ZT-MINDVBZP
SUBSYSTEM=="usb", ATTRS{idVendor}=="1b80", ATTRS{idProduct}=="d398", MODE="0660", GROUP="plugdev"
# SVEON STV20 DVB-T USB & FM
SUBSYSTEM=="usb", ATTRS{idVendor}=="1b80", ATTRS{idProduct}=="d39d", MODE="0660", GROUP="plugdev"
# Twintech UT-40
SUBSYSTEM=="usb", ATTRS{idVendor}=="1b80", ATTRS{idProduct}=="d3a4", MODE="0660", GROUP="plugdev"
# ASUS U3100MINI_PLUS_V2
SUBSYSTEM=="usb", ATTRS{idVendor}=="1b80", ATTRS{idProduct}=="d3a8", MODE="0660", GROUP="plugdev"
# SVEON STV27 DVB-T USB & FM
SUBSYSTEM=="usb", ATTRS{idVendor}=="1b80", ATTRS{idProduct}=="d3af", MODE="0660", GROUP="plugdev"
# SVEON STV21 DVB-T USB & FM
SUBSYSTEM=="usb", ATTRS{idVendor}=="1b80", ATTRS{idProduct}=="d3b0", MODE="0660", GROUP="plugdev"
# Dexatek DK DVB-T Dongle (Logilink VG0002A)
SUBSYSTEM=="usb", ATTRS{idVendor}=="1d19", ATTRS{idProduct}=="1101", MODE="0660", GROUP="plugdev"
# Dexatek DK DVB-T Dongle (MSI DigiVox mini II V3.0)
SUBSYSTEM=="usb", ATTRS{idVendor}=="1d19", ATTRS{idProduct}=="1102", MODE="0660", GROUP="plugdev"
# Dexatek Technology Ltd. DK 5217 DVB-T Dongle
SUBSYSTEM=="usb", ATTRS{idVendor}=="1d19", ATTRS{idProduct}=="1103", MODE="0660", GROUP="plugdev"
# MSI DigiVox Micro HD
SUBSYSTEM=="usb", ATTRS{idVendor}=="1d19", ATTRS{idProduct}=="1104", MODE="0660", GROUP="plugdev"
# Sweex DVB-T USB
SUBSYSTEM=="usb", ATTRS{idVendor}=="1f4d", ATTRS{idProduct}=="a803", MODE="0660", GROUP="plugdev"
# GTek T803
SUBSYSTEM=="usb", ATTRS{idVendor}=="1f4d", ATTRS{idProduct}=="b803", MODE="0660", GROUP="plugdev"
# Lifeview LV5TDeluxe
SUBSYSTEM=="usb", ATTRS{idVendor}=="1f4d", ATTRS{idProduct}=="c803", MODE="0660", GROUP="plugdev"
# MyGica TD312
SUBSYSTEM=="usb", ATTRS{idVendor}=="1f4d", ATTRS{idProduct}=="d286", MODE="0660", GROUP="plugdev"
# PROlectrix DV107669
SUBSYSTEM=="usb", ATTRS{idVendor}=="1f4d", ATTRS{idProduct}=="d803", MODE="0660", GROUP="plugdev"
# Airspy R2 / Mini
SUBSYSTEM=="usb", ATTRS{idVendor}=="1d50", ATTRS{idProduct}=="60a1", MODE="0660", GROUP="plugdev"
# HackRF One
SUBSYSTEM=="usb", ATTRS{idVendor}=="1d50", ATTRS{idProduct}=="6089", MODE="0660", GROUP="plugdev"
# HackRF Jawbreaker
SUBSYSTEM=="usb", ATTRS{idVendor}=="1d50", ATTRS{idProduct}=="604b", MODE="0660", GROUP="plugdev"
# rad1o
SUBSYSTEM=="usb", ATTRS{idVendor}=="1d50", ATTRS{idProduct}=="cc15", MODE="0660", GROUP="plugdev"
plugdev グループの無いディストリビューション(Fedora、Arch など)では、先にグループを作ります。
sudo groupadd --system plugdev
Highway Radio Receiver を動かすユーザーを、plugdev グループに入れます。グループの変更は、ログインし直すと効きます。
sudo usermod -aG plugdev <ユーザー>
規則は、次のコマンドを実行するか、SDR を挿し直すと効きます。
sudo udevadm control --reload-rules && sudo udevadm trigger
ディストリビューションの rtl-sdr や hackrf のパッケージが、同じような規則をすでに入れていることがあります。その規則で SDR を開けるなら、このファイルを置かなくてもかまいません。
画面のある機械に、その場でログインして使うだけなら、規則の GROUP="plugdev" の代わりに TAG+="uaccess" と書いてもかまいません。uaccess は、その機械の前でログインしているユーザーに、SDR を開く権限を渡す仕組みです。そのため、SSH のセッションから起動した場合や、ログインしていない間に動かす場合には効きません。
テレビ受信用のドライバを無効にする
RTL-SDR をテレビ受信用のドライバ(dvb_usb_rtl28xxu)がつかんでいると、Highway Radio Receiver から開けません。次のファイルを置くと、このドライバを読み込まなくなります。
blacklist dvb_usb_rtl28xxu
機械を再起動するか、次のコマンドを実行すると効きます。
sudo rmmod dvb_usb_rtl28xxu
Linux で SDR を使うための設定の詳しい解説は、次の文書にあります。
- RTL-SDR:RTL-SDR Quick Start Guide
- HackRF One:Installing HackRF Software
動かし続ける
ヘッドレス版は、起動した端末を閉じると止まります。SSH でつないで動かす場合など、ログアウトした後も動かし続けるには、tmux の中で起動するか、Docker で動かします。
tmux で動かす
tmux のセッションを作り、その中で起動します。
tmux new -s hwr
~/hwr-receiver/hwr-receiverd --host 0.0.0.0
Ctrl-b に続けて d を押すと、動かしたままセッションから離れられます。SSH を切っても動き続けます。もう一度つなぐときは、tmux attach -t hwr を実行します。止めるときは、セッションに戻って Ctrl-C を押します。
tmux では、機械を再起動した後に自動では起動しません。再起動の後も自動で起動させたいときは、Docker の --restart unless-stopped を使います。
動作の確認とログ
端末や tmux で起動したときは、ログはその端末に出ます。Docker で動かしたときは、次のコマンドで流れてくるログを見られます。
docker logs -f hwr-receiver
ブラウザーで開く
ヘッドレス版は、既定では 127.0.0.1:35263 だけで待ち受けます。そのため、ほかの機械のブラウザーからは、そのままでは届きません。別の端末から開くには、次のどちらかの方法を使います。
SSH のポート転送
手元の端末で次のコマンドを実行します。
ssh -L 35263:127.0.0.1:35263 <機械>
接続したまま、手元のブラウザーで http://127.0.0.1:35263 を開きます。
Tailscale
ヘッドレス版を動かす機械で次のコマンドを実行します。
tailscale serve --bg 35263
同じ tailnet に入っている端末のブラウザーで、https://<機械>.<tailnet>.ts.net を開きます。
届く範囲の管理
ヘッドレス版では、--auth でパスワードを掛けられます。それ以外の保護はなく、web console を開けた人は、すべての操作ができます。どの端末から届くようにするかは、利用者が管理してください。詳しくはブラウザーからの確認と操作にあります。
最初の設定
web console を開いたら、次の順に設定します。
- ライセンスを認証します。ヘッドレス版を動かす機械が、端末 1 台として数えられます。
- 最初の設定のとおりに、無線機とプリセットを選びます。
フォルダとファイルを選ぶダイアログは、web console では出ません。代わりに、ヘッドレス版を動かす機械の上のパスを入力します。記録の出力先の既定は <state-dir>/output(既定では ~/.local/share/hwr-receiver/output)です。別の場所に記録するときは、動かすユーザーが書き込めるフォルダを指定します。
更新
更新は、web console の設定画面にある「アップデート」の欄で行います。
- 「更新を確認」を押します。新しい版があれば、その版と変更点が表示されます。無ければ「最新の版です」と表示されます。
- 「更新して再起動」を押し、確認に答えます。
更新のあいだ、受信は止まります。新しい版を取り、署名を検証してからバイナリを入れ替え、同じ引数で起動し直します。そのため、端末で起動していても、tmux の中で動かしていても、新しい版で動き続けます。起動し直すと、web console の画面も自動で読み込み直されます。
ボタンを押すまで、更新の確認も、更新も行いません。
新しい tar.gz で置き換えて更新することもできます。動かすユーザーが書き込めないフォルダに置いた場合や、--no-self-update を付けて起動している場合は、この方法を使います。
- ダウンロードと検証と同じ手順で、新しい tar.gz を取ります。
- 動いているプロセスを
Ctrl-Cで止めます。 - 展開して起動すると同じ手順で、同じフォルダに展開して置き換えます。
- 前と同じ引数で起動します。
アンインストール
先に、web console の「ライセンス」欄で認証を解除します。解除しておくと、同じライセンスを別の機械で認証できます。
動いているプロセスを Ctrl-C で止めます(tmux で動かしているなら、セッションに戻って止めます)。止めたら、展開したフォルダと、設定と記録のフォルダを消します。
rm -rf ~/hwr-receiver ~/.local/share/hwr-receiver
--state-dir を指定していたなら、~/.local/share/hwr-receiver の代わりに、そのフォルダを消します。XDG_DATA_HOME を設定していたなら、~/.local/share/hwr-receiver の代わりに、$XDG_DATA_HOME/hwr-receiver を消します。記録の出力先を別の場所にしていたなら、そこに残った記録も、要らなければ消します。
最後に、USB の設定で自分で置いたファイルを消します。
sudo rm /etc/udev/rules.d/60-hwr-receiver.rules /etc/modprobe.d/hwr-receiver-blacklist.conf
Docker で動かす
Docker のイメージは配っていません。次の Dockerfile を使って、自分でビルドします。
# Highway Radio Receiver のヘッドレス版を動かすイメージ。配布はしていないので、自分でビルドする。
# docker build -t hwr-receiver packaging/docker
FROM debian:bookworm-slim
ARG HWR_BASE_URL=https://hwr.linux.moe
# 配布物の署名を確かめる minisign の公開鍵(アプリの更新と同じ鍵)
ARG HWR_MINISIGN_PUBKEY=RWTiq+icfxoSinMNSd424nxAIOUhwanjUaN0FabWAJBDOqzZDMzQcG/L
RUN apt-get update \
&& apt-get install -y --no-install-recommends ca-certificates curl jq minisign \
&& rm -rf /var/lib/apt/lists/*
# 公開のバイナリを取り、latest.json の SHA-256 と、minisign の署名を確かめてから置く
RUN set -eu; \
case "$(uname -m)" in \
x86_64) platform=headless-linux-x86_64 ;; \
aarch64) platform=headless-linux-aarch64 ;; \
*) echo "対応していない機種です: $(uname -m)" >&2; exit 1 ;; \
esac; \
curl -fsSL "$HWR_BASE_URL/latest.json" -o /tmp/latest.json; \
missing() { echo "配布先($HWR_BASE_URL)の案内に、$platform の配布物がありません。ヘッドレス版がまだ公開されていないか、この機種向けの配布がありません" >&2; exit 1; }; \
url=$(jq -er ".platforms[\"$platform\"].url" /tmp/latest.json) || missing; \
sha256=$(jq -er ".platforms[\"$platform\"].sha256" /tmp/latest.json) || missing; \
signature=$(jq -er ".platforms[\"$platform\"].signature" /tmp/latest.json) || missing; \
curl -fsSL "$url" -o /tmp/hwr.tar.gz; \
echo "$sha256 /tmp/hwr.tar.gz" | sha256sum -c -; \
printf "%s" "$signature" | base64 -d > /tmp/hwr.tar.gz.sig; \
minisign -Vq -P "$HWR_MINISIGN_PUBKEY" -m /tmp/hwr.tar.gz -x /tmp/hwr.tar.gz.sig; \
mkdir -p /opt/hwr-receiver; \
tar -xzf /tmp/hwr.tar.gz -C /opt/hwr-receiver hwr-receiverd; \
rm /tmp/latest.json /tmp/hwr.tar.gz /tmp/hwr.tar.gz.sig
VOLUME /var/lib/hwr-receiver
EXPOSE 35263
# コンテナの中では全アドレスで待ち受け、外への公開は docker run の -p 127.0.0.1:35263:35263 で絞る。
# 更新はイメージの作り直しで行うので、自己更新は切る。
ENTRYPOINT ["/opt/hwr-receiver/hwr-receiverd", "--listen", "0.0.0.0:35263", "--state-dir", "/var/lib/hwr-receiver", "--no-self-update"]
この内容を Dockerfile という名前で保存し、同じフォルダで次のコマンドを実行します。
docker build -t hwr-receiver .
起動は次のコマンドで行います。
docker run -d --name hwr-receiver --restart unless-stopped \
--device /dev/bus/usb \
-v /etc/machine-id:/etc/machine-id:ro \
-v hwr-data:/var/lib/hwr-receiver \
-p 127.0.0.1:35263:35263 \
hwr-receiver
| 指定 | 意味 |
|---|---|
--device /dev/bus/usb | SDR をコンテナに渡します |
-v /etc/machine-id:/etc/machine-id:ro | ライセンスが端末を見分けるのに使います。渡さないと、コンテナを作り直すたびに別の端末として数えられ、台数の上限に達します |
-v hwr-data:/var/lib/hwr-receiver | 設定、ライセンス、記録を、コンテナを作り直しても残します |
-p 127.0.0.1:35263:35263 | ホストの 127.0.0.1 にだけ出します。-p 35263:35263 と書くと、LAN の全体から届くようになります |
--restart unless-stopped | 止まったときと、機械を再起動した後に、自動で起動し直します。docker stop で止めたときは起動し直しません |
パスワードを掛けるときは、docker run に --env-file ~/hwr-auth.env を足します。記録の出力先の既定は、コンテナの中の /var/lib/hwr-receiver/output です。hwr-data のボリュームに残ります。
テレビ受信用のドライバの無効化は、ホストに置きます。ホストに次のファイルを作り、USB の設定と同じ方法で反映します。コンテナは root で動くので、udev の規則は要りません。
blacklist dvb_usb_rtl28xxu
Docker では、SDR の挿し直しと更新の手順が変わります。
- SDR の挿し直し:SDR を挿し直したら、
docker restart hwr-receiverでコンテナを再起動します。--device /dev/bus/usbが渡すのは、起動した時点のデバイスの並びだからです。 - 更新:web console に更新のボタンは出ません。
docker build --no-cache -t hwr-receiver .でイメージを作り直し、コンテナを作り直します。