Communitygithub.com

zhu-hailin/ssh-operator

AI(TRAE、Claude Code、Codex)があなたのサーバーを操作できるようにするスキル

ssh-operator とは?

SSH Operatorは、AIエージェント(Claude Code、Codex、TRAE、Cursor)がリモートLinuxサーバーをSSH/SFTP経由で操作できるようにするスキルです。アプリケーションのデプロイ、Dockerコンテナ管理、ランタイム状態の確認、ファイルのアップロード/ダウンロード、ブログ投稿の公開など、サーバー管理に必要な幅広いタスクをAIが実行できます。特に、宝塔(Baota)パネル環境に最適化されており、一般的なWebサイト/ブログのデプロイワークフローを自動化します。このスキルは、パスワードまたはキー認証を使用してSSH接続を確立し、SFTPでファイルを転送し、シェルコマンドを実行してリモートサービスを管理します。さらに、WordPress、Ghost、Haloなどのブログプラットフォームの公開APIを自動検出し、Markdownファイルを直接公開する機能も備えています。

対応✓Claude Code✓Codex CLI✓Cursor
npx skills add zhu-hailin/ssh-operator

お気に入りのAIに質問する

このエージェントスキルを事前に読み込んだ状態で新しいチャットを開きます。

ドキュメント

SSH Operator

SSH/SFTP経由でリモートLinuxサーバーを操作し、アプリケーションのデプロイ、Dockerコンテナの管理、ランタイム状態の検査を行います。複数ファイル/複数フォルダのプロジェクトをサポートし、宝塔パネル環境に最適化されています。

呼び出すタイミング

  • ユーザーがコードをサーバーにデプロイ、公開、リリースするよう依頼した場合。
  • ユーザーがリモートサービスの再起動、再構築、更新を依頼した場合。
  • ユーザーがファイルまたはフォルダ全体をリモートホストにアップロードするよう依頼した場合。
  • ユーザーがリモートログの表示やサービスの状態確認を依頼した場合。
  • ユーザーがリモートサーバーでコマンドの実行や問題の診断を依頼した場合。
  • ユーザーがリモートのウェブサイト/ブログのソースファイルの編集を依頼した場合。
  • ユーザーがブログ記事の公開またはブログプラットフォームの公開APIの検出を依頼した場合。
  • ユーザーが宝塔パネル、/www/wwwroot/、または中国のクラウドVPSホスティングについて言及した場合。

機能

  • SSH(パスワードまたはキーベースの認証)でリモートホストに接続。
  • SFTP経由でファイルのアップロード/ダウンロードおよびフォルダの再帰的アップロード。
  • シェルコマンドの実行と出力のストリーミング。
  • Dockerおよびdocker-composeワークロードの管理。
  • サービスの健全性、ログ、ディスク使用量、プロセス状態の検査。
  • デプロイした変更が有効であることを検証(チェックサム、プロセス再起動、HTTPヘルスチェック)。
  • 宝塔パネルのディレクトリ構成とNginxリバースプロキシ設定にコマンドを適応。
  • SSH経由でリモートのウェブサイト/ブログソースファイルを直接編集。
  • ブログ公開API(WordPress、Ghost、Halo)を検出し、Pythonスクリプト経由でMarkdown記事を公開。

必要な入力

アクションを実行する前に、ユーザーまたは環境から以下の情報を収集します。

  1. HOST — サーバーIPまたはホスト名。
  2. PORT — SSHポート(デフォルト22)。
  3. USER — SSHユーザー名。
  4. AUTH — パスワードまたは秘密鍵のパス。鍵を推奨します。機密情報をコミットされたファイルにハードコードしないでください。
  5. REMOTE_ROOT — サーバー上のベースプロジェクトパス(例: /www/wwwroot/ai-interviewer)。
  6. FILES_TO_UPLOAD — local_path -> remote_relative_path ペアのリスト。フォルダ全体を含みます。
  7. COMMANDS — 実行するデプロイまたは診断コマンド。

