Mehrere Drupal-Projekte automatisiert per SSH Script + composer aktualisieren
Du hast mehrere Drupal-Versuchsprojekte und willst mit wenig Aufwand dafür sorgen, dass die alle ihre update bekommen. Dazu habe ich ein .sh Script von der KI gestalten lassen, das wirklich praktisch ist. Es macht die gesamte Routine für mehrere Projekte in einem Rutscher.
Seite offline nehmen, drush cr, composer update(s), drush updb, cr, Seite wieder online oder auf Wunsch offline bleiben und am Ende eine Email senden, die einen Report über die erledigte Arbeit erstellt und zusendet.
Das ganze ist ein .sh script (da müssen ein paar Dinge eingehalten sein, die Codierung nur UTF-8, sowie Format Zeilende Unix LF.) Das Script habe ich im Projekt root in einem Ordner Schripts untergebracht und dann muß der Ordner halt beschreib/ausführbar sein. Das Ding arbeitet seit einiger Zeit für mich, man könnte es noch weiter automatisieren und per Cron zu bestimmten Zeiten laufen lassen. Doch soweit wollte ich es nicht ohne Kontrolle laufen lassen.
#!/bin/bash
# === EINSTELLUNGEN === Einfügen : in Zeile 28 deine Emailadresse, in Zeilen 10-12 sowie Z18 deine Projektpfade.
# Pfad zum Composer (entspricht deinem Alias aus "which composer")
COMPOSER_CMD="php -d memory_limit=-1 /var/www/vhosts/dein-serverpfad.com/composer/composer"
# Projektverzeichnisse (alle Projekte)
projekte=(
"/var/www/vhosts/dein-serverpfad.com/projekt-1.com"
"/var/www/vhosts/dein-serverpfad.com/projekt-2.com"
"/var/www/vhosts/dein-serverpfad.com/projekt-3.com"
)
# Testsysteme (diese bleiben im Wartungsmodus - hier als Beispiel das Projekt nr. 3)
testsysteme=(
"/var/www/vhosts/dein-serverpfad.com/projekt-3.com"
)
# Logfile-Verzeichnis & -Datei
logdir="$HOME/logs"
mkdir -p "$logdir"
logfile="$logdir/update_log_$(date +%Y-%m-%d_%H%M).txt"
# E-Mail-Empfänger
mailto="deine-emailadresse.com"
echo "== Starte Update-Vorgang für alle Projekte ==" | tee -a "$logfile"
echo "Logfile: $logfile" | tee -a "$logfile"
echo "" | tee -a "$logfile"
# === HAUPTABLAUF ===
for projekt in "${projekte[@]}"; do
{
echo "--------------------------------------------------"
echo "Projektpfad: $projekt"
echo "--------------------------------------------------"
} | tee -a "$logfile"
cd "$projekt" || {
echo "FEHLER: Konnte Verzeichnis $projekt nicht betreten." | tee -a "$logfile"
continue
}
echo "1. Wartungsmodus aktivieren" | tee -a "$logfile"
vendor/bin/drush state:set system.maintenance_mode 1 >> "$logfile" 2>&1
echo "2. Cache leeren" | tee -a "$logfile"
vendor/bin/drush cr >> "$logfile" 2>&1
echo "3. Composer Update" | tee -a "$logfile"
$COMPOSER_CMD update --with-all-dependencies >> "$logfile" 2>&1
echo "4. Datenbank aktualisieren (drush updb)" | tee -a "$logfile"
vendor/bin/drush updb -y >> "$logfile" 2>&1
echo "5. Cache erneut leeren" | tee -a "$logfile"
vendor/bin/drush cr >> "$logfile" 2>&1
# === Testsystem-Erkennung ===
ist_testsystem=false
for testpfad in "${testsysteme[@]}"; do
if [[ "$projekt" == "$testpfad" ]]; then
ist_testsystem=true
break
fi
done
if [[ "$ist_testsystem" == false ]]; then
echo "6. Wartungsmodus deaktivieren (Produktivprojekt)" | tee -a "$logfile"
vendor/bin/drush state:set system.maintenance_mode 0 >> "$logfile" 2>&1
else
echo "6. Wartungsmodus bleibt aktiv (Testsystem)" | tee -a "$logfile"
fi
echo "✔️ Projekt abgeschlossen: $projekt" | tee -a "$logfile"
echo "" | tee -a "$logfile"
done
# === ABSCHLUSS UND MAILVERSAND ===
echo "== Alle Projekte wurden aktualisiert ==" | tee -a "$logfile"
echo "Sende Logfile an: $mailto" | tee -a "$logfile"
# Nachrichtentext für die E-Mail (nicht überschreiben!)
email_text="$HOME/scripts/email_text.txt"
# Wenn nicht vorhanden, nutze eine Standardnachricht temporär
if [[ ! -f "$email_text" ]]; then
echo "⚠️ Hinweis: $email_text nicht gefunden – verwende Standardtext" | tee -a "$logfile"
email_text="/tmp/default_email_text.txt"
{
echo "Hallo,"
echo ""
echo "deine Drupal-Projekte wurden am $(date '+%d.%m.%Y um %H:%M Uhr') erfolgreich aktualisiert."
echo "Details dazu findest du im angehängten Logfile."
echo ""
echo "Viele Grüße vom Update-Script"
} > "$email_text"
fi
# Mail mit Anhang senden (mailx erforderlich)
if command -v mailx >/dev/null 2>&1; then
mailx -s "Drupal Update Log $(date +%Y-%m-%d)" -a "$logfile" "$mailto" < "$email_text"
else
echo "Hinweis: 'mailx' ist nicht installiert – Log konnte nicht gesendet werden." | tee -a "$logfile"
fi- Anmelden oder Registrieren um Kommentare zu schreiben

Neue Kommentare
vor 21 Stunden 46 Minuten
vor 1 Tag 16 Stunden
vor 2 Tagen 10 Stunden
vor 6 Tagen 20 Stunden
vor 6 Tagen 23 Stunden
vor 1 Woche 4 Tagen
vor 1 Woche 4 Tagen
vor 1 Woche 4 Tagen
vor 4 Wochen 18 Stunden
vor 4 Wochen 1 Tag