Ein modernes, webbasiertes Dokumentenmanagementsystem mit Python (Flask), integriertem OnlyOffice und KI-gestuetztem RAG-Chatbot zur Beantwortung von Fragen ueber Dokumentinhalte.
- Dokumentenverwaltung: Upload, Download, Versionierung, Loeschen, Batch-Operationen
- Vorschau: Integrierte Vorschau fuer Office-Dokumente, PDF, Bilder, Videos, Code und ZIP-Archive
- OnlyOffice Integration: Bearbeiten von Office-Dokumenten (Word, Excel, PPTX) direkt im Browser
- KI-Chatbot (RAG): Stelle Fragen zu deinen Dokumenten - der Chatbot durchsucht NUR deine eigenen und freigegebenen Dokumente. Unterstuetzt native APIs von OpenAI, Anthropic (Claude), Google Gemini, OpenRouter sowie lokale Ollama-Modelle.
- Hintergrund-Verarbeitungsmanager (GUM): Live-Statusanzeige fuer Upload und RAG-Indexierung mit verbleibender Zeit (ETA), Minimierungsfunktion (Session-Persistent) sowie "Verarbeitung stoppen"-Knopf zum Abbrechen aller Tasks.
- Premium Design-Themes: Waehlbare Oberflaechen (LaxXx Standard, LX Lab Spec Tokyo-Night, Nordic Executive Light/Dark, Obsidian Pro Luxury Black, Rose Bloom, Aurora Glass) im Benutzerprofil.
- Rechtssicherer GoBD-Audit-Trail: Lückenloses Aktivitäts-Logbuch (
/admin/logs) für Administratoren zur Nachverfolgung aller Aktionen (Uploads, Löschungen, Dokument-Freigaben, Workflow-Genehmigungen und Systemeinstellungen). - Berechtigungen (ACL): Benutzer, Gruppen (Leader/Deputy/Member), Freigaben an User & Gruppen
- Workflows: Genehmigungs-Workflows mit Genehmigungs- (Approve) und Ablehn-Optionen (Reject).
- Admin-Panel: Nutzerverwaltung, Kategorien, System-Einstellungen, Gruppenverwaltung, Aktivitäts-Protokoll
- Wiki (Extension): Plugin-basiertes Gruppen-Wiki mit Kommentaren und Suche
- Echtzeit-Updates: Socket.IO fuer Live-Benachrichtigungen
| Bereich | Technologie |
|---|---|
| Backend | Python 3.11, Flask 3.0 |
| Datenbank | SQLite (dev) / PostgreSQL 16 + pgvector (prod) |
| ORM | SQLAlchemy + Flask-Migrate |
| WSGI | Waitress (Windows) / Gunicorn (Linux) |
| Hintergrund-Queue | Redis + RQ (Redis Queue) fuer asynchrone Dokumentenverarbeitung |
| Echtzeit | Flask-SocketIO + eventlet |
| Office | OnlyOffice Document Server |
| KI / RAG | OpenAI, Ollama (lokal), OpenRouter, Anthropic (Claude), Google Gemini |
| Frontend | Bootstrap 5, FontAwesome 6, Jinja2, Custom CSS |
| Container | Docker Compose (App + Worker + PostgreSQL + Redis + OnlyOffice) |
| CI/CD | GitHub Actions (Tests + Build) |
git clone https://github.com/patrikharms-a11y/LaxXx-DMS
cd LaxXx-DMSFühre einfach das für dein Betriebssystem passende Start-Skript aus. Dieses erstellt automatisch die erforderlichen Ordner (uploads/, instance/), setzt die Schreibrechte und konfiguriert die .env-Datei inklusive automatischer Erkennung deiner Host-IP für OnlyOffice:
Linux / macOS:
./start_with_docker.shWindows:
Doppelklick auf start_with_docker.bat oder in der CMD:
start_with_docker.batDas System startet die Container im Hintergrund und gibt am Ende die passenden URLs für das DMS und den OnlyOffice-Server aus (z. B. http://localhost:5000).
pip install -r requirements.txt
# .env konfigurieren (s.o.)
python app.pyStandard-Admin beim ersten Start:
- Benutzer:
admin - Passwort:
admin123(oder viaADMIN_INITIAL_PASSWORDin.env)
Bitte nach dem ersten Login aendern!
Der Chatbot (/chat) beantwortet Fragen basierend auf deinen Dokumentinhalten. Die Berechtigungen (ACL) werden dabei strikt beachtet: Der Bot sieht NUR Dokumente, die du selbst hochgeladen hast oder die dir/deinen Gruppen freigegeben wurden.
Die Einstellungen koennen flexibel ueber die Admin-Einstellungen (/admin/settings) in der UI oder via .env konfiguriert werden:
- LLM-Provider: Waehle zwischen
ollama(lokal/selbstgehostet),openai,openrouter,anthropic(Claude) undgemini. - Automatische Embedding-Routung:
- Wenn lokale Embedding-Modelle (wie
nomic-embed-textoderbge-large-en) konfiguriert sind, weicht die App automatisch auf die lokale Ollama-Instanz aus, selbst wenn als Haupt-Chatbot-Provider ein Cloud-Dienst wie OpenAI/Anthropic/Gemini eingestellt ist. - Wenn ein Cloud-Embedding-Modell wie
text-embedding-3-small(OpenAI) odertext-embedding-004(Gemini) eingetragen ist, wird die Anfrage entsprechend an deren Cloud-Endpoints geroutet.
- Wenn lokale Embedding-Modelle (wie
Beispielkonfiguration fuer Cloud-Provider in .env:
# Aktiver Provider (ollama, openai, openrouter, anthropic, gemini)
LLM_PROVIDER=openai
# API-Keys (nur eintragen, was gebraucht wird)
OPENAI_API_KEY=sk-proj-...
ANTHROPIC_API_KEY=sk-ant-...
GEMINI_API_KEY=AIzaSy...
OPENROUTER_API_KEY=sk-or-v1-...
# Modellauswahl
CHAT_MODELS=gpt-4o-mini, claude-3-5-sonnet, gemini-1.5-flash
EMBEDDING_MODEL=text-embedding-3-smallIndexierung: Dokumente werden automatisch beim Upload und nach OnlyOffice-Bearbeitung im Hintergrund indexiert. PDFs mit mehr als 300 Seiten überspringen die ressourcenintensive Layout-Analyse mit Docling und nutzen automatisch den schnellen Standard-PDF-Text-Fallback, um Speicherüberläufe (OOM-Kills) zu verhindern.
Alle Einstellungen ueber Umgebungsvariablen (.env) oder das Admin-Panel (/admin/settings):
| Variable | Beschreibung | Default |
|---|---|---|
SECRET_KEY |
Flask Secret Key | Zufallswert |
FLASK_ENV |
development oder production |
production |
DATABASE_URL |
SQLite oder PostgreSQL URL | sqlite:///instance/dms.db |
REDIS_URL |
Redis Verbindungs-URL fuer die persistente Task-Queue | - |
ONLYOFFICE_SECRET |
OnlyOffice JWT Secret | - |
ONLYOFFICE_URL |
OnlyOffice Server URL | http://localhost:8080/ |
DMS_EXTERNAL_URL |
URL unter der OnlyOffice DMS erreicht | http://localhost:5000 |
LLM_PROVIDER |
Aktiver RAG/Chatbot Provider (ollama, openai, openrouter, anthropic, gemini) |
ollama |
OPENAI_API_KEY |
OpenAI API Key (fuer Chat & Embeddings) | - |
ANTHROPIC_API_KEY |
Anthropic Claude API Key | - |
GEMINI_API_KEY |
Google Gemini API Key | - |
OPENROUTER_API_KEY |
OpenRouter API Key | - |
EMBEDDING_MODEL |
Modell fuer Vektor-Embeddings | nomic-embed-text |
CONCURRENCY |
Anzahl paralleler Extraktionsthreads im lokalen Pool (Fallback-Modus) | 1 |
ADMIN_INITIAL_PASSWORD |
Admin-Passwort bei Ersteinrichtung | admin123 |
MAX_UPLOAD_MB |
Max. Upload-Groesse in MB | 500 |
LOG_LEVEL |
Logging-Level | INFO |
# .env anpassen:
FLASK_ENV=production
DATABASE_URL=postgresql://user:pass@host:5432/dms
SESSION_COOKIE_SECURE=true
RATELIMIT_ENABLED=true
# Starten (Docker):
docker-compose up -d
# Oder mit Gunicorn (Linux):
gunicorn -w 4 -b 0.0.0.0:5000 app:app
# Mit Waitress (Windows):
python -c "from waitress import serve; from app import app; serve(app, host='0.0.0.0', port=5000)"LaxXx-DMS/
├── app.py # Hauptanwendung
├── config.py # Konfiguration (dotenv-basiert)
├── logger.py # Zentrales Logging
├── models.py # Datenbank-Modelle (inkl. pgvector)
├── filters.py # Jinja2-Template-Filter
├── blueprints/
│ ├── __init__.py
│ └── chat.py # RAG-Chatbot Blueprint
├── extensions/
│ └── wiki/ # Wiki Extension Plugin
├── templates/ # HTML-Templates (Jinja2)
│ └── chat.html # Chat-Interface
├── static/ # CSS, JS, FontAwesome
├── tests/ # Pytest Test Suite
├── .github/workflows/ # CI/CD (GitHub Actions)
├── docker-compose.yml # Docker Compose (PostgreSQL + App + OnlyOffice)
├── Dockerfile # Container-Build
├── .env # Umgebungsvariablen (NICHT committen!)
└── requirements.txt # Python-Abhaengigkeiten
pip install pytest pytest-flask
python -m pytest tests/ -vBei Aenderungen an den Datenbank-Modellen:
flask db init # Einmalig
flask db migrate -m "Beschreibung"
flask db upgrade