# syntax=docker/dockerfile:1 # better-sqlite3 는 musl(Alpine) prebuilt 가 없어 빌드 체인이 필요하다. # build 스테이지에서 컴파일한 node_modules 를 runtime 으로 복사해 # runtime 은 빌드 체인 없이 가볍게 유지한다 (glibc 베이스라 재현성도 좋다). # ── build: 네이티브 모듈 컴파일 + TS 빌드 ──────────────────────────────── FROM node:20-bookworm-slim AS build WORKDIR /app RUN apt-get update \ && apt-get install -y --no-install-recommends python3 make g++ \ && rm -rf /var/lib/apt/lists/* COPY package*.json ./ RUN --mount=type=cache,target=/root/.npm npm ci COPY tsconfig.json ./ COPY src ./src RUN npm run build && npm prune --omit=dev # ── runtime ────────────────────────────────────────────────────────────── FROM node:20-bookworm-slim AS runtime WORKDIR /app ENV NODE_ENV=production # 앱 기본값 HOST=127.0.0.1 은 컨테이너 안에만 바인딩돼 포트 매핑이 안 먹는다. ENV HOST=0.0.0.0 ENV PORT=3000 # ffmpeg: 트림·60fps·FHD 변환. ca-certificates: yt-dlp https. RUN apt-get update \ && apt-get install -y --no-install-recommends ffmpeg ca-certificates \ && rm -rf /var/lib/apt/lists/* # yt-dlp 바이너리는 BuildKit 이 빌드 타임에 받아 넣는다 (이미지에 wget 불필요). ADD --chmod=755 https://github.com/yt-dlp/yt-dlp/releases/latest/download/yt-dlp_linux bin/yt-dlp COPY --from=build /app/node_modules ./node_modules COPY --from=build /app/dist ./dist COPY package.json ./ COPY public ./public COPY views ./views # 기본 admin 계정 파일. 운영에선 볼륨/시크릿으로 덮어쓰세요 (초기값 admin). COPY account.json ./account.json VOLUME ["/app/data"] EXPOSE 3000 CMD ["node", "dist/app.js"]