diff --git a/Dockerfile b/Dockerfile index 08d3936..111a72c 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,25 +1,20 @@ -# ── Stage 1: Go Backend Build (CGO + Xapian) ───────────────────────────────── +# ── Stage 1: Go Backend Build (CGO-frei, Manticore Search) ─────────────────── FROM golang:1.24-bookworm AS go-builder -RUN apt-get update && apt-get install -y --no-install-recommends \ - libxapian-dev pkg-config build-essential \ - && rm -rf /var/lib/apt/lists/* - WORKDIR /build COPY go.mod go.sum ./ RUN go mod download COPY . . -RUN CGO_ENABLED=1 go build -tags xapian -buildvcs=false \ +RUN CGO_ENABLED=0 go build -buildvcs=false \ -ldflags="-s -w" \ -o /out/archivmail ./cmd/archivmail/ # ── Stage 2: Runtime Image ──────────────────────────────────────────────────── FROM debian:bookworm-slim -# Xapian runtime library only (no dev headers) RUN apt-get update && apt-get install -y --no-install-recommends \ - libxapian30 ca-certificates \ + ca-certificates \ && rm -rf /var/lib/apt/lists/* RUN useradd --system --shell /bin/false --uid 999 --create-home archivmail @@ -27,7 +22,8 @@ RUN useradd --system --shell /bin/false --uid 999 --create-home archivmail COPY --from=go-builder /out/archivmail /usr/local/bin/archivmail # Volumes: config + data werden von außen gemountet -RUN mkdir -p /var/archivmail/store /var/archivmail/astore /var/archivmail/xapian \ +# Manticore Search läuft als eigener Dienst/Container (Port 9306), nicht hier +RUN mkdir -p /var/archivmail/store /var/archivmail/astore \ && chown -R archivmail:archivmail /var/archivmail USER archivmail diff --git a/Makefile b/Makefile index 81a237b..402ab88 100644 --- a/Makefile +++ b/Makefile @@ -8,11 +8,11 @@ LDFLAGS = -X main.Version=$(VERSION) -s -w all: build -# Build — requires: apt install libxapian-dev +# Build — CGO-frei, Manticore Search als Volltext-Backend build: - go build -tags xapian -ldflags "$(LDFLAGS)" -o bin/$(APP) ./cmd/archivmail - go build -tags xapian -ldflags "$(LDFLAGS)" -o bin/$(IMPORTER) ./cmd/archivmail-import - go build -tags xapian -ldflags "$(LDFLAGS)" -o bin/$(EXPORTER) ./cmd/archivmail-export + CGO_ENABLED=0 go build -ldflags "$(LDFLAGS)" -o bin/$(APP) ./cmd/archivmail + CGO_ENABLED=0 go build -ldflags "$(LDFLAGS)" -o bin/$(IMPORTER) ./cmd/archivmail-import + CGO_ENABLED=0 go build -ldflags "$(LDFLAGS)" -o bin/$(EXPORTER) ./cmd/archivmail-export clean: rm -rf bin/ @@ -35,7 +35,7 @@ test-cover: smoke: build @echo "Starting daemon in background for smoke test..." - mkdir -p /tmp/archivmail-test/{store,xapian,logs} + mkdir -p /tmp/archivmail-test/{store,logs} ./bin/archivmail --config config/config.test.yml & sleep 2 bash smoke_test.sh @@ -51,7 +51,7 @@ install: build install -D -m 644 config/config.yml /etc/archivmail/config.yml install -D -m 644 debian/archivmail.service /lib/systemd/system/archivmail.service useradd --system --no-create-home --shell /usr/sbin/nologin archivmail 2>/dev/null || true - mkdir -p /var/archivmail/{store,astore,xapian} + mkdir -p /var/archivmail/{store,astore} mkdir -p /var/log/archivmail chown -R archivmail:archivmail /var/archivmail /var/log/archivmail systemctl daemon-reload diff --git a/docs/PRD.md b/docs/PRD.md index b20b87f..ba0cc33 100644 --- a/docs/PRD.md +++ b/docs/PRD.md @@ -48,7 +48,7 @@ Ein selbst gehostetes, unternehmenstaugliches Mail-Archiv-System, das E-Mails au - **DSGVO-konform:** E-Mails verlassen nie den eigenen Server; Löschkonzept vorhanden - **Großes Volumen:** Architektur skaliert auf > 100.000 E-Mails - **Einfache Architektur:** Go-Backend REST API + Next.js-Frontend, kleines Team (1–2 Devs) -- **Tech Stack:** Go (Backend, SMTP-Daemon, Storage, Xapian) + Next.js/TypeScript (Web-GUI) + PostgreSQL +- **Tech Stack:** Go (Backend, SMTP-Daemon, Storage) + Manticore Search (Volltext-Index) + Next.js/TypeScript (Web-GUI) + PostgreSQL ## Non-Goals - Kein vollständiger E-Mail-Client (kein eigenständiges Senden von E-Mails durch Nutzer) diff --git a/docs/api-v1.md b/docs/api-v1.md index 1a84142..d401677 100644 --- a/docs/api-v1.md +++ b/docs/api-v1.md @@ -48,7 +48,7 @@ GET /api/v1/mails | Parameter | Typ | Beschreibung | Beispiel | |-----------|-----|-------------|---------| -| `q` | string | Volltext-Suche (Xapian QueryParser) | `q=Rechnung+2024` | +| `q` | string | Volltext-Suche (Manticore QueryParser) | `q=Rechnung+2024` | | `from` | string | Absender (exakt oder Partial-Match) | `from=alice@firma.de` | | `to` | string | Empfänger | `to=bob@firma.de` | | `cc` | string | CC-Empfänger | `cc=team@firma.de` | @@ -200,7 +200,7 @@ Gibt Version und Status des Servers zurück. Nützlich zum Testen der Verbindung ## Volltext-Suche Syntax (`q`-Parameter) -Der `q`-Parameter unterstützt Xapian QueryParser-Syntax: +Der `q`-Parameter unterstützt Manticore QueryParser-Syntax: | Syntax | Beispiel | Bedeutung | |--------|---------|-----------|