alchemistarkの日記

やったことのメモ

TrueNAS srcdsの更新検知

前回。
alchemistark.hatenablog.jp

まーた更新で再起動待ちになってるのに気付かず1週間ぐらいサーバー止まってましたね

やはりマニフェスト削除しか無い模様。

では参ります。頼むぞ先生。

#!/usr/bin/env bash

FILE1="/mnt/app/srcds/tf-dedicated-ar/steamapps/appmanifest_232250.acf"
FILE2="/mnt/app/srcds/tf-dedicated-mge/steamapps/appmanifest_232250.acf"
KEYWORD='"UpdateResult"		"0"'

if grep -q "$KEYWORD" "$FILE1" && grep -q "$KEYWORD" "$FILE2"; then
    exit 0
else
    exit 1
fi

更新がある時はappmanifest_232250.acf内のUpdateResultが6とかになってるので
0以外を検知したら次に行くタスクを作成する。
ウチは軍拡とMGE鯖が動いてるので2箇所チェック。
適時自分のマウント先に変更を。

#!/usr/bin/env bash

FILE1="/mnt/app/srcds/tf-dedicated-ar/steamapps/appmanifest_232250.acf"
FILE2="/mnt/app/srcds/tf-dedicated-mge/steamapps/appmanifest_232250.acf"

rm $FILE1 $FILE2

doas docker restart $(doas docker ps -q --filter label=com.docker.compose.project=ix-tf2-srcds)

更新が確認できたらズバっと削除。
ほんで最後はコンテナを再起動。
ix-tf2-srcdsは自分の環境のスタック名に書き換えておいてください。
また、doasで昇格が必要なので忘れないように。

alchemistark.hatenablog.jp

でですね。

自分が前にdoasで昇格してdockerコマンド叩いてるのすっかり忘れてましてね。

2日ほどかけて他の方法探してたんですよ。アホなので。
REST API → 廃止
Websocket → 認証とコマンドを同時に送ると認証完了前にコマンドが受理されてエラーになる
middlewared.sock → 接続はできたがメッセージがうまく送れなくて断念

んで最終的にpythonスクリプトでwebsocket叩くタスク作りましてね。
動いたー!やったー!記事書こー!!ってなったとこで自分のdoas記事見ましてね。
アホなんですよ…この子…

では供養します。先生ほんま長時間ありがとうございました。

#!/usr/bin/env bash

# --- Python が無ければインストール ---
doas apk update
doas apk add --no-cache python3 py3-pip

# --- 仮想環境を作成(毎回上書き) ---
doas python3 -m venv /tmp/pyenv
. /tmp/pyenv/bin/activate

# --- WebSocket ライブラリをインストール ---
doas pip install --no-cache-dir websockets

# --- Python スクリプトを作成 ---
cat > /tmp/truenas_restart.py << 'EOF'
import asyncio
import websockets
import json

HOST = "hostname"
PORT = 80          #WebUIのポートを変更している場合は合わせる
APP = "tf2-srcds"          #APP名なので注意
USER = "user"          # ←必要に応じて変更
PASS = "pass"    # ←必要に応じて変更

async def main():
    uri = f"ws://{HOST}:{PORT}/api/current"
    print(f"Connecting to {uri}")

    async with websockets.connect(uri) as ws:
        # --- LOGIN ---
        login_msg = {
            "jsonrpc": "2.0",
            "id": 1,
            "method": "auth.login",
            "params": [USER, PASS]
        }
        await ws.send(json.dumps(login_msg))
        print("Sent login:", login_msg)
        print("Login response:", await ws.recv())

        # --- STOP ---
        stop_msg = {
            "jsonrpc": "2.0",
            "id": 2,
            "method": "app.stop",
            "params": [APP]
        }
        await ws.send(json.dumps(stop_msg))
        print("Sent stop:", stop_msg)
        print("Stop response:", await ws.recv())

        # --- WAIT ---
        print("Waiting 3 seconds before start…")
        await asyncio.sleep(3)

        # --- START ---
        start_msg = {
            "jsonrpc": "2.0",
            "id": 3,
            "method": "app.start",
            "params": [APP]
        }
        await ws.send(json.dumps(start_msg))
        print("Sent start:", start_msg)
        print("Start response:", await ws.recv())

