Go to file
2025-12-14 19:47:49 +01:00
apache-plesk Apache reverse proxy Config 2025-12-14 15:03:15 +01:00
scripts scripts/README.md aktualisiert 2025-12-14 15:19:24 +00:00
stacks Add stack structure and compose files 2025-12-14 14:22:40 +01:00
.gitignore Format angepasst 2025-12-14 15:05:27 +01:00
index.md index geändert 2025-12-14 19:46:29 +01:00
readme.md index geändert 2025-12-14 19:47:49 +01:00

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:

./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:

docker compose pull
docker compose up -d
docker compose ps

Alle Stacks aktualisieren

./scripts/deploy.sh --all

Geeignet für regelmäßige Updates oder Wartungsfenster.


Verfügbare Stacks anzeigen

./scripts/deploy.sh --list

Grundprinzip

  • Git ist der Soll-Zustand
  • /srv/<stack> ist der Ist-Zustand
  • deploy.sh bringt beides zusammen
  • .env bleibt immer lokal und wird nie überschrieben

Minimalistische Implementierung

Datei: scripts/deploy.sh

#!/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 <stackname>        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:

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