ProxmoxVEのLXC上に録画環境を構築する

なにこれ

最近録画環境を建てる機会が何度かあったので,その時の四苦八苦をメモした.

サマリ

conf見ての通りで非特権で立てる.
Mirakurunは直接建てる,EPGStationはdocker-composeで動かしてる.
USBやPCIeのパススルーが面倒なだけ.基本的にドライバはホスト側(便宜上,以降は母艦側と書く)に入れてあればOK.
あと,udev周りよく分かってなかったので,これを機に勉強した.

wiki.archlinux.jp

root@rec:~# uname -a
Linux rec 6.5.11-8-pve #1 SMP PREEMPT_DYNAMIC PMX 6.5.11-8 (2024-01-30T12:27Z) x86_64 x86_64 x86_64 GNU/Linux

環境(PLEX PX4の場合)

パススルーでusbデバイスの適用時には対象をディレクトリではなく,明示的に指定してファイルとして読み込まることで上手く動作する場合がある.
変更後はLXCを再起動すると読み込む.

cat /etc/udev/rules.d/99-px4video.rules
KERNEL=="px4video*", GROUP="video", MODE="0666"
SUBSYSTEM=="usb", ATTRS{idVendor}=="08e6", ATTRS{idProduct}=="3437", GROUP="video", MODE="0666"

以下は追記を抜粋

cat /etc/pve/lxc/XXX.conf
unprivileged: 1
lxc.cgroup.devices.allow: c 240:* rwm
lxc.cgroup.devices.allow: c 189:* rwm
#lxc.mount.entry: /dev/bus/usb/001 dev/bus/usb/001 none bind,create=dir,mode=0666
lxc.mount.entry: /dev/bus/usb/001/003 dev/bus/usb/001/003 none bind,create=file,mode=0666
lxc.mount.entry: /dev/px4video0 dev/px4video0 none bind,optional,create=file
lxc.mount.entry: /dev/px4video1 dev/px4video1 none bind,optional,create=file
lxc.mount.entry: /dev/px4video2 dev/px4video2 none bind,optional,create=file
lxc.mount.entry: /dev/px4video3 dev/px4video3 none bind,optional,create=file

環境(MyGica S270の場合)

cat /etc/udev/rules.d/99-s270video.rules
# MyGica S270
SUBSYSTEM=="dvb", ATTRS{idVendor}=="187f", ATTRS{idProduct}=="0600", GROUP="video", MODE="0666"
# REALTECK_reader
SUBSYSTEM=="usb", ATTRS{idVendor}=="0bda", ATTRS{idProduct}=="0169", GROUP="video", MODE="0666"
cat /etc/pve/lxc/XXX.conf
#lxc.mount.entry%3A /dev/dvb/adapter0/frontend0 dev/dvb/adapter0/frontend0 none bind,create=file,mode=0666
#lxc.mount.entry%3A /dev/dvb/adapter0/demux0 dev/dvb/adapter0/demux0 none bind,create=file,mode=0666
#lxc.mount.entry%3A /dev/dvb/adapter0/dvr0 dev/dvb/adapter0/dvr0 none bind,create=file,mode=0666
unprivileged: 1
lxc.cgroup.devices.allow: c 189:* rwm
lxc.cgroup.devices.allow: c 212:* rwm
lxc.mount.entry: /dev/bus/usb/001 dev/bus/usb/001 none bind,create=dir,mode=0666
lxc.mount.entry: /dev/dvb dev/dvb none bind,create=dir,mode=0666

CT周りの話

  • lxc.mount.entry の書き方について
    • LXCでのマウント先指定では dev/bus/usb/001 のようにする.先頭に / は不要
    • ど~しても読み込まない場合は create=dir ではなく create=file でデバイスファイルを指定する.
  • CTID.conf 変更後に読み込ませるには再起動が必要

Mirakurun チューナーオプションについて

MyGica S270のオプション忘れそうなのでここにも書いておく.

dvbv5-zap -a 0 -c /usr/local/dvbconf/conf/dvbv5_channels_isdbt.conf -r -P <channel> -o -

いい感じのsystemdについて

どちらの環境でも使ってる.
up -d だとダメ.up まででよい.-d オプションは不要.
あとは journalctl で良しなに動作を見ておく.

vim /etc/systemd/system/epgstation.service
[Unit]
Description=EPGStation with docker-compose
After=network.target

