chore: switch production container and docs to bun runtime

This commit is contained in:
Codex
2026-02-18 13:18:02 +00:00
parent e3f9a3574e
commit 0e9e804935
4 changed files with 15 additions and 9 deletions

View File

@@ -2,6 +2,7 @@
NODE_ENV=production NODE_ENV=production
PORT=3000 PORT=3000
STATE_FILE_PATH=/data/state.json STATE_FILE_PATH=/data/state.json
LOG_LEVEL=info
# Webhook secrets # Webhook secrets
X_WEBHOOK_SECRET=replace-me X_WEBHOOK_SECRET=replace-me

View File

@@ -1,4 +1,4 @@
FROM node:22-alpine FROM oven/bun:1.3.5-alpine
WORKDIR /app WORKDIR /app
@@ -6,7 +6,9 @@ ENV NODE_ENV=production
ENV PORT=3000 ENV PORT=3000
ENV STATE_FILE_PATH=/data/state.json 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 src ./src
COPY README.md ./README.md COPY README.md ./README.md
COPY spec.md ./spec.md COPY spec.md ./spec.md
@@ -14,6 +16,6 @@ COPY spec.md ./spec.md
EXPOSE 3000 EXPOSE 3000
VOLUME ["/data"] 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"]

View File

@@ -360,9 +360,10 @@ This repository now contains a deployable production-style app (single container
- `GET /health` - `GET /health`
### Local commands ### Local commands
1. `npm test` 1. `bun test`
2. `npm run start` 2. `bun run lint`
3. `npm run dev` 3. `bun run start`
4. `bun run dev`
### Environment variables ### Environment variables
Use `.env.example` as the source of truth. Use `.env.example` as the source of truth.

View File

@@ -6,15 +6,17 @@ const fs = require("node:fs");
test("Dockerfile contains production container essentials", () => { test("Dockerfile contains production container essentials", () => {
const dockerfile = fs.readFileSync("Dockerfile", "utf8"); 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, /EXPOSE 3000/);
assert.match(dockerfile, /STATE_FILE_PATH=\/data\/state\.json/); assert.match(dockerfile, /STATE_FILE_PATH=\/data\/state\.json/);
assert.match(dockerfile, /bun install --frozen-lockfile --production/);
assert.match(dockerfile, /HEALTHCHECK/); 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", () => { test("env example includes required webhook and credit settings", () => {
const envFile = fs.readFileSync(".env.example", "utf8"); const envFile = fs.readFileSync(".env.example", "utf8");
assert.match(envFile, /LOG_LEVEL=/);
assert.match(envFile, /X_WEBHOOK_SECRET=/); assert.match(envFile, /X_WEBHOOK_SECRET=/);
assert.match(envFile, /POLAR_WEBHOOK_SECRET=/); assert.match(envFile, /POLAR_WEBHOOK_SECRET=/);
assert.match(envFile, /INCLUDED_CHARS=/); assert.match(envFile, /INCLUDED_CHARS=/);