fix: harden UPLOAD_MAX_BYTES parsing; sync docs with 1 GiB default

리뷰어 지적사항 반영:
- "abc" 같은 오타도 Infinity 로 풀리던 문제 수정. 잘못된 값은 기본 1 GiB 로
  fallback 하고 경고 로그를 남김. 무제한은 "0" 또는 "Infinity" 만 명시적으로 인정.
- .env.example / README 의 "비우면 무제한" 표현을 코드 동작과 일치시켜
  "비우면 기본 1 GiB" 로 정정.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
2026-05-15 18:10:27 +09:00
parent a14963e237
commit aae58f645a
3 changed files with 15 additions and 7 deletions

View File

@@ -10,7 +10,8 @@ PORT=3000
SESSION_SECRET=change-me-please
# 업로드/타임아웃 ─────────────────────────────────────────────────
# 업로드 용량 한도(바이트). 1 GiB = 1073741824. 비우거나 미설정이면 무제한.
# 업로드 용량 한도(바이트). 1 GiB = 1073741824. 비우거나 미설정이면 기본 1 GiB.
# 무제한으로 두려면 0 또는 Infinity. 잘못된 값(오타 등)은 기본 1 GiB 로 fallback.
UPLOAD_MAX_BYTES=1073741824
# HTTP 요청 타임아웃(밀리초). 0 또는 미설정이면 무제한 (10GB 업로드 같은 케이스 대비).

View File

@@ -24,7 +24,7 @@ npm start
- `HOST` — 바인딩 주소. 외부 노출이 필요하면 `0.0.0.0`, 로컬 전용이면 `127.0.0.1`.
- `PORT` — 바인딩 포트 (기본 `3000`).
- `SESSION_SECRET` — 운영 시 반드시 충분히 긴 랜덤 문자열로 교체.
- `UPLOAD_MAX_BYTES` — 업로드 용량 한도(바이트). 기본 `1073741824` (1 GiB). 비우면 무제한.
- `UPLOAD_MAX_BYTES` — 업로드 용량 한도(바이트). 비우거나 미설정이면 기본 `1073741824` (1 GiB). 무제한으로 두려면 `0` 또는 `Infinity`. 잘못된 값은 기본 1 GiB 로 fallback.
- `HTTP_REQUEST_TIMEOUT_MS` — 대용량 업로드용 HTTP 요청 타임아웃(밀리초). `0`/미설정이면 무제한.
- 관리자 비밀번호는 `account.json``password` 값 (초기값 `admin`, 운영 시 반드시 변경).

View File

@@ -32,14 +32,21 @@ import { FfmpegUnavailableError, applyTrimToVideo } from '../editor.js'
export const opRouter = Router()
// 업로드 용량 상한. 기본 1 GiB. UPLOAD_MAX_BYTES 환경변수로 변경 가능.
// 명시적으로 무제한이 필요하면 UPLOAD_MAX_BYTES=0 (또는 Infinity).
// - 비어있거나 미설정이면 기본 1 GiB
// - "0" 또는 "Infinity" 만 명시적 무제한으로 인정
// - 잘못된 값 (오타 등) 은 기본 1 GiB 로 fallback (경고 출력)
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)
if (raw === undefined || raw.trim() === '') return DEFAULT_UPLOAD_MAX_BYTES
const trimmed = raw.trim()
if (trimmed === '0' || trimmed.toLowerCase() === 'infinity') return Infinity
const n = Number(trimmed)
if (!Number.isFinite(n) || n <= 0) {
console.warn(`[upload] invalid UPLOAD_MAX_BYTES=${JSON.stringify(raw)}; falling back to default ${DEFAULT_UPLOAD_MAX_BYTES} bytes`)
return DEFAULT_UPLOAD_MAX_BYTES
}
return Math.max(1, Math.floor(n))
})()
const upload = multer({
dest: tmpDir,