#!/usr/bin/env bash # post-deploy.sh — set up host-side logrotate and healthcheck cron for a # production Cyclone deploy. Run once after `docker compose up -d`. set -euo pipefail LOG_DIR="/var/log/cyclone" HEALTHCHECK_URL="${CYCLONE_HEALTHCHECK_URL:-http://localhost:8080/api/healthz}" HEALTHCHECK_EMAIL="${CYCLONE_HEALTHCHECK_EMAIL:-root}" CRON_USER="${CYCLONE_CRON_USER:-root}" if [[ $EUID -ne 0 ]]; then echo "ERROR: post-deploy.sh must run as root." >&2 exit 1 fi # 1. Logrotate — keeps 14 days of JSON logs compressed. cat > /etc/logrotate.d/cyclone <<'LOGROTATE' /var/log/cyclone/*.log { daily rotate 14 compress delaycompress missingok notifempty copytruncate dateext dateformat -%Y%m%d } LOGROTATE mkdir -p "${LOG_DIR}" chmod 755 "${LOG_DIR}" # 2. Healthcheck cron — every 5 minutes, email if down. CRON_LINE="*/5 * * * * curl -fsS --max-time 10 ${HEALTHCHECK_URL} >/dev/null 2>&1 || echo 'Cyclone DOWN at \$(date)' | mail -s 'Cyclone healthz FAIL' ${HEALTHCHECK_EMAIL}" TMP_CRON="$(mktemp)" crontab -u "${CRON_USER}" -l 2>/dev/null > "${TMP_CRON}" || true # Remove any existing cyclone healthcheck line, then re-add. grep -v -F "Cyclone healthz" "${TMP_CRON}" > "${TMP_CRON}.new" || cp "${TMP_CRON}" "${TMP_CRON}.new" echo "${CRON_LINE}" >> "${TMP_CRON}.new" crontab -u "${CRON_USER}" "${TMP_CRON}.new" rm -f "${TMP_CRON}" "${TMP_CRON}.new" cat <