.PHONY: install dev stop test test-e2e build install: pip install --break-system-packages fastapi "uvicorn[standard]" httpx pytest pytest-asyncio ftfy fuzzysearch cd frontend && npm install @echo "Optional: pip install sentence-transformers (Embedding-Kandidaten; ohne läuft lexikalischer Fallback)." @echo "Optional: poppler-utils für PDF-Quellen (pdftotext)." dev: @echo "Backend: http://localhost:8000 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 stop: -@pkill -f "uvicorn main:app" 2>/dev/null -@pkill -f "vite --port 5173" 2>/dev/null @echo "gestoppt." test: cd backend && python -m pytest ../tests -x -q test-e2e: cd backend && CREATOR_FAKE_AGENTS=1 python -m pytest ../tests/test_e2e.py -x -q build: cd frontend && npm run build # ── Server-Deployment (Muster vom alten creator; Traefik läuft dort schon) ──── SERVER = root@178.104.67.87 REMOTE = /var/www/creator2 # Code (+ .env) auf den Server spiegeln und Container neu bauen. # storage/topics sind ausgenommen — Daten leben nur auf der jeweiligen Seite. deploy: rsync -avz --delete \ --exclude .git --exclude node_modules --exclude frontend/node_modules \ --exclude frontend/dist --exclude storage --exclude topics \ --exclude .claude-data --exclude __pycache__ --exclude .pytest_cache \ ./ $(SERVER):$(REMOTE)/ ssh $(SERVER) 'cd $(REMOTE) && docker compose up -d --build' @echo "Deploy fertig: https://creator2.marha.de" # Remote-Daten holen (Remote wird für den DB-Snapshot gestoppt und neu gestartet). sync: stop @rm -f storage/creator2.db-shm storage/creator2.db-wal ssh $(SERVER) 'cd $(REMOTE) && docker compose down' rsync -avz --progress $(SERVER):$(REMOTE)/storage/creator2.db storage/ -rsync -avz --progress $(SERVER):$(REMOTE)/storage/creator2.db-wal storage/ rsync -avz --progress --delete $(SERVER):$(REMOTE)/storage/korpus/ storage/korpus/ rsync -avz --progress --delete $(SERVER):$(REMOTE)/topics/ topics/ ssh $(SERVER) 'cd $(REMOTE) && docker compose up -d' @echo "Sync abgeschlossen — Remote läuft wieder." # Lokalen Stand auf den Server schieben (überschreibt Remote-Daten!). sync-reverse: stop @[ -f storage/creator2.db ] || { echo "Keine lokale DB — abgebrochen."; exit 1; } ssh $(SERVER) 'cd $(REMOTE) && docker compose down' ssh $(SERVER) 'mkdir -p $(REMOTE)/storage $(REMOTE)/topics && rm -f $(REMOTE)/storage/creator2.db-shm $(REMOTE)/storage/creator2.db-wal' rsync -avz --progress storage/creator2.db $(SERVER):$(REMOTE)/storage/ -rsync -avz --progress storage/creator2.db-wal $(SERVER):$(REMOTE)/storage/ rsync -avz --progress --delete storage/korpus/ $(SERVER):$(REMOTE)/storage/korpus/ rsync -avz --progress --delete topics/ $(SERVER):$(REMOTE)/topics/ ssh $(SERVER) 'cd $(REMOTE) && docker compose up -d' @echo "Reverse-Sync abgeschlossen — Remote läuft wieder."