From 0e9e804935f813173c245ac67a4e7e6256c6f8da Mon Sep 17 00:00:00 2001 From: Codex Date: Wed, 18 Feb 2026 13:18:02 +0000 Subject: [PATCH] chore: switch production container and docs to bun runtime --- .env.example | 1 + Dockerfile | 10 ++++++---- README.md | 7 ++++--- test/deployment.test.js | 6 ++++-- 4 files changed, 15 insertions(+), 9 deletions(-) diff --git a/.env.example b/.env.example index 6878f3b..af9cd28 100644 --- a/.env.example +++ b/.env.example @@ -2,6 +2,7 @@ NODE_ENV=production PORT=3000 STATE_FILE_PATH=/data/state.json +LOG_LEVEL=info # Webhook secrets X_WEBHOOK_SECRET=replace-me diff --git a/Dockerfile b/Dockerfile index 543618b..a9e95a5 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -FROM node:22-alpine +FROM oven/bun:1.3.5-alpine WORKDIR /app @@ -6,7 +6,9 @@ ENV NODE_ENV=production ENV PORT=3000 ENV STATE_FILE_PATH=/data/state.json -COPY package.json ./ +COPY package.json bun.lock ./ +RUN bun install --frozen-lockfile --production + COPY src ./src COPY README.md ./README.md COPY spec.md ./spec.md @@ -14,6 +16,6 @@ COPY spec.md ./spec.md EXPOSE 3000 VOLUME ["/data"] -HEALTHCHECK --interval=30s --timeout=5s --retries=3 CMD node -e "fetch('http://127.0.0.1:'+process.env.PORT+'/health').then((r)=>process.exit(r.ok?0:1)).catch(()=>process.exit(1))" +HEALTHCHECK --interval=30s --timeout=5s --retries=3 CMD bun -e "fetch('http://127.0.0.1:'+process.env.PORT+'/health').then((r)=>process.exit(r.ok?0:1)).catch(()=>process.exit(1))" -CMD ["node", "src/server.js"] +CMD ["bun", "src/server.js"] diff --git a/README.md b/README.md index 3c49b71..add4c5e 100644 --- a/README.md +++ b/README.md @@ -360,9 +360,10 @@ This repository now contains a deployable production-style app (single container - `GET /health` ### Local commands -1. `npm test` -2. `npm run start` -3. `npm run dev` +1. `bun test` +2. `bun run lint` +3. `bun run start` +4. `bun run dev` ### Environment variables Use `.env.example` as the source of truth. diff --git a/test/deployment.test.js b/test/deployment.test.js index 3f4895d..056b6d2 100644 --- a/test/deployment.test.js +++ b/test/deployment.test.js @@ -6,15 +6,17 @@ const fs = require("node:fs"); test("Dockerfile contains production container essentials", () => { const dockerfile = fs.readFileSync("Dockerfile", "utf8"); - assert.match(dockerfile, /FROM node:22-alpine/); + assert.match(dockerfile, /FROM oven\/bun:1\.3\.5-alpine/); assert.match(dockerfile, /EXPOSE 3000/); assert.match(dockerfile, /STATE_FILE_PATH=\/data\/state\.json/); + assert.match(dockerfile, /bun install --frozen-lockfile --production/); assert.match(dockerfile, /HEALTHCHECK/); - assert.match(dockerfile, /CMD \["node", "src\/server\.js"\]/); + assert.match(dockerfile, /CMD \["bun", "src\/server\.js"\]/); }); test("env example includes required webhook and credit settings", () => { const envFile = fs.readFileSync(".env.example", "utf8"); + assert.match(envFile, /LOG_LEVEL=/); assert.match(envFile, /X_WEBHOOK_SECRET=/); assert.match(envFile, /POLAR_WEBHOOK_SECRET=/); assert.match(envFile, /INCLUDED_CHARS=/);