[Service]
Type=simple
User=XXXXXXXXXXXXXXXXXXXX
WorkingDirectory=/var/lib/docker-mirakurun-epgstation
ExecStartPre=-/usr/bin/docker compose down --volumes
ExecStart=/usr/bin/docker compose up
ExecStop=/usr/bin/docker compose down
Restart=always

[Install]
WantedBy=multi-user.target
 curl -X PUT "http://localhost:40772/api/config/channels/scan?type=GR&setDisabledOnAdd=false&refresh=true"

今後

mirac というMirakurun相当の機能を持つRust製ソフトがあるっぽい.

github.com

置き換えできるか試す.もしかすると全部docker-composeに詰め込めるかも?

LXCへのNFSマウント周りについても書く予定.非特権では直接マウントできないので,母艦にマウントしたものをパススルーすることで実現可能.

GROWIをProxmoxのLXC上に建てる

メモ書き

なるべく楽して建てる為にdocker-conmpseを使うが,LXC上でdocker-compose使った際にelasticsearchだけ起動に失敗する.
恐らくnestingを有効化するだけではダメ.カーネルパラメータの調査が必要だけど,取り急ぎ動作するものを建てたかったのでESだけ動いてるLXCを別で建ててそっちに繋ぐこと一旦解消させた.

今後docker-conmpseで起動した環境のESに切り替えたくなったらGROWIの機能で移せる.

Nature Remoとsesame5を連携させてみる

tldr:

常時起動させたスマホsesameを常駐させる事でインターネット越しでも通知が届くようになる。

Wi-FiモジュールのPush通知の代替として使う。

外で開閉をコントロールしたい場合はNature アプリから操作する。

ーーー

 

Sesame Wi-Fiモジュールの販売が無い状態が続く中でのプレスリリースだったので大変に助かってる。

 

https://nature.global/press/release/17737/

 

https://jp.candyhouse.co/blogs/news-1/nature-remo%E3%81%8Csesame-5-5pro%E3%81%AB%E5%AF%BE%E5%BF%9C%E3%81%AE%E3%81%8A%E7%9F%A5%E3%82%89%E3%81%9B%E2%9C%A8%F0%9F%8C%B8

 

連携方法はこちら(公式)

https://nature.global/blog/17660/

 

ただ、各社の公式で書いてる内容だけだと不明点があったので触った。主に通知周りについて。

2023-12-31時点の内容なので、今後のアプデで変わるかも。

 

結論としては連携によってインターネット越しでの開閉できるが Sesame Wi-Fiモジュールの完全な代替にはならなかった。

 

具体的にはNature remoから開閉しても Sesame のアプリから通知がある訳ではない。

その為家族が手動で開閉したり、Sesame touchを利用してもスマホへは通知されない。

同様にNature Remoから操作しても通知されない。

誰かしらのスマホSesame本体にBluetoothで繋いだ時にのみログとして出てくる。*1

 

遠方にいる家族の鍵開閉をなるべくリアルタイムに通知して欲しかったので、個人的には残念。

Nature側からSesameのエンドポイントに語り掛けて、Sesameアプリへ通知を飛ばせるような改修をしてもらえたらとても良いのだけれど、出来ないかなぁ…。

*1:Bluetoothの表記で出る

おひとりさまMastodonをアプデする (v4.2.0)

これの続き。
r-pechi.hatenablog.com

変更点

  • バージョンを v4.1.5 から v4.2.0 に上げた
  • CloudFlare ZeroTrust使った

くらい。以下に詳細を書いていく

バージョンを v4.1.5 から v4.2.0 に上げた

これは単純にバーションアップしただけ。アセットの再作成に失敗しまくって困った。

github.com

たぶんこれで詰まってた,あとは割り当てるコアが少なかったので1から4に増やした。*1

Release v4.2.0 · mastodon/mastodon · GitHub

serviceのコピーが必要だった。これ。あと他の変更点も読んでおこう。
cp /home/mastodon/live/dist/mastodon-*.service /etc/systemd/system/

CloudFlare ZeroTrustを使った

マニュアルはこれ。

developers.cloudflare.com

ポート開放をしないで面出ししたかったので使ってみた。今回初
Cloudflaredが良しなにしてくれる。ログ出力が面白いので一見の価値がある。

証明書の更新は誰がやるんだ?っていう辺りが分かってないので調査する。

監視追加

そういえばやった。prometheusとLokiいれただけ。雑にメトリックとログ監視設定増やしておこうと思う。

困りどころ解消コマンド

