Files
znakovni.hr/Dockerfile
johnny2211 f575ab16c4 Fix Docker build: include scripts directory and tsx runtime
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
2026-01-18 18:47:55 +01:00

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"]