Sign inSign up

hsga/wissen-server

By hsga

•Updated 10 months ago

Display markdown files in a hsga way.

Image
Content management system
0

2.5K

hsga/wissen-server repository overview

⁠Wissen-Server – Überblick

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):

  • Rendert .md inkl. Frontmatter (z. B. title, tags, summary, updated).
  • Zugriff auf Dateien direkt vom Filesystem (z. B. SMB/WebDAV-Mount) Hinweis: Die Suche auf einem SMB-Mount ist quälend langsam.
  • Betrieb hinter NGINX (Proxy).
  • Rendert in Version 2.1.12 auch Mermaid Diagramme

⁠Architektur im Überblick

⁠Themenauswahlmenü – Funktionsprinzip

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/).

⁠Beispielstruktur (Host)

/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
---

⁠Visualisierung (ASCII)

+--------------------------------------------------------------+
|  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]                |                                  |
+---------------------------+----------------------------------+

⁠Regeln auf einen Blick

  1. Scan-Tiefe: Nur die erste Ebene unterhalb des aktuellen Ordner wird für das Menü betrachtet.
  2. Pflichtdatei: Ein Ordner erscheint nur, wenn er eine index.md enthält.
  3. Anzeigename: Der Frontmatter-title: der index.md wird als Menübezeichnung genutzt.
  4. Sortierung: Numerische Präfixe der Ordner wie 01-, 02- etc. steuern derzeit die Reihenfolge (Erweiterung über Frontmatter Tag geplant)
  5. Emojis/Symbole: Im title: erlaubt und werden im Menü dargestellt.
  6. Anführungszeichen für title: & summary werden dringend empfohlen.

⁠Empfohlene Verzeichnisse (Host)

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.


⁠Startoption: 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.

Tag summary

Content type

Image

Digest

sha256:8964c43d0…

Size

763.2 MB

Last updated

10 months ago

docker pull hsga/wissen-server