1 台で動かして、
配信して、見る。
ソースから SENCA をビルドして 1 台のノードを起動し、RTMP で送った映像を HLS で見るまでの流れです。コマンドは Linux x86_64(Ubuntu 26.04)で確かめています。詳しい手順は クイックスタート をご覧ください。
ソースからビルド
Linux(x86_64)で動きます。Ubuntu 26.04 で動作を確かめています。変換用の別プロセスの権限を絞るために、Linux の seccomp と Landlock を使います。
手順を読む →
Docker・compose
docker compose up -d --build で、1 台のノードが起動します。コンテナは root 以外のユーザーで動き、ルートのファイルシステムは読み取り専用、権限の昇格も禁止(no-new-privileges)しています。GPU をコンテナに渡す例も compose.yaml にあります。
手順を読む →
クラスター
同じクラスターシークレットと、ほかのノードの一覧(peers)を書いた設定ファイルを、各ノードに渡して起動します。投票に加わるノードは 1〜7 台です。ノード間の mTLS に使う証明書の作り方も、ドキュメントで説明しています。
手順を読む →
1 台で動かす手順
6 つの手順で、最初の配信まで。
- 1
ビルドする
ソースからノード本体と変換用のプログラムを作ります。Rust 1.90 以上と C のリンカーが必要です。できた 2 つの実行ファイルは同じ場所に置いてください。キャプチャ機器を使うときは、-p senca-capture も加えます。
git clone https://github.com/kobesoft-labs/senca.git && cd senca cargo build --release -p senca-node -p senca-codec-worker - 2
ノードを起動する
サーバーとして動かします。設定や録画を置く --data-dir は必ず指定してください。外から見たホスト名やポートが手元と違うときは、--public-http-url と --public-rtmp-url で合わせます。最後の curl で、受け付けの準備ができたことを確かめます。
./target/release/senca-node --data-dir ./data \ --http 127.0.0.1:8080 --rtmp 127.0.0.1:1935 \ --console-dir ./apps/console curl -s http://127.0.0.1:8080/readyz # ready - 3
管理者トークンを取り出す
API を使うための鍵を用意します。初めて起動したときに、強い権限を持つトークンがファイルに書き出されます。運用では用途ごとに権限を絞ったトークンを作り、このファイルは安全な場所へ移すか削除してください。
TOKEN=$(cat ./data/control/bootstrap-admin-token) - 4
ストリームを作る
配信を受ける枠を作ります。応答に含まれる stream_key は、作成したときと再発行したときにしか返りません。必ず控えてください。
curl -s -X POST http://127.0.0.1:8080/api/v1/streams \ -H "Authorization: Bearer $TOKEN" -H 'Content-Type: application/json' \ -d '{"name":"demo"}' # 応答の id と ingest.stream_key を控える SID=60dd5cca...; KEY=sk_... - 5
配信する
映像を送ります。OBS では[設定]→[配信]で、サービスを「カスタム」、サーバーを rtmp://127.0.0.1:1935/live、ストリームキーを控えた sk_... にします。キーフレームの間隔は 2 秒以下にしてください。右の例は、FFmpeg でテスト映像を送るコマンドです。
ffmpeg -re -f lavfi -i testsrc2=size=1280x720:rate=30 \ -f lavfi -i sine=frequency=440:sample_rate=48000 \ -c:v libx264 -preset veryfast -tune zerolatency -g 60 -pix_fmt yuv420p \ -c:a aac -b:a 128k -f flv "rtmp://127.0.0.1:1935/live/$KEY" - 6
再生 URL を作って見る
届いた映像を確かめます。ライブの再生には署名付きの URL が必要で、既定の有効期間は 300 秒です。ブラウザーでは、hls.js などの HLS プレイヤーで再生できます。
curl -s -X POST -H "Authorization: Bearer $TOKEN" \ http://127.0.0.1:8080/api/v1/streams/$SID/playback-url ffplay "http://127.0.0.1:8080/s/.../index.m3u8"
管理画面は http://127.0.0.1:8080/console/ です(API トークンでログインします)。管理画面のプレイヤーが再生できるのは fMP4 の HLS と WHEP だけなので、既定の TS 形式のストリームは管理画面では再生できません。
Docker
コンテナで動かす。
docker compose up -d --build
docker compose exec senca cat /var/lib/senca/control/bootstrap-admin-token
# 外から使うとき(例)
SENCA_PUBLIC_HTTP=https://media.example.com \
SENCA_PUBLIC_IP=203.0.113.10 docker compose up -d - ・使うポートは、管理 API・HLS・管理画面が 8080/tcp、RTMP が 1935/tcp、SRT が 9000/udp、WebRTC が 8443/udp です。
- ・イメージは Ubuntu 26.04 をもとにしています。ロイヤリティフリーのコーデックと、GPU 用のライブラリを含みます。
- ・WebRTC で相手に知らせる IP アドレスは SENCA_PUBLIC_IP で指定します(既定は 127.0.0.1)。
- ・配布するイメージは、コミット済みのソースから作ってください(git archive HEAD | docker build -t senca/node:local -)。
コーデックのライブラリ(任意)
変換を使うときに入れておくもの。
これらが無くてもノードは動き、受け取った映像をそのまま配信・録画できます。ただし、変換・静止画・サムネイルの要求には 503 を返します。H.264・H.265 の変換には、GPU とメーカーのドライバーが必要です。
| ライブラリ | 用途 | Ubuntu 26.04 のパッケージ |
|---|---|---|
| libdav1d.so.7 | AV1 のデコード | libdav1d7 |
| libSvtAv1Enc.so.2 | AV1 のエンコード | libsvtav1enc2 |
| libvpx.so.12 | VP8・VP9(libvpx 1.16 の ABI) | libvpx12 |
| libopus.so.0 | Opus | libopus0 |
- 最初の管理者トークン(bootstrap-admin-token)を安全な場所へ移し、用途ごとに権限を絞ったトークンを使う
- リバースプロキシの後ろやコンテナの外から使う場合は、--public-*-url を外から見た URL に合わせる
- HTTPS・RTMPS を有効にする(--tls-cert・--tls-key)か、手前のリバースプロキシで TLS を終端する
- 社内の機器へつなぐときは、--egress-allow で接続を許可する範囲を決める
- データディレクトリは専用のユーザーで運用し、chmod 700 にする(バックアップも同じように守る)
- クラスターでは、ノード間の通信を mTLS にし、クラスターシークレットには推測できない値を使う
- 再生 URL の有効期間は短くし、必要になるたびに発行する