hop.

기기 사이를 가볍게. 가입 없이 접속한 브라우저 사이에서 수락 후 자료를 전달하는 서비스입니다.

파일·클립보드(링크/텍스트) 전송, 로그인 중 수신 기록·7일 보관함과 PWA를 구현했습니다. 자동 검증 범위는 검증 기록, 클립보드 동작과 256KiB 제한은 클립보드 전송을 참고하세요. Resend 실제 메일 수신과 실기기 운영 경로는 별도로 확인합니다. 전체 설계는 구현 계획, 개발 기준은 SPEC.md와 이후 사용자 수정안을 따릅니다.

로컬 개발

Node.js 22.12 이상과 npm을 사용합니다.

npm ci
npm run build -w @hop/shared
npm run dev

웹과 API 모두 OS가 빈 임시 포트를 배정합니다. 프로젝트 루트 .env를 읽습니다. 개발 DB·파일은 기본 .data/를 사용하며 Docker의 /data/ 설정을 그대로 사용하지 않습니다. 출력된 개발 화면 주소를 열어 주세요. 서버 코드 변경은 자동으로 다시 시작하며 실행 중에는 배정된 포트를 유지합니다. 고정 샘플 포트나 기존 서비스 포트를 사용하지 않습니다. 데이터는 .data/hop.sqlite에 저장합니다. 동일 브라우저의 탭은 하나의 기기이므로 다른 기기를 테스트하려면 다른 브라우저·프로필·시크릿 창을 사용하세요.

검증

npm run typecheck
npm run build
npm test

API 테스트는 격리된 실제 SQLite DB와 임시 로컬 포트의 Socket.IO를 사용합니다. 테스트 환경이 로컬 소켓 연결을 제한하면 권한이 필요할 수 있습니다. 운영 프록시와 실기기 확인을 자동 테스트로 대신했다고 주장하지 않습니다.

Docker 배포 준비

유그린 NAS의 Docker 앱과 터미널에서 같은 docker-compose.yaml로 배포하는 순서는 deploy.md를 따라 진행하세요. 현재 배포 경로는 Cloudflare Tunnel → 기존 NPM(8080) → NAS의 hop.(50189)입니다.

.env.example을 .env로 복사하고 비밀값을 설정합니다. SESSION_SECRET과 DISCOVERY_SECRET은 서로 다른 32자 이상의 무작위 비밀값이어야 합니다. 예를 들어 openssl rand -hex 32로 각각 생성합니다. Git에 실제 환경 파일·DB·파일을 넣지 않습니다.

이번 NAS 배포는 사용자가 지정한 50189를 호스트·컨테이너 포트로 사용합니다. scripts/configure-nas.sh가 실제 NAS 내부 IP를 물어보고 운영 .env와 저장 권한을 준비하고 Git의 docker-compose.yaml을 검사합니다. Compose 파일은 생성하거나 덮어쓰지 않습니다. 다른 환경에서는 충돌 없는 포트·바인딩 IP·프록시 경로를 따로 확인하세요. Compose는 필수 값이 비어 있으면 실행을 거절합니다. .env는 Node 서버 직접 실행 시 자동 로드되지 않으며 Compose 또는 실행 환경이 주입합니다.

sudo docker compose -f docker-compose.yaml config --quiet
sudo docker compose -f docker-compose.yaml up -d --build

앱 시작 시 버전 관리된 Drizzle 마이그레이션을 적용하며 실패하면 시작하지 않습니다. DB 볼륨과 프로젝트의 uploads 폴더는 재배포·재시작 후 유지됩니다. docker compose down -v는 데이터를 삭제하므로 사용하지 마세요.

Nginx Proxy Manager에는 실제 컨테이너/호스트 경로의 포트를 지정하고 HTTPS·WebSocket 지원을 켭니다. Secure 쿠키 때문에 운영 환경에서는 HTTPS가 필수입니다. 요청·연결 타임아웃과 업로드 제한은 Phase 2에서 문서화하고 실제 경로에서 검증합니다. 앱의 파일 상한은 중간 프록시·Cloudflare 상한을 보장하지 않습니다.

