From cce072dad3bd8a18e10f3f0a563cb2b3df20855e Mon Sep 17 00:00:00 2001 From: Martin Date: Sun, 14 Dec 2025 19:47:49 +0100 Subject: [PATCH] =?UTF-8?q?index=20ge=C3=A4ndert?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- readme.md | 161 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 161 insertions(+) create mode 100644 readme.md diff --git a/readme.md b/readme.md new file mode 100644 index 0000000..bd655e6 --- /dev/null +++ b/readme.md @@ -0,0 +1,161 @@ +# 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 + +---