Problem: Docker container failed to start with REGENERATE_GIFS=true because scripts directory was not copied to production image and tsx was not available at runtime. Error: Cannot find module '/app/packages/backend/scripts/regenerate-all-gifs.ts' Root cause: 1. Dockerfile only copied dist/ and prisma/ directories, not scripts/ 2. tsx was in devDependencies, not available in production Solution: 1. Add COPY scripts directory in Dockerfile (line 69) 2. Move tsx from devDependencies to dependencies in package.json 3. Update pnpm-lock.yaml to reflect dependency change Changes: - Dockerfile: Added COPY --from=backend-builder scripts directory - package.json: Moved tsx@^4.7.0 to dependencies - pnpm-lock.yaml: Updated lockfile This allows the REGENERATE_GIFS environment variable to work correctly in production, enabling automatic GIF regeneration on container startup. Co-Authored-By: Auggie
94 lines
2.7 KiB
Docker
94 lines
2.7 KiB
Docker
# ===========================================
|
|
# Stage 1: Build Frontend
|
|
# ===========================================
|
|
FROM node:20-alpine AS frontend-builder
|
|
|
|
WORKDIR /app
|
|
|
|
# Copy workspace configuration files
|
|
COPY package.json pnpm-lock.yaml pnpm-workspace.yaml ./
|
|
COPY packages/frontend/package.json ./packages/frontend/
|
|
|
|
# Install pnpm and dependencies
|
|
RUN npm install -g pnpm && \
|
|
pnpm install --frozen-lockfile
|
|
|
|
# Copy frontend source code
|
|
COPY packages/frontend ./packages/frontend
|
|
|
|
# Build frontend
|
|
RUN cd packages/frontend && pnpm build
|
|
|
|
# ===========================================
|
|
# Stage 2: Build Backend
|
|
# ===========================================
|
|
FROM node:20-alpine AS backend-builder
|
|
|
|
WORKDIR /app
|
|
|
|
# Copy workspace configuration files
|
|
COPY package.json pnpm-lock.yaml pnpm-workspace.yaml ./
|
|
COPY packages/backend/package.json ./packages/backend/
|
|
|
|
# Install pnpm and dependencies
|
|
RUN npm install -g pnpm && \
|
|
pnpm install --frozen-lockfile
|
|
|
|
# Copy backend source code
|
|
COPY packages/backend ./packages/backend
|
|
|
|
# Generate Prisma client and build backend
|
|
RUN cd packages/backend && \
|
|
npx prisma generate && \
|
|
pnpm build
|
|
|
|
# ===========================================
|
|
# Stage 3: Production Runtime
|
|
# ===========================================
|
|
FROM node:20-alpine AS production
|
|
|
|
WORKDIR /app
|
|
|
|
# Install OpenSSL for Prisma compatibility, nginx for reverse proxy, and ffmpeg for video processing
|
|
RUN apk add --no-cache openssl nginx ffmpeg
|
|
|
|
# Install pnpm globally
|
|
RUN npm install -g pnpm
|
|
|
|
# Copy workspace configuration files
|
|
COPY package.json pnpm-workspace.yaml pnpm-lock.yaml ./
|
|
COPY packages/backend/package.json ./packages/backend/
|
|
COPY packages/frontend/package.json ./packages/frontend/
|
|
|
|
# Install ALL dependencies (including Prisma CLI needed for migrations)
|
|
RUN pnpm install --frozen-lockfile
|
|
|
|
# Copy backend build artifacts
|
|
COPY --from=backend-builder /app/packages/backend/dist ./packages/backend/dist
|
|
COPY --from=backend-builder /app/packages/backend/prisma ./packages/backend/prisma
|
|
COPY --from=backend-builder /app/packages/backend/scripts ./packages/backend/scripts
|
|
|
|
# Copy Prisma generated client (in pnpm workspace structure)
|
|
# We need to copy the entire .pnpm directory to preserve the Prisma client
|
|
COPY --from=backend-builder /app/node_modules/.pnpm ./node_modules/.pnpm
|
|
|
|
# Copy frontend build artifacts
|
|
COPY --from=frontend-builder /app/packages/frontend/dist ./packages/frontend/dist
|
|
|
|
# Create uploads directory
|
|
RUN mkdir -p /app/packages/backend/uploads
|
|
|
|
# Copy nginx configuration
|
|
COPY nginx.conf /etc/nginx/nginx.conf
|
|
|
|
# Copy startup script
|
|
COPY docker-entrypoint.sh /app/docker-entrypoint.sh
|
|
RUN chmod +x /app/docker-entrypoint.sh
|
|
|
|
# Expose frontend port
|
|
EXPOSE 5173
|
|
|
|
# Set entrypoint
|
|
CMD ["/app/docker-entrypoint.sh"]
|
|
|