Files
portainer-core/scripts/update-stacks.sh
T

83 lines
2.2 KiB
Bash
Executable File

#!/bin/bash
# Update Docker Stacks Script
# Pull latest images and recreate containers
set -e
STACKS_DIR="/home/jpmschweitzer/Projects/tower-of-joy/stacks"
# Show usage
if [ "$1" = "-h" ] || [ "$1" = "--help" ]; then
echo "Usage: $0 [stack-name]"
echo ""
echo "Update a specific stack or all stacks"
echo ""
echo "Examples:"
echo " $0 portainer # Update only Portainer"
echo " $0 ollama # Update only Ollama"
echo " $0 # Update all stacks (interactive)"
echo ""
echo "Available stacks:"
ls -1 "$STACKS_DIR"/*.yml 2>/dev/null | xargs -n 1 basename | sed 's/.yml$//' | sed 's/^/ - /'
exit 0
fi
# Function to update a stack
update_stack() {
local stack_file=$1
local stack_name=$(basename "$stack_file" .yml)
echo ""
echo "=== Updating $stack_name ==="
# Pull latest images
echo "[1/3] Pulling latest images..."
docker compose -f "$stack_file" pull
# Recreate containers
echo "[2/3] Recreating containers..."
docker compose -f "$stack_file" up -d
# Verify containers running
echo "[3/3] Verifying containers..."
sleep 2
if docker compose -f "$stack_file" ps | grep -q "Up"; then
echo "✅ $stack_name updated successfully"
else
echo "⚠️ $stack_name may have issues, check logs"
fi
}
# If specific stack provided
if [ -n "$1" ]; then
STACK_FILE="$STACKS_DIR/$1.yml"
if [ -f "$STACK_FILE" ]; then
update_stack "$STACK_FILE"
else
echo "❌ Stack not found: $1"
echo "Available stacks:"
ls -1 "$STACKS_DIR"/*.yml 2>/dev/null | xargs -n 1 basename | sed 's/.yml$//' | sed 's/^/ - /'
exit 1
fi
else
# Interactive mode - update all stacks
echo "=== Update All Stacks ==="
echo ""
echo "This will update all deployed stacks to the latest images."
read -p "Continue? (y/N) " -n 1 -r
echo
if [[ $REPLY =~ ^[Yy]$ ]]; then
for stack_file in "$STACKS_DIR"/*.yml; do
if [ -f "$stack_file" ]; then
update_stack "$stack_file"
fi
done
echo ""
echo "=== All Stacks Updated ==="
else
echo "Update cancelled"
exit 0
fi
fi