Files
home/Projects/kompose/hooks.sh.template
2025-10-11 10:24:25 +02:00

341 lines
9.5 KiB
Bash

#!/usr/bin/env bash
# Template hooks file for Kompose stacks
# Copy this file to your stack directory and uncomment/modify the hooks you need
#
# Available hooks:
# - Database: pre_db_export, post_db_export, pre_db_import, post_db_import
# - Docker Compose: pre_<command>, post_<command> for any docker compose command
#
# Hooks receive command arguments as parameters: $1, $2, etc., or $@ for all args
# Return 0 for success, 1 for failure
# Post-command hooks only execute if the command succeeds
# ================================================================================
# DATABASE HOOKS
# ================================================================================
# Execute before database export
# Use case: Export schemas, prepare data, stop write operations
#hook_pre_db_export() {
# echo " Running pre-export tasks..."
# # Example: Export application schema
# # docker exec ${COMPOSE_PROJECT_NAME}_app npm run schema:export
# return 0
#}
# Execute after database export
# Arguments: $1 = path to the dump file
# Use case: Compress dumps, upload to S3, send notifications
#hook_post_db_export() {
# local dump_file="$1"
# echo " Running post-export tasks..."
# echo " Dump file: $dump_file"
# # Example: Compress dump
# # gzip "$dump_file"
# return 0
#}
# Execute before database import
# Arguments: $1 = path to the dump file
# Use case: Prepare environment, load schemas, clear caches
#hook_pre_db_import() {
# local dump_file="$1"
# echo " Running pre-import tasks..."
# echo " Importing from: $dump_file"
# # Example: Apply schema migrations
# # docker exec ${COMPOSE_PROJECT_NAME}_app npm run schema:apply
# return 0
#}
# Execute after database import
# Arguments: $1 = path to the dump file
# Use case: Restart services, rebuild indexes, warm caches
#hook_post_db_import() {
# local dump_file="$1"
# echo " Running post-import tasks..."
# # Example: Restart application
# # docker restart ${COMPOSE_PROJECT_NAME}_app
# return 0
#}
# ================================================================================
# DOCKER COMPOSE COMMAND HOOKS
# ================================================================================
# Execute before 'docker compose up'
# Arguments: $@ = command arguments (e.g., "up", "-d", "--build")
# Use case: Pre-flight checks, create directories, pull secrets
#hook_pre_up() {
# local -a args=("$@")
# echo " Running pre-up checks..."
#
# # Example: Create required directories
# if [[ ! -d "./uploads" ]]; then
# echo " Creating uploads directory..."
# mkdir -p ./uploads
# fi
#
# # Example: Check for required environment variables
# if [[ -z "${API_KEY}" ]]; then
# echo " ERROR: API_KEY not set"
# return 1
# fi
#
# return 0
#}
# Execute after 'docker compose up'
# Arguments: $@ = command arguments
# Use case: Health checks, initialization, warm caches
#hook_post_up() {
# local -a args=("$@")
# echo " Running post-up tasks..."
#
# # Example: Wait for services to be healthy
# echo " Waiting for services to be healthy..."
# sleep 5
#
# # Example: Initialize application
# # docker exec ${COMPOSE_PROJECT_NAME}_app npm run init
#
# return 0
#}
# Execute before 'docker compose down'
# Arguments: $@ = command arguments
# Use case: Graceful shutdown, backups, save state
#hook_pre_down() {
# local -a args=("$@")
# echo " Running pre-down tasks..."
#
# # Example: Create backup before shutdown
# # ./backup.sh
#
# # Example: Check for --volumes flag
# if [[ " ${args[*]} " =~ " --volumes " ]] || [[ " ${args[*]} " =~ " -v " ]]; then
# echo " WARNING: Volumes will be removed!"
# # You could add a confirmation prompt here
# fi
#
# return 0
#}
# Execute after 'docker compose down'
# Arguments: $@ = command arguments
# Use case: Cleanup, notifications
#hook_post_down() {
# local -a args=("$@")
# echo " Running post-down tasks..."
#
# # Example: Send notification
# # curl -X POST https://hooks.slack.com/... -d '{"text":"Stack stopped"}'
#
# return 0
#}
# Execute before 'docker compose start'
# Arguments: $@ = command arguments
#hook_pre_start() {
# local -a args=("$@")
# echo " Running pre-start tasks..."
# return 0
#}
# Execute after 'docker compose start'
# Arguments: $@ = command arguments
#hook_post_start() {
# local -a args=("$@")
# echo " Running post-start tasks..."
#
# # Example: Verify services are running
# # docker compose ps
#
# return 0
#}
# Execute before 'docker compose stop'
# Arguments: $@ = command arguments
#hook_pre_stop() {
# local -a args=("$@")
# echo " Running pre-stop tasks..."
#
# # Example: Flush pending writes
# # docker exec ${COMPOSE_PROJECT_NAME}_app npm run flush
#
# return 0
#}
# Execute after 'docker compose stop'
# Arguments: $@ = command arguments
#hook_post_stop() {
# local -a args=("$@")
# echo " Running post-stop tasks..."
# return 0
#}
# Execute before 'docker compose restart'
# Arguments: $@ = command arguments
#hook_pre_restart() {
# local -a args=("$@")
# echo " Running pre-restart tasks..."
#
# # Example: Clear caches before restart
# # docker exec ${COMPOSE_PROJECT_NAME}_redis redis-cli FLUSHALL
#
# return 0
#}
# Execute after 'docker compose restart'
# Arguments: $@ = command arguments
#hook_post_restart() {
# local -a args=("$@")
# echo " Running post-restart tasks..."
#
# # Example: Verify services are healthy
# # ./health-check.sh
#
# return 0
#}
# Execute before 'docker compose build'
# Arguments: $@ = command arguments
#hook_pre_build() {
# local -a args=("$@")
# echo " Running pre-build tasks..."
#
# # Example: Run code generation
# # npm run generate
#
# # Example: Backup current image
# # docker tag ${COMPOSE_PROJECT_NAME}_app:latest ${COMPOSE_PROJECT_NAME}_app:backup
#
# return 0
#}
# Execute after 'docker compose build'
# Arguments: $@ = command arguments
#hook_post_build() {
# local -a args=("$@")
# echo " Running post-build tasks..."
#
# # Example: Tag and push image
# # local tag="$(date +%Y%m%d-%H%M%S)"
# # docker tag ${COMPOSE_PROJECT_NAME}_app:latest registry.example.com/app:$tag
# # docker push registry.example.com/app:$tag
#
# return 0
#}
# Execute before 'docker compose pull'
# Arguments: $@ = command arguments
#hook_pre_pull() {
# local -a args=("$@")
# echo " Running pre-pull tasks..."
#
# # Example: Check registry availability
# # curl -f https://registry.example.com/v2/ > /dev/null
#
# return 0
#}
# Execute after 'docker compose pull'
# Arguments: $@ = command arguments
#hook_post_pull() {
# local -a args=("$@")
# echo " Running post-pull tasks..."
#
# # Example: Verify pulled images
# # docker images | grep ${COMPOSE_PROJECT_NAME}
#
# return 0
#}
# Execute before 'docker compose logs'
# Arguments: $@ = command arguments
#hook_pre_logs() {
# local -a args=("$@")
# # Usually not needed, but available if you need it
# return 0
#}
# Execute after 'docker compose logs'
# Arguments: $@ = command arguments
#hook_post_logs() {
# local -a args=("$@")
# # Usually not needed, but available if you need it
# return 0
#}
# ================================================================================
# OTHER DOCKER COMPOSE COMMANDS
# ================================================================================
# The following commands also support pre/post hooks:
# - ps, exec, run, create, kill, pause, unpause, port, top
#
# Example:
#hook_pre_ps() {
# echo " Listing containers..."
# return 0
#}
# ================================================================================
# UTILITY FUNCTIONS (Optional)
# ================================================================================
# Helper function to check if a container is running
#is_container_running() {
# local container_name="$1"
# docker ps --format '{{.Names}}' | grep -q "^${container_name}$"
#}
# Helper function to wait for a container to be healthy
#wait_for_healthy() {
# local container_name="$1"
# local max_attempts="${2:-30}"
# local attempt=0
#
# while [[ $attempt -lt $max_attempts ]]; do
# if docker inspect --format='{{.State.Health.Status}}' "$container_name" 2>/dev/null | grep -q "healthy"; then
# return 0
# fi
# sleep 1
# ((attempt++))
# done
#
# return 1
#}
# Helper function to send notifications
#send_notification() {
# local message="$1"
# # Implement your notification logic here (Slack, Discord, email, etc.)
# # curl -X POST https://hooks.slack.com/... -d "{\"text\":\"$message\"}"
# return 0
#}
# ================================================================================
# NOTES
# ================================================================================
#
# Environment Variables Available:
# - $SCRIPT_DIR: Root kompose directory
# - $stack: Current stack name
# - All variables from root .env and stack .env files
# - CLI overrides from -e flags
#
# Best Practices:
# - Return 0 for success, 1 for failure
# - Use indented output: echo " Message"
# - Make non-critical operations return 0
# - Check container status before docker exec
# - Test with --dry-run first
# - Add timeouts for long operations
# - Document your hooks with comments
#
# Testing:
# - Dry run: ./kompose.sh stack command --dry-run
# - Check syntax: bash -n hooks.sh
# - Debug: Add 'set -x' at the top of your hook function
#