【iPhone対応】さくらVPSをワンコマンドで自動復旧
Mac / iPhone(a-Shell + ショートカット)から実行する方法
はじめに
さくらVPSを運用していると、
- サーバーが固まった
- SSHは入れるけどサービスが落ちている
- 外出先で再起動したい
====
私の場合はGitbucketを置いているふるーいサーバーがあってそこが落ちることがあるため
その都度再起動してましたがスマホでワンタップでできれば楽ちんだなとやってみました。
本記事では、
- VPS上の shell script で再起動処理
- 処理結果を Slack に通知
- Mac からはエイリアスで実行
- iPhone からは a-Shell + ショートカットで実行
という構成をまとめます。
👉 結果として
「Mac / iPhone どちらからでもワンタップでVPS復旧」
ができるようになります。
構成イメージ
[ Mac / iPhone ]
|
| SSH(鍵認証)
v
[ さくらVPS ]
├─ 再起動・復旧用 shell script
└─ Slack 通知
1. VPS上に自動復旧用 shell script を作成
まず、VPS上に再起動処理を行うスクリプトを作成します。
例:web-restart.sh
#!/bin/bash
SLACK_WEBHOOK_URL="https://hooks.slack.com/services/XXX/XXX/XXX"
usage() {
echo "使用方法: $(basename "$0") {restart|status}"
exit 0
}
cmd="${1:-}"
[ -z "$cmd" ] && usage
# root判定
if [ "${EUID:-$(id -u)}" -ne 0 ]; then
is_root=0
else
is_root=1
fi
service_cmd="/sbin/service"
# Slack送信
send_slack() {
local text="$1"
curl -s -X POST -H 'Content-type: application/json' \
--data "{\"text\":\"$text\"}" \
"$SLACK_WEBHOOK_URL" >/dev/null
}
# ポート確認(失敗しても落とさない)
show_port() {
local port="$1"
if command -v ss >/dev/null 2>&1; then
ss -ltnp 2>/dev/null | awk -v p=":${port}" '$4 ~ p'
elif command -v netstat >/dev/null 2>&1; then
netstat -ltnp 2>/dev/null | awk -v p=":${port}" '$4 ~ p'
fi
}
case "$cmd" in
restart)
echo "♻️ restart requested"
RESULT_OK=1
DETAILS="♻️ restart requested\n"
if [ $is_root -eq 0 ]; then
echo "⚠️ root権限なし(再起動は失敗する想定)"
DETAILS+="⚠️ root権限なし\n"
RESULT_OK=0
fi
echo "▶ httpd restart"
if $service_cmd httpd restart >/dev/null 2>&1; then
DETAILS+="✅ httpd restart OK\n"
else
echo "⚠️ httpd の再起動に失敗しました"
DETAILS+="❌ httpd restart FAILED\n"
RESULT_OK=0
fi
echo "🔎 httpd (port 8090)"
show_port 8090 || true
echo "▶ nginx config test"
if command -v nginx >/dev/null 2>&1; then
if nginx -t >/dev/null 2>&1; then
DETAILS+="✅ nginx config OK\n"
else
echo "⚠️ nginx 設定チェック失敗"
DETAILS+="❌ nginx config FAILED\n"
RESULT_OK=0
fi
fi
echo "▶ nginx restart"
if $service_cmd nginx restart >/dev/null 2>&1; then
DETAILS+="✅ nginx restart OK\n"
else
echo "⚠️ nginx の再起動に失敗しました"
DETAILS+="❌ nginx restart FAILED\n"
RESULT_OK=0
fi
# Slack通知
if [ $RESULT_OK -eq 1 ]; then
send_slack "🟢 *Web再起動 成功*\n${DETAILS}"
else
send_slack "🔴 *Web再起動 失敗*\n${DETAILS}"
fi
echo "✅ 完了"
exit 0
;;
status)
echo "📊 サービス状態確認"
DETAILS="📊 サービス状態\n"
if $service_cmd httpd status >/dev/null 2>&1; then
DETAILS+="✅ httpd: OK\n"
else
echo "httpd: 利用不可または権限不足"
DETAILS+="⚠️ httpd: NG\n"
fi
if $service_cmd nginx status >/dev/null 2>&1; then
DETAILS+="✅ nginx: OK\n"
else
echo "nginx: 利用不可または権限不足"
DETAILS+="⚠️ nginx: NG\n"
fi
echo "🔎 ポート8090"
if show_port 8090 >/dev/null 2>&1; then
DETAILS+="✅ port 8090 open\n"
else
DETAILS+="⚠️ port 8090 closed\n"
fi
send_slack "$DETAILS"
echo "✅ 完了"
exit 0
;;
*)
usage
;;
esac
実行権限を付与
chmod +x web-restart.sh
2. Macからエイリアスで実行する
Macでは ssh コマンドをエイリアス化 すると一瞬で実行できます。
SSH鍵認証
VPS_HOST=xxxxx.xxx.sakura.ne.jp
VPS_PORT="xxxxxx"
VPS_USER=user_name
SSH_KEY="$HOME/.ssh/id_rsa.xxxxx"
REMOTE_SCRIPT=/home/user_name/bin/web-restart.sh
# ==========================
# 実行
# ==========================
echo "🔐 SSH接続中: ${VPS_USER}@${VPS_HOST}:${VPS_PORT}"
ssh \
-i "${SSH_KEY}" \
-p "${VPS_PORT}" \
-o IdentitiesOnly=yes \
-o BatchMode=yes \
-o ConnectTimeout=10 \
-o HostKeyAlgorithms=+ssh-rsa \
-o PubkeyAcceptedAlgorithms=+ssh-rsa \
"${VPS_USER}@${VPS_HOST}" \
"sudo ${REMOTE_SCRIPT} restart"
echo "✅ VPS Webサービス再起動要求 完了"
がパスワードなしで通る状態にしておきます。
エイリアス設定(.bash)
# さくらVPSスクリプト
alias sakurareboot='sh ~/xxxxxx/local-script-execution.sh'
反映:
source ~/.bash_profile
実行
sakurareboot
👉 Slack に通知が飛べば成功です 🎉
3. iPhone で a-Shell を使って実行する
a-Shell とは
- iOS上で動く本格的なターミナルアプリ
- SSH / shell script 実行が可能
- Filesアプリとは別の独立したDocuments領域を持つ
4. iPhone内に SSH 実行用 script を配置
a-Shell 上で以下の構成にします。
Documents/
└─ scripts/
└─ mobile-script-execution.sh
mobile-script-execution.sh
#!/bin/sh
VPS_HOST=xxxxx.xxx.sakura.ne.jp
VPS_PORT="xxxxxx"
VPS_USER=user_name
SSH_KEY="~/Documents/.ssh/id_rsa.xxxxx"
REMOTE_SCRIPT=/home/user_name/bin/web-restart.sh
# ==========================
# 実行ファイル
# ==========================
echo "🔐 SSH接続中: ${VPS_USER}@${VPS_HOST}:${VPS_PORT}"
ssh \
-i "${SSH_KEY}" \
-p "${VPS_PORT}" \
-o IdentitiesOnly=yes \
-o BatchMode=yes \
-o ConnectTimeout=10 \
-o HostKeyAlgorithms=+ssh-rsa \
-o PubkeyAcceptedAlgorithms=+ssh-rsa \
"${VPS_USER}@${VPS_HOST}" \
"sudo ${REMOTE_SCRIPT} restart"
echo "✅ VPS Webサービス再起動要求 完了"
.sshに配置した認証キーですがa-shellの使い方がよくわからず
コピーしてtouchでファイルを作成して貼り付けました。
これが原因で余計なスペースが入りエラーですすめず・・・
⚠️ 改行や余計なスペースが入らないよう注意
実行権限
chmod +x ~/Documents/scripts/mobile-script-execution.sh
5. ショートカットアプリから a-Shell を実行する
ここも結構なハマりポイントでした。
いろんな記事などでpickFolderなどというコマンドが存在してそれを実行し共有スペースと繋げるどうこうと説明してもらっていたのですがまずコマンドが存在していないしスマホのディレクトリがよくわからなくてやられました。
ポイント
- iOSショートカットの「a-Shell」アクションは
a-Shell内のDocumentsを基準にコマンドを実行する - Filesアプリの「書類」とは直結していない
ショートカットの設定手順
- ショートカットアプリを開く
- 新規ショートカット作成
- アクション追加
- 「a-Shell」→「コマンドを実行」
- シェルコマンドに以下を指定
sh ~/Documents/scripts/mobile-script-execution.sh
- 保存
6. 実行結果
- iPhoneのショートカットをタップ
- a-Shell が起動
- SSH 経由で VPS の script 実行
- サービス再起動
- Slack に結果通知 🎉
外出先でも完全復旧可能になりました。
ハマったポイントまとめ
-
$HOMEが展開されない環境がある
→~を使うと解決 - SSH鍵に余計なスペースや改行が入ると
invalid format - a-Shell の
Documentsは Filesアプリとは別物 -
pickFolderは使えないケースがある(環境依存)
おわりに
- VPS運用は「復旧スピード」が命
- iPhoneからでも即対応できる環境は精神安定剤になる
- a-Shell + ショートカットは想像以上に強力
ちなみにさくらVPSのサーバー監視で直接再起動することもできるんですがそれではやれてる感がでないため
わざわざslackでサーバーアラート通知を受け取りiPhoneショートカットで再起動します。
同じように
「サーバーをスマホから制御したい人」
の参考になれば幸いです。
もちろんchatGPT先生が作ってくれました。
chatGPTを介して作業をすすめたのでそれをまとめてとお願いしました。
実際にできあがったものとそこそこ違いますが・・許容範囲だと思います。