#!/bin/bash # --- Configuration --- QUARTZ_PROJECT_DIR="/home/hoid/projects/digital_garden" # Path to your my-quartz-deployment repo OBSIDIAN_CONTENT_SOURCE="/home/hoid/docker/obsidian/vaults/weeslahw_coppermind/Digital_Garden" LOCAL_CONTENT_TARGET_DIR_NAME="content" # Temp dir for Obsidian content within QUARTZ_PROJECT_DIR LAST_BUILD_TIMESTAMP_FILE=".last_build_content_timestamp" LOG_FILE="${QUARTZ_PROJECT_DIR}/update_quartz_docker.log" # Quartz Framework Source Configuration QUARTZ_FRAMEWORK_DIR_NAME="quartz" # Dir name within QUARTZ_PROJECT_DIR QUARTZ_FRAMEWORK_REPO_URL="https://github.com/jackyzha0/quartz.git" QUARTZ_FRAMEWORK_BRANCH="v4" # Or "main", or a specific tag like "v4.2.5" DOCKER_COMPOSE_CMD="/usr/local/bin/docker-compose" # --- Script Logic --- log_message() { echo "[$(date '+%Y-%m-%d %H:%M:%S')] - $1" | tee -a "$LOG_FILE"; } cd "$QUARTZ_PROJECT_DIR" || { log_message "FATAL: Failed to cd to project directory: ${QUARTZ_PROJECT_DIR}"; exit 1; } log_message "--- Quartz Docker Update Script Started ---" # --- Step 1: Ensure Quartz Framework Source is Present and Updated --- FRAMEWORK_FULL_PATH="${QUARTZ_PROJECT_DIR}/${QUARTZ_FRAMEWORK_DIR_NAME}" if [ -d "${FRAMEWORK_FULL_PATH}/.git" ]; then log_message "Attempting to update Quartz framework source in ./${QUARTZ_FRAMEWORK_DIR_NAME}..." (cd "$FRAMEWORK_FULL_PATH" && git checkout "$QUARTZ_FRAMEWORK_BRANCH" && git fetch origin && git reset --hard "origin/${QUARTZ_FRAMEWORK_BRANCH}") if [ $? -ne 0 ]; then log_message "WARNING: Failed to update Quartz framework source. Using existing version. Consider deleting ./${QUARTZ_FRAMEWORK_DIR_NAME} to force fresh clone." else log_message "Quartz framework source updated successfully to branch/tag ${QUARTZ_FRAMEWORK_BRANCH}." fi else log_message "Cloning Quartz framework (branch/tag: ${QUARTZ_FRAMEWORK_BRANCH}) into ./${QUARTZ_FRAMEWORK_DIR_NAME}..." rm -rf "$FRAMEWORK_FULL_PATH" # Remove if it's a broken/incomplete dir git clone --depth 1 --branch "$QUARTZ_FRAMEWORK_BRANCH" "$QUARTZ_FRAMEWORK_REPO_URL" "$FRAMEWORK_FULL_PATH" if [ $? -ne 0 ]; then log_message "ERROR: Failed to clone Quartz framework source from ${QUARTZ_FRAMEWORK_REPO_URL} (branch: ${QUARTZ_FRAMEWORK_BRANCH})." log_message "--- Script Finished (Error) ---" exit 1 fi fi # --- Step 2: Change Detection for Obsidian Content --- NEEDS_REBUILD=false # ... (Your existing change detection logic for OBSIDIAN_CONTENT_SOURCE vs LAST_BUILD_TIMESTAMP_FILE) ... # (Make sure this logic is sound and sets NEEDS_REBUILD=true correctly) if [ ! -d "$OBSIDIAN_CONTENT_SOURCE" ]; then log_message "ERROR: Obsidian content source directory does not exist: ${OBSIDIAN_CONTENT_SOURCE}" NEEDS_REBUILD=false elif [ ! -f "$LAST_BUILD_TIMESTAMP_FILE" ]; then log_message "No last build timestamp found. Triggering initial rebuild." NEEDS_REBUILD=true else if find "$OBSIDIAN_CONTENT_SOURCE" -type f -newer "$LAST_BUILD_TIMESTAMP_FILE" -print -quit | grep -q .; then log_message "Changes detected in Obsidian content. Triggering rebuild." NEEDS_REBUILD=true else log_message "No changes detected in Obsidian content since last build." fi fi if [ "$NEEDS_REBUILD" = false ]; then log_message "Skipping Docker rebuild and deploy as no content changes were detected." log_message "--- Script Finished (No Changes) ---" exit 0 fi # --- Step 3: Prepare Content Directory for Docker Build --- LOCAL_CONTENT_FULL_PATH="${QUARTZ_PROJECT_DIR}/${LOCAL_CONTENT_TARGET_DIR_NAME}" log_message "Preparing content directory for Docker build: ${LOCAL_CONTENT_FULL_PATH}" rm -rf "${LOCAL_CONTENT_FULL_PATH}" # Remove old temporary content mkdir "${LOCAL_CONTENT_FULL_PATH}" || { log_message "ERROR: Failed to create local content directory."; exit 1; } rsync -a --delete "${OBSIDIAN_CONTENT_SOURCE}/" "${LOCAL_CONTENT_FULL_PATH}/" || { log_message "ERROR: Failed to rsync Obsidian content."; exit 1; } log_message "Obsidian content prepared successfully." # --- Step 4: Docker Build & Deploy using Docker Compose --- # ... (Your existing docker-compose down and docker-compose up sections using $DOCKER_COMPOSE_CMD) ... # (The Dockerfile will now use the ./quartz_framework_source/ and ./content/ directories) log_message "Tearing down existing Docker Compose services (if any)..." COMPOSE_DOWN_OUTPUT_FILE="${QUARTZ_PROJECT_DIR}/compose_down_output.tmp" $DOCKER_COMPOSE_CMD down --remove-orphans --volumes > "$COMPOSE_DOWN_OUTPUT_FILE" 2>&1 DOWN_EXIT_CODE=$? if [ $DOWN_EXIT_CODE -ne 0 ]; then log_message "WARNING: '$DOCKER_COMPOSE_CMD down' failed with exit code $DOWN_EXIT_CODE. Output:" echo "" >> "$LOG_FILE"; cat "$COMPOSE_DOWN_OUTPUT_FILE" >> "$LOG_FILE"; echo "" >> "$LOG_FILE" log_message "Attempting to proceed..." else log_message "'$DOCKER_COMPOSE_CMD down' executed successfully." fi rm -f "$COMPOSE_DOWN_OUTPUT_FILE" log_message "Building and deploying with Docker Compose..." COMPOSE_UP_OUTPUT_FILE="${QUARTZ_PROJECT_DIR}/compose_up_output.tmp" $DOCKER_COMPOSE_CMD up -d --build --remove-orphans > "$COMPOSE_UP_OUTPUT_FILE" 2>&1 UP_EXIT_CODE=$? if [ $UP_EXIT_CODE -ne 0 ]; then log_message "ERROR: '$DOCKER_COMPOSE_CMD up -d --build --remove-orphans' failed with exit code $UP_EXIT_CODE! Output:" echo "" >> "$LOG_FILE"; cat "$COMPOSE_UP_OUTPUT_FILE" >> "$LOG_FILE"; echo "" >> "$LOG_FILE" log_message "--- Script Finished (Error) ---" rm -f "$COMPOSE_UP_OUTPUT_FILE"; exit 1 else log_message "'$DOCKER_COMPOSE_CMD up -d --build --remove-orphans' executed successfully." fi rm -f "$COMPOSE_UP_OUTPUT_FILE" # --- Step 5: Update Timestamp & Cleanup --- touch "$LAST_BUILD_TIMESTAMP_FILE" log_message "Updated last build timestamp." log_message "Cleaning up temporary local content directory ./${LOCAL_CONTENT_TARGET_DIR_NAME}..." rm -rf "${LOCAL_CONTENT_FULL_PATH}" # Note: We are NOT cleaning up ./${QUARTZ_FRAMEWORK_DIR_NAME} here as we want to keep it for the next run to `git pull`. # It's in .gitignore of your `my-quartz-deployment` repo. log_message "--- Script Finished Successfully ---"