Der Weg zum Fullstack-Developer

Meine Erfahrungen, Auffrischung meiner Programmierkenntnisse und mein persönliches Knowledge-Management

🚀 Lokale WordPress-Projekte mit einem einzigen Befehl erstellen

Ich habe bestimmt 50 Mal das Gleiche gemacht:

  • Verzeichnis anlegen
  • Apache konfigurieren
  • /etc/hosts anpassen
  • 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.local ist 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 ~/bin Ordner habe
  • diesen in meine .bashrc in den $PATH aufgenommen 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

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert