# apps/web/Dockerfile # 웹앱(@d3ro/web) standalone 이미지. 빌드 컨텍스트는 저장소 루트다. # docker build -t d3ro-voice-web:latest -f apps/web/Dockerfile \ # --build-arg NEXT_PUBLIC_SUPABASE_URL=... \ # --build-arg NEXT_PUBLIC_SUPABASE_ANON_KEY=... \ # --build-arg NEXT_PUBLIC_PAYPLE_CLIENT_KEY=... . # 공개 경로는 https://d3ro.chanpaca.net/app (Next basePath '/app', 정본 packages/core/src/web-urls.ts). FROM node:24.19.0-alpine AS base FROM base AS builder WORKDIR /app # NEXT_PUBLIC_* 는 next build 때 클라이언트·서버 번들에 박힌다. 런타임 환경변수로는 바뀌지 않는다. ARG NEXT_PUBLIC_SUPABASE_URL ARG NEXT_PUBLIC_SUPABASE_ANON_KEY ARG NEXT_PUBLIC_PAYPLE_CLIENT_KEY="" ENV NEXT_PUBLIC_SUPABASE_URL=$NEXT_PUBLIC_SUPABASE_URL \ NEXT_PUBLIC_SUPABASE_ANON_KEY=$NEXT_PUBLIC_SUPABASE_ANON_KEY \ NEXT_PUBLIC_PAYPLE_CLIENT_KEY=$NEXT_PUBLIC_PAYPLE_CLIENT_KEY \ NEXT_TELEMETRY_DISABLED=1 RUN test -n "$NEXT_PUBLIC_SUPABASE_URL" && test -n "$NEXT_PUBLIC_SUPABASE_ANON_KEY" \ || (echo "NEXT_PUBLIC_SUPABASE_URL and NEXT_PUBLIC_SUPABASE_ANON_KEY build args are required" >&2 && exit 1) COPY package*.json tsconfig*.json ./ COPY packages ./packages COPY apps/web ./apps/web # 개발자 로컬 .env* 가 컨텍스트에 섞여 들어와도 빌드 값은 위 build arg 만 쓴다. RUN rm -f apps/web/.env apps/web/.env.* RUN npm ci RUN npm run build --workspace=@d3ro/web FROM base AS runner WORKDIR /app ENV NODE_ENV=production ENV PORT=3002 ENV HOSTNAME="0.0.0.0" ENV NEXT_TELEMETRY_DISABLED=1 # node 사용자로 실행하므로 .next/cache 쓰기가 가능하도록 소유권을 넘긴다. COPY --from=builder --chown=node:node /app/apps/web/.next/standalone ./ COPY --from=builder --chown=node:node /app/apps/web/.next/static ./apps/web/.next/static USER node EXPOSE 3002 CMD ["node", "apps/web/server.js"]