# search das komplette serverjonas search - `crawler.py` – PostgreSQL-Crawler, baut den Suchindex auf - `launcher.py` – startet/überwacht den Crawler und rollt Updates aus (siehe unten) - `search/` – Suchmaschine darüber (CLI + HTTP-API), siehe [search/README.md](search/README.md) - `web/` – Statistik-Webseite ## Rolling Updates (Generation-Mechanismus) Zentrale Tabelle (eine Zeile, `id = 1`): ```sql CREATE TABLE IF NOT EXISTS deployment_state ( id INTEGER PRIMARY KEY, generation BIGINT NOT NULL, required_version INTEGER NOT NULL ); ``` **Ablauf:** 1. Einmalig initialisieren: `python3 crawler.py --init-deployment` 2. Launcher starten: `python3 launcher.py` (startet + überwacht den Crawler) 3. Neue Version verteilen: - Neue `crawler.py` mit erhöhter `JONASSEARCH_CRAWLER_VERSION` bereitstellen (Update-Quelle im `.env` setzen oder Datei nach `releases//crawler.py` legen) - `python3 launcher.py --check-update` → neue Version wird gestaget → geprüft (`--self-update`) → aktiviert → **erst dann** wird die Generation in PostgreSQL erhöht (`--update-deployment`) 4. Alle laufenden alten Crawler merken das beim nächsten sicheren Punkt (vor jedem relevanten Commit bzw. spätestens nach `JONASSEARCH_UPDATE_CHECK_SECONDS` im Hintergrund-Check), rollen ihre offene Transaktion sauber zurück und beenden sich mit **Exit-Code 42** – nie mitten in einer Transaktion, kein hartes Killen. 5. Der jeweilige Launcher erkennt 42 und startet die bereits bereitgestellte neue Version, die die neue Generation beim Start liest. Exit-Codes des Crawlers: `0` = normal beendet, `1` = Fehler/Crash, `42` = ausschließlich „Update erforderlich". Nützliche Befehle: ```bash python3 crawler.py --version # installierte Version python3 launcher.py --status # Generation + Versionen anzeigen python3 crawler.py --self-update 2 # gestagte Release prüfen (ohne zu aktivieren) python3 crawler.py --update-deployment 2 # Generation+1 und required_version=2 setzen ```