발견과 QR·코드 연결

같은 네트워크 탐색은 기본 비활성입니다. TRUSTED_PROXY_CIDRS는 실제로 앱에 연결하는 검증된 프록시 IP/CIDR만 허용합니다. 임의 전달 헤더를 신뢰하지 않습니다. 검증된 클라이언트 IP를 얻지 못하면 네트워크 탐색을 하지 않습니다. 공인 IP가 정확히 같은 경우만 후보로 표시하고 IPv6 /64 통합은 하지 않습니다. 같은 공인 IP는 동일 Wi-Fi나 실제 근접의 증명이 아닙니다.

QR·4자리 코드는 기본 10분의 임시 공간 초대입니다. 초대 코드 길이는 설정으로 6자리까지 확장할 수 있습니다. 최대 10대, 선택적 참여 승인, 내보내기와 공간 닫기를 지원합니다. 공간 참여와 자료 전송 수락은 별개입니다. QR 초대 토큰은 URL fragment에 넣어 서버 요청·리퍼러로 전달하지 않으며 참여 후 주소에서 지웁니다.

익명 자료

비로그인 화면에는 전송 내역을 표시하지 않습니다. 수락 후 링크는 새 탭으로 열고 파일은 다운로드합니다. 텍스트는 원문 미리보기와 클립보드 복사 버튼을 표시합니다. 익명 기기 세션은 기본 30일이며 저장한 자료는 최대 7일입니다. 쿠키 삭제·만료·초기화 시 이전 익명 접근권은 복구할 수 없습니다. 로그인 전 수신 자료를 계정으로 가져오지 않습니다. 기기 세션 정리가 필요하면 브라우저의 사이트 데이터를 삭제합니다. 기기 이름은 인증된 신원이 아니며 전송은 서버를 경유합니다. E2EE나 P2P 전송을 제공한다고 안내하지 않습니다.

파일 저장 위치

NAS 파일은 /volume1/docker/projects/apps/hop/uploads/originals 안에서 업로드한 사람 기준으로 구분합니다. 로그인 중 올린 새 파일은 계정ID/, 비로그인 파일은 기기세션ID/에 저장합니다. 파일명은 무작위 식별자.jpg처럼 안전한 원래 확장자를 붙이고 다운로드 시에는 원래 파일명을 제공합니다. 받은 사람의 보관함은 같은 원본을 참조하며 중복 저장하지 않습니다. 기본 보관 기간은 항목별 7일이고 마지막 유효 참조가 끝나면 약 1분 간격 정리에서 파일을 지웁니다. 각 업로드 폴더의 owner-info.json에는 업로드 요청 시 확인한 국가·지역·도시·접속 IP를 관리자용으로 기록합니다. 좌표·파일 본문·인증 비밀값은 기록하지 않고, 기본 7일 내 최근 20개 기록만 유지합니다. 지역 정보가 제공되지 않으면 확인 불가로 남깁니다.

기존 평면 originals 및 completed 파일은 앱 시작 시 DB에 기록된 업로드 소유자의 폴더로 이동하며 만료일·ID·접근권은 유지합니다. 새 completed 폴더는 만들지 않습니다. 과거 기기 전송의 업로드 소유자가 기기 세션으로만 기록되어 있다면 해당 기기 세션 폴더를 사용하고 계정을 추정하지 않습니다. 앱은 NAS 사용자의 UID/GID로 실행하며 업로드 폴더는 Git·Docker 빌드에서 제외합니다. DB는 hop_hop_database 영구 볼륨에 있습니다. 수동 삭제는 조회·다운로드·전송과 1분 주기 정리 시 감지해 공유된 모든 항목과 용량 계산에 반영합니다. 권한 오류는 삭제로 오인하지 않습니다. 기존 계정·DB·자료를 초기화하지 않습니다.

