# Build: bun installiert nach bun.lock, Vite/Nitro bauen das autarke .output/.
FROM oven/bun:1 AS build
ARG BETTER_AUTH_SECRET=o9gGatYEeDlINQnYvqEVq4etO7Ak6QJGnLQlXQtGuEE2NwuduL31L5nvm09UZl3n
ARG BETTER_AUTH_URL=https://tripplaner.constantinkautz.de
ARG NODE_ENV=production
ARG PORT=3000
ARG DATABASE_URL=postgres://tripplaner:uz77e4VoukGo7okuHVeDHyRt86mBrDBttdscjdVyHVubkKu7eqNcrQQK7kWI3Kok@dxfen7pxgswq4aqovsstio89:5432/tripplaner
ARG COOLIFY_URL=https://tripplaner.constantinkautz.de
ARG COOLIFY_FQDN=tripplaner.constantinkautz.de
ARG COOLIFY_BRANCH=main
ARG COOLIFY_RESOURCE_UUID=eplkz3pjeoawyynla50liw8a
WORKDIR /app
COPY package.json bun.lock bunfig.toml ./
RUN bun install --frozen-lockfile
COPY . .

# AGPL Abschnitt 13: der Quellcode muss den Nutzern des Dienstes angeboten werden.
# Muss VOR dem Build laufen, damit Vite den Ordner nach .output/public kopiert.
# Das Skript bricht ab, wenn eine Umgebungsdatei im Archiv landen würde.
ARG SOURCE_COMMIT=unbekannt
ENV SOURCE_COMMIT=$SOURCE_COMMIT
RUN sh scripts/quellcode-archiv.sh

RUN bun run build

# Der Migrationsläufer wird zu einer eigenständigen Datei gebündelt. Sonst
# bräuchte die Laufzeit node_modules, nur um drizzle-orm und postgres zu laden.
RUN bun build backend/db/migrate.ts --target=bun --outfile=.output/migrate.mjs

# Laufzeit: srvx backt den Server-Adapter zur Buildzeit ein — der Build lief unter
# bun, also muss auch die Laufzeit bun sein (node bricht mit "Bun is not defined" ab).
# .output ist autark, node_modules bleiben im Build-Stage zurück.
FROM oven/bun:1 AS runtime
ARG BETTER_AUTH_SECRET=o9gGatYEeDlINQnYvqEVq4etO7Ak6QJGnLQlXQtGuEE2NwuduL31L5nvm09UZl3n
ARG BETTER_AUTH_URL=https://tripplaner.constantinkautz.de
ARG NODE_ENV=production
ARG PORT=3000
ARG DATABASE_URL=postgres://tripplaner:uz77e4VoukGo7okuHVeDHyRt86mBrDBttdscjdVyHVubkKu7eqNcrQQK7kWI3Kok@dxfen7pxgswq4aqovsstio89:5432/tripplaner
ARG COOLIFY_URL=https://tripplaner.constantinkautz.de
ARG COOLIFY_FQDN=tripplaner.constantinkautz.de
ARG COOLIFY_BRANCH=main
ARG COOLIFY_RESOURCE_UUID=eplkz3pjeoawyynla50liw8a
WORKDIR /app
ENV NODE_ENV=production
ENV PORT=3000
# Coolifys Gesundheitsprüfung läuft IM Container und ruft curl auf. Das
# bun-Image bringt weder curl noch wget mit — ohne diese Zeile scheitert die
# Prüfung mit "curl: not found" und die App bleibt auf "unknown" stehen.
RUN apt-get update \
 && apt-get install -y --no-install-recommends curl \
 && rm -rf /var/lib/apt/lists/*
COPY --from=build /app/.output ./.output
# .output enthält den Migrationsordner nicht — ohne diese Zeile findet die
# Migration im Container keine SQL-Dateien.
COPY --from=build /app/drizzle ./drizzle
EXPOSE 3000
# Erst migrieren, dann starten. Schlägt die Migration fehl, startet der Server
# nicht; exec sorgt dafür, dass SIGTERM beim Server ankommt.
CMD ["sh", "-c", "bun .output/migrate.mjs && exec bun .output/server/index.mjs"]