Organize uploader storage and restore transfer readiness

This commit is contained in:
2026-10-14 19:15:46 +09:00
parent 69e7449ba7
commit c3573b605c
24 changed files with 966 additions and 449 deletions

View File

@@ -55,9 +55,9 @@ QR·4자리 코드는 기본 10분의 임시 공간 초대입니다. 초대 코
## 파일 저장 위치
NAS 파일은 `/volume1/docker/projects/apps/hop/uploads`에 저장합니다. `originals`에는 보관함에 연결된 파일과 아직 다운로드를 완료하지 않은 파일을 두고, 보관함에 연결되지 않은 파일은 수신자에게 다운로드 응답을 끝낸 뒤 `completed`로 이동합니다. 기본 7일 만료일과 용량 계산은 그대로 유지하며 이동으로 만료일을 연장하지 않습니다. 물리 파일명은 `무작위 식별자.jpg`처럼 원래 확장자를 붙이고, 다운로드 시에는 원래 파일명을 제공합니다. 확장자 없는 기존 파일도 앱 시작 시 가능한 경우 자동 반영합니다. 이전 버전의 다운로드 완료 여부는 소급 확인할 수 없어 기존 파일은 다시 다운로드할 때 분류합니다.
NAS 파일은 `/volume1/docker/projects/apps/hop/uploads/originals` 안에서 **업로드한 사람** 기준으로 구분합니다. 로그인 중 올린 새 파일은 `user-계정ID/`, 비로그인 파일은 `guest-기기세션ID/`에 저장합니다. 파일명은 `무작위 식별자.jpg`처럼 안전한 원래 확장자를 붙이고 다운로드 시에는 원래 파일명을 제공합니다. 받은 사람의 보관함은 같은 원본을 참조하며 중복 저장하지 않습니다. 기본 보관 기간은 항목별 7일이고 마지막 유효 참조가 끝나면 약 1분 간격 정리에서 파일을 지웁니다. 각 업로드 폴더의 `owner-info.json`에는 업로드 요청 시 확인한 국가·지역·도시·접속 IP를 관리자용으로 기록합니다. 좌표·파일 본문·인증 비밀값은 기록하지 않고, 기본 7일 내 최근 20개 기록만 유지합니다. 지역 정보가 제공되지 않으면 확인 불가로 남깁니다.
앱은 NAS 사용자의 UID/GID로 실행하며 업로드 폴더는 Git·Docker 빌드에서 제외합니다. DB는 `hop_hop_database` 영구 볼륨에 있습니다. 두 폴더 모두 수동 삭제를 조회·다운로드·전송과 1분 주기 정리 시 감지해 공유된 모든 항목과 용량 계산에 반영합니다. 권한 오류는 삭제로 오인하지 않습니다. 단일 Compose 파일로 전환하는 순서는 [deploy.md](deploy.md)의 7-0단계를 따르며 기존 계정·DB·파일은 유지합니다.
기존 평면 `originals` 및 `completed` 파일은 앱 시작 시 DB에 기록된 업로드 소유자의 폴더로 이동하며 만료일·ID·접근권은 유지합니다. 새 `completed` 폴더는 만들지 않습니다. 과거 기기 전송의 업로드 소유자가 기기 세션으로만 기록되어 있다면 해당 기기 세션 폴더를 사용하고 계정을 추정하지 않습니다. 앱은 NAS 사용자의 UID/GID로 실행하며 업로드 폴더는 Git·Docker 빌드에서 제외합니다. DB는 `hop_hop_database` 영구 볼륨에 있습니다. 수동 삭제는 조회·다운로드·전송과 1분 주기 정리 시 감지해 공유된 모든 항목과 용량 계산에 반영합니다. 권한 오류는 삭제로 오인하지 않습니다. 기존 계정·DB·자료를 초기화하지 않습니다.
## 업데이트와 백업