77 lines
1.6 KiB
Docker
77 lines
1.6 KiB
Docker
# Build stage
|
|
FROM node:20-alpine AS builder
|
|
|
|
WORKDIR /app
|
|
|
|
# Copy package files
|
|
COPY package.json package-lock.json* ./
|
|
|
|
# Install dependencies
|
|
RUN npm ci
|
|
|
|
# Copy source code
|
|
COPY . .
|
|
|
|
# Set build-time environment variables
|
|
ARG DATABASE_URL
|
|
ARG GOOGLE_CLIENT_ID
|
|
ARG GOOGLE_CLIENT_SECRET
|
|
ARG R2_ACCOUNT_ID
|
|
ARG R2_ACCESS_KEY_ID
|
|
ARG R2_SECRET_ACCESS_KEY
|
|
ARG R2_BUCKET_NAME
|
|
ARG GOOGLE_MAPS_API_KEY
|
|
ARG VAPID_PUBLIC_KEY
|
|
ARG VAPID_PRIVATE_KEY
|
|
ARG VAPID_SUBJECT
|
|
|
|
ENV DATABASE_URL=${DATABASE_URL}
|
|
ENV GOOGLE_CLIENT_ID=${GOOGLE_CLIENT_ID}
|
|
ENV GOOGLE_CLIENT_SECRET=${GOOGLE_CLIENT_SECRET}
|
|
ENV R2_ACCOUNT_ID=${R2_ACCOUNT_ID}
|
|
ENV R2_ACCESS_KEY_ID=${R2_ACCESS_KEY_ID}
|
|
ENV R2_SECRET_ACCESS_KEY=${R2_SECRET_ACCESS_KEY}
|
|
ENV R2_BUCKET_NAME=${R2_BUCKET_NAME}
|
|
ENV GOOGLE_MAPS_API_KEY=${GOOGLE_MAPS_API_KEY}
|
|
ENV VAPID_PUBLIC_KEY=${VAPID_PUBLIC_KEY}
|
|
ENV VAPID_PRIVATE_KEY=${VAPID_PRIVATE_KEY}
|
|
ENV VAPID_SUBJECT=${VAPID_SUBJECT}
|
|
|
|
# Build the app
|
|
RUN npm run build
|
|
|
|
# Production stage
|
|
FROM node:20-alpine
|
|
|
|
WORKDIR /app
|
|
|
|
# Copy package files
|
|
COPY package.json package-lock.json* ./
|
|
|
|
# Install production dependencies only
|
|
RUN npm ci --omit=dev
|
|
|
|
# Copy built app from builder
|
|
COPY --from=builder /app/build ./build
|
|
|
|
# Copy drizzle migrations and config
|
|
COPY --from=builder /app/drizzle ./drizzle
|
|
COPY --from=builder /app/drizzle.config.ts ./drizzle.config.ts
|
|
|
|
# Copy entrypoint script
|
|
COPY docker-entrypoint.sh /usr/local/bin/
|
|
RUN chmod +x /usr/local/bin/docker-entrypoint.sh
|
|
|
|
# Expose port
|
|
EXPOSE 3000
|
|
|
|
# Set environment variables
|
|
ENV NODE_ENV=production
|
|
ENV ORIGIN=http://localhost:3000
|
|
|
|
# Use entrypoint script
|
|
ENTRYPOINT ["docker-entrypoint.sh"]
|
|
|
|
# Start the app
|
|
CMD ["node", "build"]
|