From c7d55b5463d2f23c33393fa23d57a756989a683a Mon Sep 17 00:00:00 2001 From: jisangs Date: Sun, 5 Jul 2026 18:34:02 +0900 Subject: [PATCH] =?UTF-8?q?=EA=B0=9C=EB=B0=9C=20=EB=82=B4=EC=9A=A9=20READM?= =?UTF-8?q?E.md=20=ED=8C=8C=EC=9D=BC=EC=97=90=20=EB=B0=98=EC=98=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 30 +++++++++++++++++++++++++----- 1 file changed, 25 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 8196607..b0ea00a 100644 --- a/README.md +++ b/README.md @@ -19,14 +19,19 @@ chocomae(mouse-typing) 서비스의 관리자 기능을 독립 Next.js 서비스 ## 구현된 기능 -- 관리자 로그인 (기존 `admin` 테이블 / MariaDB `PASSWORD()` 호환) +- 관리자 로그인 (기존 `admin` 테이블 / MariaDB `PASSWORD()` 호환, 로그인 실패 5회 → 15분 잠금) - 마에스트로 전체 목록 — 검색(이름·이메일·ID), 상태/계정유형 필터, 페이지네이션 - 마에스트로 상세 보기 — 기본 정보, 연장/업그레이드 이력, 처리 로그 -- 연장 신청 목록 — 승인 / 취소 (트랜잭션 + `maestro_log`) -- 업그레이드 신청 목록 — 승인 / 거절 (트랜잭션 + `maestro_log`) +- 마에스트로 정보 수정 — 이름, 이메일, 상태, 계정유형, 만료일, 엔터코드 허용 여부 (`PATCH /api/maestros/[id]`) +- 마에스트로 암호 초기화 — 관리자가 `123456`으로 초기화 (트랜잭션 + `maestro_log`) +- 수강생 목록 — 서버사이드 페이지네이션 (`GET /api/maestros/[id]/students`) +- 연장 신청 목록 — 승인 / 취소 (트랜잭션 + `maestro_log` + 이메일 발송) +- 업그레이드 신청 목록 — 승인 / 거절 (트랜잭션 + `maestro_log` + 이메일 발송) +- 관리자 주도 연장/업그레이드 신청 등록 — 마에스트로 상세 화면에서 직접 등록 (이메일 미발송) - 비인증 접근 차단 (`proxy.ts`, API route `auth()` 검사) - 구조화 로깅 — API 처리 시간·결과, DB 쿼리 pretty 출력, slow query 감지, 비밀번호 컬럼 마스킹 (`Password`) - 동시 승인 방지 — 연장/업그레이드 승인·취소·거절 시 조건부 원자 UPDATE로 이중 처리 차단 +- 이메일 자동 발송 — 연장/업그레이드 승인 후 Nodemailer로 발송, 실패 시 UI 경고 표시 ## 개발 환경 설정 @@ -92,10 +97,15 @@ pnpm dev ## 배포 (Synology NAS Docker) ```bash -# 이미지 빌드 및 컨테이너 시작 -docker compose up -d --build +# 스테이지 배포 +bash scripts/deploy-stage.sh + +# 운영 배포 (yes 입력 확인 필요) +bash scripts/deploy-production.sh ``` +각 스크립트는 `git pull` → `proxy-network` 확인 → `docker compose up -d --build --remove-orphans` → `docker exec npm nginx -s reload` 순으로 실행된다. + `docker-compose.yml`의 `environment` 섹션에 위 환경변수를 설정한다. `TZ: Asia/Seoul`은 두 compose 파일에 이미 포함되어 있다. 상세 절차는 [`docs/deployment.md`](docs/deployment.md)를 참고한다. ## 프로젝트 구조 @@ -109,6 +119,12 @@ chocoadmin/ │ │ ├── extension-requests/ │ │ └── upgrade-requests/ │ └── api/ # API routes +│ └── maestros/[id]/ +│ ├── route.ts # PATCH — 마에스트로 정보 수정 +│ ├── students/route.ts # GET — 수강생 목록 (페이지네이션) +│ ├── extension-requests/ # POST — 관리자 주도 연장 신청 +│ ├── upgrade-requests/ # POST — 관리자 주도 업그레이드 신청 +│ └── reset-password/ # POST — 암호 초기화 ├── components/ │ ├── data-table/ # TanStack Table 기반 테이블 │ ├── forms/ @@ -118,10 +134,14 @@ chocoadmin/ │ ├── logger.ts # 공통 로거 (debug/info/warn/error) │ ├── errors.ts # ApiError 공통 에러 클래스 │ ├── api-handler.ts # API route 래퍼 (auth, 타이밍, 에러 처리) +│ ├── mail.ts # Nodemailer 이메일 발송 │ ├── constants.ts # 상태값 상수 │ ├── maestros.ts # 마에스트로 DB 쿼리 │ ├── extension-requests.ts │ └── upgrade-requests.ts +├── scripts/ +│ ├── deploy-stage.sh # 스테이지 배포 스크립트 +│ └── deploy-production.sh # 운영 배포 스크립트 ├── prisma/ │ └── schema.prisma # DB introspection 결과 ├── docs/