v1.12.31 불필요 파일 정리 및 업로드·배포 안정성 보강

This commit is contained in:
2026-10-21 19:10:01 +09:00
parent 7b6fc45bf3
commit 0cd888a427
17 changed files with 170 additions and 59 deletions

View File

@@ -280,13 +280,11 @@ components/content/
├── ProseImage.vue # 이미지 (Regular/Wide/Full-width)
├── ProseList.vue # Ordered/Unordered List
├── ProseBlockquote.vue # 인용구
├── ProseButton.vue # 버튼 (Left-aligned/Centered)
├── ProseCallout.vue # Callout 카드
├── ProseToggle.vue # Toggle 카드
├── ProseVideo.vue # Video 카드
├── ProseAudio.vue # Audio 카드
├── ProseFile.vue # File 카드
├── ProseProduct.vue # Product 카드
├── ProseBookmark.vue # 북마크 카드(썸네일·제목·도메인)
├── ProseSignup.vue # 회원가입/뉴스레터 CTA 카드
├── ProseHeaderCard.vue # Header 카드 (Simple/Wide/Full-width/Split)
@@ -671,7 +669,7 @@ components/content/
### 업로드 파일 제공
- `GET /uploads/**` - 런타임 업로드 파일 제공. 운영 Docker에서는 빌드 산출물 `.output/public`이 아니라 `public/uploads` 볼륨의 실제 파일을 읽어 로고·게시물 이미지·회원 썸네일을 즉시 제공한다. 응답은 `ETag`, `Last-Modified`를 제공하고 조건부 요청이 일치하면 304를 반환한다. 원본·시스템·회원 썸네일처럼 새 URL로 생성되는 업로드 파일은 `public, max-age=31536000, immutable`을 사용하며, 같은 URL로 재생성될 수 있는 게시물 `thumbs/*-(card|body|body-720|lightbox).webp` 파생 파일은 `public, max-age=3600, stale-while-revalidate=86400`을 사용한다.
- `GET /uploads/**` - 런타임 업로드 파일 제공. 운영 Docker에서는 `public/uploads` 볼륨의 실제 파일을 읽어 로고·게시물 이미지·회원 썸네일을 즉시 제공한다. 업로드 원본은 Docker 빌드 입력과 Nitro 정적 복사에서 제외해 `.output/public`에 중복 포함하지 않는다. URL 디코딩과 디스크 경로 정규화 뒤 업로드 루트 이탈을 거부하고, 내부 `_import-jobs` 경로는 인코딩된 구분자·상위 경로를 섞어도 404를 반환한다. 응답은 `ETag`, `Last-Modified`를 제공하고 조건부 요청이 일치하면 304를 반환한다. 새 URL로 생성되는 원본·시스템·회원 썸네일은 `public, max-age=31536000, immutable`, 같은 URL로 재생성되는 게시물 `thumbs/*-(card|page-cover|body|body-720|body-1600|body-2560|lightbox).webp`는 `public, no-cache`를 사용한다.
### 관리자 API (`/admin/api/`)