diff options
Diffstat (limited to 'hetzner-admin/run-command.sh')
| -rwxr-xr-x | hetzner-admin/run-command.sh | 41 |
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 ;; |
