Display markdown files in a hsga way.
2.5K
Der Wissen-Server ist eine schlanke FastAPI-Anwendung, die Markdown-Dokumente direkt aus dem Dateisystem rendert. Ohne Datenbank. Inhalte (inkl. Frontmatter) liegen als Dateien vor
Kerneigenschaften (Kurz):
.md inkl. Frontmatter (z. B. title, tags, summary, updated).Der Wissen-Server baut das linke Themenauswahlmenü automatisch aus den title:-Werten der index.md in den direkten Unterordnern des Dokumenten-Roots (z. B. /srv/wissen/docs/).
/srv/wissen/docs/
├── 01-ACME/
│ └── index.md # title: 🔒 ACME & Let's Encrypt
├── 02-Netzwerk/
│ └── index.md # title: 🌐 Netzwerk & Dienste
├── 03-Windows/
│ └── index.md # title: Windows
└── index.md # Startseite
Beispiel-Frontmatter (/srv/wissen/docs/01-ACME/index.md):
---
title: "🔒 ACME & Let's Encrypt"
summary: "Zertifikate automatisieren – Grundlagen & Praxis."
tags: [ACME, TLS, Zertifikate]
updated: 2025-09-26
---
+--------------------------------------------------------------+
| Themen (aus title: der index.md je Unterordner) |
| ---------------------------------------------------------- |
| •🔒 ACME & Let's Encrypt -> ?p=01-ACME/index.md |
| •🌐 Netzwerk & Dienste -> ?p=02-Netzwerk/index.md |
| • Windows -> ?p=03-Windows/index.md |
| |
+---------------------------+----------------------------------+
| (linkes Menü) | (rechter Inhaltsbereich) |
| | |
| [🔒 ACME & Let's Encrypt]| Datei: 01-ACME/index.md |
| [🌐 Netzwerk & Dienste] | … gerenderter Markdown-Inhalt … |
| [Windows] | |
+---------------------------+----------------------------------+
index.md enthält.title: der index.md wird als Menübezeichnung genutzt.01-, 02- etc. steuern derzeit die Reihenfolge (Erweiterung über Frontmatter Tag geplant)title: erlaubt und werden im Menü dargestellt.sudo mkdir -p /srv/wissen/{docs}
/srv/wissen/docs → Dokumenten-Wurzel (Markdown & Assets)
💡 Dokumentenpfad: Verwenden Sie Ihren produktiven Content-Pfad als Bind-Mount
/srv/wissen/docs-> /data/docs. So bleiben Container austauschbar, Daten aber persistent.
docker compose up -d# Container starten (liest Dateien read-only aus /srv/wissen/docs)
# docker-compose.yml
docker run -d \
--name wissen-server-latest \
-p 127.0.0.1:8081:8080 \
-e MERMAID_ENABLED=1 \
-v /srv/wissen/docs:/data/docs:ro \
hsga/wissen-server:latest
**Erläuterungen:**
* `-p 127.0.0.1:8081:8080` → nur lokal erreichbar; NGINX terminiert TLS & veröffentlicht nach außen.
* `-e DOC_ROOT="/data/docs"` → Dokumenten-Wurzel **im Container**.
* `-v /srv/wissen/docs:/data/docs:ro` → Inhalte read-only in den Container einbinden.
---
## Reverse-Proxy (NGINX) – Einbindung
```nginx
# Externer NGINX: TLS & Reverse Proxy auf den Container @ 127.0.0.1:8081
# "/" -> Redirect auf /docs?p=index.md
# Sonst: ALLES zum Container (damit /static, /assets, ... funktionieren)
# HTTP → HTTPS
server {
listen 80;
listen [::]:80;
server_name wissen.example.app;
location ^~ /.well-known/acme-challenge/ {
root /var/www/_letsencrypt;
default_type "text/plain";
access_log off;
auth_basic off;
add_header X-Which "VHOST-wissen" always;
}
location / {
return 301 https://$host$request_uri;
}
}
# HTTPS
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name wissen.example.app;
ssl_certificate /etc/ssl/certs/wissen.example.app.fullchain.pem; # <- prüfen
ssl_certificate_key /etc/ssl/private/wissen.example.app.key; # <- prüfen
# Basis-Härtung (optional weitere Snippets einbinden)
# ssl_protocols TLSv1.2 TLSv1.3;
# ssl_session_timeout 1d;
# ssl_session_cache shared:SSL:10m;
# >>> Basic Auth gilt standardmäßig für ALLE Locations in diesem Server
# auth_basic "Restricted Area";
# auth_basic_user_file /etc/nginx/htpasswd/wissen.users;
add_header X-Which "VHOST-wissen-443" always;
# Root-Redirect
location = / {
rewrite ^ /docs?p=index.md last;
}
# Alles andere direkt zum Container (der bedient /static und proxied /docs,/api)
location / {
proxy_http_version 1.1;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Host $host;
# WICHTIG: Basic-Auth nicht an die App weiterreichen
proxy_set_header Authorization "";
#
proxy_pass http://127.0.0.1:8081;
proxy_read_timeout 120;
}
}
🎉 Fertig – damit ist der Wissen-Server produktionsbereit hinter NGINX.
Content type
Image
Digest
sha256:8964c43d0…
Size
763.2 MB
Last updated
10 months ago
docker pull hsga/wissen-server