# Build stage - install deps and build frontend FROM node:22-slim AS builder WORKDIR /app # Install pnpm RUN corepack enable && corepack prepare pnpm@latest --activate # Copy package files first for better layer caching COPY package.json pnpm-lock.yaml pnpm-workspace.yaml ./ # Install all dependencies (including dev for build) RUN pnpm install --frozen-lockfile # Copy source code COPY tsconfig.json vite.config.js ./ COPY src ./src # Build the frontend RUN pnpm run build # Production stage - minimal runtime image FROM node:22-slim AS runtime WORKDIR /app # Install pnpm RUN corepack enable && corepack prepare pnpm@latest --activate # Copy package files COPY package.json pnpm-lock.yaml pnpm-workspace.yaml ./ # Install production dependencies only RUN pnpm install --frozen-lockfile --prod # Copy built frontend from builder COPY --from=builder /app/dist ./dist # Copy server source (runs with tsx) COPY tsconfig.json ./ COPY src/feedline ./src/feedline COPY src/realm ./src/realm COPY src/lib ./src/lib # Create data directory for realm storage RUN mkdir -p /data/realms # Environment variables ENV NODE_ENV=production ENV PORT=4001 ENV HOST=0.0.0.0 ENV REALM_STORAGE_DIR=/data/realms EXPOSE 4001 # Run the server CMD ["pnpm", "exec", "tsx", "src/feedline/main.ts"]