Files
Aether/deploy/Dockerfile
T
HoneyandClaude Opus 5 31a027c93a feat(aether): initial commit – self-hosted Cloud, Phasen 1–7
Go-Backend (chi, pgx, golang-migrate) + React/TS-Frontend als PWA.
Enthalten: Auth inkl. OIDC, Dateien mit Versionen und Papierkorb,
Freigaben (Links + intern), WebDAV, Gruppenordner, Admin/Theming,
Volltextsuche mit OCR, eigener PDF-Betrachter und WOPI-Office
(Collabora/OnlyOffice).

Nicht im Repo: deploy/.env (Sitzungsschlüssel, DB- und Admin-Passwort)
sowie alle Daten- und Build-Verzeichnisse – siehe .gitignore.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-24 09:25:36 +02:00

59 lines
2.8 KiB
Docker
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# ── Stage 1: Frontend build ───────────────────────────────────────────────────
FROM node:20-alpine AS frontend-builder
WORKDIR /app/frontend
COPY frontend/package*.json ./
RUN npm ci
COPY frontend/ ./
RUN npm run build
# ── Stage 2: Backend build ────────────────────────────────────────────────────
FROM golang:1.25-alpine AS backend-builder
WORKDIR /app
RUN apk add --no-cache git
COPY backend/go.mod backend/go.sum ./
RUN go mod download
COPY backend/ ./
RUN CGO_ENABLED=0 GOOS=linux go build -ldflags="-s -w" -o aether ./cmd/aether
# ── Stage 3: Final image ──────────────────────────────────────────────────────
FROM alpine:3.20
# ocrmypdf, tesseract und poppler machen den Inhalt von PDFs und Scans
# durchsuchbar (internal/documents). Sie wiegen zusammen rund 330 MB – der
# Löwenanteil des Images. Wer das nicht braucht, kann die zweite apk-Zeile
# streichen und OCR_ENABLED=false setzen; der Server prüft beim Start selbst,
# ob die Programme da sind, und läuft sonst ohne Volltextsuche weiter.
#
# tesseract-ocr-data-deu/-eng sind die Sprachmodelle. Ohne sie startet
# tesseract zwar, erkennt aber nichts – das Paket tesseract-ocr allein bringt
# keine mit.
RUN apk add --no-cache ca-certificates tzdata && \
apk add --no-cache ocrmypdf tesseract-ocr tesseract-ocr-data-deu \
tesseract-ocr-data-eng poppler-utils && \
addgroup -S aether && adduser -S aether -G aether && \
mkdir -p /data/users /data/thumbs /data/tmp && \
chown -R aether:aether /data
WORKDIR /app
# Tesseract vermisst beim allerersten Aufruf die OpenCL-Geräte und schreibt
# dabei einen langen Diagnoseblock nach stderr. ocrmypdf ruft davor
# `tesseract --list-langs` auf und liest die Antwort – der Block bringt seinen
# Parser aus dem Tritt, und der Aufruf endet mit „Tesseract failed to report
# available languages" (Exit 3).
#
# Das Ergebnis der Vermessung landet als .dat im Arbeitsverzeichnis; ab dann ist
# die Ausgabe kurz genug. Ohne diese Zeile scheitert deshalb genau das erste
# Dokument nach jedem Neustart eines frischen Containers – gemessen, nicht
# vermutet: Versuch 1 Exit 3, Versuch 2 erfolgreich. Der Wiederholungszähler
# fängt es zwar auf, aber ein Fehlschlag, den man einbauen kann, gehört nicht
# in den Log.
RUN tesseract --list-langs >/dev/null 2>&1 || true
COPY --from=backend-builder /app/aether ./aether
COPY --from=frontend-builder /app/frontend/dist ./static
RUN chown -R aether:aether /app
USER aether
EXPOSE 8080
ENTRYPOINT ["./aether"]