업데이트와 백업

일반 업데이트는 git pull --ff-only origin main → sudo docker compose -f docker-compose.yaml up -d --build로 진행합니다. 소스와 운영 Compose 설정을 Git에서 함께 관리하며 UGREEN 앱도 동일한 파일을 사용합니다. DB·업로드는 기존 볼륨에 유지되므로 매번 백업할 필요는 없습니다. DB 구조 변경에 대비하거나 데이터를 따로 보관하려면 앱을 정지한 뒤 DB 볼륨(WAL·SHM 포함), 업로드 볼륨, .env를 같은 시점에 백업합니다. 자세한 순서는 deploy.md의 업데이트 절차를 참고하세요.

파일당 기본 2GiB, 익명 주체당 2GiB, 전체 익명 20GiB 제한과 최소 5GiB 여유 공간을 적용합니다. MB/KB 환경변수는 MiB/KiB 기준입니다. 파일은 수락 후 스트리밍 저장하고 중단 시 임시 파일·예약을 회수합니다. 파일은 8MiB 단위로 나누어 전송하고 서버가 받은 위치를 기록합니다. 중간 오류는 최대 3회 자동 재시도하며, 현재 화면에서 같은 파일로 ‘다시 전송’할 수 있습니다. 백그라운드 완료는 보장하지 않습니다.

개발 환경의 QR

기본 개발 URL은 127.0.0.1입니다. 이 URL을 휴대폰에서 열면 휴대폰 자신을 가리키므로 PC 개발 서버에 접속할 수 없습니다. 같은 PC의 다른 브라우저·시크릿 창에서는 코드를 입력해 연결할 수 있습니다. 휴대폰 검증을 시작할 때 사용할 LAN 접속 주소·포트·바인딩 범위를 사용자에게 확인합니다. HTTPS 운영 배포에서는 공개 서비스 주소로 QR을 생성합니다. 개발 HTTP 환경에서는 플랫폼에 따라 클립보드 등 보안 컨텍스트 API가 제한될 수 있습니다.

이메일 발송

2026-10-08 사용자 지침에 따라 명세의 SMTP 대신 기존 Resend 연동을 사용합니다. 발신 주소는 hello@noname.company입니다. Resend HTTPS API 발송 어댑터를 연결했습니다. 루트 .env의 RESEND_API_KEY와 MAIL_FROM을 서버에서 읽으며 API 키는 브라우저로 전달하지 않습니다. 공개 가입은 기본 닫혀 있으며, REGISTRATION_MODE=open으로 시작하려면 사용 가능한 메일 어댑터가 필요합니다. API 키는 Git에 저장하지 않습니다.

계정 메일 토큰은 일회용·해시 저장이며 링크 fragment를 사용합니다. 인증 전 계정 업로드·원격 전송·수락을 금지합니다. 이메일 정규화는 양끝 공백 제거와 도메인 소문자화이며 로컬 파트 대소문자·점·별칭은 보존합니다. ‘내 계정에 저장’은 기존 익명 접근권을 제거하고 계정 보관함으로 이동하며 원래 만료와 상대 접근권을 유지합니다.

최초 계정 초기화는 SETUP_TOKEN(32자 이상 무작위 비밀값)과 빈 사용자 DB 조건으로만 가능합니다. /api/auth/setup도 이메일 인증을 거칩니다. 서비스 관리 화면의 권한은 아래 관리자 계정 기준으로 별도 확인합니다.

서비스 관리

이메일 인증을 완료한 hello@noname.company 계정으로 로그인하면 더보기 → 관리자가 표시됩니다. 서버도 매 요청에서 동일 계정의 인증·활성 상태를 확인합니다. 다른 계정이나 이메일 로컬 파트의 대소문자가 다른 계정에는 권한을 주지 않습니다.

