#!/usr/bin/env bash set -euo pipefail REPO_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" STACKS_DIR="$REPO_ROOT/stacks" TARGET_ROOT="/srv" usage() { echo "Usage:" echo " $0 Deploy one stack (e.g. n8n)" echo " $0 --all Deploy all stacks" echo " $0 --list List stacks" exit 1 } list_stacks() { find "$STACKS_DIR" -maxdepth 1 -mindepth 1 -type d -printf "%f\n" | sort } deploy_stack() { local stack="$1" local src="$STACKS_DIR/$stack" local dst="$TARGET_ROOT/$stack" if [[ ! -d "$src" ]]; then echo "ERROR: Stack '$stack' not found in $STACKS_DIR" exit 2 fi if [[ ! -d "$dst" ]]; then echo "ERROR: Target dir '$dst' does not exist. Create it first:" echo " sudo mkdir -p $dst && sudo chown -R $USER:$USER $dst" exit 3 fi echo "==> Deploying stack: $stack" cp "$src/docker-compose.yml" "$dst/docker-compose.yml" # safety hint only if [[ -f "$src/.env.example" && ! -f "$dst/.env" ]]; then echo "NOTE: $dst/.env is missing. Create it from .env.example before starting." fi ( cd "$dst" && docker compose pull && docker compose up -d ) ( cd "$dst" && docker compose ps ) echo } main() { cd "$REPO_ROOT" git pull --ff-only if [[ "${1:-}" == "--list" ]]; then list_stacks exit 0 fi if [[ "${1:-}" == "--all" ]]; then while read -r s; do deploy_stack "$s" done < <(list_stacks) exit 0 fi [[ $# -eq 1 ]] || usage deploy_stack "$1" } main "$@"