前回。
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で昇格が必要なので忘れないように。
でですね。
自分が前に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付与した時点で気付けよなぁ……
