jisangs fb0861f211 docker-compose.yml 내용 수정: env_file에 환경 변수 설정 제거
- Production에서 .env.production 파일을 적용
2026-07-09 09:42:15 +09:00
2026-07-07 10:06:13 +09:00

chocoadmin

chocomae(mouse-typing) 서비스의 관리자 기능을 독립 Next.js 서비스로 분리한 웹 애플리케이션이다.

기술 스택

구분 기술
프레임워크 Next.js 16 (App Router)
언어 TypeScript
패키지 매니저 pnpm
UI / CSS Tailwind CSS v4 + shadcn/ui (Base UI)
Table TanStack Table v8
ORM Prisma v7 (MariaDB adapter)
인증 NextAuth.js v5 (admin 테이블 기반)
유효성 검증 Zod v4
이메일 Nodemailer
DB MariaDB 10.11 (기존 chocomae DB 공유)

구현된 기능

  • 관리자 로그인 (기존 admin 테이블 / MariaDB PASSWORD() 호환, 로그인 실패 5회 → 15분 잠금)
  • 마에스트로 전체 목록 — 검색(이름·이메일·ID), 상태/계정유형 필터, 페이지네이션
  • 마에스트로 상세 보기 — 기본 정보, 연장/업그레이드 이력, 처리 로그
  • 마에스트로 정보 수정 — 이름, 이메일, 상태, 계정유형, 만료일, 엔터코드 허용 여부 (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 경고 표시

개발 환경 설정

1. 의존성 설치

pnpm install

2. 환경변수 설정

cp .env.example .env.local

.env.local을 열어 실제 값으로 교체한다.

DATABASE_URL="mysql://USER:PASSWORD@127.0.0.1:3306/chocomae"
AUTH_SECRET="..."
NEXTAUTH_SECRET="..."
AUTH_URL="http://localhost:3000"
NEXTAUTH_URL="http://localhost:3000"

3. DB 연결 확인

pnpm db:check

4. 개발 서버 실행

pnpm dev

http://localhost:3000 에서 확인한다.

환경변수 전체 목록

변수 필수 설명
DATABASE_URL MariaDB 연결 문자열 (mysql://...)
AUTH_SECRET NextAuth 세션 암호화 키
NEXTAUTH_SECRET NextAuth 호환용 (동일 값)
AUTH_URL 서비스 기본 URL
NEXTAUTH_URL NextAuth 호환용 (동일 값)
APP_ENV local | stage | production — 미설정 시 debug 레벨 기본값
LOG_LEVEL debug | info | warn | error — production 권장: info
DB_SLOW_QUERY_MS slow query 임계값(ms), 기본 1000 — 초과 시 warn 로그
MAIL_FROM_NAME 발송자 이름 (Phase 11)
MAIL_FROM_ADDRESS 발송자 주소 (Phase 11)
MAIL_BCC_ADDRESS BCC 주소 (Phase 11)
MAIL_SMTP_HOST SMTP 호스트 (Phase 11)
MAIL_SMTP_PORT SMTP 포트 (Phase 11)
MAIL_SMTP_SECURE TLS 여부 (Phase 11)
MAIL_SMTP_USER SMTP 인증 계정 (Phase 11)
MAIL_SMTP_PASSWORD SMTP 인증 비밀번호 (Phase 11)
MAIL_SEND_ENABLED true | false 발송 활성화 (Phase 11)
MAIL_OVERRIDE_TO 설정 시 모든 메일 수신인을 이 주소로 고정 — local/stage 테스트용 (Phase 11)

배포 (Synology NAS Docker)

# 스테이지 배포
bash scripts/deploy-stage.sh

# 운영 배포 (yes 입력 확인 필요)
bash scripts/deploy-production.sh

각 스크립트는 git pullproxy-network 확인 → docker compose up -d --build --remove-orphansdocker exec npm nginx -s reload 순으로 실행된다.

docker-compose.ymlenvironment 섹션에 위 환경변수를 설정한다. TZ: Asia/Seoul은 두 compose 파일에 이미 포함되어 있다. 상세 절차는 docs/deployment.md를 참고한다.

프로젝트 구조

chocoadmin/
├── app/
│   ├── (auth)/login/          # 관리자 로그인
│   ├── (admin)/               # 인증 필요 화면
│   │   ├── MobileNav.tsx      # 모바일 슬라이드인 사이드바 (햄버거·오버레이·X 버튼)
│   │   ├── nav-config.ts      # 내비게이션 항목 공유 설정
│   │   ├── maestros/          # 마에스트로 목록·상세
│   │   ├── 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/
│   └── ui/                    # shadcn/ui 컴포넌트
├── lib/
│   ├── db.ts                  # Prisma Client 싱글톤 (SQL/결과 로깅 포함)
│   ├── 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/
│   ├── business-rules.md      # 기존 서비스 비즈니스 규칙 조사
│   ├── deployment.md
│   └── plan/project-plan.md   # 전체 개발 계획
├── auth.ts                    # NextAuth 설정
├── proxy.ts                   # 미인증 접근 차단 미들웨어
└── .env.example

문서

S
Description
chocomae 관리자 웹 서비스
Readme 873 KiB
Languages
TypeScript 95.7%
CSS 2.2%
Shell 1.3%
Dockerfile 0.5%
JavaScript 0.3%