Eigene BookStack-Instanz installieren
ℹ️
DieserDieseArtikelAnleitungerklärtstarteterstab demPunkt,Punkt,woanmandemschondu bereits einen Linux-Serveraufgesetzt hathast undauchDockerschoninstalliert ist. Die „Schritte davor“ folgen später –Ich werde demnächst alle vorangegangenen Schritte erklären,es ist wirklich nichtschwer,schwervor Allem(besonders mitHilfe von KIs.KI-Hilfe).
SchrittÜberblick: 1:Was Kompositionwird vorbereitenhier eingerichtet?
WirDu wollen,bekommst dassam eineEnde:
https://...automatischem
ℹ️Hintergrund: Was ist Caddy? 🌐
Caddy ist ein
moderner,moderner Webserver (ähnlich Nginx/Apache), geschrieben in GogeschriebenerWebserver(ähnlich wieNginxoderApache), derbesonders„Security-by-default“dafür bekannt ist, viele Dingestandardmäßig sicherlebt undbequemdir vor allem HTTPSzuextremmachen.bequem macht.Kernidee: „Webserver, der einfach funktioniert“ ✅
Caddy nimmt dir viel Konfigurationsarbeit ab – vor allem rund umHTTPS.Wichtige Merkmale ✨
- Automatisches HTTPS (TLS)
CaddyZertifikatekannZertifikatewerden automatischbeziehenbezogen underneuernerneuert (typischerweisetypisch via Let’s Encrypt), sodass deine Websites ohne großen Aufwand überhttps://laufen..- Einfache Konfiguration
MitÜberdemein gut lesbares Caddyfile(eine schlanke, gut lesbare Konfigurationsdatei) lässt sich vieles sehr kompakt definieren..- Reverse Proxy & Load Balancing
- Ideal, um Anfragen an
andereServicesDienste weiterzuleiten,(z. B.anDocker-Container)eine Node.js-, Python- oder Docker-Anwendung.weiterzuleiten.- Gute Defaults
& Security-by-Default
- Viele sinnvolle
EinstellungenSecurity-Standards sindbereitsdirekt„von Haus aus“ aktiv, statt alles manuell „zusammenschrauben“ zu müssen.aktiv.ErweiterbarModularüber Moduleerweiterbar
CaddyBeiist modular aufgebaut und kann für speziellespeziellen Anforderungenerweitertlässtwerden.sich Caddy ausbauen.
Typische Einsatzfälle 🧩
- Websites hosten (
statisch oderstatisch/dynamisch)- Reverse Proxy vor einer App (z. B.
/api→ Backend)- TLS-Termination
und sichere Weiterleitung- Lokale
EntwicklungsumgebungenDev-Setups mit HTTPS
Schritt 1: Verzeichnis & Dateien vorbereiten 🧱
Erstelle einendas OrdnerVerzeichnis:
/opt/bookstack
Lege darin zwei Dateien:Dateien an:Caddyfile
docker-compose.yml
Caddyfile
folgenden✍️
InhaltWichtig: Du musst gleich einundpaarpasseWerteihnanpassenan–(du siehstschonimwo^^):YAML sehr deutlich, wo.
BookStack-YML
Schritt 2: Docker Compose konfigurieren (docker-compose.yml) 🐳
Füge folgenden Inhalt ein (und passe ihn an, wo nötig):
services:
mariadb:
image: lscr.io/linuxserver/mariadb:latest
container_name: bookstack-mariadb
environment:
- PUID=1000
- PGID=1000
- TZ=Europe/Berlin
- MYSQL_ROOT_PASSWORD=PW_OF_MYSQL_ROOT
- MYSQL_DATABASE=bookstack
- MYSQL_USER=bookstack
- MYSQL_PASSWORD=PW_OF_MYSQL_DB
volumes:
- ./mariadb:/config
restart: unless-stopped
bookstack:
image: lscr.io/linuxserver/bookstack:latest
container_name: bookstack
depends_on:
- mariadb
environment:
- PUID=1000
- PGID=1000
- TZ=Europe/Berlin
- APP_URL=https://wiki.fabula.vision
# Wo wird BookStack aufrufbar sein? (Deine URL)
- APP_KEY=base64:...
# Zum Generieren das ausführen: docker run -it --rm --entrypoint /bin/bash lscr.io/linuxserver/bookstack:latest appkey
- APP_THEME=custom
#'custom' ermöglich es Hacks zu nutzen; mehr dazu hier: https://www.bookstackapp.com/hacks/applying/
- DB_HOST=mariadb
- DB_PORT=3306
- DB_DATABASE=bookstack
- DB_USERNAME=bookstack
- DB_PASSWORD=PW_OF_MYSQL_DB
# (Wie oben!)
- APP_DEFAULT_DARK_MODE=true
# (Geschmackssache)
volumes:
- ./bookstack:/config
restart: unless-stopped
caddy:
image: caddy:latest
container_name: caddy
depends_on:
- bookstack
ports:
- "80:80"
- "443:443"
volumes:
- ./Caddyfile:/etc/caddy/Caddyfile:ro
- ./caddy/data:/data
- ./caddy/config:/config
restart: unless-stopped
Schritt 3: Caddy konfigurieren (Caddyfile
) 🛡️
Füge Folgendes ein und ersetze die Domain:
wiki.fabula.vision {
# Deine URL natürlich...
encode zstd gzip
# Reverse Proxy zu BookStack (Container heißt "bookstack", interner Port 80)
reverse_proxy bookstack:80
# sinnvolle Header (optional)
header {
# HSTS (nur setzen, wenn du sicher bist, dass HTTPS dauerhaft aktiv sein soll)
Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"
X-Content-Type-Options "nosniff"
X-Frame-Options "SAMEORIGIN"
Referrer-Policy "strict-origin-when-cross-origin"
}
}
Schritt 2:4: StartenContainer starten ▶️
-
Ins Verzeichnis wechseln:
cd /opt/bookstack/
Stack installieren:
starten:
dockerdocker compose pulldocker compose up -d
Aktualisieren geht später so:
docker abercompose nunpull
docker compose up -d
Fertig ✅
Jetzt schnell die URL aufrufen und die Standard-Zugangsdaten ändern!
admin@admin.com
password
Cron
Einen
Schritt 5: Cron-Job für BookStack anlegen⏱️
Einen folgendermaßen:Cron-Job anlegen:
crontab -e
* * * * * docker exec -i bookstack php /app/www/artisan schedule:run >/dev/null 2>&1
Beschränkungen & Module/Hacks
🧩Es gibt drei Einschränkungen, die ich bisher festgestelltaufgefallen habe:sind:
-
E-Mail-Versand
- (z. B. „Passwort vergessen“) funktioniert
nicht,bei mir nicht bzw. meine Experimente haben noch keine Lösunghervorgebrachthervorgebracht.
ManErweiterung über „Hacks“
AllerdingsWichtiger funktioniertHinweis daszum Export 📄
Und das mit dem Exportieren funktioniert eh leider nicht bei mir, habe keine Ahnung warum und deshalb die Funktion einfach deaktiviert.
Ok, aber wieWie installiert man nunHacks dieals Hacks?Module?
APP_THEME=custom/opt/bookstack/bookstack/www/themes/custom/modules
Nun
docker exec -it bookstack /bin/bash
cd /app/www/https://www.bookstackapp.com/hacks/mermaid-viewer/
Shift+Enter – Zeilenumbruch:Zeilenumbruch (CommonMark)
-
HierIn(den BookStack-Einstellungen unter
https://example.com/settings/customization)
bei „Custom HTML Head Content“diesenfolgenden Code eintragen:<script> window.addEventListener('editor-markdown::setup', event => { event.detail.markdownIt.set({breaks: true}); }); </script> -
Dann hier eineEinefunctions.phpanlegen:
anlegen unter: /opt/bookstack/bookstack/www/themes/custom/
Mit dem folgendenfolgendem Inhalt:
<?php
use BookStack\Theming\ThemeEvents;
use BookStack\Facades\Theme;
Theme::listen(ThemeEvents::COMMONMARK_ENVIRONMENT_CONFIGURE, function ($environment) {
$environment->mergeConfig([
'renderer' => [
'soft_break' => "<br>",
]
]);
return $environment;
});
Weitere QoL-Fixes (einzustellenunter „Customization“) 🛠️
Einstellen hier:
https://deineurl.com/settings/customizationEinfach jeweils unter „Custom HTML Head Content“ eintragen:
-
BlockquotesBlockquotes:habenkeinkeinen dickendicker Rand unten / saubere Abstände - Ursache: CSS (
liegtu.am CSS, weil u.a.alle<p>-Elementemitmargin-bottom)
<style>
/* 1) Letztes & erstes direktes Kindelement im Blockquote: Margin */
.content-wrap blockquote > :last-child {
margin-bottom: .3em;
}
.content-wrap blockquote > :first-child {
margin-top: .3em;
}
/* 2) Blockquote: keine Scrollbalken */
.content-wrap blockquote {
overflow: visible; /* Standard „ohne Scrollen“ */
overflow-x: visible;
overflow-y: visible;
}
</style>
Codeblöcke habenCodeblöcke: Soft-Wraps (alsokein manhorizontales mussScrollen nicht horizontal scrollen, um die ganze Zeile zu sehen):nötig)
<script>
window.addEventListener('library-cm6::pre-init', event => {
const detail = event.detail;
const config = detail.editorViewConfig;
const EditorView = detail.libEditorView;
if (detail.usage === 'content-code-block') {
config.extensions.push(EditorView.lineWrapping);
}
});
</script>
Dark Mode: Text im Dark-Mode heller machen (Überschriften werden grau 70%, normaler Text hell-grau 90%):
<style>
html.dark-mode .page-content h1, html.dark-mode .page-content h2, html.dark-mode .page-content h3, html.dark-mode .page-content h4, html.dark-mode .page-content h5, html.dark-mode .page-content h6 {
color: hsl(0 0% 70%);
}
html.dark-mode body {
color: hsl(0 0% 90%);
}
</style>
TextTextgröße: größer machen (Hauptinhalt wird auf 110% hochskaliert, aber, Überschriften auf 90% runter, weil ich sie als zu groß empfand):
<style>
.page-content {
zoom:1.1;
}
.page-content h1, .page-content h2, .page-content h3, .page-content h4, .page-content h5, .page-content h6 {
zoom:.9;
}
</style>
Wenn du willst, kann ich dir als nächsten Schritt noch eine „Checkliste vor dem Start“ (DNS, Ports 80/443, Firewall, APP_KEY-Generierung etc.) ergänzen – inhaltlich gleich, nur als schnell abhakbare Sektion.