Sanitized mirror from private repository - 2026-04-05 08:31:50 UTC
This commit is contained in:
135
scripts/portainer-fix-v2.sh
Executable file
135
scripts/portainer-fix-v2.sh
Executable file
@@ -0,0 +1,135 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Emergency Watchtower Fix v2 - Correct ntfy URL format
|
||||
# Based on Shoutrrr documentation for ntfy service
|
||||
|
||||
API_KEY=REDACTED_API_KEY
|
||||
BASE_URL="http://vishinator.synology.me:10000"
|
||||
|
||||
echo "🚨 EMERGENCY FIX v2: Correcting ntfy notification URL format"
|
||||
echo "============================================================="
|
||||
|
||||
# Function to fix Watchtower with correct ntfy URL
|
||||
fix_watchtower_v2() {
|
||||
local endpoint_id=$1
|
||||
local endpoint_name=$2
|
||||
|
||||
echo ""
|
||||
echo "🔧 Fixing Watchtower on: $endpoint_name (ID: $endpoint_id)"
|
||||
echo "--------------------------------------------------------"
|
||||
|
||||
# Get current Watchtower container
|
||||
container_info=$(curl -s -H "X-API-Key: $API_KEY" \
|
||||
"$BASE_URL/api/endpoints/$endpoint_id/docker/containers/json?all=true" | \
|
||||
jq -r '.[] | select(.Names[]? | contains("watchtower")) | "\(.Id) \(.Names[0]) \(.State)"')
|
||||
|
||||
if [ -z "$container_info" ]; then
|
||||
echo "❌ No Watchtower container found"
|
||||
return 1
|
||||
fi
|
||||
|
||||
read container_id container_name state <<< "$container_info"
|
||||
echo "📍 Found container: $container_name ($container_id) - State: $state"
|
||||
|
||||
# Stop and remove current container
|
||||
echo "🛑 Stopping and removing current container..."
|
||||
curl -s -X POST -H "X-API-Key: $API_KEY" \
|
||||
"$BASE_URL/api/endpoints/$endpoint_id/docker/containers/$container_id/stop" > /dev/null
|
||||
|
||||
sleep 2
|
||||
|
||||
curl -s -X DELETE -H "X-API-Key: $API_KEY" \
|
||||
"$BASE_URL/api/endpoints/$endpoint_id/docker/containers/$container_id?force=true" > /dev/null
|
||||
|
||||
sleep 2
|
||||
|
||||
# Use correct ntfy URL format - no insecure parameter, just HTTP scheme
|
||||
# For local HTTP ntfy servers, use http:// in the host part
|
||||
if [ "$endpoint_name" = "Atlantis" ] || [ "$endpoint_name" = "Calypso" ]; then
|
||||
# For local ntfy servers, we need to use the generic HTTP format
|
||||
# Since ntfy:// defaults to HTTPS, we'll use generic:// for HTTP
|
||||
NOTIFICATION_URL="generic+http://localhost:8081/updates"
|
||||
else
|
||||
NOTIFICATION_URL="ntfy://ntfy.vish.gg/REDACTED_NTFY_TOPIC"
|
||||
fi
|
||||
|
||||
echo "🔗 Using notification URL: $NOTIFICATION_URL"
|
||||
|
||||
# Create new container with corrected URL
|
||||
create_response=$(curl -s -X POST -H "X-API-Key: $API_KEY" \
|
||||
-H "Content-Type: application/json" \
|
||||
"$BASE_URL/api/endpoints/$endpoint_id/docker/containers/create?name=watchtower" \
|
||||
-d "{
|
||||
\"Image\": \"containrrr/watchtower:latest\",
|
||||
\"Env\": [
|
||||
\"WATCHTOWER_CLEANUP=true\",
|
||||
\"WATCHTOWER_INCLUDE_RESTARTING=true\",
|
||||
\"WATCHTOWER_INCLUDE_STOPPED=true\",
|
||||
\"WATCHTOWER_REVIVE_STOPPED=false\",
|
||||
\"WATCHTOWER_POLL_INTERVAL=3600\",
|
||||
\"WATCHTOWER_TIMEOUT=10s\",
|
||||
\"WATCHTOWER_HTTP_API_UPDATE=true\",
|
||||
\"WATCHTOWER_HTTP_API_TOKEN="REDACTED_HTTP_TOKEN"\",
|
||||
\"WATCHTOWER_NOTIFICATIONS=shoutrrr\",
|
||||
\"WATCHTOWER_NOTIFICATION_URL=$NOTIFICATION_URL\",
|
||||
\"TZ=America/Los_Angeles\"
|
||||
],
|
||||
\"HostConfig\": {
|
||||
\"Binds\": [\"/var/run/docker.sock:/var/run/docker.sock\"],
|
||||
\"RestartPolicy\": {\"Name\": \"always\"},
|
||||
\"PortBindings\": {\"8080/tcp\": [{\"HostPort\": \"8080\"}]}
|
||||
}
|
||||
}")
|
||||
|
||||
new_container_id=$(echo "$create_response" | jq -r '.Id')
|
||||
|
||||
if [ "$new_container_id" != "null" ] && [ -n "$new_container_id" ]; then
|
||||
echo "✅ Created new container: ${new_container_id:0:12}"
|
||||
|
||||
# Start the container
|
||||
echo "▶️ Starting new Watchtower container..."
|
||||
start_response=$(curl -s -X POST -H "X-API-Key: $API_KEY" \
|
||||
"$BASE_URL/api/endpoints/$endpoint_id/docker/containers/$new_container_id/start")
|
||||
|
||||
sleep 5
|
||||
|
||||
# Check status
|
||||
container_status=$(curl -s -H "X-API-Key: $API_KEY" \
|
||||
"$BASE_URL/api/endpoints/$endpoint_id/docker/containers/$new_container_id/json" | \
|
||||
jq -r '.State.Status')
|
||||
|
||||
echo "📊 Container status: $container_status"
|
||||
|
||||
if [ "$container_status" = "running" ]; then
|
||||
echo "🟢 SUCCESS: Watchtower is running!"
|
||||
|
||||
# Check logs for any errors
|
||||
echo "📋 Recent logs:"
|
||||
curl -s -H "X-API-Key: $API_KEY" \
|
||||
"$BASE_URL/api/endpoints/$endpoint_id/docker/containers/$new_container_id/logs?stdout=true&stderr=true&tail=3" | \
|
||||
sed 's/^.......//g' | sed 's/^/ /'
|
||||
else
|
||||
echo "🔴 Issue: Container status is $container_status"
|
||||
echo "📋 Logs for debugging:"
|
||||
curl -s -H "X-API-Key: $API_KEY" \
|
||||
"$BASE_URL/api/endpoints/$endpoint_id/docker/containers/$new_container_id/logs?stdout=true&stderr=true&tail=5" | \
|
||||
sed 's/^.......//g' | sed 's/^/ /'
|
||||
fi
|
||||
else
|
||||
echo "🔴 FAILED: Could not create container"
|
||||
echo "API Response: $create_response"
|
||||
fi
|
||||
}
|
||||
|
||||
# Fix both endpoints
|
||||
fix_watchtower_v2 2 "Atlantis"
|
||||
fix_watchtower_v2 443397 "Calypso"
|
||||
|
||||
echo ""
|
||||
echo "============================================================="
|
||||
echo "🎯 Fix v2 complete! Checking final status..."
|
||||
echo "============================================================="
|
||||
|
||||
# Quick status check
|
||||
sleep 3
|
||||
./scripts/check-watchtower-status.sh
|
||||
Reference in New Issue
Block a user