複数ファイル / 複数フォルダのデプロイ

ほとんどの実際のプロジェクトは単一ファイルではありません。以下のいずれかのアプローチを使用します。

オプション 1: 提供されたスクリプトテンプレートを使用

scripts/deploy-folder.py をプロジェクトリポジトリにコピーし、FILES_TO_UPLOAD リストを設定して実行します。このスクリプトはフォルダの再帰的アップロードを処理し、相対パスを保持します。

Unix系のローカル環境では、scripts/deploy-rsync.sh が、適切な除外ルールを備えたインクリメンタルなrsyncベースの代替手段を提供します。

オプション 2: エージェント駆動のSFTP

エージェントがSFTP/SSHツールを利用できる場合:

  1. SSHセッションを確立します。
  2. 変更された各フォルダについて、その内容を走査し、ファイルを個別にアップロードしてリモートディレクトリツリーを再作成します。
  3. 変更された各ファイルについて、対応するリモートの相対パスにアップロードします。
  4. デプロイコマンドを実行し、検証します。

オプション 3: ワンショットtarball

大規模プロジェクトの場合は、ローカルでパックしてリモートで展開する方が適しています。

# ローカル
 tar czf deploy.tar.gz backend/app frontend/.next docker-compose.yml .env.production
 scp deploy.tar.gz user@host:/tmp/

# リモート
 ssh user@host "cd /www/wwwroot/project && tar xzf /tmp/deploy.tar.gz && docker-compose up -d --build"

スクリプトライブラリ

すぐに使える自動化スクリプトです。Pythonスクリプトは scripts/_ssh.py を接続/設定読み込みに使用し、.env ファイル(.env.example 参照)から資格情報を読み取ります。スクリプトを _ssh.py と一緒にプロジェクトにコピーしてください。

スクリプト目的
scripts/_ssh.py共有ヘルパー: .env 設定を読み込み、SSH/SFTP接続を開く。
scripts/deploy-folder.pyファイルとフォルダを再帰的にSFTPアップロードし、デプロイ後コマンドを実行。
scripts/deploy-rsync.sh一般的な除外ルール付きのインクリメンタルrsyncデプロイ。
scripts/blog_api_probe.py一般的なブログ公開API(WordPress、Ghost、Halo)を検出。
scripts/publish_post.pyMarkdownファイルをREST API経由でWordPressまたはGhostに公開。
scripts/backup_before_deploy.pyデプロイ前にコード、Nginx設定、Dockerボリューム、SQLiteをバックアップ。
scripts/server_health.pyCPU、メモリ、ディスク、Docker、Nginx、HTTPの健全性ステータスを収集。
scripts/log_collector.pyDocker、Nginx、宝塔のログを分析用にローカルファイルにプル。
scripts/nginx_manager.py宝塔のNginxサイト設定を読み取り/バックアップ/編集し、安全にリロード。
scripts/bt_panel.py宝塔のインストール、パネル情報の表示、Nginxのリロード、SSH経由でのDockerステータスの確認。

Pythonの依存関係は requirements.txt にリストされています。

標準デプロイワークフロー

  1. SSHセッションを確立 — 提供された認証情報と適切なタイムアウト(20秒以上)を使用します。
  2. 変更前にバックアップ — scripts/backup_before_deploy.py または同等のものを実行します。
  3. REMOTE_ROOT が存在することを確認(mkdir -p)。
  4. ファイル/フォルダをアップロード — REMOTE_ROOT 下の相対パスを保持します。
  5. コマンドを順番に実行 — 依存するコマンドは && で連結することを推奨します。
  6. サービスが起動するのを待つ(sleep + docker-compose ps またはヘルスエンドポイントを使用)。
  7. 新しいコードが有効であることを確認(コンテナ内でgrep、/health にアクセス、ログを確認)。
  8. 結果を簡潔に報告 — 何が変更されたか、サービスが正常かどうか、エラーがあれば報告します。

一般的なコマンドパターン