asyncio.run(main())
EOF

# --- Python スクリプト実行 ---
python3 /tmp/truenas_restart.py

apkにはdoasが必要、他にも念の為適当にdoasを付加してます。
doas付与した時点で気付けよなぁ……

Homerのページアイコンについて

ダッシュボードにHomerを使用しているのだが
androidChromeで「ホーム画面に追加」を使用しショートカットを作成すると
何故かHomerのアイコンでタイトルもHomerになってしまう。
ページのタイトルはもちろん設定してあり、favicon.icoも置いてあるに関わらず

どこで設定すんねんと適当にファイル開いてたら発見。
manifest.jsonの中身適当に編集しておいてください。ちゃんと直りました。

TrueNAS 25.10.1におけるDNS競合問題について

しょーもない理由で安定版の25.04.2.6から25.10.1へVerUPしました。

そしたらAdGuard HomeのDNSサーバーが死にました。なんでさ。

Copilot先生と長話してどうにかなったのでまとめます。

大本の原因は25.10.1でIncusというものが導入されたこと

へーそうなの(無知
仮想化関係らしい*1。元々VM機能使ってなかったのでそこはどうでもいいのだが
仮想環境内用にDNSサーバー建てているらしい。
それでAdGuardのDNSとポートの競合、死亡。 君弱くない?

一応既知の問題として上がっていて、将来的にコンテナに個別のIP割り振って動作させたりとか構想がある らしい。よくわかってない。
とりあえず現状は対策されておらず、こちらで処置する必要アリ。

先生に話聞きながらIncusの停止やdnsmasqの停止ですったもんだしたが、どうでもいいので省略。

▼クリックで表示

まず、ポート53使ってるのはなんぞや
→dnsmasqです
dnsmasqを呼び出してるのは?
Incusです
Incusって止めちゃって大丈夫?
→(Copilot先生曰く)VM使ってないなら大丈夫では?
じゃあIncus止めますね
→ポート解放されてないよ
dnsmasqが遺児プロセス化したのでkill
→ようやくポートが解放された

まず、dnsmasqが10.179~とか思いっきりプライベートIPでListenしてるのに
何故AdGuardのListenが失敗するのか?まで考えたのだが
単純に0.0.0.0(全てのIP)でListenしようとしている為だった

これを実IPに設定できればわざわざIncus殺さなくて済むのでは?

ではAdGuardで待ち受けIPを指定できるのかというとできます
ただし設定ファイルの直接編集のみです。

/opt/adguardhome/conf/AdGuardHome.yaml

dns:
  bind_hosts:
    - 0.0.0.0


ホストから
/mnt/.ix-apps/app_mounts/adguard-home/config/AdGuardHome.yaml
でもいいぞ(ボソリ

複数IPの指定可能、IPv6の指定可能
ただし0.0.0.0または::を指定した場合、IPv4IPv6全てが設定されてしまう。
::だけ設定しても全てのIPv4アドレスまでListenされる、0.0.0.0も同様IPv6全てListen
( ::は'::'としないとAdGuardが起動しなくなる。ホストから設定ファイルを直さないといけなくなる*2 )
IPv6でリンクローカルアドレスを設定する場合はinf名を付ける*3
ex: fe80::abcd:cafe:1234:5678%eth0

確認は

ss -tulnp | grep :53

で。

これでとりあえずIncusを残したままListenまではいけたので、様子見とします。


追記

appのVerUPを実施すると設定ファイルが初期化されるのか起動に失敗してロールバックする。ばかやろう!
後で一旦ホストネットワークを解除して試してみます

DNSポートを変更し、アップデート実行後戻そうとしたらエラー
設定ファイルの中身は編集したまま
でもDNSポート競合でダメ なんでよ

appをロールバックしてもダメになってしまった
だがapp設定ではDNSポート変えてるのにListenが53のままという現象が起きてる
もうdocker-compose化するしかないか

app設定でポートを53に設定しようとすると0.0.0.0:53のListen状態を確認しようとする?*4
一旦ポートを変更したら二度と戻せないかもしれない。
だがapp設定でポートをどこにしようともAdGuardHome.yaml内の待ち受けポートは変更されない*5ので
app設定は適当なポート番号にしておいて、AdGuardHome.yamlでは(0.0.0.0以外のIPを指定し)53にしておけば起動できる。なんだそれ。

……
そもそもapp設定でHost IPsを指定したら行けたわ。何やってんだ。

*1:LXDからIncusへ変更されたらしい。で、LXDってナニ?

*2:1敗

*3:1敗

*4:appの再起動すらできない

*5:ただし、AdGuardHome.yamlを手動変更した後の話なので、AdGuardHome.yamlを全く触っていない状態だとどうなるかは不明

TrueNAS App表示が消えた

App一覧がまっさらになってワイ顔面蒼白

ただバックグラウンドで全部動いてるっぽくて、TrueNASのGUIがコンテナを認識できなくなった?っぽい。
appのプールを外して再接続してもダメで、ダメ元でTrueNASをアーリーアクセスにVerUPしてみたがダメ、
その後もう一度プールの再接続したら復旧した。
つまり何で戻ったかよくわからない…
マジでヒヤっとしたのでやめてほしい

SourcePawn開発環境

知らない間に出てたらしい。

github.com


もうSourcePawn開発なんてやってないんだけど、たまに環境に合わせて修正が必要になるので
環境だけは欲しいんだよね

コンパイラの大幅な変更により、BasicPawnはSourcePawnコンパイラの新しいバージョンと互換性がなくなりました。この問題を修正するまで、上記のバージョンはBasicPawnでは動作しません。サポートされている最新のコンパイラは、 SourceMod 1.11-git67241.11-git6724からダウンロードできます。

ワイの知らない間に生まれて知らない間に終わっていた
まぁ古いプラグインの修正とコンパイルができればいいんだけど…

VSCodeでSourcePawnあったっけな
あるならそっちのが話早いか…?

marketplace.visualstudio.com

あるっぺえな。そりゃそうか。

知らない間にSourcePawnの新構文とかAMXX*1とか出現していて何だそれってなってる

github.com

まだある 使いやすいのどれだろ

*1:HL1用のプラグインらしい。むしろ古い話だった

ひかり電話との格闘の結果

完全に解決してるわけではないのだがまとめる。

alchemistark.hatenablog.jp

雑多に書いてるがこれの結論だけ抜き出した話になる。


HGW側の設定は先人に倣いIDを内線番号と同じにしておく。*1
パスワードも事前に設定しておく。ひかり電話のテンプレートを使用する場合は自動で入力されるので初期値のままでも良い。

AGEphoneの設定は簡単設定だけで問題ない。
テンプレートも標準のSIPアカウントでもひかり電話(西日本)でもいける。*2

もし宅内でHGWと端末が別NWに属する場合、静的ルーティング設定が必要。
IPoEを別ルーターで接続している場合はそうなってる場合があるんじゃないかな。ウチだけか。

TrueNASでWG-Easyを使ってる場合
WG-EasyのPostUpを使用せず、TrueNASのInit/Shutdown ScriptsでNAT設定を入れること。

TrueNASはnft、WG-Easyはiptables-legacyを使用しているので
nftとiptables-legacyのルールが混在することになる
これでなんか動作が不安定になってるっぽい。
WGだけの使用では問題にならないが、ひかり電話で使用すると何故か片通話になったりする。ならなかったりもする。
なので対処療法的にiptables-legacyを使用しない運用にしている。

*1:0003→3

*2:ただしひかり電話テンプレートを使用する場合は未使用の内線設定を準備する必要がある。削除を押すと初期化されるのでそれでも良い。