# ═══════════════════════════════════════════════════════════════════════ # STAGE 1: Dependencies # Install only production dependencies # ═══════════════════════════════════════════════════════════════════════ FROM oven/bun:1.2-slim AS deps WORKDIR /app COPY package.json bun.lock ./ RUN bun install --production --frozen-lockfile # ═══════════════════════════════════════════════════════════════════════ # STAGE 2: Runtime # Minimal image with Chromium + Bun runtime only # ═══════════════════════════════════════════════════════════════════════ FROM debian:bookworm-slim AS runtime LABEL org.opencontainers.image.source="https://gitea.bigoscloud.com/biggy/samsung-tv-server" \ org.opencontainers.image.title="Samsung TV Server" \ org.opencontainers.image.description="Samsung TV Server — Bun runtime (optimized)" \ org.opencontainers.image.licenses="MIT" WORKDIR /app # Install Chromium with aggressive cleanup RUN apt-get update && \ apt-get install -y --no-install-recommends \ chromium \ ca-certificates \ fonts-liberation \ libasound2 \ libatk-bridge2.0-0 \ libatk1.0-0 \ libatspi2.0-0 \ libcups2 \ libdbus-1-3 \ libdrm2 \ libgbm1 \ libgtk-3-0 \ libnspr4 \ libnss3 \ libxcomposite1 \ libxdamage1 \ libxfixes3 \ libxkbcommon0 \ libxrandr2 \ xdg-utils && \ apt-get clean && \ rm -rf /var/lib/apt/lists/* /var/cache/apt/* /var/log/apt/* /tmp/* # Copy Bun binary from official image (lighter than full install) COPY --from=oven/bun:1.2-slim /usr/local/bin/bun /usr/local/bin/bun COPY --from=oven/bun:1.2-slim /usr/local/bin/bunx /usr/local/bin/bunx # Copy dependencies from deps stage COPY --from=deps /app/node_modules ./node_modules # Copy application code COPY package.json bun.lock ./ COPY src/ ./src/ COPY public/ ./public/ # Create data directory for SQLite RUN mkdir -p /app/data EXPOSE 3099 CMD ["bun", "run", "start"]