1FROM node:24-bookworm-slim AS build
2RUN apt-get update && apt-get install -y --no-install-recommends python3 make g++ pkg-config libsecret-1-dev && rm -rf /var/lib/apt/lists/*
3RUN corepack enable
4ENV ELECTRON_SKIP_BINARY_DOWNLOAD=1
5ENV VP_GIT_HOOKS=0
6WORKDIR /src
7COPY . .
8# The unused compiler's launcher probe loops under x64 emulation.
9RUN sed -i 's/^ tsc-rs: true$/ tsc-rs: false/' pnpm-workspace.yaml && pnpm install --frozen-lockfile
10RUN pnpm exec vp run --filter t3 build
11RUN pnpm --filter t3 deploy --prod --legacy /opt/knife/apps/server
12RUN node --input-type=module -e 'import { fingerprintForkServerRuntime } from "./scripts/lib/fork-runtime.ts"; import { writeFile } from "node:fs/promises"; await writeFile("/opt/knife/knife-server-runtime", await fingerprintForkServerRuntime(process.cwd()));'
13
14FROM node:24-bookworm-slim
15ARG CODEX_VERSION=0.163.0
16ARG CLAUDE_VERSION=2.1.301
17RUN apt-get update && apt-get install -y --no-install-recommends ca-certificates git openssh-client libsecret-1-0 libdbus-1-3 tini && rm -rf /var/lib/apt/lists/*
18RUN npm install --global @openai/codex@${CODEX_VERSION} @anthropic-ai/claude-code@${CLAUDE_VERSION} && npm cache clean --force
19COPY --from=build --chown=node:node /opt/knife /opt/knife
20COPY scripts/container-runtime.ts /opt/knife/scripts/container-runtime.ts
21COPY packages/shared/package.json /opt/knife/packages/shared/package.json
22COPY packages/shared/src/forkUpdateDirectory.ts /opt/knife/packages/shared/src/forkUpdateDirectory.ts
23RUN mkdir -p /opt/knife/node_modules/@t3tools && ln -s /opt/knife/packages/shared /opt/knife/node_modules/@t3tools/shared && ln -s /opt/knife/apps/server/node_modules/effect /opt/knife/node_modules/effect
24COPY --chmod=755 infra/container/knife /usr/local/bin/knife
25RUN mkdir /data /archives /workspaces && chown node:node /data /archives /workspaces
26USER node
27WORKDIR /workspaces
28ENV T3CODE_HOME=/data
29EXPOSE 3773
30VOLUME ["/data", "/home/node", "/archives", "/workspaces"]
31ENTRYPOINT ["/usr/bin/tini", "--", "knife"]
32CMD ["serve", "--host", "0.0.0.0", "--port", "3773"]