저장 파일·업로드 주체·파일별 전송 요청 시점의 접속 지역/IP·남은 디스크와 진행 중 업로드를 확인하고, 확인 후 원본을 삭제할 수 있습니다. 삭제하면 같은 원본을 참조하는 모든 보관함 항목도 무효화됩니다. 파일 내용 다운로드 기능은 제공하지 않습니다. 화면은 새로고침할 때 갱신하며 지속적인 폴링은 하지 않습니다.

관리자는 신규 파일 업로드 중지/재개, 동시 업로드 수와 전체 파일 저장 한도, 국가 코드 및 IP/CIDR 차단을 설정할 수 있습니다. 기본값은 동시 4개·전체 20GB·차단 없음입니다. 개인/기기별 한도와 최소 디스크 여유 공간은 함께 적용합니다. 중지 전에 수락한 전송·기존 다운로드·링크/텍스트는 유지합니다. 전체 한도를 줄여도 기존 파일은 삭제하지 않습니다.

네트워크 탭에서 국가·IP 규칙과 자동 차단을 관리합니다. 규칙은 HTTP·기기 연결에 적용하고 차단된 진행 중 업로드와 연결도 종료합니다. IPv4·IPv6와 IP 대역을 지원하며 현재 관리자 접속을 차단하는 설정은 거절합니다. 국가는 검증된 Cloudflare 제공 값만 사용하고, 미제공 국가는 추정하지 않습니다. VPN·실제 거주지 추적은 하지 않습니다. 도시 정보 설정은 배포 문서를 참고하세요.

관리 설정은 DB에 저장되어 재시작 후 유지하며 .env는 초기 기본값으로 사용합니다. 관리 기록은 바뀐 항목만 기본 30일 보관하며 개별·선택·전체 삭제로 정리할 수 있습니다. 이번 업데이트는 관리 테이블을 추가하는 마이그레이션을 자동 적용하며 기존 계정·파일·볼륨·docker-compose.yaml을 유지합니다. 앱의 자원 제한은 대규모 네트워크 공격을 모두 차단하지는 못하므로 외부 트래픽 대응은 Cloudflare 등 앞단 설정도 함께 사용합니다.

기술 참고: Fastify 프록시 설정, Drizzle SQLite, Tailwind Vite.

현재 전송 UX

클립보드 전송 수정안을 따릅니다. 파일과 클립보드 중 하나를 선택하고 링크·일반 텍스트는 자동 판별합니다. 기기를 누르면 클립보드를 읽어 제안하며, 권한 거부 시에도 직접 입력할 수 있습니다. 입력 중인 내용을 자동으로 덮어쓰지 않으며 수락 후에만 전달합니다. 수신과 완료 카드는 뷰포트 상단에 표시됩니다. 기본 테마는 검정이며 라이트·시스템 전환을 유지합니다.

개발 테스트 계정

node --import tsx scripts/seed-test-accounts.mjs로 개발 DB에 인증된 일반 사용자 test1@hop.test, test2@hop.test를 준비합니다. 새로 준비하는 테스트 계정의 비밀번호는 둘 다 12345678입니다. 메일을 보내지 않으며 운영 환경에서는 실행을 거절합니다. 같은 이름의 테스트 계정은 비밀번호만 재설정하고 다른 기존 계정은 변경하지 않습니다.

새 비밀번호는 개발·운영 모두 최소 8자입니다. 가입·재설정·비밀번호 변경에 같은 기준을 적용하며 화면도 서버의 최소 길이를 사용합니다. 기존 계정의 비밀번호는 일괄 변경하지 않습니다. 가입 이메일의 인증 완료 버튼을 누르면 인증한 계정으로 자동 로그인하고 받은 항목을 표시합니다. 같은 브라우저의 이전 계정 세션은 종료하며, 다른 기기의 세션은 유지합니다. 인증 토큰은 일회용·만료·정지 계정 차단을 유지합니다.

현재 전송·보관함 흐름

