#!/bin/bash # Phase 2 — Recreate overlay networks + redeploy stacks # Only runs on whichever node holds swarm leadership # Must wait for all 3 nodes to complete phase1 first LOG=/volume1/docker/mtu_migration/phase2.log exec >> "$LOG" 2>&1 echo "[$(date)] Phase2 starting — waiting for all nodes phase1.done" TIMEOUT=600 ELAPSED=0 while true; do ALL_DONE=true for node in docker-2 docker-3; do [ ! -f "/volume1/docker/mtu_migration/${node}_phase1.done" ] && ALL_DONE=false done $ALL_DONE && break sleep 5; ELAPSED=$((ELAPSED+5)) if [ "$ELAPSED" -ge "$TIMEOUT" ]; then echo "[$(date)] TIMEOUT waiting for phase1 — aborting phase2" exit 1 fi done echo "[$(date)] All phase1 done files present — checking swarm quorum" SWARM_READY=false for i in $(seq 1 24); do STATUS=$(docker node ls 2>/dev/null | grep -c "Ready") echo "[$(date)] Swarm ready nodes: $STATUS" [ "$STATUS" -ge 2 ] && SWARM_READY=true && break sleep 10 done if ! $SWARM_READY; then echo "[$(date)] Swarm not ready after 4min — aborting phase2" exit 1 fi echo "[$(date)] Swarm healthy — redeploying stacks" CD=/volume1/docker/compose-files for stack in traefik auth postgresql; do f="$CD/${stack}.yaml" [ -f "$f" ] || { echo "[$(date)] WARN: $f not found, skipping"; continue; } echo "[$(date)] Redeploying stack: $stack" docker stack deploy -c "$f" "$stack" 2>&1 echo "[$(date)] $stack deploy exit: $?" sleep 5 done echo "[$(date)] Verifying overlay MTUs:" docker network ls --filter driver=overlay -q | \ xargs docker network inspect --format '{{.Name}} {{json .Options}}' 2>/dev/null echo "[$(date)] Phase2 COMPLETE" touch /volume1/docker/mtu_migration/phase2.done