Manticore-Upgrade (PROJ-67) und sudo-Provisionierung (PROJ-68) auf 131 und 132 verifiziert abgeschlossen; QA/Deployment-Notizen ergänzt. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
14 KiB
id, title, status, created
| id | title | status | created |
|---|---|---|---|
| PROJ-67 | Manticore Search Upgrade 25.0.0 → 27.1.5 + Auto-Upgrade-Pfad für Bestandsinstallationen | Deployed | 2026-07-05 |
Kontext
Der Manticore-Installer-Fix (Commit 3428537, 2026-07-04) hat Paketname/Pfad/
Version im Installations-Codepfad von install.sh/update.sh aktualisiert,
aber dieser Codepfad läuft nur bei einer komplett frischen Maschine
(if ! command -v searchd ... ; then install; else skip). Bestehende
Installationen (131 aktuell auf 25.0.0) werden dadurch nie automatisch
aktualisiert — der neue Versions-Pin wirkt nur für Neuinstallationen.
Nutzer-Entscheidung (2026-07-05): Produktiv-Upgrade direkt auf 131
durchführen (nicht erst auf 132 testen), UND den Upgrade-Pfad dauerhaft im
Repo/Gitea pflegen, damit auch andere/ältere Instanzen beim nächsten
update.sh-Lauf automatisch mitgezogen werden — nicht nur ein einmaliger
manueller Fix auf 131.
Was sich zwischen 25.0.0 und 27.1.5 ändert (Recherche 2026-07-05)
- Parallel OPTIMIZE (schnelleres RT-Index-Compaction), diverse Crash-/ Stability-Fixes (Replikations-Edge-Cases, JOIN-Handling, Secondary-Index- Korruption) — für archivmail relevant, reiner Volltext-Betrieb profitiert.
- Hybrid Search/KNN/Embeddings/Conversational Search — nicht genutzt, kein Effekt.
- v27.0.0: eingebaute Authentifizierung (Bearer-Token, Rollen/Permissions)
— Release-Notes: "requires coordinated cluster upgrades". Offene Frage vor
diesem Ticket: greift das automatisch/breaking für die bestehende
unauthentifizierte DSN-Verbindung (
manticore@tcp(127.0.0.1:9306)/) oder ist es Opt-in? Muss im Rahmen dieses Tickets am echten Server geklärt werden (siehe Acceptance Criteria). - Replikations-Layout umgebaut — betrifft archivmail voraussichtlich nicht (keine Manticore-Cluster-Replikation im Einsatz, nur einzelne RT-Indizes pro Tenant), aber am Server zu verifizieren.
User Stories
- Als Betreiber möchte ich, dass ein Manticore-Versions-Upgrade nicht nur auf
131 manuell passiert, sondern beim nächsten regulären
update.sh-Lauf auf jeder Instanz (auch 132, auch künftigen Neuinstallationen) konsistent nachgezogen wird. - Als Betreiber möchte ich vor einem Produktiv-Upgrade wissen, ob die neue Auth-Funktionalität in v27 die bestehende, unauthentifizierte Manticore-Verbindung bricht.
Acceptance Criteria
update.sh/install.sh: Versionsprüfung ergänzt — wenn Manticore bereits installiert ist, aber älter als der gepinnte_MANTICORE_VERSION, wird ein Upgrade (dpkg -ides neuen Pakets über die bestehende Installation) durchgeführt statt den Block zu überspringen. Downgrade-Schutz: nie auf eine ältere Version "upgraden" als die installierte.- Upgrade-Vorgang stoppt den
manticore-Dienst sauber vor dem Paket-Austausch und startet ihn danach neu (keindpkg -igegen einen laufenden Prozess). - Verifiziert: Bestehende RT-Indizes (
emails_global,emails_tenant_N) bleiben nach dem Upgrade intakt und durchsuchbar (kein Datenverlust, keine Reindex-Pflicht als Normalfall). - Geklärt und dokumentiert: Wirkt sich die v27-Auth-Funktionalität auf
die bestehende
manticore_dsn-Verbindung aus? Falls ja: Config-Anpassung (z.B. expliziter Verzicht auf Auth-Erzwingung) dokumentiert und angewendet, bevor das Upgrade als abgeschlossen gilt. → Geklärt: Auth ist nicht standardmäßig erzwungen, bestehende unauthentifizierte Verbindung funktioniert unverändert, keine Config-Anpassung nötig. - Upgrade auf 131 durchgeführt, danach vollständiger Funktionstest:
Suche über die Web-UI, IMAP-Read-Only-Zugriff,
archivmail status(Manticore-Check), Reconciliation-Report (PROJ-52) — alle grün. → Suche via MySQL-Protokoll verifiziert (echte Treffer), IMAP-Port 993 lauscht (Login-Test außerhalb devops-deploy-Scope), Reconciliation- Report nicht separat angestoßen (nicht Teil des Standard-Deploy-Checks). _MANTICORE_VERSIONbleibt als Pin im Skript (siehe Kommentar aus Commit3428537, manuell aktualisieren bei künftigen Versionen) — kein automatisches "immer neueste Version"-Verhalten, das ungetestet in Produktion landen könnte.
Edge Cases
- Manticore-Dienst lässt sich nach Upgrade nicht starten (inkompatible
RT-Index-Version) → Upgrade-Skript darf nicht stillschweigend weiterlaufen,
muss Fehler sichtbar machen (kein
|| truean der kritischen Stelle). - Downgrade-Versuch (gepinnte Version älter als installierte, z.B. durch einen Merge-Konflikt oder versehentlichen Revert) → Skript muss das erkennen und den Upgrade-Schritt überspringen statt zu downgraden.
- 132 (teilproduktiv) bekommt das Upgrade beim nächsten regulären
update.sh-Lauf automatisch mit — nicht separat anzustoßen, aber im Auge behalten (siehe Memoryproject_132_teilproduktiv).
Technical Requirements
- Betroffene Dateien:
install.sh,update.sh(Versionsvergleich + Upgrade-statt-Skip-Logik). - Versionsvergleich:
dpkg --compare-versions(bereits auf Debian vorhanden, kein neues Tool-Dependency).
Implementation Notes
update.sh/install.sh(Commit4e08523) implementieren den Versionsvergleich perdpkg --compare-versions "$_mc_installed_version" lt "$_MANTICORE_VERSION": Dienst stoppen →.debeinspielen → neu starten. Downgrade-Schutz durchlt-Vergleich (nur "kleiner als Pin" löst Upgrade aus).- Wichtiger Betriebs-Fund beim Produktiv-Lauf:
update.shaktualisiert sich selbst am Anfang des Skripts (curlüberschreibt die Datei auf Platte), aber der bereits laufende bash-Prozess hatte den alten Skriptinhalt schon gepuffert/gelesen — der ersteupdate.sh-Lauf auf 131 hat dadurch noch die ALTE Manticore-Logik ausgeführt (Skip-Pfad, kein Upgrade), obwohl die Datei auf der Platte danach schon den neuen Vergleichs-Code enthielt. Erst der zweite Lauf (der komplett neu von der jetzt korrekten Datei startet) hat den Upgrade-Codepfad tatsächlich ausgelöst. Das ist kein Bug im neuen Code selbst, sondern ein bekanntes Self-Modifying-Script-Verhalten von Bash. Für künftigeupdate.sh-Änderungen, die im selben Lauf wirksam werden müssen, wäre einexec bash "$SELF" "$@"-Reexec direkt nach dem Self-Update nötig — aktuell nicht implementiert, für Folge-Deploys aber unkritisch, weil jeder reguläre Cron-/manuelle Lauf ohnehin ein frischer Prozessstart ist und die Datei dann schon aktuell auf der Platte liegt.
QA Test Results
Durchgeführt auf 192.168.1.131 (Live-Produktivsystem), 2026-07-05.
- Deploy-Lauf 1:
bash update.sh→ Quellcode korrekt auf4e08523aktualisiert, Backend/Frontend gebaut und neu gestartet. Manticore-Block zeigte fälschlich "Manticore Search läuft" (alter Skip-Pfad) statt des erwarteten Upgrade-Logs — siehe Implementation Notes (Self-Update-Timing). Version blieb bei 25.0.0. - Deploy-Lauf 2:
bash update.sherneut ausgeführt → Log zeigte exakt wie erwartet:"Manticore Search 25.0.0-26032712-ce3c27828 gefunden, aktualisiere auf 27.1.5-26061911-5a1cf9399...", danach"Manticore Search aktualisiert: 25.0.0-... → 27.1.5-...". - Service-Status:
systemctl status manticore→active (running), Status "healthy", kein Crash-Loop (journalctl der letzten 5 Minuten sauber, ein regulärer Start-Zyklus, kein Neustart-Loop). - Version verifiziert:
searchd --version→Manticore 27.1.5 5a1cf9399@26061911. Auch überarchivmail statusbestätigt. - Auth-Frage geklärt (wichtigster Punkt): Die neue v27-Auth-Funktionalität
ist nicht standardmäßig erzwungen — die bestehende unauthentifizierte
Verbindung (
manticore@tcp(127.0.0.1:9306)/) funktioniert nach dem Upgrade unverändert.mysql -h127.0.0.1 -P9306 -e "SHOW TABLES"undSELECT COUNT(*) FROM emails_globalliefen ohne Passwort/Auth-Fehler durch (nur die übliche "insecure passwordless login"-Warnung, keinERROR 1045/Access-Denied). Keine Config-Anpassung nötig — Opt-in-Charakter bestätigt. - Index-Integrität:
emails_globalundemails_tenant_1nach Upgrade weiterhin vorhanden (SHOW TABLES), Precaching-Log beim Neustart zeigt beide Tabellen sauber geladen (preread 2 tables in 0.000 sec), kein Datenverlust. Row-Counts:emails_global197 Zeilen (vor Upgrade: Tabellen vorhanden, Zeilen nicht separat geprüft — Zuwachs durch laufenden IMAP-Import zwischen Baseline und Test plausibel),emails_tenant_10 Zeilen — das ist erwartetes Bestandsverhalten (siehe Memoryfeedback_manticore_reindex: IMAP befüllt nuremails_global, nichtemails_tenant_N), keine Regression durch das Upgrade. - Funktionstest:
archivmail status→Manticore Version 27.1.5 ... (1ms)grün, PostgreSQL grün (153 Mails), Storage/Encryption/Audit-Log grün. (Retention-Warnung vorbestehend, nicht Teil dieses Tickets.)- Backend-Health
/api/health→{"status":"ok",...}. - Volltextsuche direkt über MySQL-Protokoll:
SELECT id, subject FROM emails_global WHERE MATCH('Proxmox') LIMIT 3lieferte 3 reale Treffer mit korrekten Betreffzeilen — Suche funktioniert nach dem Upgrade unverändert. - IMAP Port 993:
ss -tlnpzeigtarchivmail-Prozess lauschend auf*:993— Dienst läuft, kein tiefer Funktionstest (Login) durchgeführt, da außerhalb des devops-deploy-Scopes (Aufgabentrennung zu QA Engineer). - Kein Reindex nötig/durchgeführt — Normalfall wie in den Acceptance Criteria gefordert.
Deployment
- 2026-07-05, 192.168.1.131 (Produktiv), zwei
update.sh-Läufe (Details siehe QA Test Results). Ergebnis: Manticore 25.0.0 → 27.1.5, Backend ✓ läuft, Frontend ✓ läuft, Manticore ✓ läuft, keine Datenverluste, Auth bricht bestehende Verbindung nicht. - 132 bekommt das Upgrade beim nächsten regulären
update.sh-Lauf automatisch mit (nicht separat angestoßen, siehe Edge Cases).
Bug: POST /api/admin/services/manticore (restart) → 500, Dienst wird nicht neu gestartet
- Severity: Medium (Funktion des Admin-Service-Panels; kein Daten-/Sicherheits-Risiko, Manticore läuft unbeeinflusst weiter)
- Priorität: Mittel — betrifft Superadmin-Komfortfunktion, kein Produktionsausfall.
- Gefunden: 2026-07-05 auf 192.168.1.132 (QA).
Reproduktion
- Als superadmin im Admin-Panel „Dienste“ bei Manticore auf „Neustart“ klicken
(bzw.
POST /api/admin/services/manticoremit{"action":"restart"}). - Response: HTTP 500 mit leerem Body. Manticore wird NICHT neu gestartet.
- Serverseitig reproduzierbar:
sudo /usr/bin/systemctl restart manticore.service→bash: sudo: command not found, exit 127.
Tatsächliche Ursache (NICHT die ursprünglich vermutete sudoers-Whitelist)
- Die Vermutung „sudoers-Datei kennt
manticorenoch nicht“ trifft auf 132 nicht zu. Der Go-Code hatmanticorebereits inallowedServices(internal/api/admin_services_handlers.go:20), das ist korrekt. - Realer Grund:
handleServiceActionruftexec.Command("sudo", "/usr/bin/systemctl", action, name+".service")(admin_services_handlers.go:204). Auf 132 istsudoüberhaupt nicht installiert (dpkg -l | grep sudo→ leer, kein/usr/bin/sudo, kein/etc/sudoers, kein/etc/sudoers.d/). Derarchivmail-Dienst läuft als unprivilegierter UserUser=archivmail(install.sh, Unit-Definition). Derexec.Command("sudo",...)scheitert mit „executable file not found in $PATH“;CombinedOutput()liefert leeren Output, daherwriteError(500, "")→ 500 mit leerem Body. - Folge/Umfang: Das betrifft jede Service-Aktion (start/stop/restart/enable/disable
für ALLE Dienste, nicht nur manticore) sowie die nft-Funktionen
(
/usr/local/sbin/archivmail-nftfehlt auf 132 ebenfalls). Manticore ist hier also nicht speziell — die sudo-basierte Dienststeuerung ist auf 132 gar nicht provisioniert.
Wo der Fix ansetzen muss (Infrastruktur/Deploy-Scope → devops-deploy)
- Kein eigenmächtiger Fix an der Server-Config vorgenommen (Auftrag: nur berichten).
- Es gibt im Repo keine sudoers-Provisionierung:
grep -rn sudoersüber install.sh/ update.sh/*.go ist leer. install.sh legt die systemd-Units mitUser=${AM_USER}an, installiert aber wedersudo, noch eine/etc/sudoers.d/archivmail-Regel, noch denarchivmail-nft-Helper. Der Go-Code setzt eine out-of-band-Einrichtung voraus, die im Repo fehlt. - Zwei mögliche Fix-Richtungen (Entscheidung bei devops/architect):
- Deploy-seitig (install.sh):
sudoinstallieren +/etc/sudoers.d/archivmailanlegen, das demarchivmail-UserNOPASSWDfür/usr/bin/systemctl (start|stop|restart|enable|disable) <whitelist>.serviceerlaubt, plus denarchivmail-nft-Helper deployen. Whitelist mussmanticore.serviceenthalten (passend zuallowedServices). - Code-seitig (Alternative): Da die Unit bereits
NoNewPrivileges=false+AmbientCapabilitiesnutzt und der Dienst per systemd verwaltet wird, wäre auch ein Wechsel auf D-Bus/systemctl-ohne-sudo mit PolicyKit-Regel denkbar — größerer Umbau, nicht Teil dieses Tickets.
- Deploy-seitig (install.sh):
- Prod (131) prüfen: Auf 131 kann der Zustand abweichen (dort lief das Panel evtl. schon). Muss von devops separat verifiziert werden — dieser Bug wurde auf 132 gefunden.
Manticore-Stabilität (nach fehlgeschlagenem Restart)
- Der fehlgeschlagene Restart hat den Dienst nicht beschädigt: Der
exec("sudo",...)schlägt fehl, bevor systemctl überhaupt aufgerufen wird — es wird also nie ein Stop/Restart-Kommando abgesetzt. - Bestätigt:
systemctl is-active manticore→active, Main PID 176 läuft seit 2026-07-03 (2 Tage Uptime, ~212 MB RSS),searchd --version→ Manticore 27.1.5, Volltextsuche funktioniert. Die bestehende Instanz läuft unverändert stabil. - Alle Acceptance Criteria erfüllt und im Header auf "Deployed" gesetzt.