보관함은 받은 항목으로 먼저 열립니다. 계정 설정에서 이메일은 표시만 하고 비밀번호 변경 버튼을 눌러 입력 화면으로 이동하며, 모바일에서는 하단 시트로 표시합니다. 기기 설정에서는 이름만 변경합니다. 사이트에 접속하면 자동 발견에 참여하며, 이전 버전에서 발견을 꺼둔 기기도 다시 접속하면 켜집니다. 파일의 실제 저장 위치·다운로드 실패·만료·관리자 접근은 deploy.md의 파일 저장 안내에 정리했습니다.

최신 동작 기준은 TEMPORARY_VAULT.md입니다. 중앙에서 기기를 고른 뒤 PC 모달·모바일 하단 시트로 링크·파일·임시 저장 자료를 보냅니다. 로그인 중 받은 자료는 보관함의 받은 항목에 날짜별로 남고, 직접 담은 자료는 임시 저장에서 한 줄 메모와 함께 관리합니다. 모든 자료는 최대 7일입니다. 저장 종류는 먼저 링크/파일 중 하나를 선택합니다. 이메일 원격 전송과 영구 즐겨찾기는 제거했습니다.

개발 실행은 같은 PC의 다른 브라우저를 자동 발견하고 반복 검증용 요청 한도를 사용합니다. QR 방에 들어가면 방 안의 기기만 보이며 한 방만 참여할 수 있습니다. 방장 나가기는 방 전체를 닫습니다. 운영 발견은 실제 프록시 경로를 검증한 후 켭니다.

npm run test:e2e:layout은 실제 12개 기기 연결과 4/3/2열, 선택 전 입력 없음, 중앙 모달/하단 시트 및 방 격리를 검증합니다.

NAS 업데이트·PWA·개인 용량

이번 NAS 업데이트는 deploy.md의 7단계부터 진행합니다. 운영 자동 발견은 실제 Tunnel → NPM → hop. 경로를 진단해 인접 프록시만 신뢰하며, Cloudflare의 원본 IP로 같은 네트워크 기기를 구분합니다. 공개 주소는 HTTPS를 사용합니다. 상단 더보기의 앱 설치 메뉴로 PWA 설치 또는 iPhone 홈 화면 추가를 안내합니다. 파일·계정 기록·API 응답은 오프라인 캐시에 넣지 않습니다.

로그인 계정의 임시 저장과 받은 파일을 합쳐 개인별 2GiB로 제한합니다. 같은 원본은 한 계정에서 한 번 계산하고 다른 계정의 한도와 분리합니다. 한도가 차면 파일 수신·다운로드는 계속하고 받은 항목에 저장하지 않았다는 안내를 표시합니다. 익명 업로드는 기기 세션당 2GiB, 서버 전체 20GiB이며 화면에는 내역을 표시하지 않습니다.

근처 위치 검색과 기종 구분은 기기 발견 문서를 참고하세요. 양쪽 기기가 위치를 허용하면 약 100m 내 기기를 표시하며, 대기 화면은 반복 목록 검색을 하지 않습니다.

로고 원본은 apps/web/public/logo.svg, 아이콘 원본은 apps/web/public/icon.svg입니다. 헤더·서비스 정보 로고는 SVG 경로를 사용하므로 기기 기본 폰트에 영향을 받지 않습니다. 흰 글자는 테마에 맞춰 변경하고 청록색 점은 유지합니다. 아이콘 원본을 교체한 뒤 node scripts/generate-icons.mjs를 실행하면 192px·512px·Android maskable PNG가 다시 생성됩니다.

기기 이름은 서버 DB에 저장되며 동일 브라우저의 기기 세션 쿠키가 유효한 동안 유지됩니다. 쿠키를 지우거나 다른 브라우저로 접속하면 새 기기로 인식됩니다.

