#!/bin/bash # Install a daily cron job to restart the docker-compose stack. # Non-interactive; idempotent update of user's crontab. # Usage: # INTERVAL="15 3 * * *" ./install_daily_restart_cron.sh # Defaults to 03:15 daily if INTERVAL not provided. set -euo pipefail REPO_DIR="$(cd "$(dirname "$0")" && pwd)" SCRIPT_PATH="$REPO_DIR/restart_containers.sh" INTERVAL_CRON=${INTERVAL:-"15 3 * * *"} if [ ! -x "$SCRIPT_PATH" ]; then echo "Making restart_containers.sh executable" chmod +x "$SCRIPT_PATH" fi if ! command -v crontab >/dev/null 2>&1; then echo "Error: crontab not found on this system." exit 1 fi # Prefer docker compose; fallback to docker-compose is handled inside the script # Compose file to use (default docker-compose.yml). Override via COMPOSE_FILE env COMPOSE_FILE_PATH=${COMPOSE_FILE:-docker-compose.yml} LOG_FILE="$REPO_DIR/logs/cron_restart.log" mkdir -p "$(dirname "$LOG_FILE")" # Build the cron line; ensure PATH for docker is available CRON_LINE="$INTERVAL_CRON PATH=/usr/local/bin:/usr/bin:/bin /bin/bash -lc 'COMPOSE_FILE=$COMPOSE_FILE_PATH "$SCRIPT_PATH" >> "$LOG_FILE" 2>&1'" # Install or update crontab entry EXISTING_CRON="$(mktemp)" trap 'rm -f "$EXISTING_CRON"' EXIT crontab -l > "$EXISTING_CRON" 2>/dev/null || true # Remove any previous lines referencing restart_containers.sh grep -v "$SCRIPT_PATH" "$EXISTING_CRON" > "$EXISTING_CRON.cleaned" || true mv "$EXISTING_CRON.cleaned" "$EXISTING_CRON" echo "$CRON_LINE" >> "$EXISTING_CRON" crontab "$EXISTING_CRON" echo "Installed cron entry: $CRON_LINE" echo "Logs will be written to: $LOG_FILE"