Repository navigation
2026.4.26 — VPS常駐運用の詰まり解消
バージョン体系について: 2026.4.26 から日付ベース (
YYYY.M.D) のCalVerに移行しました。npm semver の制約上、月・日の leading zero は付けません (例: 4月26日 →2026.4.26)。
🚀 リモートサーバー (Linux/systemd) 運用での詰まりポイントを一掃
VPS等で常駐させようとした初期ユーザーが踏んだ4つの落とし穴を全部潰しました。
🐛 Fixes
spawn claude ENOENT(systemd配下) — エンジン (Claude/Codex/Gemini) およびSlackトリアージのCLI起動を、起動時に純JSのPATH探索 (shared/resolveBin.ts) で絶対パス化するように変更。systemdの最小PATHでも動作。解決失敗時はインストールコマンド付きの親切なエラーを返す。- rootユーザーでClaude CLI拒否 —
shared/childEnv.tsで uid==0 検出時にIS_SANDBOX=1を自動付与しバイパス。同時に「root実行は非推奨、専用ユーザーを推奨」の警告ログを一度だけ出力。 - WebUI Settingsで Slack トークン保存しても繋がらない —
PUT /api/configおよびchokidarwatcher が、connectorsまたはportal.portalName/operatorNameの差分を検知するとreloadAllConnectors()を呼んでトップレベル+インスタンス Slack/Discord/Telegram/WhatsApp コネクタを再接続。デーモン再起動不要。partial 失敗 (例: 不正トークン) は UI にエラー表示。 - クラッシュ後の自動復旧なし —
scripts/systemd/openryoko.serviceテンプレとscripts/systemd/install.shを追加。Restart=on-failure+RestartSec=5で自動復旧。インストーラはユーザーの実シェル (bash/zsh/fish) で PATH を自動検出して unit file に焼き込む。
🏗️ Infrastructure
engines.node: ">=22"を root /packages/jimmy/packages/webの package.json に明示。- README に「🖥️ Linux サーバーで常駐させる (systemd)」セクションを追加。
SessionManager.setConfig()/setConnectorNames()を追加 — config 再読み込み時にセッションが boot 時の値を引きずる問題を解消。- 連結器 reload を single-flight 化 (
reloadInFlightmutex + pending coalescing) — 並行 reload 時の二重起動を防止。 - 連結器の停止 (
stop()) が失敗した場合、参照を破棄せず手動再起動を案内 — 二重ライブクライアントによる重複応答を防止。 - API 経由の config 書き込み時に watcher の重複 reload を抑制 (
suppressNextConnectorReload)、partial 失敗時は抑制を解除して chokidar の retry チャンスを残す。
🔒 Security
resolveBinでcommand -v ${bin}のシェル展開を撤廃し、純JS のprocess.env.PATH走査に置換。engines.*.binをPUT /api/config経由で書き換えられるため、シェルメタ文字を含む値で任意コマンド実行できてしまう脆弱性を修正。- 同時に bin 名に
/,\, NULL バイトを含む値を拒否 (path traversal 防御)。
✅ Tests
- 新規:
shared/__tests__/resolveBin.test.ts(絶対パス・PATH 解決・コマンドインジェクション耐性)、shared/__tests__/childEnv.test.ts(root 検出と IS_SANDBOX 注入)、sessions/__tests__/manager-connector-names.test.ts(setConnectorNames) - jimmy: 23 files / 275 tests、web: 7 files / 61 tests、すべて pass。
📦 アップデート方法
npm update -g openryokoソースから運用している場合:
git pull
pnpm install
pnpm build
ryoko stop && ryoko start🖥️ Linux サーバー常駐 (新機能)
sudo useradd -m -s /bin/bash ryoko
sudo -u ryoko -i bash -lc 'npm install -g openryoko @anthropic-ai/claude-code && ryoko setup'
sudo ./scripts/systemd/install.sh ryoko
journalctl -u openryoko -f詳細は README の「🖥️ Linux サーバーで常駐させる」 を参照。