FROM node:22-alpine AS builder WORKDIR /app # 依存関係のインストール COPY package.json package-lock.json* ./ COPY ui/package.json ui/package-lock.json* ./ui/ RUN npm ci --ignore-scripts RUN npm --prefix ui ci --ignore-scripts # noVNC スタンドアロン (vnc.html を含む Web 配布物) を取得。 # npm の @novnc/novnc は lib のみで vnc.html を含まないため、 # Browser タブの iframe 用に GitHub から tarball を取得する。 ARG NOVNC_VERSION=1.6.0 RUN apk add --no-cache --virtual .novnc-fetch curl tar \ && mkdir -p /app/vendor/noVNC \ && curl -fSL "https://github.com/novnc/noVNC/archive/refs/tags/v${NOVNC_VERSION}.tar.gz" \ | tar -xz -C /app/vendor/noVNC --strip-components=1 \ && test -f /app/vendor/noVNC/vnc.html \ && apk del .novnc-fetch # TypeScript ビルド COPY tsconfig.json ./ COPY src ./src COPY ui ./ui RUN npm run build:server RUN npm run build:ui # --- ランタイムステージ --- FROM node:22-alpine AS runtime RUN apk add --no-cache \ git \ ca-certificates \ tzdata \ bash \ bubblewrap \ python3 \ py3-pip # Pre-bake python packages into the system site-packages (read-only bind-mounted # into every bash sandbox). Runtime `pip install` is intentionally unsupported. COPY runtime/python-requirements.txt /tmp/python-requirements.txt RUN pip3 install --no-cache-dir --break-system-packages -r /tmp/python-requirements.txt \ && rm /tmp/python-requirements.txt WORKDIR /app # 本番依存のみインストール COPY package.json package-lock.json* ./ RUN npm ci --omit=dev --ignore-scripts # ビルド済み成果物をコピー COPY --from=builder /app/dist ./dist COPY --from=builder /app/ui/dist ./ui/dist COPY --from=builder /app/vendor ./vendor # schema.sql は dist に含まれないため個別コピー COPY src/db/schema.sql ./dist/db/schema.sql # デフォルト設定 COPY config.yaml ./ # データ永続化ディレクトリ RUN mkdir -p /data /workspaces ENV NODE_ENV=production \ PORT=9876 \ DB_PATH=/data/maestro.db EXPOSE 9876 CMD ["node", "dist/index.js"]