# deploy.sh ## Was ist `deploy.sh` und wofür ist es gedacht? `deploy.sh` ist ein kleines, bewusst simples Hilfsskript, das zwei Dinge standardisiert: 1. Docker-Stacks reproduzierbar aus dem Git-Repo nach `/srv` ausrollen 2. Updates einheitlich durchführen (Images ziehen, Container neu starten) Es ist **kein Deployment-Framework**, kein CI/CD-Ersatz und keine Magie. Es ist ein Werkzeug, das den im Projekt definierten **Mini-Standard** automatisiert. --- ## Typische Anwendungsfälle ### Einzelnen Stack deployen Mit diesem Befehl wird ein einzelner Stack aus dem Repository ausgerollt: ```bash ./scripts/deploy.sh n8n ``` Das Skript macht dabei: - holt den neuesten Stand aus dem Git-Repo (`git pull`) - kopiert `docker-compose.yml` nach `/srv/n8n/` - lässt eine vorhandene `.env` **unangetastet** - zieht Images und startet Container neu - zeigt am Ende den Status Die Docker-Kommandos, die dafür (pro Stack) ausgeführt werden, sind: ```bash docker compose pull docker compose up -d docker compose ps ``` --- ### Alle Stacks aktualisieren ```bash ./scripts/deploy.sh --all ``` Geeignet für regelmäßige Updates oder Wartungsfenster. --- ### Verfügbare Stacks anzeigen ```bash ./scripts/deploy.sh --list ``` --- ## Grundprinzip - **Git ist der Soll-Zustand** - `/srv/` ist der Ist-Zustand - `deploy.sh` bringt beides zusammen - `.env` bleibt immer lokal und wird nie überschrieben --- ## Minimalistische Implementierung Datei: `scripts/deploy.sh` ```bash #!/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." echo "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" if [[ -f "$src/.env.example" && ! -f "$dst/.env" ]]; then echo "NOTE: $dst/.env is missing. Create it from .env.example." 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 "$@" ``` Ausführbar machen: ```bash chmod +x scripts/deploy.sh ``` --- ## Was `deploy.sh` bewusst nicht tut - keine `.env` erzeugen, verändern oder überschreiben - keine Daten- oder Volume-Ordner anfassen - keine Firewall- oder Proxy-Änderungen vornehmen - keine Secrets ins Git schreiben ---