offline-first, p2p synced, atproto enabled, feed reader
1# Build stage - install deps and build frontend
2FROM node:22-slim AS builder
3
4WORKDIR /app
5
6# Install pnpm
7RUN corepack enable && corepack prepare pnpm@latest --activate
8
9# Copy package files first for better layer caching
10COPY package.json pnpm-lock.yaml pnpm-workspace.yaml ./
11
12# Install all dependencies (including dev for build)
13RUN pnpm install --frozen-lockfile
14
15# Copy source code
16COPY tsconfig.json vite.config.js ./
17COPY src ./src
18
19# Build the frontend
20RUN pnpm run build
21
22# Production stage - minimal runtime image
23FROM node:22-slim AS runtime
24
25WORKDIR /app
26
27# Install pnpm
28RUN corepack enable && corepack prepare pnpm@latest --activate
29
30# Copy package files
31COPY package.json pnpm-lock.yaml pnpm-workspace.yaml ./
32
33# Install production dependencies only
34RUN pnpm install --frozen-lockfile --prod
35
36# Copy built frontend from builder
37COPY --from=builder /app/dist ./dist
38
39# Copy server source (runs with tsx)
40COPY tsconfig.json ./
41COPY src/feedline ./src/feedline
42COPY src/realm ./src/realm
43COPY src/lib ./src/lib
44
45# Create data directory for realm storage
46RUN mkdir -p /data/realms
47
48# Environment variables
49ENV NODE_ENV=production
50ENV PORT=4001
51ENV HOST=0.0.0.0
52ENV REALM_STORAGE_DIR=/data/realms
53
54EXPOSE 4001
55
56# Run the server
57CMD ["pnpm", "exec", "tsx", "src/feedline/main.ts"]