Ghost-Blog auf Debian 13 einrichten: Das Grundsetup für bloYg
Grundsetup für bloYg: von einem frischen Debian-13-Server zu einem ersten stabilen Ghost-Blog mit Docker Compose, MariaDB, Caddy und HTTPS.
🛠️ Dieser Artikel dokumentiert das Grundsetup von bloYg: den Weg von einem frischen Debian-13-Server zu einem ersten stabil laufenden Ghost-Blog mit Docker Compose, MariaDB, Caddy und HTTPS.
Wichtig ist die Abgrenzung: Dieser Post beschreibt bewusst nur den technischen Weg zum ersten sauberen Live-Zustand. Branding, Theme-Feinschliff, Membership-Policy und redaktionelle Nacharbeiten gehören danach in eigene Follow-up-Texte.
🔒 Alle sensiblen Daten sind hier durch Platzhalter ersetzt.
1. Ziel des Grundsetups#
Ghost sauber online bringen, HTTPS aktivieren, eine nachvollziehbare Verzeichnisstruktur schaffen und einen Zustand erreichen, auf dem man anschließend sicher weiterarbeiten kann.
2. Minimale Eingaben für ein Redeployment#
SERVER_HOST=<SERVER_HOST_OR_IP>
SSH_USER=<SSH_USER>
SSH_AUTH=<SSH_KEY_OR_PASSWORD>
OS=<DEBIAN_13_ODER_UBUNTU>
DOMAIN=<YOUR_DOMAIN>
WWW_REDIRECT=<YES_OR_NO>text3. Zielarchitektur#
- Host: Debian 13
- App: Ghost
- Datenbank: MariaDB
- Reverse Proxy / TLS: Caddy
- Orchestrierung: Docker Compose
- Basisschutz: UFW + fail2ban
4. Empfohlene Reihenfolge#
- Host prüfen
- Basis-Pakete installieren
- Docker installieren
- Firewall und Basisschutz aktivieren
- Ghost-Stack anlegen
- Domain und DNS prüfen
- Caddy konfigurieren
- Container starten
- Ghost initial prüfen
5. Host vorbereiten#
apt-get update
apt-get install -y ca-certificates curl gnupg ufw fail2ban
install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/debian/gpg -o /etc/apt/keyrings/docker.asc
chmod a+r /etc/apt/keyrings/docker.asc
. /etc/os-release
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/debian ${VERSION_CODENAME} stable" > /etc/apt/sources.list.d/docker.list
apt-get update
apt-get install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
systemctl enable --now docker fail2banbashWenn der Erstzugang anfangs nur über Passwort oder Root läuft, sollte das kein Dauerzustand bleiben. Für den Weg zum ersten Live-Stand reicht das manchmal pragmatisch, für den Regelbetrieb sollte danach aber ein sauberer sicherer Zugang eingerichtet werden.
6. Firewall-Basis#
ufw allow 22/tcp
ufw allow 80/tcp
ufw allow 443/tcp
ufw --force enablebash7. Verzeichnisstruktur#
/opt/ghost-stack/
├── .env
├── docker-compose.yml
├── Caddyfile
└── backup.shtextGenau diese klare Ordnerstruktur macht spätere Wartung, Backups und Redeployments deutlich leichter.
8. Umgebungsvariablen#
DOMAIN=example.com
GHOST_URL=https://example.com
DB_ROOT_PASSWORD=<DB_ROOT_PASSWORD>
DB_NAME=ghost
DB_USER=ghost
DB_PASSWORD=<DB_PASSWORD>text9. Compose-Grundidee#
services:
db:
image: mariadb:11
restart: unless-stopped
ghost:
image: ghost:5-alpine
restart: unless-stopped
caddy:
image: caddy:2
restart: unless-stopped
ports:
- "80:80"
- "443:443"yaml10. Caddy-Konfiguration#
www.example.com {
redir https://example.com{uri} 301
}
example.com {
encode zstd gzip
reverse_proxy ghost:2368
header {
Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"
X-Content-Type-Options nosniff
X-Frame-Options SAMEORIGIN
Referrer-Policy strict-origin-when-cross-origin
}
}plaintext11. Erster Start#
cd /opt/ghost-stack
docker compose up -dbashDirekt danach lohnt sich ein sehr kurzer operativer Schnellcheck:
cd /opt/ghost-stack
docker compose ps
curl -I https://example.combashDamit sieht man in wenigen Sekunden, ob die Container laufen und ob die Hauptdomain grundsätzlich antwortet.
12. Akzeptanzkriterien#
- Ghost ist unter der Hauptdomain erreichbar.
- HTTPS ist aktiv.
- Caddy terminiert TLS sauber.
- Der Stack liegt reproduzierbar in einem klaren Ordner.
- Die Basis für spätere Nacharbeiten steht.
13. Was dieser Post bewusst noch nicht abdeckt#
- Theme-Feinschliff
- sichtbares Branding auf bloYg / Y / Notizen aus dem Internet
- Membership-Policy im Frontend
- About-Seite, Startseite und redaktionelle Texte
- spätere Design- und Betriebsdetails
Genau diese Trennung macht das Grundsetup als Vorlage nützlich: Erst ein sauberer technischer Live-Stand, danach die gezielten Nacharbeiten zum finalen Produkt.
Fazit#
📌 Dieser Post endet absichtlich beim ersten stabilen Live-Zustand. Gerade deshalb taugt er als Grundlage für spätere Redeployments und als saubere technische Startmarke.