基本的にログを追いかければ何とかなる。
nginxとか,postgresqlは割と見た気がする。
外部からのアクセスができるまでの間の原因切り分けするのに手こずるので,nginxとcloudflaredはだしっぱがいいかも。
先にLoki仕込んで追えた方が幸せか??

  • journalctl -f -u mastodon*.service
  • journalctl -f -u cloudflared.service

## あとやること - Admin周りの操作やパラメータの調整 https://docs.joinmastodon.org/admin/tootctl/ https://docs.joinmastodon.org/admin/config/

*1:アセット作成時だけ必要なので,済んだら1に戻している

おひとりさまMastodonを建てる

なにこれ

昨今の Twitter がアレなので自前でインスタンスを建てた。
まだ繋ぎ方やパラメータのチューニング中なので非公開だが,手順理解の為に記録として。

構成情報

Proxmox 8.0.3 上に LXC で Ubuntu22.04 を用意
CPU: 1Core
RAM: 512MiB (+SWAP 4GiB)
Disk: 100GiB
Mastodon Version: v4.1.4

$ uname -a
Linux mstdn 6.2.16-3-pve #1 SMP PREEMPT_DYNAMIC PVE 6.2.16-3 (2023-06-17T05:58Z) x86_64 x86_64 x86_64 GNU/Linux


メモリはこんなに切り詰める必要はないはず。最小構成でどこまで小さく出来るのかを見てみたかった。
512Miだと常時80%前後を推移しているので1.5Giあれば足りた。*1勿論もっと在ってもいい。

Docker 使うか K8s 上にデプロイするかでも悩んだけど,極論 PostgreSQL と Redis だけ外出ししてしまえれば何でもいいのと構成理解の為だったのもあり一先ず全部ひとまとめにしている。 デバッグは Proxmox のスナップショット,運用時は雑に LXC のバックアップ機能を取ればある程度可用性は保てそう。

セットアップ手順

基本的に公式の順序でやった。
docs.joinmastodon.org

1か所だけ手順から逸れた。
PostgresのDBマイグレーションに失敗するのでこれを読み替えて実施する。
Postgres PG::Error: ERROR: new encoding (UTF8) is incompatible · GitHub
DB のエンコードを変えてから Setting up Mastodon を実行すればOK。

今後の方針

これのアップデートを掛けつつ作業を進める予定
r-pechi.hatenablog.com

  • エンドポイントを絞る
    • ポートを閉めたい。 Cloudflare Tuunnel とか使う予定
  • サービス正常性監視導入
    • 最低限 Prometheus は入れとく。 Splunk でログ解析してレスポンス監視する
    • メタデータはオブジェクトストレージに置く
  • DB 周りの分離とバックアップ
    • 基本的に dump は内部のオブジェクトストレージに置く
  • オブジェクトストレージは Ceph で HA して担保する

*1:分流10件くらいのTLで試したが問題なし

自宅基盤アップデート戦略

編集中…

方針

  • 人に迷惑かけない
  • セキュアにする
  • なるべくデータはロストさせない
  • 監視基盤は拡充させていく
  • 広げる程に増えるデータ量はオブジェクトストレージでカバーする
  • 新しいテクノロジーは積極的に取り入れてみる

 

具体的に

  • ルーティング周りは CloudFlare Tunnel に寄せてエンドポイントを極力晒さない
  • ログやメトリックは Prometheus Grafana と Splunk に食わせる
  • オブジェクトストレージはMinIOかCeph
  • 複数の基盤技術を用いる
  • Kubernetes と Proxmox VE

2023おうちIoT機器リスト

いまやるんならこれでしょ!というのを上げてく

基本的な方針として、Googleの製品とGoogle Homeをバンバン使う。

 

Google nest hub / Google nest mini

コントローラとして。画面のある方がHub。

画面が不要ならMiniで済むが、タイマーの残り時間などが分かるし、雑にYouTube見れたり置き時計にもなるのでHubが好き。画面不要ならMiniでいい。

 

Google nest doorbell

ドアホンとして。課金したほうが良いが、しなくても3時間は通知が見れる。

 

Nature Remo

赤外線コントローラとして。

SwitchBotよりも初期設定が楽で操作がしやすく、またTypeBのデータロガーも買えば家の消費電力可視化まで可能。用途が広いのでこっち。湿度センサー付きにするかはお好み(あると除湿がしやすくなって便利)

 

Sesami 5 + タッチセンサー

ドアキーとして。

タッチセンサーは確実に買ったほうが良い