.PHONY: install dev prod stop logs remove auth sync sync-projects sync-all sync-all-reverse projects searxng ollama qa COMPOSE = docker compose auth: @mkdir -p .claude-data storage projects uni @chown -R 1000:1000 .claude-data storage projects uni @grep -q "^CLAUDE_CODE_OAUTH_TOKEN=.\+" .env 2>/dev/null \ || echo "WARNUNG: CLAUDE_CODE_OAUTH_TOKEN fehlt in .env (Claude-Provider inaktiv)." @grep -q "^MINIMAX_API_KEY=.\+" .env 2>/dev/null \ || echo "WARNUNG: MINIMAX_API_KEY fehlt in .env (MiniMax-Provider inaktiv)." @echo "Verzeichnisse angelegt und auf uid 1000 chowned." install: pip install --break-system-packages fastapi uvicorn[standard] aiosqlite uv playwright transformers trafilatura pymupdf4llm pip install --break-system-packages torch --index-url https://download.pytorch.org/whl/cpu python3 -m playwright install chromium @echo "Falls Chromium OS-Libs fehlen: 'sudo python3 -m playwright install-deps chromium' einmalig ausführen." @which pdftotext >/dev/null 2>&1 || sudo apt-get install -y poppler-utils @which tesseract >/dev/null 2>&1 || sudo apt-get install -y tesseract-ocr tesseract-ocr-deu tesseract-ocr-eng cd frontend && npm install npm install -g opencode-ai @mkdir -p $(HOME)/.config/opencode @ln -sfn $(CURDIR)/dev-ops/opencode.json $(HOME)/.config/opencode/opencode.json @if grep -q "^MINIMAX_API_KEY=.\+" .env 2>/dev/null; then \ echo "OpenCode-Config verlinkt. MINIMAX_API_KEY aus .env wird von 'make dev' geladen."; \ else \ echo "OpenCode-Config verlinkt. MINIMAX_API_KEY noch in .env eintragen."; \ fi dev: @echo "Backend: http://localhost:8000" @echo "Frontend: http://localhost:5173" @set -a; [ -f .env ] && . ./.env; set +a; \ cd backend && uvicorn main:app --reload --port 8000 & @cd frontend && npx vite --port 5173 prod: auth $(COMPOSE) up -d --build stop: -@pkill -f "uvicorn main:app" 2>/dev/null -@pkill -f "vite --port 5173" 2>/dev/null $(COMPOSE) down @echo "Server gestoppt." logs: $(COMPOSE) logs -f remove: stop @echo "Lösche Datenbank und generierte Dateien..." rm -rf storage/* @echo "Fertig." searxng: docker run -d --name searxng --restart unless-stopped -p 8888:8080 searxng/searxng @echo "SearxNG läuft auf http://localhost:8888 (Websuche für den Lokal-Provider)." ollama: @which ollama >/dev/null 2>&1 || curl -fsSL https://ollama.com/install.sh | sh ollama pull qwen3.6:27b ollama pull qwen3.5:9b @echo "Ollama bereit — Provider 'Lokal' ist aktiv (Modelle anpassen: backend/config.py + dev-ops/opencode.json)." # Remote wird für die DB-Kopie gestoppt (sonst reißt der Snapshot mitten im Schreibvorgang) # und danach wieder gestartet. sync: stop @mkdir -p storage/topics uni @rm -f storage/creator.db-shm storage/creator.db-wal ssh root@178.104.67.87 'cd /var/www/creator && docker compose down' rsync -avz --progress root@178.104.67.87:/var/www/creator/storage/creator.db storage/ -rsync -avz --progress root@178.104.67.87:/var/www/creator/storage/creator.db-wal storage/ rsync -avz --progress --delete root@178.104.67.87:/var/www/creator/storage/topics/ storage/topics/ rsync -avz --progress --delete root@178.104.67.87:/var/www/creator/uni/ uni/ ssh root@178.104.67.87 'cd /var/www/creator && docker compose up -d' @echo "Sync abgeschlossen — Remote läuft wieder." # Projekte vom Server holen: `make sync-projects` (auch: `make sync projects`). # Mit --delete — exakter Spiegel: lokale Projekte ohne Server-Pendant werden gelöscht. sync-projects: @mkdir -p projects rsync -avz --progress --delete root@178.104.67.87:/var/www/creator/projects/ projects/ @echo "Projekt-Sync abgeschlossen." sync-all: sync sync-projects @echo "Voller Sync (Themen + Projekte) abgeschlossen." # Gegenstück zu sync-all: lokalen Stand auf den Server schieben (Local → Remote). # Stoppt den Remote-Server (DB-Sicherheit), pusht DB + Themen + Projekte, startet ihn neu. # --delete = exakter Spiegel: Remote-Dateien ohne lokales Pendant werden gelöscht. sync-all-reverse: stop @echo "ACHTUNG: überschreibt den Remote-Stand (DB, topics/, uni/, projects/) mit dem lokalen." @[ -f storage/creator.db ] || { echo "Keine lokale DB — abgebrochen."; exit 1; } ssh root@178.104.67.87 'cd /var/www/creator && docker compose down' ssh root@178.104.67.87 'rm -f /var/www/creator/storage/creator.db-shm /var/www/creator/storage/creator.db-wal' rsync -avz --progress storage/creator.db root@178.104.67.87:/var/www/creator/storage/ @[ -f storage/creator.db-wal ] && rsync -avz --progress storage/creator.db-wal root@178.104.67.87:/var/www/creator/storage/ || true rsync -avz --progress --delete storage/topics/ root@178.104.67.87:/var/www/creator/storage/topics/ rsync -avz --progress --delete uni/ root@178.104.67.87:/var/www/creator/uni/ rsync -avz --progress --delete projects/ root@178.104.67.87:/var/www/creator/projects/ ssh root@178.104.67.87 'cd /var/www/creator && docker compose up -d --build' @echo "Reverse-Sync abgeschlossen — Remote läuft wieder." # QA-Report über einen abgeschlossenen Lauf (read-only): make qa TOPIC=aak qa: @[ -n "$(TOPIC)" ] || { echo "Nutzung: make qa TOPIC= [LLM=1]"; exit 1; } @set -a; [ -f .env ] && . ./.env; set +a; \ cd backend && python3 qa.py "$(TOPIC)" $(if $(LLM),--llm,) # Guide-QA über einen gebauten Guide (read-only): make qa-guide TOPIC=Markdown [LLM=1] qa-guide: @[ -n "$(TOPIC)" ] || { echo "Nutzung: make qa-guide TOPIC= [LLM=1]"; exit 1; } @set -a; [ -f .env ] && . ./.env; set +a; \ cd backend && python3 guide_qa.py "$(TOPIC)" $(if $(LLM),--llm,) projects: sync-projects