# Bach to Basics 회원과 곡 보관함 운영 ## 기능 범위 Bach to Basics의 기존 파일 가져오기 기능을 유지하면서 서버 곡 보관함을 추가했다. 비회원은 전체 공개 MIDI를 바로 연주할 수 있다. 회원은 MIDI를 올리고 공개 범위와 회원 등급을 지정할 수 있다. 공개 범위는 다음 네 단계다. | 공개 범위 | 접근 대상 | |---|---| | 전체 공개 | 비회원 포함 모든 사용자 | | 회원 공개 | 지정한 최소 등급 이상의 로그인 회원 | | 지정 회원 공유 | 최소 등급을 만족하며 업로더가 지정한 회원 | | 나만 보기 | 업로더 본인과 관리자 | 회원 등급은 일반 회원 1단계와 우수 회원 2단계 및 지도 회원 3단계와 관리자 4단계로 구성한다. 역할은 회원과 운영자 및 관리자로 구분한다. 등급은 곡 접근 범위에 사용하며 역할은 운영 권한에 사용한다. ## 회원 기능 - 회원 가입과 로그인 및 로그아웃 - 현재 비밀번호를 확인한 뒤 비밀번호 변경 - 모든 세션을 종료한 뒤 새 비밀번호로 다시 로그인 - 비밀번호와 확인 문구를 입력한 회원 탈퇴 - 탈퇴 시 본인이 올린 MIDI와 공유 정보 제거 - 관리자 화면에서 회원 등급과 역할 및 이용 상태 변경 비밀번호는 `scrypt`로 해시한다. 원문은 DB와 로그에 저장하지 않는다. 로그인 세션 토큰도 SHA-256 해시만 DB에 보관한다. 상태 변경 요청에는 로그인 세션과 CSRF 확인 값을 함께 검사한다. ## MIDI 업로드 - 허용 확장자: `.mid`, `.midi` - 최대 파일 크기: 10MB - 회원별 최대 파일 수: 100개 - 회원별 최대 보관 용량: 500MB - 파일 이름에서 디렉터리 요소 제거 - `MThd` 헤더 확인 - 임의 저장 이름과 SHA-256 해시 기록 - 곡 제목과 아티스트 및 설명 - 난이도와 장르 및 편곡 형태 - 최대 12개 검색 태그 - 전체 공개 곡은 등급 제한 사용 불가 저장 위치는 `/home/syskiller/piano/bach-to-basics/data`다. SQLite DB와 MIDI 파일은 Git에 넣지 않는다. DB 파일 권한은 600이며 데이터 디렉터리는 750으로 유지한다. ## 검색과 버전 묶음 곡명과 아티스트 및 설명과 태그를 함께 검색한다. 장르와 난이도 및 편곡 형태와 개별 태그로 결과를 좁힐 수 있다. 같은 아티스트와 같은 제목은 한 묶음으로 표시한다. 묶음 안에서 멜로디와 반주 및 피아노 독주와 듀엣과 연습 패턴을 선택한다. ## 공개 샘플 상업 가요를 복제하지 않고 직접 만든 다음 연습곡을 전체 공개 샘플로 제공한다. - 첫눈이 내리는 밤: 입문 멜로디 - 첫눈이 내리는 밤: 중급 양손 반주 - 파란 바람 산책: 쉬운 가요풍 멜로디 - 아침의 작은 왈츠: 중급 피아노 독주 같은 제목의 난이도와 편곡 형태를 한 묶음에서 고르는 동작은 `첫눈이 내리는 밤`의 두 버전으로 확인한다. ## 초기 관리자 초기 관리자 아이디는 Compose 환경 변수로 지정한다. 비밀번호는 `secrets/library_admin_password`에서만 읽는다. DB에 같은 아이디가 없을 때만 최초 관리자를 생성한다. 컨테이너 재시작 때 기존 비밀번호를 덮어쓰지 않는다. ## 백업과 복구 다음 항목을 같은 시점에 백업한다. - `data/library.sqlite3` - `data/midi` - `secrets/library_admin_password` - 소스 저장소 Git 번들 비밀 파일은 일반 소스 백업과 분리하고 권한 600을 유지한다. SQLite를 복사하기 전에는 백엔드의 쓰기 요청을 잠시 막거나 SQLite 온라인 백업 명령을 사용한다. 단순 파일 복사 중 DB가 변경되면 일관된 백업이 아닐 수 있다. ## 운영 확인 배포 후 다음을 검사한다. 1. 비회원에게 공개 샘플만 표시되는지 확인한다. 2. 회원 가입과 로그인 및 로그아웃을 확인한다. 3. 비공개 곡이 다른 회원과 비회원에게 보이지 않는지 확인한다. 4. 회원 공개와 지정 공유 및 최소 등급 제한을 확인한다. 5. MIDI 업로드와 한글 제목 및 태그 검색을 확인한다. 6. 같은 제목의 멜로디와 반주 버전을 각각 불러온다. 7. 비밀번호 변경 후 기존 세션이 끝나는지 확인한다. 8. 시험 회원 탈퇴 후 계정과 업로드가 제거되는지 확인한다. 9. 모바일 화면에서 검색과 업로드 및 계정 화면이 가로로 넘치지 않는지 확인한다.