From a14963e237aaca1ddc3bb919319420f72c47cedf Mon Sep 17 00:00:00 2001 From: claude-bot Date: Fri, 15 May 2026 18:06:21 +0900 Subject: [PATCH] feat: cap upload size at 1 GiB by default (UPLOAD_MAX_BYTES override) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 기본 업로드 한도를 1 GiB (1073741824 바이트) 로 설정. .env 의 UPLOAD_MAX_BYTES 로 바꿀 수 있고, 0 이나 Infinity 로 두면 무제한. Co-Authored-By: Claude Opus 4.7 --- .env.example | 4 ++-- README.md | 2 +- src/routes/op.ts | 14 ++++++++++---- 3 files changed, 13 insertions(+), 7 deletions(-) diff --git a/.env.example b/.env.example index 9807025..02f070e 100644 --- a/.env.example +++ b/.env.example @@ -10,8 +10,8 @@ PORT=3000 SESSION_SECRET=change-me-please # 업로드/타임아웃 ───────────────────────────────────────────────── -# 업로드 용량 한도(바이트). 비우거나 미설정이면 무제한. -# UPLOAD_MAX_BYTES= +# 업로드 용량 한도(바이트). 1 GiB = 1073741824. 비우거나 미설정이면 무제한. +UPLOAD_MAX_BYTES=1073741824 # HTTP 요청 타임아웃(밀리초). 0 또는 미설정이면 무제한 (10GB 업로드 같은 케이스 대비). # HTTP_REQUEST_TIMEOUT_MS=0 diff --git a/README.md b/README.md index 981b2a3..db33d5e 100644 --- a/README.md +++ b/README.md @@ -24,7 +24,7 @@ npm start - `HOST` — 바인딩 주소. 외부 노출이 필요하면 `0.0.0.0`, 로컬 전용이면 `127.0.0.1`. - `PORT` — 바인딩 포트 (기본 `3000`). - `SESSION_SECRET` — 운영 시 반드시 충분히 긴 랜덤 문자열로 교체. -- `UPLOAD_MAX_BYTES` — 업로드 용량 한도(바이트). 비우면 무제한. +- `UPLOAD_MAX_BYTES` — 업로드 용량 한도(바이트). 기본 `1073741824` (1 GiB). 비우면 무제한. - `HTTP_REQUEST_TIMEOUT_MS` — 대용량 업로드용 HTTP 요청 타임아웃(밀리초). `0`/미설정이면 무제한. - 관리자 비밀번호는 `account.json` 의 `password` 값 (초기값 `admin`, 운영 시 반드시 변경). diff --git a/src/routes/op.ts b/src/routes/op.ts index 3b59932..dd6d96f 100644 --- a/src/routes/op.ts +++ b/src/routes/op.ts @@ -31,10 +31,16 @@ import { FfmpegUnavailableError, applyTrimToVideo } from '../editor.js' export const opRouter = Router() -// 업로드 용량 상한은 환경변수 UPLOAD_MAX_BYTES 로 조정. 기본은 사실상 무제한(Infinity). -const uploadMaxBytes = process.env.UPLOAD_MAX_BYTES - ? Math.max(1, Number(process.env.UPLOAD_MAX_BYTES)) - : Infinity +// 업로드 용량 상한. 기본 1 GiB. UPLOAD_MAX_BYTES 환경변수로 변경 가능. +// 명시적으로 무제한이 필요하면 UPLOAD_MAX_BYTES=0 (또는 Infinity). +const DEFAULT_UPLOAD_MAX_BYTES = 1024 * 1024 * 1024 +const uploadMaxBytes = (() => { + const raw = process.env.UPLOAD_MAX_BYTES + if (raw === undefined || raw === '') return DEFAULT_UPLOAD_MAX_BYTES + const n = Number(raw) + if (!Number.isFinite(n) || n <= 0) return Infinity + return Math.max(1, n) +})() const upload = multer({ dest: tmpDir, limits: { fileSize: uploadMaxBytes }