| apache-plesk | ||
| scripts | ||
| stacks | ||
| .gitignore | ||
| readme.md | ||
deploy.sh
Was ist deploy.sh und wofür ist es gedacht?
deploy.sh ist ein kleines, bewusst simples Hilfsskript, das zwei Dinge standardisiert:
- Docker-Stacks reproduzierbar aus dem Git-Repo nach
/srvausrollen - 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.ymlnach/srv/n8n/ - lässt eine vorhandene
.envunangetastet - 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-Zustanddeploy.shbringt beides zusammen.envbleibt 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
.enverzeugen, verändern oder überschreiben - keine Daten- oder Volume-Ordner anfassen
- keine Firewall- oder Proxy-Änderungen vornehmen
- keine Secrets ins Git schreiben