Das Ende manueller Uploads
Wer seine Web-Applikationen noch per FTP hochlädt oder sich jedes Mal per SSH einloggen muss, um manuell git pull und docker build auszuführen, verschwendet wertvolle Lebenszeit.
Die Profi-Lösung für kleine bis mittlere Projekte heißt: Git Web Deployment.
Dabei nutzt du einen sogenannten "Git Hook" auf deinem Ubuntu-Server. Sobald du lokal git push prod master tippst, schiebt dein PC den Code auf den Server. Dort wird er automatisch entpackt, Docker baut das Image neu und startet die Anwendung ohne dein weiteres Zutun neu. In diesem Guide bauen wir dieses System von Grund auf auf – inklusive der Docker-Installation auf einem frischen Ubuntu-System.
Vorbereitung: Psychologische Sicherheit
Wir hantieren hier mit Server-Konfigurationen und Deployment-Pfaden. Damit du niemals den Überblick verlierst, wo dein Code landet und wo das Git-System liegt, arbeiten wir mit einer strengen Ordner-Hygiene.
Logge dich auf deinem Ubuntu-Server ein und erstelle diese Struktur:
# Wir erstellen einen zentralen Ort für unsere Deployments
mkdir -p ~/web-projects/mein-projekt
# Und einen Ort für das Git-Kontrollzentrum (Bare Repository)
mkdir -p ~/git-repos/mein-projekt.git
Schritt 1: Docker auf Ubuntu installieren
Bevor wir automatisieren können, muss die Engine laufen. Wir nutzen das offizielle Docker-Repository für maximale Stabilität.
Führe diese Befehle nacheinander in deinem Ubuntu-Terminal aus:
- GPG-Key & Repository hinzufügen:
sudo apt update
sudo apt install ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc
sudo tee /etc/apt/sources.list.d/docker.sources <<EOF
Types: deb
URIs: https://download.docker.com/linux/ubuntu
Suites: $(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}")
Components: stable
Signed-By: /etc/apt/keyrings/docker.asc
EOF
sudo apt update
- Docker Pakete installieren:
sudo apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
- Benutzerrechte fixen (Wichtig!):
Damit du Docker ohne
sudonutzen kannst (essentiell für unsere Automatisierung), füge deinen User der Docker-Gruppe hinzu:
sudo usermod -aG docker $USER
newgrp docker
⚠️ 📸 SCREENSHOT ANFRAGE: Hier einen Screenshot vom Terminal einfügen, der die Ausgabe von
docker run hello-worldzur Bestätigung der erfolgreichen Installation zeigt.
Schritt 2: Das Git-"Bare"-Repository erstellen
Ein "Bare"-Repository ist ein Git-Ordner ohne sichtbare Projekt-Dateien. Er dient nur als Empfangsstation für deinen Code.
cd ~/git-repos/mein-projekt.git
git init --bare
Schritt 3: Die Magie – Der post-receive Hook
Das ist das Gehirn deines Deployments. Diese Datei wird ausgeführt, sobald du Code an den Server schickst. Sie entpackt den Code und weist Docker an, die App neu zu bauen.
Erstelle die Datei: ~/git-repos/mein-projekt.git/hooks/post-receive:
#!/bin/bash
# Pfad, wo die Live-Webseite liegen soll
TARGET="/home/$USER/web-projects/mein-projekt"
# Pfad zum Git-Ordner
GIT_DIR="/home/$USER/git-repos/mein-projekt.git"
BRANCH="master"
while read oldrev newrev ref
do
if [ "$ref" = "refs/heads/$BRANCH" ]; then
echo "✅ Ref $ref empfangen. Starte Deployment auf ${BRANCH} Branch..."
# 1. Code in das Zielverzeichnis auschecken
git --work-tree="${TARGET}" --git-dir="${GIT_DIR}" checkout -f ${BRANCH}
# 2. In das Zielverzeichnis wechseln
cd "${TARGET}"
# 3. Docker Magie: Neu bauen und im Hintergrund starten
echo "🐳 Docker Compose: Build & Restart..."
docker compose up -d --build
echo "🚀 Deployment erfolgreich abgeschlossen!"
else
echo "Ref $ref ignoriert: Nur der ${BRANCH} Branch wird automatisch deployt."
fi
done
Ganz wichtig: Die Datei muss ausführbar gemacht werden!
chmod +x ~/git-repos/mein-projekt.git/hooks/post-receive
Schritt 4: Lokales Projekt erstellen (Dein PC)
Damit wir etwas zum Deployment haben, erstellen wir nun auf deinem lokalen Entwickler-PC eine kleine Beispiel-Anwendung. Wir bleiben auch hier hygienisch und isoliert:
mkdir mein-deploy-test
cd mein-deploy-test
git init
Erstelle nun diese drei unverzichtbaren Dateien in deinem lokalen Ordner:
mein-deploy-test/package.json:
{
"dependencies": { "express": "^4.18.2" }
}
mein-deploy-test/server.js:
const express = require('express');
const app = express();
app.get('/', (req, res) => res.send('<h1>🚀 Live-Deployment erfolgreich!</h1><p>Gepusht via Git Hook & Docker Compose.</p>'));
app.listen(3000, () => console.log('App läuft auf Port 3000'));
mein-deploy-test/docker-compose.yaml:
version: '3.8'
services:
web:
image: node:18-alpine
working_dir: /app
volumes:
- .:/app
command: sh -c "npm install && node server.js"
ports:
- "3000:3000"
Git Vorbereiten
Füge die Dateien hinzu und committe sie:
git add .
git commit -m "Initiales Deployment-Setup"
Schritt 5: Die Brücke zum Server schlagen (Remote add)
Wir sagen deinem lokalen Projekt jetzt, wo im Internet der Zielserver ("live") liegt.
# Ersetze 'benutzer' und 'deine-server-ip' durch deine echten Daten
git remote add live ssh://benutzer@deine-server-ip/home/benutzer/git-repos/mein-projekt.git
Schritt 6: Der "Magic Push" & Live-Beweis
Jetzt kommt der Moment der Wahrheit. Wir schieben den Code live:
git push live master
Dein Terminal wird dir nun live die Rückmeldungen vom Server anzeigen: Wie der Code entpackt wird und wie Docker auf dem entfernten Server beginnt, den Container hochzufahren.
Der Beweis: Die IP-Prüfung!
Öffne nun deinen Webbrowser und navigiere zur IP-Adresse deines Servers auf Port 3000:
Juhu! Wenn du dort "Live-Deployment erfolgreich!" liest, hast du soeben dein eigenes, automatisches Cloud-System geschaffen. Keine manuellen Uploads mehr nötig!
⚠️ 📸 SCREENSHOT ANFRAGE: Hier einen Screenshot vom Browser-Fenster einfügen, der die erfolgreiche Live-Anzeige unter der Server-IP und Port 3000 zeigt.
Fazit
Herzlichen Glückwunsch! Du hast dir ein professionelles CI/CD System mit einfachsten Bordmitteln gebaut. Kein GitHub-Actions-Overhead, keine Drittanbieter. Dein Code gehört dir, dein Deployment ist blitzschnell und dank Docker auf dem Server ist deine Umgebung absolut konsistent. Willkommen in der Welt der DevOps-Profis!
Login