Move file transfer restriction into network settings

This commit is contained in:
2026-10-15 13:51:36 +09:00
parent 328fad2e36
commit 9cda9cbe84
20 changed files with 456 additions and 88 deletions

View File

@@ -483,7 +483,7 @@ sed -i -e 's/^GUEST_REQUESTS_PER_MINUTE=5$/GUEST_REQUESTS_PER_MINUTE=30/' -e 's/
**용량 설정 → 수정**에서 동시 업로드 1~16개, 전체 파일 저장 한도, 계정별 보관함·기기 세션별/전체 업로드·파일 한 개·NAS 최소 여유 공간을 변경합니다. 평소에는 값만 표시하고 수정 중에만 입력창과 저장/취소 버튼을 표시합니다. 개인 한도는 모든 계정·기기에 같은 기준으로 적용하며 계정별 예외 설정은 아닙니다. 화면은 GB(1,000 단위)를 사용하며, 서버 설정 범위인 1~1024GiB는 화면에서 약 1.1~1099.5GB에 해당합니다. 기본은 4개·20GiB이고, 업로드 요청은 같은 계정/기기 주체당 동시에 최대 2개만 처리합니다. 새 용량 항목의 초기값은 기존 `.env`를 따릅니다. 파일/개인/기기 한도와 NAS 최소 여유는 관리자 설정을 저장한 뒤 재시작 없이 적용하고 전송 횟수 제한은 유지합니다. 이미 수락해 공간을 예약한 업로드는 한도를 낮춰도 계속되며, 이후 새 공간 예약에는 변경된 한도를 적용합니다. 업로드 본문을 읽기 전에 서버 전체 동시 요청 제한을 적용하고, 들어오는 HTTP 요청에 5분 타임아웃을 적용합니다. 큰 파일은 기존 8MiB 조각 전송을 사용합니다.
**신규 업로드 중지**는 새 파일 전송·임시 저장을 거절합니다. 중지 전에 수락한 파일, 이미 저장된 원본의 재전송·다운로드, 링크·텍스트 전송은 계속됩니다. 한도를 낮춰도 기존 자료를 자동 삭제하지 않습니다.
**네트워크 → 수정 → 파일 전송 금지**를 켜고 저장하면 새 파일 전송·보관함 파일 저장·기존 보관함 파일의 새 기기 전송을 거절합니다. 아직 수락하지 않은 파일 요청도 제한 중에는 수락할 수 없습니다. 켜기 전에 이미 수락한 파일 업로드와 기존 파일 다운로드, 링크·텍스트 전송/저장은 계속됩니다. 기존 자료를 삭제하지 않습니다. 설정은 기존 `uploadsPaused` 값을 재사용하며 기본값은 꺼짐입니다. 사용자 화면은 파일 선택/저장/보관함 파일 보내기 메뉴를 숨기고 링크·텍스트만 가능한 안내를 표시합니다. 파일 드롭·붙여넣기도 같은 제한을 적용합니다. 현재 접속자에게 Socket.IO로 공개 정책만 전달하고, 최초 접속/재연결/스냅샷에서도 최신 정책을 확인합니다. 늦게 도착한 과거 정책이 새 상태를 덮어쓰지 않도록 리비전을 비교합니다.
**네트워크 → 수정 → 블랙리스트/화이트리스트 → 추가**에서 국가 코드 또는 IPv4/IPv6·CIDR을 한 항목씩 등록합니다. IPv4는 `203.0.113.*`, `203.0.*.*`처럼 뒤쪽 전체 자리의 와일드카드도 지원하며 각각 `/24`, `/16` CIDR로 저장합니다. `203.*.113.*`나 `113*` 같은 불연속·부분 자리 패턴은 지원하지 않습니다. IPv6는 CIDR을 사용합니다. 모달로 추가한 표를 확인하고 네트워크 설정을 저장하며, 제거할 때는 표의 항목을 선택합니다. 비어 있으면 차단하지 않습니다. 저장 즉시 일치하는 새 HTTP·Socket.IO 접속을 거절하고, 진행 중 업로드와 기기 연결도 종료합니다. `CLIENT_IP_SOURCE`와 `TRUSTED_PROXY_CIDRS`로 검증한 원본 IP를 사용하며 원본 IP가 없으면 직접 연결 주소를 기준으로 합니다. 국가 정보는 검증된 Cloudflare 전달 값만 사용합니다. 국가를 모르면 국가 블랙리스트만으로 차단하지 않지만, 화이트리스트가 있으면 허용 IP와 일치해야 접속할 수 있습니다. 현재 관리자의 IP/국가·인접 연결을 차단하는 규칙은 저장할 수 없습니다. 차단 해제는 목록에서 해당 규칙을 지우고 다시 저장합니다. 잘못된 규칙으로 관리자가 차단되면 기존 NAS 접근 권한으로 DB의 `admin_settings`를 복구해야 하므로 실제 규칙을 확인한 뒤 적용합니다.
@@ -545,3 +545,7 @@ sudo docker compose -f docker-compose.yaml up -d --build
```
스크립트는 `hop` 컨테이너가 중지됐는지 확인하고 해당 컨테이너의 DB 볼륨·실제 이미지 ID·실행 UID를 그대로 사용합니다. 외부 네트워크나 앱 프로세스 없이 전송·보관함·예약·기기 세션·재시도 기록만 트랜잭션으로 비우고 외래 키를 검사합니다. 계정·비밀번호·이메일 인증 상태·계정 로그인 세션·계정 설정·접속 기록과 관리자 설정/기록은 보존합니다. 파일은 자동 삭제하지 않습니다. 계정별 보관함의 파일·링크·텍스트와 기기 연결 공간은 모두 초기화됩니다. NAS에서 직접 실행하기 전에는 데이터가 바뀌지 않습니다.
## 관리자 용량 표시·파일 전송 금지
관리자 상단의 신규 업로드 허용/중지 영역은 제거하고 파일 전송 금지를 네트워크 수정 화면으로 옮겼습니다. 용량 단위는 KB/MB/GB를 유지하고 `7,687.0GB`처럼 천 단위 쉼표를 표시합니다. 동시에 처리할 업로드 수에도 설명을 표시하고 읽기/수정 화면의 수치와 입력창을 같은 높이로 정렬합니다. 이번 변경은 기존 관리 설정 필드를 재사용하므로 DB 초기화나 Compose 변경 없이 최신 소스로 재빌드·배포하면 됩니다.