diff options
| author | Adam Malczewski <[email protected]> | 2026-05-19 19:40:21 +0900 |
|---|---|---|
| committer | Adam Malczewski <[email protected]> | 2026-05-19 19:40:21 +0900 |
| commit | f78a91c20f658dd404277919a0b872b352c99bb6 (patch) | |
| tree | 58cfffb655da4443f4b7a39543b86f988f15239f /Dockerfile | |
| download | dispatch-main.tar.gz dispatch-main.zip | |
- Bun monorepo with @dispatch/core, @dispatch/api, @dispatch/frontend
- Agent runtime with Vercel AI SDK, streaming via WebSocket
- Tools: read_file, write_file, list_files (scoped to working directory)
- Hono API server with POST /chat, GET /status, GET /health, WS /ws
- Svelte 5 + DaisyUI frontend with chat UI, theme switcher, copy button
- OpenCode Go (Zen) as LLM provider, deepseek-v4-flash-free model
- Docker setup (dev + prod) with bin/ scripts and gopass secrets
- Biome v2 linting/formatting, Vitest tests (44 passing)
- Debug info attached to error messages for diagnostics
Diffstat (limited to 'Dockerfile')
| -rw-r--r-- | Dockerfile | 45 |
1 files changed, 45 insertions, 0 deletions
diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..a5ffeb3 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,45 @@ +# Production Dockerfile — multi-stage build for the API server only +# Frontend deploys separately (e.g., Cloudflare Pages) + +FROM oven/bun:1 AS builder + +WORKDIR /app + +COPY package.json bun.lock ./ +COPY packages/core/package.json packages/core/package.json +COPY packages/api/package.json packages/api/package.json +COPY packages/frontend/package.json packages/frontend/package.json + +RUN bun install --frozen-lockfile + +COPY . . + +# --- Production image --- + +FROM oven/bun:1 + +WORKDIR /app + +# Copy only what the API server needs +COPY --from=builder /app/package.json ./ +COPY --from=builder /app/node_modules ./node_modules +COPY --from=builder /app/packages/core ./packages/core +COPY --from=builder /app/packages/api ./packages/api + +# Create workspace directory for file tools +RUN mkdir -p workspace + +# Production entrypoint +COPY docker/entrypoint.sh /usr/local/bin/entrypoint.sh +RUN chmod +x /usr/local/bin/entrypoint.sh + +# Run as non-root +USER bun + +EXPOSE 3000 + +HEALTHCHECK --interval=30s --timeout=10s --retries=3 \ + CMD bun -e "const r = await fetch('http://localhost:3000/health'); process.exit(r.ok ? 0 : 1)" + +ENTRYPOINT ["/usr/local/bin/entrypoint.sh"] +CMD ["bun", "packages/api/src/index.ts"] |
