From 3edabc4d374b25263082a4597bb9c7c90a0cc7ef Mon Sep 17 00:00:00 2001 From: Travis Vasceannie Date: Sat, 22 Nov 2025 21:36:53 +0000 Subject: [PATCH] x --- swarm.sh | 94 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 94 insertions(+) create mode 100755 swarm.sh diff --git a/swarm.sh b/swarm.sh new file mode 100755 index 0000000..7b2bf96 --- /dev/null +++ b/swarm.sh @@ -0,0 +1,94 @@ +#!/usr/bin/env bash +set -euo pipefail + +OUT_DIR=${1:-swarm-snapshot-$(date +%Y%m%d-%H%M%S)} +mkdir -p "$OUT_DIR"/{cluster,nodes,services,stacks,networks,volumes,configs,secrets} + +echo "Writing snapshot to: $OUT_DIR" + +######################## +# Cluster-level info # +######################## + +docker info --format '{{json .}}' | jq '.' > "$OUT_DIR/cluster/docker-info.json" +docker info --format '{{json .Swarm}}' | jq '.' > "$OUT_DIR/cluster/swarm.json" + +######################## +# Nodes # +######################## + +docker node ls -q | while read -r id; do + echo "Node: $id" + docker node inspect "$id" | jq '.' > "$OUT_DIR/nodes/$id.json" +done + +######################## +# Services # +######################## + +docker service ls -q | while read -r id; do + name="$(docker service inspect --format '{{.Spec.Name}}' "$id")" + echo "Service: $name" + docker service inspect "$id" | jq '.' > "$OUT_DIR/services/${name}.json" +done + +######################## +# Stacks # +######################## + +for stack in $(docker stack ls --format '{{.Name}}'); do + echo "Stack: $stack" + mkdir -p "$OUT_DIR/stacks/$stack" + + docker stack services "$stack" --format '{{json .}}' \ + | jq -s '.' > "$OUT_DIR/stacks/$stack/services.json" + + docker stack ps "$stack" --format '{{json .}}' \ + | jq -s '.' > "$OUT_DIR/stacks/$stack/tasks.json" + + # If available, this reconstructs the original compose-ish config + docker stack config "$stack" \ + > "$OUT_DIR/stacks/$stack/stack-config.yml" 2>/dev/null || true +done + +######################## +# Networks # +######################## + +docker network ls --format '{{.ID}} {{.Name}}' \ +| while read -r id name; do + echo "Network: $name" + docker network inspect "$id" | jq '.' > "$OUT_DIR/networks/${name}.json" +done + +######################## +# Volumes # +######################## + +docker volume ls --format '{{.Name}}' \ +| while read -r vol; do + echo "Volume: $vol" + docker volume inspect "$vol" | jq '.' > "$OUT_DIR/volumes/${vol}.json" +done + +######################## +# Configs # +######################## + +docker config ls -q | while read -r id; do + name="$(docker config inspect --format '{{.Spec.Name}}' "$id")" + echo "Config: $name" + docker config inspect "$id" | jq '.' > "$OUT_DIR/configs/${name}.json" +done + +######################## +# Secrets (metadata) # +######################## + +docker secret ls -q | while read -r id; do + name="$(docker secret inspect --format '{{.Spec.Name}}' "$id")" + echo "Secret: $name (metadata only)" + docker secret inspect "$id" | jq '.' > "$OUT_DIR/secrets/${name}.json" +done + +echo "Done. Snapshot in: $OUT_DIR"