Compare commits

..

2 commits
v1.0.32 ... dev

Author SHA1 Message Date
Suphonchai Phoonsawat
6ce071ee14 fix(token): restore environment variable checks for DOCVER_API_KEY and DOCVER_TOKEN_SECRET
All checks were successful
Deploy eCourt Note Web to Server / Validate Database Schema (Drizzle) (push) Successful in 4s
Deploy eCourt Note Web to Server / Build Web Docker Image (push) Successful in 1m16s
Deploy eCourt Note Web to Server / Deploy eCourt Note Web to Server (push) Successful in 5s
Deploy eCourt Note Web to Server / Notify Deployment Status (push) Successful in 0s
2026-10-26 18:37:02 +07:00
Suphonchai Phoonsawat
ab62a2b3e2 feat(docker): add MinIO configuration and token settings in Dockerfile
All checks were successful
Deploy eCourt Note Web to Server / Validate Database Schema (Drizzle) (push) Successful in 3s
Deploy eCourt Note Web to Server / Build Web Docker Image (push) Successful in 1m6s
Deploy eCourt Note Web to Server / Deploy eCourt Note Web to Server (push) Successful in 4s
Deploy eCourt Note Web to Server / Notify Deployment Status (push) Successful in 0s
2026-10-26 13:02:25 +07:00
3 changed files with 28 additions and 16 deletions

View file

