diff --git a/.env b/.env index 6232963..0aab052 100644 --- a/.env +++ b/.env @@ -5,7 +5,7 @@ PAPERLESS_ADMIN_MAIL=deine.email@beispiel.de PAPERLESS_TIME_ZONE=Europe/Berlin PAPERLESS_UI_LANGUAGE=de PAPERLESS_OCR_LANGUAGE=deu -PAPERLESS_URL=http://your-paperless-ip:8000 +PAPERLESS_URL=http://paperless:8000 PAPERLESS_TOKEN=your_api_token_here # Postgres diff --git a/README.md b/README.md index efc0447..73397e8 100644 --- a/README.md +++ b/README.md @@ -2,8 +2,6 @@ Dieses Projekt implementiert ein lokales Retrieval-Augmented Generation (RAG) System, das Dokumente aus **Paperless-ngx** synchronisiert, verarbeitet und über eine **Streamlit** Web-UI sowie einen **Telegram Bot** durchsuchbar macht. - - ## Features * **Delta-Sync mit Paperless-ngx**: Synchronisiert nur neue oder geänderte Dokumente via API und löscht entfernte Dokumente automatisch aus dem Vektor-Speicher. @@ -11,14 +9,13 @@ Dieses Projekt implementiert ein lokales Retrieval-Augmented Generation (RAG) Sy * **Parent-Child Retrieval**: Splittet Dokumente intelligent auf (kleine Chunks für die Vektorsuche in ChromaDB, große Chunks/ganze Dokumente für den LLM-Kontext in PostgreSQL/DocStore), um den Kontextverlust zu minimieren. * **Lokales LLM**: Verwendet `granite4:tiny-h` über **Ollama** für maximale Daten-Privatsphäre. * **Multi-Interface**: Bietet eine Web-Oberfläche (Streamlit) mit Metadaten-Filterung (z.B. nach Document ID) und einen zugangsbeschränkten Telegram-Bot. -* **Vollständig Dockerisiert**: Alle Komponenten (PostgreSQL, ChromaDB, Ollama, Scheduler, Streamlit, Telegram) laufen isoliert in Containern. +* **Vollständig Dockerisiert**: Alle Komponenten (PostgreSQL, ChromaDB, Ollama, Scheduler, Streamlit, Telegram, Paperless-ngx) laufen isoliert in Containern. --- ## Voraussetzungen * **Docker** und **Docker Compose** müssen installiert sein. -* Eine laufende **Paperless-ngx** Instanz. * Ein **Paperless API Token** (kann im Paperless-Admin-Bereich erstellt werden). * Ein **Telegram Bot Token** (über den BotFather in Telegram erstellbar) sowie deine Telegram User-ID. @@ -27,38 +24,55 @@ Dieses Projekt implementiert ein lokales Retrieval-Augmented Generation (RAG) Sy ## Setup & Installation **1. Repository vorbereiten** -Stelle sicher, dass alle Dateien (`docker-compose.yml`, `Dockerfile`, `requirements.txt`, `init_ollama.sh` und der `src/`-Ordner) korrekt am selben Ort liegen. +Stelle sicher, dass alle Dateien (`docker-compose.yml`, `Dockerfile`, `requirements.txt`, der `init-skripts`-Ornder und der `src/`-Ordner) korrekt am selben Ort liegen. -**2. Skript ausführbar machen (Linux/macOS)** -Das Ollama-Startskript benötigt Ausführungsrechte: +**2. Skripte ausführbar machen (Linux/macOS)** +Die Startskripte benötigt Ausführungsrechte: ```bash -chmod +x init_ollama.sh +chmod +x init-skripts/* ``` **3. Umgebungsvariablen konfigurieren** Erstelle eine .env Datei im Hauptverzeichnis und fülle sie mit deinen Daten: ``` # Paperless -PAPERLESS_URL=http://:8000 -PAPERLESS_TOKEN= +PAPERLESS_ADMIN_USER=admin +PAPERLESS_ADMIN_PASSWORD=ein_sehr_sicheres_admin_passwort +PAPERLESS_ADMIN_MAIL=deine.email@beispiel.de +PAPERLESS_TIME_ZONE=Europe/Berlin +PAPERLESS_UI_LANGUAGE=de +PAPERLESS_OCR_LANGUAGE=deu +PAPERLESS_URL=http://paperless:8000 +PAPERLESS_TOKEN=your_api_token_here -# Postgres (Standardwerte können belassen werden) +# Postgres POSTGRES_USER=raguser POSTGRES_PASSWORD=ragpass POSTGRES_DB=ragdb POSTGRES_HOST=postgres POSTGRES_PORT=5432 -# Chroma & Ollama (Interne Docker-Routings) +# Chroma CHROMA_HOST=chromadb CHROMA_PORT=8000 + +# Ollama OLLAMA_BASE_URL=http://ollama:11434 # Telegram -TELEGRAM_BOT_TOKEN= -ALLOWED_TELEGRAM_USERS= +TELEGRAM_BOT_TOKEN=your_telegram_bot_token +ALLOWED_TELEGRAM_USERS=123456789,987654321 ``` +**4. Paperless API-Token** +Um ein API-Token für Paperless zu generieren, führe einfach folgenden Befehl aus: +```bash +docker-compose up -d --build +docker compose exec paperless manage.py drf_create_token +docker-compose down +``` +Trage den generierten API-Token nach dem Ausführen dieser Befehle in die .env-Datei ein. + ## Starten & Ausführen Starte das gesamte System im Hintergrund: @@ -70,19 +84,31 @@ docker-compose up -d --build * Die Datenbanken (Postgres, Chroma) werden initialisiert. + * Paperless-ngx startet und wird initialisiert. + * Der ollama-Container startet, wartet kurz und lädt automatisch das Modell granite4:tiny-h herunter. - * Der scheduler wartet auf 03:00 Uhr nachts für den initialen Ingest (siehe Troubleshooting für einen manuellen Start). + * Der scheduler wartet auf 01:00 Uhr nachts für den initialen Ingest (siehe Troubleshooting für einen manuellen Start). * streamlit und der telegram-bot gehen online. **Zugriff:** + * Paperless-ngx Web-UI: Öffne http://localhost:8000 in deinem Browser. + * Streamlit Web-UI: Öffne http://localhost:8501 in deinem Browser. * Telegram Bot: Suche deinen Bot in Telegram und sende /start. ---------------------------------------------------------------------------------------------------------------------------- +--- + + ## Sicherheit + +Für mehr Sicherheit und eine einfachere Nutzung empfiehlt es sich, Paperless und die Streamlit-App in Produktivumgebungen hinter einem Reverse-Proxy (z. B. Nginx oder Nginx Proxy Manager) zu betreiben. + +Die Telegram-Anbindung kann einfach durch Auskommentieren oder Entfernen des Telegram-Containers in der docker-compose.yml deaktiviert werden. + +--- ## Nützliche Docker-Befehle (Troubleshooting & Logs) @@ -107,7 +133,7 @@ docker-compose logs -f ollama ``` **Manuellen Ingest (Sync) sofort anstoßen:** -Falls du nicht bis 03:00 Uhr nachts warten willst, kannst du den Sync-Job manuell im laufenden Scheduler-Container ausführen: +Falls du nicht bis 01:00 Uhr nachts warten willst, kannst du den Sync-Job manuell im laufenden Scheduler-Container ausführen: ```bash docker exec -it python src/ingest_job.py ``` diff --git a/src/telegram_bot.py b/src/telegram_bot.py index b7aca33..cc98c63 100644 --- a/src/telegram_bot.py +++ b/src/telegram_bot.py @@ -24,7 +24,7 @@ async def start(update: Update, context: ContextTypes.DEFAULT_TYPE): if not check_auth(update): await update.message.reply_text("Zugriff verweigert.") return - await update.message.reply_text("Hallo! Ich bin dein Paperless RAG-Bot. Frag mich etwas.") + await update.message.reply_text("Hallo! Ich bin dein DocuMind-G4 RAG-Bot. Frag mich etwas.") async def handle_message(update: Update, context: ContextTypes.DEFAULT_TYPE): if not check_auth(update):