Ich habe bestimmt 50 Mal das Gleiche gemacht:
- Verzeichnis anlegen
- Apache konfigurieren
/etc/hostsanpassen- Datenbank erstellen
- WordPress installieren
Und jedes Mal dachte ich mir:
Warum mache ich das eigentlich noch manuell?
🧠 Ziel
Am Ende wollte ich genau das hier:
createProject meinprojekt
👉 und alles ist fertig:
meinprojekt.localist erreichbar- Apache ist konfiguriert
- Datenbank ist angelegt
- WordPress ist installiert
🧱 Struktur der Lösung
Statt ein großes, unübersichtliches Skript zu bauen, habe ich alles modular aufgeteilt:
createProject
├── generate_credentials
├── create_database
├── create_vhost
├── update_hosts
└── install_wordpress
👉 Jedes Skript kann auch einzeln verwendet werden
👉 createProject ist nur der Orchestrator
⚙️ Nutzung
createProject meinprojekt
Optional:
createProject meinprojekt --skip-db
createProject meinprojekt --skip-wp
🔧 Voraussetzung: eigene CLI-Skripte im PATH
Ich rufe die Skripte direkt wie Commands auf:
createProject
install_wordpress
create_database
Das funktioniert, weil ich:
- einen
~/binOrdner habe - diesen in meine
.bashrcin den$PATHaufgenommen habe - darin Symlinks auf meine Skripte liegen
👉 Wie das genau funktioniert, habe ich in diesem Beitrag erklärt:
Erste Schritte zur lokalen Entwicklungsumgebung
🔑 Zentrale Idee: .env als gemeinsame Basis
Ein Problem bei mehreren Skripten ist:
Wie teile ich Daten zwischen ihnen?
Meine Lösung: eine .env Datei pro Projekt.
Beispiel:
DB_NAME=meinprojekt
DB_USER=meinprojekt
DB_PASSWORD=supergeheim
👉 Diese Datei wird einmal erzeugt
👉 und dann von allen Skripten genutzt
🔐 Automatisierte Passwort-Generierung für lokale Projekte
⚙️ Credentials automatisch erzeugen
Statt Passwörter manuell zu vergeben:
if command -v pwgen >/dev/null 2>&1; then
DB_PASSWORD=$(pwgen -s 16 1)
else
DB_PASSWORD=$(openssl rand -base64 12)
fi
👉 Vorteile:
- keine Hardcodes
- keine Eingabe nötig
- funktioniert überall
🗄️ Datenbank erstellen
Die Datenbank wird direkt über MySQL erstellt:
sudo mysql <<SQL
CREATE DATABASE IF NOT EXISTS \`$DB_NAME\`;
CREATE USER IF NOT EXISTS '$DB_USER'@'localhost' IDENTIFIED BY '$DB_PASSWORD';
GRANT ALL PRIVILEGES ON \`$DB_NAME\`.* TO '$DB_USER'@'localhost';
FLUSH PRIVILEGES;
SQL
👉 kein Passwort im Skript
👉 nutzt das Linux-Rechtesystem
🗄️ Datenbank automatisch erstellen mit Bash
🌐 Hosts-Datei automatisch anpassen
Statt manuell:
127.0.0.1 meinprojekt.local
macht das Skript:
echo "127.0.0.1 $DOMAIN" | sudo tee -a /etc/hosts
🌐 Apache Virtual Hosts automatisieren
🌍 Apache VirtualHost erstellen
<VirtualHost *:80>
ServerName meinprojekt.local
DocumentRoot /home/user/www/meinprojekt <Directory /home/user/www/meinprojekt>
AllowOverride All
Require all granted
</Directory>
</VirtualHost>
Apache wird nur neu geladen, wenn die Konfiguration gültig ist:
if sudo apache2ctl configtest; then
sudo systemctl reload apache2
fi
🚀 WordPress Installation mit WP-CLI
Der eigentliche Komfort:
wp core download
wp config create --dbname="$DB_NAME" --dbuser="$DB_USER" --dbpass="$DB_PASSWORD"
wp core install ...
👉 keine Browser-Installation
👉 reproduzierbar
👉 komplett automatisiert
🧩 WordPress-Installer Script (install_wordpress.sh)
🦸 Das zentrale Script: createProject
Hier läuft alles zusammen:
#!/usr/bin/env bash
set -euo pipefailshow_help() {
cat << EOF
Usage: createProject <name> [OPTIONS]Options:
--skip-db Keine Datenbank erstellen
--skip-wp WordPress nicht installieren
--skip-hosts Hosts-Eintrag nicht setzen
--skip-apache Apache nicht konfigurieren
--skip-pw Keine Credentials generieren
--help Hilfe anzeigen
EOF
}NAME="${1:-}"shift || true# Defaults
SKIP_DB=false
SKIP_WP=false
SKIP_PW=false
SKIP_HOSTS=false
SKIP_APACHE=false# Optionen parsen
while [[ $# -gt 0 ]]; do
case "$1" in
--skip-pw) SKIP_PW=true; shift ;;
--skip-db) SKIP_DB=true; shift ;;
--skip-wp) SKIP_WP=true; shift ;;
--skip-hosts) SKIP_HOSTS=true; shift ;;
--skip-apache) SKIP_APACHE=true; shift ;;
--help)
show_help
exit 0
;;
*)
echo "Unknown option: $1"
exit 1
;;
esac
doneif [[ -z "$NAME" ]]; then
show_help
exit 1
fiDOMAIN="$NAME.local"
PROJECT_DIR="$HOME/www/$NAME"echo "🚀 Erstelle Projekt: $DOMAIN"mkdir -p "$PROJECT_DIR"# Credentials
if [ "$SKIP_PW" = false ]; then
generate_credentials "$NAME"
fi# Datenbank
if [ "$SKIP_DB" = false ]; then
create_database "$NAME"
fi# WordPress
if [ "$SKIP_WP" = false ]; then
install_wordpress "$NAME"
fi# Hosts
if [ "$SKIP_HOSTS" = false ]; then
update_hosts "$DOMAIN"
fi# Apache
if [ "$SKIP_APACHE" = false ]; then
create_vhost "$NAME"
fiecho "✅ Fertig!"
🔄 Standalone vs. orchestriert
Ein wichtiger Punkt:
👉 Jedes Skript funktioniert auch einzeln
Beispiel:
create_database testprojekt
Wenn keine .env existiert:
👉 wird sie automatisch erzeugt
🧠 Erkenntnis aus der Praxis
Ich hatte anfangs alles in ein großes Skript gepackt.
Das Problem:
- schwer zu warten
- schwer zu debuggen
- unflexibel
Die Aufteilung in kleine Skripte hat alles deutlich einfacher gemacht.
🔥 Fazit
Was früher mehrere Minuten gedauert hat, ist jetzt:
createProject meinprojekt
👉 fertig
Und vor allem:
Ich muss nicht mehr nachdenken.
Das Setup ist:
- reproduzierbar
- schnell
- konsistent
🧭 Ausblick
Der nächste Schritt wäre:
- Projekte auflisten
- Projekte löschen
- Datenbanken zurücksetzen
👉 aber das ist ein eigenes Thema 😉

Schreibe einen Kommentar