#!/bin/bash today=$(date +'%F') stackdir="/etc/komodo/stacks" backupdir="/backups" services=() readarray -d '' services < <(find "$stackdir" -maxdepth 1 -mindepth 1 -type d) # Directories to backup. volumes=( "/var/lib/docker/volumes" "/opt" ) function stopServices() { echo "Stopping services..." for service in "${services[@]}"; do cd "$service" && docker compose stop done } function startServices() { echo "Restarting services..." for service in "${services[@]}"; do cd "$service" && docker compose up -d done } function copyStacks() { echo "Copying stack configuration..." local dir="$1/stacks" mkdir "$dir" for service in "${services[@]}"; do cp -r --parents "$service" "$dir" done } function copyVolumes() { echo "Copying volumes..." local dir="$1/volumes" mkdir "$dir" for volume in "${volumes[@]}"; do # copy only directories. find "$volume" -maxdepth 1 -mindepth 1 -type d -print0 | xargs -0 -I {} cp -r --parents "$volume" "{}" done } function backup() { echo "Creating backup..." tar -cvzf "/$today.tar.gz" "$1" cp -r "/$today.tar.gz" "$backupdir" # Cleanup temporary files. rm -rf "$1" "/$today.tar.gz" } function cleanBackups() { echo "Removing old backups..." # Remove backups older than 7 days. find "$backupdir" -maxdepth 1 -mindepth 1 -name "*.tar.gz" -mtime +7 -print0 | xargs -0 -I {} rm -rf "{}" } function main() { # stop services. stopServices # Create a temporary directory. local temp="/$today" mkdir "$temp" # copy stack configuration. copyStacks "$temp" # copy stack configuration. copyVolumes "$temp" # Create a tar to backup. backup "$temp" # Restart services. startServices # Remove backups older than 7 days. cleanBackups } main "$@"