전송 제한의 기본값은 상대 10회·기기 세션 30회·같은 IP 전체 120회/분입니다. 거절 후 5분 대기는 유지하며 전송 버튼에 재시도까지 남은 초를 표시합니다. 기존 NAS .env 한도 변경은 deploy.md의 전송 요청 제한 안내를 따릅니다. 수신 요청은 파일·링크·텍스트 아이콘과 제목으로 구분하며 차단은 확인 후 실행합니다. 푸터의 내 기기 설정에서 차단한 기기를 관리·해제할 수 있습니다. npm run test:e2e:receive로 새 수신·제한·차단 흐름을 검증합니다.

관리자 정보와 용량 표시

업로드 주체 이름은 [iPhone]처럼 대괄호로 구분하고 관리자·보관함의 만료일은 [보관 만료] 2026년 10월 22일 11:02 까지처럼 한국 시간의 연도·24시간으로 표시합니다. 푸터의 발견 허용/꺼짐 문구는 숨깁니다.

전송·수신·보관함·관리자 화면은 같은 용량 표시 함수를 사용합니다. 1MB 미만은 KB, 1MB 이상은 MB, 1GB 이상은 GB이며 사용자 요청에 따라 1,024 기준에 익숙한 KB/MB/GB 명칭을 사용합니다(1GB = 1,024MB). 예: 938KB, 1.1MB, 20.0GB. 기존 서버 저장 한도와 환경변수의 MiB 기준은 유지하므로 기존 20GiB 한도는 화면에서 20GB입니다. 관리자 입력도 같은 기준이며 15 입력은 15GB를 뜻합니다. 반올림된 표시값을 수정하지 않으면 기존의 정확한 바이트 한도를 보존합니다.

파일별 접속 정보는 DB에 최초 전송 요청 당시의 값을 저장하여 이후 같은 사람이 다른 지역에서 전송해도 바뀌지 않습니다. 같은 요청의 여러 파일은 같은 요청 당시 정보를 사용하며 원본 재전송은 원래 정보를 유지합니다. 기본 최대 7일 보관하고 실패·삭제한 파일의 기록은 주기 정리합니다. 기존 파일은 owner-info.json에 동일한 요청의 기록이 있을 때만 복원하고, 없으면 다른 파일의 최근 정보로 추정하지 않습니다. 파일 내용·GPS 좌표를 추가로 수집하지 않으며 관리자 외에는 제공하지 않습니다.

네트워크·사용자 관리

관리자 탭은 저장 파일 / 용량 설정 / 네트워크 / 사용자 / 관리 기록입니다. 국가는 일본(JP)처럼 이름과 코드를 함께 표시합니다. 네트워크에는 자동 블랙리스트·블랙리스트·화이트리스트를 둡니다. 국가 또는 IPv4/IPv6 주소·CIDR을 추가 모달에서 한 항목씩 등록하고 표에서 선택 제거하며, 추가·제거는 즉시 적용합니다. 기존 수동 차단 규칙은 유지합니다.

블랙리스트·자동 차단이 우선합니다. 화이트리스트가 비어 있으면 공개하고, 항목이 있으면 등록 국가 또는 IP/대역에 해당하는 접속만 허용합니다. 국가가 확인되지 않은 접속은 허용 IP와 일치해야 합니다. 현재 관리자 자신을 차단하는 수동 규칙은 저장할 수 없습니다.

자동 차단은 기본 꺼짐이며 관리자가 기준을 확인하고 켭니다. 기본 감지 기간 10분에 로그인 실패 10회, 요청 제한 위반 20회, 파일 전송 시도 30회 초과 또는 요청 파일 용량 10GB 초과를 감지하면 해당 IP를 30분 차단합니다. 모두 관리자에서 변경할 수 있습니다. 수락 전 파일 요청도 계산하며 같은 요청 키의 재시도는 중복 계산하지 않습니다. 로그인 보관함 업로드와 기기 전송은 같은 원본 공인 IP 기준을 공유하므로 기기 쿠키를 새로 받아도 우회하지 못합니다. 정상 조각 전송·서버 혼잡·거절 대기는 이 기준의 제한 위반으로 세지 않습니다. 같은 공인 IP를 공유하는 사람에게 함께 영향을 줄 수 있습니다.