# サービスの停止、再構築、再起動
cd ${REMOTE_ROOT} && docker-compose stop backend \
  && docker-compose rm -f backend \
  && docker-compose build backend \
  && docker-compose up -d backend

# サービスの状態確認
cd ${REMOTE_ROOT} && docker-compose ps

# 最近のログを表示
cd ${REMOTE_ROOT} && docker-compose logs --tail=50 backend

# 実行中のコンテナ内でコードを確認
docker exec ${CONTAINER_NAME} grep -n "await db.flush()" app/api/v1/interview.py

# ディスククリーンアップ
docker system prune -a -f

宝塔パネル適応

完全な運用ガイドについては references/baota.md を、bt CLIのチートシートについては references/bt-commands.md を参照してください。重要なポイントは以下の通りです。

  • 公式サイト: https://www.bt.cn; インストールスクリプト: https://www.bt.cn/new/download.html。
  • デフォルトのプロジェクトルート: /www/wwwroot/<site-name>。
  • scripts/bt_panel.py を使用して、宝塔のインストール、パネル情報の表示、SSH経由でのNginxのリロードを行います。
  • プロジェクトディレクトリ内でDocker Composeを使用し、CLIまたは宝塔Dockerプラグインを介してコンテナを管理します。
  • Node/Pythonフロントエンドの場合は、宝塔サイトを追加し、scripts/nginx_manager.py を使用して 127.0.0.1:3000 へのNginxリバースプロキシロケーションを追加します。
  • /api/ ルートをバックエンドコンテナ(例: 127.0.0.1:8000)にルーティングします。
  • 宝塔ファイアウォールとクラウドプロバイダーのセキュリティグループの両方でポートを開放します。
  • 高番号ポートをインターネットに直接公開せず、80/443でNginxを使用します。

問題が発生した場合は、references/troubleshooting.md を参照してください。

安全ルール

  • 機密情報をコミットしないでください。PASS や鍵のパスは、環境変数、gitから除外された .env ファイル、またはシークレットマネージャーに保存します。
  • 明示的なファイルリストを優先 し、幅広いアップロードによって予期しないファイルが上書きされるのを防ぎます。
  • 診断時は非破壊的なチェックを最初に実行(ログ、ps、df)してからサービスを再起動します。
  • git push --force や破壊的な rm -rf は避ける — ユーザーが明示的に要求した場合を除きます。
  • リスクの高いアクション(データベースマイグレーション、サービス全体の再起動、破壊的な削除)については、可能な限りユーザーに確認します。
  • 一時ファイルをクリーンアップ(例: デプロイ後の /tmp/deploy.tar.gz)。

クロスプラットフォームの注意点

  • このスキルは、リモートホストがLinuxであり、ローカル環境にSSHクライアントまたは paramiko などのPythonライブラリがあることを前提としています。
  • Windowsローカルホストでは、パスの正規化が必要になる場合があります。リモートパスは常にコマンド内で引用符で囲みます。
  • 直接SSHツールを持たないエージェントの場合、以下にフォールバックします: (1) ユーザーが実行するデプロイスクリプトを生成する、(2) プラットフォームが提供するターミナル/リモート実行ツールを使用する。
  • Claude Code、Codex、TRAE、Cursor間での最大限の移植性のために、メインの SKILL.md は500行未満に保ち、詳細なリファレンスは references/ に移動します。

例

ユーザー: 「最新のバックエンド修正を私の宝塔サーバーにデプロイしてください。」

エージェント:

  1. HOST、PORT、USER、認証情報、REMOTE_ROOT を尋ねるかロードします。
  2. どのファイルが変更されたかを尋ねるか、最近の編集から推測します。
  3. 変更されたファイル/フォルダを REMOTE_ROOT 下のリモートパスにアップロードします。
  4. 影響を受けるDockerサービスを再構築して再起動します。
  5. docker-compose ps を確認し、ログの末尾を表示して健全性を確認します。
  6. アップロードとサービスの状態に関する簡単なサマリーで応答します。

関連スキル