mcpField
H
huawei-cloud-ecs-dsh-deploy

huawei-cloud-ecs-dsh-deploy

github.com/huaweicloudクラウド・DevOps5968 回インストール2 日前に更新
リポジトリ

huawei-cloud-ecs-dsh-deploy について

Huawei Cloud Flexus X に DeepSeek Harness(dsh)をデプロイするスキルです。クラウド上にエージェント開発環境を用意する開発者向けで、実行前に明示的な確認が必要です。Web UI は SSH トンネル経由で利用します。

主な機能

  1. 01dsh のデプロイとクラウドサーバー管理
  2. 02リージョンと既存サーバーの一覧表示
  3. 03Huawei Cloud 認証情報のテスト
  4. 04状態確認またはサーバー削除
  5. 05SSH トンネル経由の Web UI アクセス

活用シーン

  1. 01クラウド上のエージェント開発環境の構築
  2. 02dsh Web UI のデプロイと実行
  3. 03デプロイ済みサーバーの確認と管理

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/huaweicloud/huaweicloud-skills --skill huawei-cloud-ecs-dsh-deploy

インストール後、Claude Code で/huawei-cloud-ecs-dsh-deployを入力して読み込まれたか確認します。

同梱ファイル

SKILL.md と一緒にインストールされる参考資料やスクリプト。

references/
acceptance-criteria.md
cli-installation-guide.md
conversation-examples.md
iam-policies.md
verification-method.md
scripts/
coc_deploy.py
config.py
deploy_dsh.py
huawei_cloud_ecs.py
pyproject.toml
query_regions.py
utils.py

詳細

Huawei Cloud Flexus X + DeepSeek Harness(dsh)のワンクリックデプロイ

⚠️ デプロイ前の確認事項(最優先)

このスキルでは実際に料金が発生する操作(Huawei Cloud Flexus X インスタンスの作成)を行うため、実行前にユーザーの確認が必要です!

必ず確認する項目:

  • リージョン(デフォルト:cn-north-4)
  • フレーバー(デフォルト:x1.2u.4g、2 コア、4GB)
  • 課金モード(デフォルト:従量課金)

禁止事項:

  • ❌ ユーザーが明示的に確認する前にデプロイを実行しないでください
  • ❌ ユーザーに確認せず、デフォルト設定でデプロイしないでください
  • ❌ ユーザーがデフォルト値を受け入れると決めつけないでください
  • ❌ 料金を捏造したり、推定したりしないでください(例:「約 ¥0.2~0.3/時間」)。必ず公式の料金ページを案内してください