@ -28,13 +28,13 @@ export async function POST(request: Request) {
if (!parsed.ok) return docverError(parsed.error, 400); if (!parsed.ok) return docverError(parsed.error, 400);
// ความผิด config ฝั่ง server ไม่ใช่ความผิดของผู้เรียก — ไม่ตั้ง = 500 (ห้าม log ค่า secret) // ความผิด config ฝั่ง server ไม่ใช่ความผิดของผู้เรียก — ไม่ตั้ง = 500 (ห้าม log ค่า secret)
// const secret = process.env.DOCVER_TOKEN_SECRET?.trim(); const secret = process.env.DOCVER_TOKEN_SECRET?.trim();
const secret = // const secret =
"487023dd1c1c4d6a07475e96b1cc300fec1e68ac9c2dd7d5ac9b1bf75da1053e"; // "487023dd1c1c4d6a07475e96b1cc300fec1e68ac9c2dd7d5ac9b1bf75da1053e";
// if (secret === undefined || secret === "") { if (secret === undefined || secret === "") {
// return docverError("DOCVER_TOKEN_SECRET ยังไม่ถูกตั้งค่า", 500); return docverError("DOCVER_TOKEN_SECRET ยังไม่ถูกตั้งค่า", 500);
// } }
const ttlRaw = Number(process.env.DOCVER_TOKEN_TTL_SECONDS); const ttlRaw = Number(process.env.DOCVER_TOKEN_TTL_SECONDS);
const ttlSeconds = const ttlSeconds =
Number.isFinite(ttlRaw) && ttlRaw > 0 ? Math.floor(ttlRaw) : 3600; Number.isFinite(ttlRaw) && ttlRaw > 0 ? Math.floor(ttlRaw) : 3600;

View file

@ -23,8 +23,20 @@ ENV NEXT_TELEMETRY_DISABLED=1
# db/index.ts throw ถ้าไม่มี DATABASE_URL ตอน next build เก็บ page data — # db/index.ts throw ถ้าไม่มี DATABASE_URL ตอน next build เก็บ page data —
# ใส่ค่า dummy (postgres.js เชื่อมแบบ lazy ไม่มี query ตอน build) ตัวจริงฉีดตอน docker run # ใส่ค่า dummy (postgres.js เชื่อมแบบ lazy ไม่มี query ตอน build) ตัวจริงฉีดตอน docker run
ENV DATABASE_URL=postgresql://placeholder:placeholder@127.0.0.1:5432/placeholder ENV DATABASE_URL=postgresql://placeholder:placeholder@127.0.0.1:5432/placeholder
ENV MINIO_ENDPOINT=127.0.0.1
ENV MINIO_PORT=19000
ENV MINIO_USE_SSL=false
ENV MINIO_ACCESS_KEY=minioadmin
ENV MINIO_SECRET_KEY=minioadmin
ENV DOCVER_API_KEY=2d9b76d49a4f5311f6a0dacf759ecec53f34b6d102f24c696890a4052c99cf54
ENV DOCVER_TOKEN_SECRET=487023dd1c1c4d6a07475e96b1cc300fec1e68ac9c2dd7d5ac9b1bf75da1053e
ENV DOCVER_TOKEN_TTL_SECONDS=604800
ENV MINIO_BUCKET=docver
ENV DOCVER_LINK_TTL_SECONDS=900
RUN npm run build RUN npm run build
# ─── Stage 3: runtime ตัวเบา (แค่ standalone + public/) ─── # ─── Stage 3: runtime ตัวเบา (แค่ standalone + public/) ───
FROM node:24-alpine AS runner FROM node:24-alpine AS runner
WORKDIR /app WORKDIR /app

View file

@ -121,12 +121,12 @@ export function verifyDocverToken(
* คืน null เมื่อผ่าน / Response 401 เมื่อไม่ผ่าน */ * คืน null เมื่อผ่าน / Response 401 เมื่อไม่ผ่าน */
export function requireDocverApiKey(request: Request): Response | null { export function requireDocverApiKey(request: Request): Response | null {
// เทียบกับค่า trim แล้ว — กัน trailing newline จาก K8s secret / docker env_file // เทียบกับค่า trim แล้ว — กัน trailing newline จาก K8s secret / docker env_file
//const envKey = process.env.DOCVER_API_KEY?.trim(); const envKey = process.env.DOCVER_API_KEY?.trim();
const envKey = // const envKey =
"2d9b76d49a4f5311f6a0dacf759ecec53f34b6d102f24c696890a4052c99cf54"; // "2d9b76d49a4f5311f6a0dacf759ecec53f34b6d102f24c696890a4052c99cf54";
// if (envKey === undefined || envKey === "") { if (envKey === undefined || envKey === "") {
// return docverError("ระบบยังไม่ได้ตั้งค่า API key", 401); return docverError("ระบบยังไม่ได้ตั้งค่า API key", 401);
// } }
const provided = request.headers.get("x-api-key"); const provided = request.headers.get("x-api-key");
if (provided === null || provided === "") { if (provided === null || provided === "") {
return docverError("API key ไม่ถูกต้อง", 401); return docverError("API key ไม่ถูกต้อง", 401);
@ -150,10 +150,10 @@ export function requireDocverBearer(
): { ok: true; claims: DocverTokenClaims } | { ok: false; response: Response } { ): { ok: true; claims: DocverTokenClaims } | { ok: false; response: Response } {
const denied = () => const denied = () =>
({ ok: false, response: docverError(BEARER_DENIED, 401) }) as const; ({ ok: false, response: docverError(BEARER_DENIED, 401) }) as const;
//const secret = process.env.DOCVER_TOKEN_SECRET?.trim(); const secret = process.env.DOCVER_TOKEN_SECRET?.trim();
const secret = // const secret =
"487023dd1c1c4d6a07475e96b1cc300fec1e68ac9c2dd7d5ac9b1bf75da1053e"; // "487023dd1c1c4d6a07475e96b1cc300fec1e68ac9c2dd7d5ac9b1bf75da1053e";
//if (secret === undefined || secret === "") return denied(); if (secret === undefined || secret === "") return denied();
const header = request.headers.get("authorization"); const header = request.headers.get("authorization");
if (header === null) return denied(); if (header === null) return denied();
const match = /^Bearer\s+(\S+)$/i.exec(header); const match = /^Bearer\s+(\S+)$/i.exec(header);