From 4e085238b65796d5e91efb86714a009456a22a27 Mon Sep 17 00:00:00 2001 From: sysops Date: Sun, 5 Jul 2026 18:10:53 +0200 Subject: [PATCH] =?UTF-8?q?feat(PROJ-67):=20Manticore-Upgrade-Pfad=20f?= =?UTF-8?q?=C3=BCr=20Bestandsinstallationen?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit install.sh/update.sh übersprangen den Manticore-Block komplett, sobald irgendeine Version schon lief — der Versions-Pin aus dem letzten Fix wirkte dadurch nie auf existierende Installationen (nur Neuinstallationen). Jetzt per dpkg --compare-versions: ist die installierte Version älter als _MANTICORE_VERSION, wird der Dienst gestoppt, das neue Paket eingespielt und neu gestartet. Downgrade-Schutz durch "lt"-Vergleich. Spec PROJ-67 dokumentiert die Recherche zum Versionssprung 25.0.0 -> 27.1.5 (u.a. offene Frage zur neuen v27-Auth-Funktionalität) und den geplanten Produktiv-Test auf 131. --- features/INDEX.md | 5 +- .../PROJ-67-manticore-upgrade-25-zu-27.md | 104 ++++++++++++++++++ install.sh | 33 ++++-- update.sh | 41 +++++-- 4 files changed, 162 insertions(+), 21 deletions(-) create mode 100644 features/PROJ-67-manticore-upgrade-25-zu-27.md diff --git a/features/INDEX.md b/features/INDEX.md index ecd51aa..3096613 100644 --- a/features/INDEX.md +++ b/features/INDEX.md @@ -81,8 +81,9 @@ | PROJ-63 | Defensive Tenant-Scope-Härtung der Tenant-Verwaltungs-Endpunkte (FUND-2) | Deployed | [PROJ-63](PROJ-63-harden-tenant-admin-scope.md) | 2026-06-25 | | PROJ-64 | Session-Invalidation bei Passwort-Change + Datei-Permissions-Härtung (Security-Audit) | Deployed | [PROJ-64](PROJ-64-session-invalidation-file-permissions.md) | 2026-07-03 | | PROJ-65 | Physische Tenant-Trennung im Storage-Layer | Deployed | [PROJ-65](PROJ-65-physische-tenant-trennung.md) | 2026-07-04 | -| PROJ-66 | Backup-Strategie für Store, Keyfile, PostgreSQL (Produktiv + Teilproduktiv) | In Progress | [PROJ-66](PROJ-66-backup-strategie.md) | 2026-07-04 | +| PROJ-66 | Backup-Strategie für Store, Keyfile, PostgreSQL (Produktiv + Teilproduktiv) | Deployed | [PROJ-66](PROJ-66-backup-strategie.md) | 2026-07-04 | +| PROJ-67 | Manticore Search Upgrade 25.0.0 → 27.1.5 + Auto-Upgrade-Pfad | In Review | [PROJ-67](PROJ-67-manticore-upgrade-25-zu-27.md) | 2026-07-05 | -## Next Available ID: PROJ-67 +## Next Available ID: PROJ-68 diff --git a/features/PROJ-67-manticore-upgrade-25-zu-27.md b/features/PROJ-67-manticore-upgrade-25-zu-27.md new file mode 100644 index 0000000..418cd43 --- /dev/null +++ b/features/PROJ-67-manticore-upgrade-25-zu-27.md @@ -0,0 +1,104 @@ +--- +id: PROJ-67 +title: Manticore Search Upgrade 25.0.0 → 27.1.5 + Auto-Upgrade-Pfad für Bestandsinstallationen +status: In Review +created: 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 -i` des 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 (kein `dpkg -i` gegen 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. +- [ ] 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. +- [ ] `_MANTICORE_VERSION` bleibt als Pin im Skript (siehe Kommentar aus + Commit 3428537, 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 `|| true` an 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 Memory `project_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 +_wird während der Umsetzung ergänzt._ + +## QA Test Results +_wird nach dem Upgrade-Test auf 131 ergänzt._ + +## Deployment +_wird nach Abschluss ergänzt._ diff --git a/install.sh b/install.sh index aa53614..1524f24 100755 --- a/install.sh +++ b/install.sh @@ -432,21 +432,34 @@ install_native() { # dynamisch "latest" ermitteln (vorhersagbar, kein Parsing-Risiko) — zum # Aktualisieren: https://repo.manticoresearch.com/repository/manticoresearch_bookworm/dists/bookworm/main/binary-amd64/Packages _MANTICORE_VERSION="27.1.5-26061911-5a1cf9399" - info "Installiere Manticore Search ${_MANTICORE_VERSION}..." - if ! command -v searchd >/dev/null 2>&1 && ! systemctl is-active --quiet manticore 2>/dev/null; then - _mc_arch="$(dpkg --print-architecture)" + _mc_installed_version="$(dpkg-query -W -f='${Version}' manticore 2>/dev/null || true)" + _mc_fetch_and_install() { + local _mc_arch="$(dpkg --print-architecture)" wget -q -O /tmp/manticore.deb \ "https://repo.manticoresearch.com/repository/manticoresearch_bookworm/dists/bookworm/main/binary-${_mc_arch}/manticore_${_MANTICORE_VERSION}_${_mc_arch}.deb" \ || true - if [[ -f /tmp/manticore.deb ]]; then - dpkg -i /tmp/manticore.deb 2>/dev/null || apt-get install -f -y -qq 2>/dev/null || true - rm -f /tmp/manticore.deb - log "Manticore Search installiert" - else - die "Manticore Search konnte nicht installiert werden — siehe: https://manticoresearch.com/install/" + if [[ ! -f /tmp/manticore.deb ]]; then + return 1 fi + dpkg -i /tmp/manticore.deb 2>/dev/null || apt-get install -f -y -qq 2>/dev/null || true + rm -f /tmp/manticore.deb + return 0 + } + if [[ -z "$_mc_installed_version" ]]; then + info "Installiere Manticore Search ${_MANTICORE_VERSION}..." + _mc_fetch_and_install && log "Manticore Search installiert" \ + || die "Manticore Search konnte nicht installiert werden — siehe: https://manticoresearch.com/install/" + elif dpkg --compare-versions "$_mc_installed_version" lt "$_MANTICORE_VERSION"; then + # PROJ-67: Upgrade statt Skip, damit auch Bestandsinstallationen beim + # nächsten install.sh-/update.sh-Lauf mitgezogen werden. "lt"-Vergleich + # schützt gegen versehentliches Downgrade. + info "Manticore Search ${_mc_installed_version} gefunden, aktualisiere auf ${_MANTICORE_VERSION}..." + systemctl stop manticore 2>/dev/null || true + _mc_fetch_and_install \ + && log "Manticore Search aktualisiert: ${_mc_installed_version} → ${_MANTICORE_VERSION}" \ + || warn "Upgrade fehlgeschlagen — vorherige Version bleibt installiert" else - log "Manticore Search bereits installiert" + log "Manticore Search ${_mc_installed_version} bereits aktuell (>= ${_MANTICORE_VERSION})" fi systemctl enable --now manticore 2>/dev/null || warn "Manticore-Dienst konnte nicht gestartet werden" systemctl is-active --quiet manticore && log "Manticore Search läuft" diff --git a/update.sh b/update.sh index db86979..7716bbd 100755 --- a/update.sh +++ b/update.sh @@ -94,21 +94,44 @@ command -v npm >/dev/null || die "npm nicht gefunden — apt-get install npm" # nachschlagen (letzter "Package: manticore"-Block). _MANTICORE_VERSION="27.1.5-26061911-5a1cf9399" -if ! command -v searchd >/dev/null 2>&1 && ! systemctl is-active --quiet manticore 2>/dev/null; then - info "Manticore Search nicht gefunden — installiere Version ${_MANTICORE_VERSION}..." - _mc_arch="amd64" +_mc_installed_version="$(dpkg-query -W -f='${Version}' manticore 2>/dev/null || true)" + +_mc_fetch_and_install() { + # $1 = human-readable action word for log ("installiere"/"aktualisiere") + local _mc_arch="amd64" [[ "$(uname -m)" == "aarch64" ]] && _mc_arch="arm64" wget -q -O /tmp/manticore.deb \ "https://repo.manticoresearch.com/repository/manticoresearch_bookworm/dists/bookworm/main/binary-${_mc_arch}/manticore_${_MANTICORE_VERSION}_${_mc_arch}.deb" \ || true - if [[ -f /tmp/manticore.deb ]]; then - dpkg -i /tmp/manticore.deb 2>/dev/null || apt-get install -f -y -qq 2>/dev/null || true - rm -f /tmp/manticore.deb - log "Manticore Search installiert" - else - warn "Manticore Search konnte nicht automatisch installiert werden — bitte manuell installieren" + if [[ ! -f /tmp/manticore.deb ]]; then + warn "Manticore Search konnte nicht heruntergeladen werden — bitte manuell $1" warn "Siehe: https://manticoresearch.com/install/" + return 1 fi + dpkg -i /tmp/manticore.deb 2>/dev/null || apt-get install -f -y -qq 2>/dev/null || true + rm -f /tmp/manticore.deb + return 0 +} + +if [[ -z "$_mc_installed_version" ]]; then + info "Manticore Search nicht gefunden — installiere Version ${_MANTICORE_VERSION}..." + _mc_fetch_and_install "installieren" && log "Manticore Search installiert" +elif dpkg --compare-versions "$_mc_installed_version" lt "$_MANTICORE_VERSION"; then + # PROJ-67: bestehende Installation ist älter als der gepinnte Stand — Upgrade + # statt Skip, damit auch Bestandsinstallationen (nicht nur Neuinstallationen) + # beim nächsten Deploy automatisch mitgezogen werden. Downgrade-Schutz durch + # "lt"-Vergleich: eine bereits neuere installierte Version wird nie + # zurückgestuft (z.B. falls _MANTICORE_VERSION versehentlich rückwärts + # editiert wurde). + info "Manticore Search ${_mc_installed_version} gefunden, aktualisiere auf ${_MANTICORE_VERSION}..." + systemctl stop manticore 2>/dev/null || true + if _mc_fetch_and_install "aktualisieren"; then + log "Manticore Search aktualisiert: ${_mc_installed_version} → ${_MANTICORE_VERSION}" + else + warn "Upgrade fehlgeschlagen — vorherige Version bleibt installiert, Dienst wird trotzdem neu gestartet" + fi +else + log "Manticore Search ${_mc_installed_version} bereits aktuell (>= ${_MANTICORE_VERSION})" fi if systemctl list-unit-files manticore.service >/dev/null 2>&1; then