正しい手順:

  1. デフォルト設定(リージョン、フレーバー、課金モード)をユーザーに提示します
  2. 料金については、公式料金計算ツール(https://www.huaweicloud.com/pricing/calculator.html#/hecs)を利用するよう案内します
  3. 設定を確認するか、変更するかをユーザーに尋ねます
  4. ユーザーが CONFIRM(大文字)と入力した後にのみ、デプロイを実行します

概要

このスキルを使うと、DeepSeek AI のオープンソース AI エージェントハーネスである DeepSeek Harness(dsh) を Huawei Cloud Flexus X インスタンスにワンクリックでデプロイできます。

モジュール説明コマンド
リージョン一覧利用可能なリージョンを表示しますpython3 scripts/deploy_dsh.py --list-regions
接続テストAK/SK 認証情報を検証しますpython3 scripts/deploy_dsh.py --test
デプロイFlexus X インスタンスを購入して dsh をデプロイしますpython3 scripts/deploy_dsh.py
コンポーネント
コンポーネント説明ポート備考
Node.jsJavaScript ランタイム-Node.js 22 LTS。/opt/nodejs/current にインストールされます
@deepseek-ai/dshDeepSeek Harness CLI3080(ループバック)公式 npm パッケージ。dsh web は 127.0.0.1 のみで待ち受けます
Nginxリバースプロキシ80(ループバック)ローカルサーバーが 80 → 127.0.0.1:3080 をプロキシします(パブリックアクセスにはこのポートを使用しません。下記の SSH トンネルを参照)
systemdサービスマネージャー-dsh.service が dsh のライフサイクルを管理し、障害時に自動再起動します
UFWファイアウォール-22(SSH)/80/443 を許可します(80/443 はセキュリティグループでブロックされるため、パブリックからは到達できません)
デプロイされるアプリケーション
アプリケーション説明ポートアクセス URL
dsh Web UIAI エージェントハーネスの Web インターフェイス3080(ループバック)http://127.0.0.1:3080(**先に SSH トンネルが必要**。ローカルアクセスガイドを参照)

✅ 重要:dsh の web コマンドは、意図的に 127.0.0.1 のみで待ち受けます。CLI は --host 0.0.0.0 を拒否します。リモートアクセスには SSH ローカルポートフォワーディングトンネルを使用します。お使いのマシンで ssh -L 3080:127.0.0.1:3080 root@{public_ip} を実行し、その後 http://127.0.0.1:3080 を開いてください。セキュリティグループで開放する必要があるのはポート 22 のみです。dsh がパブリックに公開されることはなく、より安全です。

使用例
  1. AI エージェント開発 - Web UI を使って DeepSeek AI エージェントハーネスを実行・管理します
  2. 自動化とワークフロー - 「すべてがプラグイン」というアーキテクチャで、複数ステップのエージェントワークフローを構築します
  3. 開発とテスト - AI エージェント開発環境をすばやくセットアップします
  4. チームでの共同作業 - チーム内でエージェントのワークスペースを共有します
  5. マルチリージョンデプロイ - 世界中のユーザーに近い場所からアクセスできる環境を提供します
重要な注意事項

⚠️ すべてのスクリプトと環境チェック用スクリプトはスキルパッケージ内にあります。実行にはスキルの action=exec を必ず使用し、シェルから直接実行しないでください。

前提条件

このスキルを使用する前に、次の条件を満たしていることを確認してください。

1. Huawei Cloud アカウント
  • 有効な Huawei Cloud アカウントがあること
  • アカウントの実名認証が完了していること
  • 十分な残高があるか、支払い方法が登録されていること
2. AK/SK 認証情報
  • Huawei Cloud のアクセスキー(AK/SK)が作成済みであること
  • AK/SK に次の権限が付与されていること:
    • ECS:Elastic Cloud Server の管理
    • VPC:Virtual Private Cloud の管理
    • EIP:Elastic Public IP の管理
    • COC:Cloud Operations Center の管理
  • 取得方法:Huawei Cloud Console → My Credentials → Access Keys → Create Access Key

認証情報の設定方法:

方法説明優先度
環境変数HW_ACCESS_KEY、HW_SECRET_KEY、HW_SECURITY_TOKEN最優先(推奨)
コマンドライン引数--ak、--sk、--security-token低(使用可能ですが非推奨)

認証情報の種類(推奨順):

優先度種類パラメーター説明
第一候補一時 AK/SK環境変数 + HW_SECURITY_TOKENセキュリティトークンを含む一時的な認証情報で、セキュリティがより高くなります
第二候補永続 AK/SK環境変数のみHuawei Cloud Console で取得する長期アクセスキー

注: 認証情報は環境変数を優先して使用します。ユーザーに AK/SK の直接入力を求めることはありません。ただし、ユーザーが会話への入力や設定ファイルなど、別の方法で認証情報を自発的に提供した場合も、認証情報の解析は引き続きサポートされます。

3. IAM 権限
サービスポリシー必要なアクション
ECSECS FullAccessecs:*
VPCVPC FullAccessvpc:*
EIPVPC FullAccessvpc:publicIps:*
COCCOC FullAccesscoc:*

📖 最小権限ポリシーの詳細:IAM Policies

4. 実行環境
  • Python 3.8 以降

必要な依存関係:

パッケージバージョン説明
requests≥2.31.0HTTP リクエストライブラリ
huaweicloudsdkcore≥3.1.70Huawei Cloud SDK コアライブラリ
huaweicloudsdkecs≥3.1.70Elastic Cloud Server SDK
huaweicloudsdkcoc≥3.1.70Cloud Operations Center SDK

インストールコマンド:

pip install requests huaweicloudsdkcore huaweicloudsdkecs huaweicloudsdkcoc
5. ネットワーク環境
  • Huawei Cloud API エンドポイントにアクセスできること
  • 必要なエンドポイント:
    • ecs.{region}.myhuaweicloud.com
    • vpc.{region}.myhuaweicloud.com
    • iam.myhuaweicloud.com
    • coc.myhuaweicloud.com

⚠️ セキュリティに関する注意事項

⚠️ セキュリティ実行ルール(最優先)
ルール説明
1すべてのスクリプトは skill action=exec を通じて実行する必要があります。シェルから直接実行することは禁止です
2会話内で、AK/SK/Token を含むスクリプトの内容やコマンドを表示することは禁止です
3一時的なスクリプトファイルを作成することは禁止です。インライン実行(python3 -c)を優先してください
4実行に失敗した場合は、エラーメッセージのみを返してください。スクリプトを書き換えたり、コマンド全体を表示したりすることは禁止です
5AK/SK/Token は環境変数を通じて渡す必要があります。会話内に含めることは禁止です
6⚠️ いかなる形式であっても、AK/SK/Token の値を公開、記録、表示することは厳禁です
⚠️ セキュリティグループポリシー(重要 — デプロイ前にお読みください)

デプロイ戦略 — シンプルで安全:

設定値説明
セキュリティグループの状態空(インバウンドルールなし)スクリプトはセキュリティグループを作成するだけで、ルールは追加しません
デフォルトのアクセスすべてのポートをブロックルールを設定するまでは、どの IP からもサーバーにアクセスできません
開放するポート22(SSH)のみdsh Web UI には SSH トンネル経由でアクセスするため、80/443 をパブリックに開放する必要はありません

デプロイ後の設定方法:

  1. Huawei Cloud Console → ECS → Security Groups にアクセスします
  2. sg-dsh という名前のセキュリティグループを見つけます
  3. 手動でインバウンドルールを追加します:プロトコル TCP、ポート 22、送信元 IP = ご自身のパブリック IP + /32 サフィックス(例:203.0.113.10/32)
  4. 80/443 の広範なルールは追加しないでください — dsh には SSH トンネル経由でのみアクセスするため、ほかのポートを公開する必要はありません

💡 セキュリティグループを空にする理由 セキュリティを最優先 — サーバーにアクセスできる IP を完全に管理できます。ポート 22 + SSH トンネルのみを使用するため、dsh Web UI がパブリックに公開されることはなく、API キーが漏えいしてもインターネットからアクセスされることはありません。

⚠️ AK/SK のセキュリティ: 前提条件 - AK/SK 認証情報を参照してください。AK/SK/Token の値をいかなる形式でも公開、記録、出力することは禁止されています。

⚠️ dsh のセキュリティ(重要)
ルール説明
1dsh は 127.0.0.1 のみにバインドします — 0.0.0.0 でリッスンするよう強制しないでください(CLI は設計上これを拒否します)
2SSH ローカルポートフォワーディングでリモートアクセスします:ローカルで ssh -L 3080:127.0.0.1:3080 root@{public_ip} を実行し、その後 http://127.0.0.1:3080 を開きます
3DEEPSEEK_API_KEY は systemd drop-in を使用し、ファイルモード 600 で注入します — ユニットファイルやログに記載しないでください
4デプロイ時に API キーを設定する必要はありません。ユーザーは後から Web UI(設定 → モデル)で設定することもできます
5dsh は root ではなく、専用システムユーザー dsh(シェルなし)で実行します
6本番環境で使用する場合、HTTPS を必ず有効にしてください(例:Nginx ローカルプロキシ経由で Let's Encrypt を使用)
🔐 SSL/TLS 検証
  • 🔒 すべての Huawei Cloud API リクエストでは、SSL/TLS 証明書の検証がデフォルトで有効です(verify=true)。
  • HW_VERIFY_SSL 環境変数で上書きできます — HW_VERIFY_SSL=false にすると検証が無効になります。
  • ⚠️ HW_VERIFY_SSL=false はテスト専用です。 本番環境で SSL 検証を無効にしないでください。中間者攻撃により AK/SK 認証情報や API トラフィックが漏えいするおそれがあります。

主なコマンドと使い方

💡 注:操作オプションが指定されていない場合、デフォルトでデプロイ操作が実行されます。

コマンドオプション
コマンド/オプション機能説明
python3 scripts/deploy_dsh.pyデプロイFlexus X インスタンスを購入し、dsh をデプロイします
python3 scripts/deploy_dsh.py --list-regions利用可能なリージョンを表示利用可能なすべてのリージョン(19 リージョン)を表示します
python3 scripts/deploy_dsh.py --test接続をテストAK/SK 認証情報を検証します
python3 scripts/deploy_dsh.py --list-serversサーバー一覧指定したリージョンのすべてのサーバーを表示します
python3 scripts/deploy_dsh.py --delete <ID>サーバーを削除ID または名前を指定してサーバーを削除します
python3 scripts/deploy_dsh.py --status <ID>ステータスを確認サーバー ID を指定してデプロイ状況を確認します
グローバルパラメーター

💡 必須パラメーター:--ak、--sk(または HW_ACCESS_KEY、HW_SECRET_KEY 環境変数を設定) 💡 推奨パラメーター:--security-token(または一時認証情報用に HW_SECURITY_TOKEN を設定)

実行例

例 1:利用可能なリージョンを一覧表示する

python3 scripts/deploy_dsh.py --list-regions

例 2:AK/SK 接続をテストする

python3 scripts/deploy_dsh.py --test

例 3:デフォルト設定でデプロイする(ユーザーの確認が必要です)

python3 scripts/deploy_dsh.py

例 4:リージョンとフレーバーを指定してデプロイする

python3 scripts/deploy_dsh.py --region cn-east-3 --flavor x1.4u.8g

例 5:既存のサーバーを一覧表示する

python3 scripts/deploy_dsh.py --list-servers --region cn-north-4

例 6:デプロイのステータスを確認する

python3 scripts/deploy_dsh.py --status <server_id>

例 7:サーバーを削除する

python3 scripts/deploy_dsh.py --delete <server_id_or_name>
パラメーター説明デフォルト
--region対象リージョンcn-north-4
--flavorインスタンスのフレーバーx1.2u.4g
--nameサーバー名自動生成
--passwordサーバーのパスワード自動生成
--charging-mode課金モードpostPaid
--bandwidthEIP 帯域幅(Mbps)100
--volume-sizeシステムディスク(GB)40
--coc-regionCOC サービスのリージョンcn-north-4
--coc-timeoutCOC スクリプトの実行タイムアウト(秒)1800
dsh パラメーター
パラメーター説明デフォルト
--dsh-portdsh の待ち受けポート(ループバックのみ)3080
--api-keydsh サービスに事前設定する DEEPSEEK_API_KEY(任意)未設定

💡 dsh ポートは 127.0.0.1 のみにバインドされます。SSH トンネル経由でローカルからアクセスしてください(ssh -L 3080:127.0.0.1:3080 root@{ip})。dsh ポート自体にセキュリティグループのルールを設定する必要はありません。

詳細パラメーター

💡 以下のパラメーターは上級ユーザー向けで、一般的な用途では必要ありません。

パラメーター説明デフォルト
--project-idHuawei Cloud プロジェクト ID(任意)自動取得
--imageイメージ IDデフォルトの Ubuntu 22.04
--zoneアベイラビリティゾーンを指定自動選択
--random-zoneアベイラビリティゾーンをランダムに選択オフ
--no-eipエラスティックパブリック IP を作成しないオフ
--auto-confirm対話形式の確認をスキップする(注意して使用してください!)オフ
認証情報の設定例

方法 1:環境変数を使用する(第一選択—強く推奨)

python3 scripts/deploy_dsh.py

方法 2:コマンドライン引数を使用する(第二選択—使用可能)

# Temporary credentials
python3 scripts/deploy_dsh.py \
  --ak <AK> --sk <SK> --security-token <TOKEN> \
  --region cn-north-4 \
  --flavor x1.2u.4g

# Permanent credentials
python3 scripts/deploy_dsh.py \
  --ak <AK> --sk <SK> \
  --region cn-north-4 \
  --flavor x1.4u.8g
🔒 重複デプロイ防止機構

システムに組み込まれたロックファイル機構により、重複デプロイを防止します。

  • デプロイ開始時にロックファイルを自動作成します:dsh_deploy.lock
  • ロックファイルの有効期間:30 分(自動的に期限切れになります)
  • ロックファイルが存在する場合、新しいデプロイは自動的にブロックされます
  • ロックファイルのパス:システムの一時ディレクトリ(Linux では /tmp/dsh_deploy.lock、Windows では %TEMP%\dsh_deploy.lock)

⚠️ 重要な注意事項:

  • ❌ 複数のデプロイタスクを同時に実行しないでください
  • ❌ 重複デプロイによって複数のサーバーが作成され、料金が二重に発生します
  • デプロイに失敗した場合は、ロックファイルが削除されているか確認してください

**失敗時の処理:**デプロイに失敗した場合は、失敗理由を返し、コンソールを確認するようユーザーに案内します。自動再試行やパラメーターの変更は行いません。

🚀 国内ミラーによる高速化

国内ミラーを組み込んでおり、デプロイを高速化できます。

ミラーの種類ミラーソース説明
Ubuntu APTUSTC (mirrors.ustc.edu.cn)システムパッケージの更新
npm レジストリnpmmirror (registry.npmmirror.com)@deepseek-ai/dsh のインストールと Node.js バイナリのダウンロード
pip(ローカル)Huawei Cloud (repo.huaweicloud.com)オペレーター側での Python 依存関係のインストール

ミラー設定の場所: scripts/coc_deploy.py の COMBINED_INSTALL_SCRIPT

モジュールの詳細

DeepSeek Harness(dsh)のデプロイ

⏱️ デプロイ時間:全体で約 10 分 かかります(サーバーの作成に 3~5 分+ソフトウェアのデプロイに 5~8 分)。しばらくお待ちください。

💡 デプロイコマンドについては認証情報の設定例を、すべてのパラメーターについてはグローバルパラメーターを参照してください。

サーバー上のデプロイ段階(COC スクリプト経由):

段階操作説明
0国内ミラーUSTC APT ミラーと npmmirror npm レジストリを設定
1Node.js 22 LTS公式 tarball(npmmirror ミラー、失敗時は nodejs.org)経由でインストール
2@deepseek-ai/dshnpm install -g @deepseek-ai/dsh
3専用ユーザーシステムユーザー dsh を作成し、DSH_HOME(/home/dsh/.dsh)を準備
4systemd サービスdsh.service を作成(restart=on-failure、ProtectSystem、ReadWritePaths)
5Nginx リバースプロキシ80 → 127.0.0.1:3080、WebSocket アップグレードヘッダー(ループバックのみ)
6ファイアウォールUFW で 22/80/443 を許可(80/443 はセキュリティグループでブロックされ、パブリックからは到達不可)
7起動と検証dsh を起動し、ループバックで HTTP 200 を待機して、デプロイ情報を出力

利用可能なリージョン

一般的なリージョン(その他のリージョンは --list-regions を実行してください):

リージョン IDリージョン名対応する Flexus X インスタンスタイプ
cn-north-4中国北部・北京 4x1, x1e, x1i, x2e
cn-east-3中国東部・上海 1x1, x1e, x1i, x2e
cn-south-1中国南部・広州x1, x1e, x1i, x2e
ap-southeast-1中国・香港x1, x2e
ap-southeast-3アジア太平洋・シンガポールx1, x1e, x2e

💡 リージョンの全リスト(19 件)は、次を実行してください:python3 scripts/deploy_dsh.py --list-regions

出力形式の仕様

⛔ 重要 — SSH トンネルコマンドは省略・要約・言い換えをせず、必ずそのまま出力してください:

デプロイ後の返信には、コピーしてすぐに実行できる SSH トンネルコマンドを必ず含めてください。{public_ip} はスクリプト出力の実際のパブリック IP に置き換えてください。 たとえば、スクリプトの出力が Public IP: 121.36.x.x の場合、返信には次を含める必要があります:

ssh -L 3080:127.0.0.1:3080 [email protected]

完全なコマンドを示さずに「SSH トンネルを確立してください」とだけ書くことは絶対に避けてください。ユーザーはコピーして実行する必要があります。コマンドがないと Web UI にアクセスできません。

デプロイが成功したら、必ず次の形式で結果を返してください:

🎉 Deployment Successful!

| Item | Value |
|------|-----|
| Server Name | {server_name} |
| Public IP | {public_ip} |
| SSH Password | {password} |
| Region | {region_id} ({region_name}) |

🌐 Access URL (SSH tunnel required first):
- Run on your local machine (Windows PowerShell / macOS Terminal), replacing {public_ip} with the Public IP from the table above:

ssh -L 3080:127.0.0.1:3080 root@{public_ip}

- Enter the SSH password (from the table above), keep the terminal window open
- Then open in your browser: http://127.0.0.1:3080

🔑 SSH Login: `ssh root@{public_ip}` (password: {password})

📦 Installed Components:
- Node.js 22 LTS ({node_version})
- @deepseek-ai/dsh ({dsh_version}, systemd service 'dsh')
- Nginx reverse proxy (80 → 127.0.0.1:{dsh_port}, loopback only)

📋 Post-deployment TODO:
1. Configure security group: Console → ECS → Security Groups → sg-dsh → Add inbound rule (TCP 22, source your_ip/32)
2. Establish SSH tunnel locally (see command above), then open Web UI: http://127.0.0.1:3080
3. In the Web UI: Settings → Models, enter your DeepSeek API key and save
4. Choose a workspace directory, then start a session

📖 [DeepSeek Harness GitHub](https://github.com/deepseek-ai/deepseek-harness) | [Flexus X Docs](https://support.huaweicloud.com/productdesc-flexusx/pd_01_0002.html)

変数: {server_name} サーバー名 | {public_ip} パブリック IP | {password} SSH パスワード | {region_id}/{region_name} リージョン | {dsh_port} dsh のループバックポート | {node_version} Node.js バージョン | {dsh_version} dsh CLI バージョン

🔐 ローカルアクセスガイド(SSH ポートフォワーディング)

⚠️ デプロイ後は必ずこのセクションの手順に従ってください。従わない場合、ブラウザーで dsh Web UI を開けません。dsh はサーバーのループバックアドレス 127.0.0.1:3080 のみでリッスンします。ローカルポート 3080 からサーバーのポート 3080 に転送するため、お使いのローカルマシンで SSH トンネルを確立する必要があります。

仕組み:ssh -L 3080:127.0.0.1:3080 root@{public_ip} は、ローカルの 3080 ポートのすべてのトラフィックを、暗号化された SSH チャネル経由でクラウドサーバー上の 127.0.0.1:3080(dsh が実行されている場所)に転送するという意味です。データは完全に暗号化され、dsh Web UI がパブリックに公開されることはありません。SSH 接続が可能なユーザーだけがアクセスできます。

Windows ユーザー(PowerShell)
  1. PowerShell を開きます:Win キーを押し → powershell と入力 → Enter キーを押します(または Win+X を押し →「Windows PowerShell」/「Windows Terminal」を選択します)
  2. トンネルコマンドを実行します({public_ip} をデプロイ出力に表示されたパブリック IP に置き換えます):
    ssh -L 3080:127.0.0.1:3080 root@{public_ip}
    
  3. 初回のフィンガープリント確認:Are you sure you want to continue connecting (yes/no)? と表示されたら、yes と入力して Enter キーを押します
  4. パスワードを入力します:デプロイ出力に表示された SSH パスワードを入力し(入力中に文字は表示されませんが、正常な動作です)、Enter キーを押します
  5. ウィンドウを開いたままにします:リモートシェルのプロンプト(例:root@xxx:~#)が表示されたら、トンネルは確立されています。このウィンドウを閉じないでください
  6. ブラウザーを開きます:http://127.0.0.1:3080 にアクセスして dsh Web UI を開きます

💡 Windows 10/11 には OpenSSH クライアントが標準搭載されています。追加のインストールは不要です。「'ssh' is not recognized」と表示された場合は、設定 → アプリ → オプション機能 →「OpenSSH Client」を追加してください。

macOS ユーザー(Terminal)
  1. Terminal を開きます:Command + Space を押し → Terminal と入力 → Enter キーを押します(または Finder → アプリケーション → ユーティリティ → Terminal)
  2. トンネルコマンドを実行します({public_ip} をデプロイ出力に表示されたパブリック IP に置き換えます):
    ssh -L 3080:127.0.0.1:3080 root@{public_ip}
    
  3. 初回のフィンガープリント確認:Are you sure you want to continue connecting (yes/no)? と表示されたら、yes と入力して Enter キーを押します
  4. パスワードを入力します:デプロイ出力に表示された SSH パスワードを入力し(入力中に文字は表示されませんが、正常な動作です)、Enter キーを押します
  5. ウィンドウを開いたままにします:リモートシェルのプロンプトが表示されたら、トンネルは確立されています。このウィンドウを閉じないでください
  6. ブラウザーを開きます:http://127.0.0.1:3080 にアクセスして dsh Web UI を開きます

💡 macOS には OpenSSH クライアントが標準搭載されています。追加のインストールは不要です。

トンネルの終了と高度な使い方
シナリオ操作
トンネルを終了するPowerShell/Terminal のウィンドウで Ctrl+C を押すか、exit と入力して Enter キーを押します
シェルなしでポート転送のみを行うssh -N -L 3080:127.0.0.1:3080 root@{public_ip} を実行します(-N はリモートコマンドを実行しません。シェルプロンプトは表示されません。推奨)
macOS でバックグラウンド実行するssh -f -N -L 3080:127.0.0.1:3080 root@{public_ip} を実行します(-f はバックグラウンドで実行します。pkill -f "ssh -f -N" または killall ssh で停止します)
ローカルポート 3080 が使用中の場合別のローカルポートを使います:ssh -L 18080:127.0.0.1:3080 root@{public_ip} を実行し、http://127.0.0.1:18080 を開きます
パスワードなしでログインする(推奨)ssh-copy-id root@{public_ip} を実行します(macOS/Linux)。または、以後パスワードなしで接続できるよう、PowerShell で SSH キーを使用します

⚠️ 注:トンネルを終了すると、http://127.0.0.1:3080 にアクセスできなくなります。これは正常な動作です。トンネルコマンドを再実行してください。マシンを再起動するたびに、トンネルを再確立する必要があります。

dsh の初期設定

SSH トンネルを確立したら、dsh Web UI(http://127.0.0.1:3080)を開きます。

設定説明
API KeySettings → Models に移動し、DeepSeek API キーを入力して保存します(--api-key で事前設定されていない場合)
Workspaceセッションと成果物を保存するワークスペースディレクトリを選択します
Start SessionWeb UI でセッションを開始すると、ハーネスが応答します

⚠️ 重要:dsh はファイルの読み書きやコマンドの実行が可能です。セキュリティグループで開放するポートは 22 のみにしてください(接続元は your_ip/32)。dsh には SSH トンネル経由でアクセスします。80/3080 を公開インターネットに開放しないでください。また、0.0.0.0/0 は絶対に使用しないでください。

デプロイアーキテクチャ

このスキルでは、従来の SSH 方式に代わり、安全なデプロイのために COC (Cloud Operations Center) を使用します。

┌─────────────────────────────────────────────────────────────┐
│                    Flexus Cloud Server X Instance                     │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  ┌─────────────────────────────────────────────────────┐    │
│  │              Ubuntu 22.04 Server                    │    │
│  ├─────────────────────────────────────────────────────┤    │
│  │                                                     │    │
│  │   SSH tunnel ──► dsh (127.0.0.1:3080)              │    │
│  │   (port 22)       (loopback only)                   │    │
│  │                                                     │    │
│  │  ┌───────────────┐      ┌───────────────┐          │    │
│  │  │    Nginx      │      │    systemd    │          │    │
│  │  │   (port 80)   │      │  dsh.service  │          │    │
│  │  │   loopback    │      └───────┬───────┘          │    │
│  │  └───────────────┘              │                   │    │
│  │                                 ▼                   │    │
│  │                            dsh web (Node.js 22)     │    │
│  │                             user: dsh (no-shell)   │    │
│  │                             DSH_HOME: /home/dsh/.dsh│    │
│  └───────────┬──────────────────────┬──────────────────┘    │
│              │                      │                       │
│              │              ┌───────┴───────┐              │
│              │              │ Security Group │             │
│              │              │    sg-dsh     │             │
│              │              │ allow 22 /32  │             │
│              │              └───────┬───────┘             │
│              │                      │                      │
│              └──────────────────────┼──────────────────────┘
│                                     ▼                       │
│                           ┌─────────────┐                  │
│                           │    EIP      │  SSH only (22)   │
│                           └─────────────┘                  │
│                                     ▲                       │
│                                     │                       │
│                           ┌─────────┴─────────┐            │
│                           │  COC (Cloud       │           │
│                           │  Operations       │           │
│                           │  Center)          │           │
│                           │  Secure Script    │           │
│                           │  Execution        │           │
│                           └───────────────────┘            │
└─────────────────────────────────────────────────────────────┘

              ┌─────────────────────────────┐
              │  User machine (Windows/macOS) │
              │  ssh -L 3080:127.0.0.1:3080 root@{ip} │
              │  Browser → http://127.0.0.1:3080      │
              └─────────────────────────────┘
デプロイフロー
ステージ操作説明
1サーバーの作成Huawei Cloud SDK を使用して Flexus X インスタンスを作成します
2セキュリティグループの設定sg-dsh セキュリティグループを作成します(ルールは空のため、手動での設定が必要です)
3UniAgent の起動待ちCOC UniAgent がオンラインになるまで待ちます
4COC スクリプトの作成Cloud Operations Center でインストールスクリプトを作成します
5スクリプトの実行COC を通じて対象インスタンスでスクリプトを実行します
6デプロイの確認dsh サービスとループバックポートの状態を確認します
COC デプロイの利点

SSH 方式と比較して、COC デプロイには次のような利点があります。

機能SSH 方式COC 方式
セキュリティSSH ポートを開放する必要があり、セキュリティリスクがありますCloud Operations Center を通じて安全に実行でき、SSH ポートは不要です
権限管理SSH パスワードまたはキーが必要ですHuawei Cloud IAM の権限管理を使用します
監査ログ手動でのログ記録が必要ですCOC が実行ログを自動的に記録します
一括デプロイSSH 接続を順次行う必要があります複数のサーバーへの一括デプロイに対応しています
エラー処理手動での処理が必要ですCOC が標準化されたエラー処理を提供します
ログファイル
ファイルパス説明
/var/log/dsh-bootstrap.logデプロイスクリプトの実行ログ
/home/dsh/.dsh/dsh データディレクトリ(セッション、ワークスペース、アーティファクト)
/etc/systemd/system/dsh.servicedsh systemd ユニットファイル
/etc/systemd/system/dsh.service.d/10-credentials.confDEEPSEEK_API_KEY のドロップイン(モード 600、--api-key を使用した場合のみ)
/etc/nginx/conf.d/dsh.confNginx リバースプロキシの設定

ファイル構成

skills/huawei-cloud-ecs-dsh-deploy/
├── SKILL.md                    # English version
├── scripts/
│   ├── deploy_dsh.py           # Main deployment script
│   ├── pyproject.toml          # Dependency list
│   ├── huawei_cloud_ecs.py     # Huawei Cloud SDK wrapper
│   ├── coc_deploy.py           # COC deployment module (includes install script)
│   ├── config.py               # Configuration constants
│   ├── utils.py                # Utility functions
│   └── query_regions.py        # Region query helper
└── references/
    ├── acceptance-criteria.md     # Acceptance criteria
    ├── cli-installation-guide.md  # CLI installation guide (KooCLI & dependencies)
    ├── iam-policies.md            # IAM policies
    ├── verification-method.md     # Verification methods
    └── conversation-examples.md   # Natural-language conversation examples

エラー処理

既知の制限事項
制限事項説明解決策
dsh はループバックにのみバインドしますdsh web は設計上、--host 0.0.0.0 を拒否しますローカルで SSH トンネルを確立します:ssh -L 3080:127.0.0.1:3080 root@{ip} を実行し、http://127.0.0.1:3080 を開きます
ステータス確認方法--status はサーバーインスタンスの状態を確認します。dsh のヘルスチェックには SSH トンネルが必要ですトンネル接続後に http://127.0.0.1:3080 を開いて確認するか、サーバー上で curl http://127.0.0.1:3080 を実行します
よくあるエラー
エラーコード説明解決策
401 UnauthorizedAK/SK が無効ですAK/SK が正しく、有効であることを確認します
403 Forbidden権限がありません必要な IAM ポリシーを追加します
QuotaExceededリソースのクォータを超過しましたECS/VPC/EIP のクォータを確認します
ServerLimitExceededインスタンス数の上限に達しました使用していないインスタンスを解放します
FlavorNotFoundフレーバーを利用できません別のリージョンまたはフレーバーを試します
Timeoutサーバーの作成がタイムアウトしましたコンソールで実際の状態を確認します
Node.js < 22dsh には Node.js >= 22 が必要ですインストールスクリプトが Node 22 LTS を自動的にインストールします

参考資料

スキルの参考ドキュメント
外部参考資料

コメント