From fbe6a54e41657f752074c9a4cbd628b0e57cc64e Mon Sep 17 00:00:00 2001 From: Gmer4Lfe Date: Thu, 25 Jun 2026 21:37:20 -0400 Subject: [PATCH] Fix three image cleanup gaps: weekly restart prune, mode-aware rebuild error, monthly orphan sweep MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit docker_weekly_restart.sh was missing the trailing dangling prune that daily_restart has. docker_update.sh rebuild failure message always named docker_daily_restart.sh regardless of mode. docker_prune_images.sh --all added to monthly — the only scheduled path that removes tagged orphan images. --- Configurations/master.conf | 14 ++++++++++++++ Docker_Essentials/docker_update.sh | 4 +++- Docker_Essentials/docker_weekly_restart.sh | 16 ++++++++++++++++ 3 files changed, 33 insertions(+), 1 deletion(-) diff --git a/Configurations/master.conf b/Configurations/master.conf index 52de01a..3e45f63 100644 --- a/Configurations/master.conf +++ b/Configurations/master.conf @@ -453,6 +453,7 @@ # State file on /boot/config — survives reboots (interval gate independent of uptime gate). MONTHLY_MAINTENANCE_SCRIPTS=( "Docker_Essentials/docker_update.sh --remainder" # update all containers not in daily/weekly managed lists + "Tools/docker_prune_images.sh --all" # remove stopped containers then all unused images (tagged orphans) "Tools/zfs_pool_scrub.sh" # ZFS pool integrity scrub — all pools, skip ZFS_REPORT_IGNORE_POOLS "Tools/smart_long_test.sh" # SMART extended self-test — all drives, sequential ) @@ -691,6 +692,19 @@ FALLBACK_PARTNERSHIP_SUSPEND_AFTER=120 # minutes without active partnership before suspending # 0 = suspend immediately when partnership goes inactive +# ━━━ Play State Sync ━━━ + PLAY_SYNC_ENABLED=true + PLAY_SYNC_REMOTE=true # sync across hosts via Tailscale + PLAY_SYNC_DAYS=90 # days back to check for played items (0 = all time) + PLAY_SYNC_TYPES="Movie,Episode" # Audio excluded — music library too large; favorites handled separately + PLAY_SYNC_FAV_TYPES="MusicArtist,MusicAlbum,Movie,Series" # union sync — never unmarks; Audio tracks future + +# ━━━ Play State Sync — Handback ━━━ +# play_state_sync runs before DNS cutover so users land on current watch state. +# Retried until success — DNS is held until sync completes or retries are exhausted. + PLAY_SYNC_HANDBACK_RETRIES=5 # attempts before giving up and proceeding to DNS cutover + PLAY_SYNC_HANDBACK_RETRY_DELAY=60 # seconds between retry attempts + # ━━━ Failover Test ━━━ # Controlled simulation of a failover event — run manually via fallback_test.sh. FALLBACK_TEST_BLOCK_WAIT=150 # seconds to wait after blocking connectivity diff --git a/Docker_Essentials/docker_update.sh b/Docker_Essentials/docker_update.sh index 033958c..b303953 100755 --- a/Docker_Essentials/docker_update.sh +++ b/Docker_Essentials/docker_update.sh @@ -397,7 +397,9 @@ if [[ ${#UPDATED[@]} -gt 0 ]]; then echo "$ICON_DONE $container rebuilt ✅" REBUILT+=("$container") else - error "Failed to rebuild $container — will be picked up by docker_daily_restart.sh" + _fallback_msg=$([[ "$WEEKLY_MODE" == true ]] && echo "docker_weekly_restart.sh" || ([[ "$REMAINDER_MODE" == true ]] && echo "no follow-up restart" || echo "docker_daily_restart.sh")) + error "Failed to rebuild $container — $_fallback_msg" + unset _fallback_msg notify "$container failed to rebuild after image update on $(hostname)" "Docker Update" "warning" REBUILD_FAILED+=("$container") fi diff --git a/Docker_Essentials/docker_weekly_restart.sh b/Docker_Essentials/docker_weekly_restart.sh index 389224c..9254775 100755 --- a/Docker_Essentials/docker_weekly_restart.sh +++ b/Docker_Essentials/docker_weekly_restart.sh @@ -268,6 +268,21 @@ done END=$(date +%s) +# ============================================================================================== +# ━━━ Prune Old Images ━━━ +# ============================================================================================== +echo "" +echo "━━━ $ICON_SYNC Pruning Dangling Images — $(date '+%Y-%m-%d %H:%M:%S') ━━━" + +if [[ "$DRY_RUN" == true ]]; then + warn "DRY RUN — would prune dangling images" + PRUNED_SUMMARY="(dry run)" +else + PRUNED_OUTPUT=$(docker image prune -f 2>&1) + [[ "$ENABLE_LOGGING" == "true" ]] && echo "$PRUNED_OUTPUT" | sed 's/^/ /' + PRUNED_SUMMARY=$(echo "$PRUNED_OUTPUT" | grep -E "^Total reclaimed" || echo "nothing reclaimed") +fi + # ============================================================================================== # ━━━ Summary ━━━ # ============================================================================================== @@ -280,6 +295,7 @@ if [[ ${#RESTARTED[@]} -gt 0 ]]; then fi [[ ${#SKIPPED[@]} -gt 0 ]] && log "$ICON_NOT_RUNNING Skipped: ${SKIPPED[*]} (were stopped)" [[ ${#FAILED[@]} -gt 0 ]] && echo "$ICON_ERROR Failed: ${FAILED[*]}" +echo "$ICON_SYNC Pruned: ${PRUNED_SUMMARY:-none}" if [[ "$DRY_RUN" == true ]]; then echo "$ICON_WARN Status: DRY RUN — no changes made"