From 0a56906b181e5a73aab941dde5ed27bdbe239253 Mon Sep 17 00:00:00 2001 From: Cyrene Date: Sat, 26 Sep 2026 15:48:07 +0800 Subject: [PATCH] test(team-delete): verify DELETE /api/teams/{idx} tears a team down completely Created a scratch team 5, booted all 16 of its containers, snapshotted its footprint, deleted it via the API, and re-snapshotted: before: 16 containers, 1 sidecar, team5_default network, teams/team5 dir after : 0 containers, 0 sidecars, network gone, dir GONE, 34 UFW ports closed, Traefik domain removed, 0 score rows took 102s; the other 4 teams (64 containers, receivers active) were untouched and still at 64/64 SLA. Adds panel/team_footprint.sh (before/after proof of a delete), team_health.sh, watch_load.sh. --- panel/team_footprint.sh | 15 +++++++++++++++ panel/team_health.sh | 12 ++++++++++++ 2 files changed, 27 insertions(+) create mode 100644 panel/team_footprint.sh create mode 100644 panel/team_health.sh diff --git a/panel/team_footprint.sh b/panel/team_footprint.sh new file mode 100644 index 0000000..7cc03ef --- /dev/null +++ b/panel/team_footprint.sh @@ -0,0 +1,15 @@ +#!/usr/bin/env bash +# Team footprint snapshot: everything a team owns, so a delete can be proven +# rather than assumed. Usage: ./team_footprint.sh [label] +set -uo pipefail +IDX=${1:-5} +LABEL=${2:-team$IDX} +echo "=== $LABEL ($IDX) ===" +echo " containers : $(docker ps --format '{{.Names}}' | grep -c "_container_team${IDX}\$")" +echo " sidecars : $(docker ps --format '{{.Names}}' | grep -c "team${IDX}-.*-1\$")" +echo " network : $(docker network ls --format '{{.Name}}' | grep -c "^team${IDX}_default\$")" +echo " volumes : $(docker volume ls --format '{{.Name}}' | grep -c "^team${IDX}")" +echo " dir : $([ -d "/opt/gemastik18-final/teams/team${IDX}" ] && echo present || echo GONE)" +echo " recv unit : $(systemctl is-active "gemastik-receiver-team${IDX}.service" 2>/dev/null || echo GONE)" +echo " ufw rules : $(ufw status | grep -cE " 3${IDX}0[0-9]{2}/tcp| 3${IDX}[1-9][0-9]{2}/tcp")" +echo " traefik : $(grep -c "team${IDX}" /data/coolify/proxy/dynamic/attackdefense-teams.yaml 2>/dev/null || echo 0)" diff --git a/panel/team_health.sh b/panel/team_health.sh new file mode 100644 index 0000000..823c958 --- /dev/null +++ b/panel/team_health.sh @@ -0,0 +1,12 @@ +#!/usr/bin/env bash +# Health of every real team: container count, receiver unit, disk. +set -uo pipefail +cd /opt/gemastik18-final +for i in 1 2 3 4; do + printf "team%s: %2s containers | receiver=%s | team dir=%s\n" "$i" \ + "$(docker ps --format '{{.Names}}' | grep -c "_container_team${i}\$")" \ + "$(systemctl is-active "gemastik-receiver-team${i}.service")" \ + "$([ -d "teams/team${i}" ] && echo ok || echo MISSING)" +done +echo "panel: $(systemctl is-active gemastik-panel)" +df -h / | tail -1