summaryrefslogtreecommitdiff
path: root/hetzner-admin/run-command.sh
diff options
context:
space:
mode:
Diffstat (limited to 'hetzner-admin/run-command.sh')
-rwxr-xr-xhetzner-admin/run-command.sh41
1 files changed, 41 insertions, 0 deletions
diff --git a/hetzner-admin/run-command.sh b/hetzner-admin/run-command.sh
index 0ed9fe3..c5b8ea5 100755
--- a/hetzner-admin/run-command.sh
+++ b/hetzner-admin/run-command.sh
@@ -2,7 +2,48 @@
# SSH authorized_keys の command= から呼ばれる。$SSH_ORIGINAL_COMMAND をホワイトリストで検証する。
set -e
+# 管理画面から停止・起動できるサービス(名前は status/targets.txt の名前に合わせる)
+# Caddy / hetzner-admin / status は止めると管理画面に戻れなくなるので対象外
+SERVICES="golive whoisband blog todo git vpn ntfy mail"
+service_compose() {
+ case "$1" in
+ golive) echo /app/tokyo-livehouse-events/docker-compose.yml ;;
+ whoisband) echo /app/whois-band/docker-compose.yml ;;
+ blog) echo /app/microblog/docker-compose.yml ;;
+ todo) echo /app/todo/docker-compose.yml ;;
+ git) echo /app/infra/cgit/docker-compose.yml ;;
+ vpn) echo /app/infra/vpn/docker-compose.yml ;;
+ ntfy) echo /app/infra/ntfy/docker-compose.yml ;;
+ mail) echo /app/infra/mail/docker-compose.yml ;;
+ *) return 1 ;;
+ esac
+}
+
+# 管理画面で停止したサービスの一覧。status-app が読み、DOWN ではなく STOPPED と表示する
+STOPPED_FILE=/app/infra/status/stopped.txt
+
case "$SSH_ORIGINAL_COMMAND" in
+ "services")
+ touch "$STOPPED_FILE"
+ for name in $SERVICES; do
+ running=$(docker compose -f "$(service_compose "$name")" ps -q --status running 2>/dev/null | wc -l)
+ if [ "$running" -gt 0 ]; then state=running; else state=stopped; fi
+ echo "$name $state"
+ done
+ ;;
+ "stop "*|"start "*)
+ action="${SSH_ORIGINAL_COMMAND%% *}"
+ name="${SSH_ORIGINAL_COMMAND#* }"
+ compose=$(service_compose "$name") || { echo "Unknown service: $name" >&2; exit 1; }
+ touch "$STOPPED_FILE"
+ if [ "$action" = stop ]; then
+ grep -qx "$name" "$STOPPED_FILE" || echo "$name" >> "$STOPPED_FILE"
+ docker compose -f "$compose" stop 2>&1
+ else
+ sed -i "/^${name}\$/d" "$STOPPED_FILE"
+ docker compose -f "$compose" up -d 2>&1
+ fi
+ ;;
"docker ps")
exec docker ps
;;