자동 차단 목록에는 IP·국가·사유·차단/해제 시각을 표시하고 선택 해제·검색·더 보기를 지원합니다. 시간 만료로 해제되며 차단 목록은 재시작 뒤 유지합니다. 감지 중인 횟수 창은 메모리에 두고 재시작 시 초기화합니다. 확인되지 않은 프록시 주소를 공인 사용자 IP로 추정해 자동 차단하지 않습니다. 기존 인증된 관리자 세션은 자동 차단 해제를 위해 접속할 수 있지만 수동 블랙리스트·화이트리스트를 우회하지 않습니다.

사용자 탭은 이메일·계정 상태·최근 접속 시각·국가/지역/IP를 관리자에게만 보여 줍니다. 로그인·인증·로그인 상태 API 이용부터 기록하며, 같은 접속 정보는 약 1분에 한 번만 갱신합니다. 마지막 접속 시각은 유지하고 위치/IP는 기본 30일 이후 제거합니다. 과거 지역은 추정하지 않습니다. 더보기에서 재설정 메일 발송과 계정 삭제를 사용합니다. 재설정은 기존 일회용 메일 절차를 사용하며 사용자가 완료해야 비밀번호와 로그인 상태가 바뀝니다. 삭제는 이메일 확인 후 로그인·토큰·보관함 접근권을 폐기하고 계정을 익명화합니다. 다른 수신자의 파일은 유지하며 관리자 자신은 삭제할 수 없습니다.

관리 기록은 동시에 처리할 업로드 수 5 > 10, 블랙리스트 추가: 중국(CN)처럼 변경 사항만 보여 줍니다. 변경이 없는 저장은 기록하지 않습니다. 이전 기록은 비교 가능한 전 정보가 있을 때만 차이를 표시합니다. 읽음 기능은 두지 않고 개별·선택·전체 삭제만 제공하며 기록을 지워도 설정·파일·자동 차단 목록은 바뀌지 않습니다.

관리자 용량은 기본적으로 값만 표시하며 수정 → 설정 저장/취소로 변경합니다. 계정별 보관함·기기 세션별/전체 업로드·파일 한 개·NAS 최소 여유 공간도 설정하며 저장한 값은 DB에 보존됩니다. GB 입력은 소수점 셋째 자리까지 지원하고 입력창을 벗어나면 20.000처럼 정리합니다. 기본값으로 돌리기는 NAS .env의 초기 설정값을 초안으로 불러오며 설정 저장을 눌러야 적용됩니다. 네트워크 토글과 규칙 추가·제거는 언제든 각각 즉시 적용하고, 자동 블랙리스트의 숫자 감지 기준만 해당 영역의 수정 → 감지 기준 저장/취소로 변경합니다. 서로 다른 영역의 변경이 입력 중인 감지 기준을 함께 저장하지 않습니다. IP 대역은 CIDR 외에 203.0.113.*처럼 뒤쪽 전체 자리의 IPv4 와일드카드도 입력할 수 있고, 203.0.113.0/24로 정규화합니다. 저장 파일 목록은 업로더 ID와 계정 이메일(비로그인은 ‘비로그인’)을 표시합니다.

네트워크의 파일 전송 금지를 켜면 새 파일 전송/저장 메뉴를 숨기고 링크·텍스트만 허용합니다. 이미 수락한 파일 업로드와 기존 다운로드는 유지하며, 변경 사항은 접속 중인 사용자에게도 반영합니다. 용량 표시는 7,687.0GB처럼 천 단위 쉼표를 사용합니다.

Description
No description provided
Readme 3 MiB
Languages
JavaScript 52.2%
TypeScript 24%
Vue 15.3%
CSS 7.4%
Shell 0.9%
Other 0.1%