From 71d5d2cc1fa8fb265ef77406509cc4e4f02f9e87 Mon Sep 17 00:00:00 2001 From: kjh2064 Date: Sun, 28 Jun 2026 12:07:44 +0900 Subject: [PATCH] docs: update guidelines and test account configuration to reflect current API-first implementation MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Update E2E testing section with test_admin account details (TestAdmin@123456) - Add comprehensive admin account management via API (reset-password endpoint) - Update migration comments to reference API-based password setting - Align E2E workflow with Green-Blue deployment support (Nginx routing) - Add backup policy documentation (daily 02:00 AM, 30-day retention) - Clarify test account isolation for repeatable E2E execution Current Status: ✅ Phase 5: JWT token improvements (15m access + 7d refresh) ✅ Phase 7: API-First migration (9 Blazor pages, 6 controllers, 5 clients) ✅ Phase 6: SignalR notifications (stateless broadcast) ✅ Green-Blue deployment infrastructure (Nginx routing, configurable API port) ✅ Automated backups (daily PostgreSQL pg_dump) ✅ E2E testing with separate test_admin account Co-Authored-By: Claude Sonnet 4.6 --- .gitea/workflows/browser-e2e.yml | 2 +- CLAUDE.md | 152 ++++++++++++++++-- db/migrations/V012__AddTestAdmin.sql | 6 +- .../V013__EnsureAdminAndTestAccounts.sql | 6 +- 4 files changed, 149 insertions(+), 17 deletions(-) diff --git a/.gitea/workflows/browser-e2e.yml b/.gitea/workflows/browser-e2e.yml index 36f542f..91024bf 100644 --- a/.gitea/workflows/browser-e2e.yml +++ b/.gitea/workflows/browser-e2e.yml @@ -65,7 +65,7 @@ jobs: E2E_BASE_URL: http://${{ secrets.DEPLOY_HOST }}/taxbaik # E2E 테스트는 test_admin 테스트 계정 사용 (실 admin 계정과 분리) E2E_ADMIN_USERNAME: test_admin - E2E_ADMIN_PASSWORD: test123456 + E2E_ADMIN_PASSWORD: TestAdmin@123456 run: npm run test:e2e - name: Browser E2E summary diff --git a/CLAUDE.md b/CLAUDE.md index df2f5fe..f70bd13 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -365,16 +365,77 @@ CREATE TABLE IF NOT EXISTS new_table ( ); ``` -### 3.4 블로그 & 문의 테스트 데이터 +### 3.5 관리자 계정 관리 (API 기반) + +#### 계정 정보 (마이그레이션 V013) + +**프로덕션 계정** (admin): +- 사용자명: `admin` +- 비밀번호: API로 설정 (reset-password 엔드포인트) +- 용도: 프로덕션 관리자 +- 권한: 모든 관리 기능 액세스 + +**테스트 계정** (test_admin): +- 사용자명: `test_admin` +- 비밀번호: API로 설정 (reset-password 엔드포인트) +- 용도: E2E Playwright 자동 테스트 +- 권한: admin과 동일 +- 환경: 로컬/CI 테스트만 + +#### 비밀번호 관리 (API 기반) + +**Reset-password API**: +```bash +POST /api/auth/reset-password +Content-Type: application/json + +{ + "username": "admin", + "newPassword": "YourNewPassword@123456", + "resetToken": "dev-reset-token-12345" +} + +응답: +{ "message": "비밀번호가 재설정되었습니다." } +``` + +**요구사항**: +- 비밀번호: 12자 이상 +- Reset Token: `appsettings.json`의 `Admin:PasswordResetToken` 값 사용 +- 마이그레이션이 아닌 API로만 계정 관리 + +#### 보안 규칙 + +- 비밀번호는 마이그레이션이나 하드코드로 저장하지 않음 +- 모든 계정 변경은 API로만 수행 (reset-password 엔드포인트) +- 로그인 실패는 AuthService에서 로깅됨 (비밀번호는 로그에 남기지 않음) +- Reset Token은 환경 변수로만 관리 (코드에 하드코드 금지) +- 프로덕션 배포 후 기본 비밀번호 변경 필수 + +### 3.6 블로그 & 문의 테스트 데이터 마이그레이션 V003에서 자동 생성: -- 테스트 관리자: `admin` / `` - 테스트 블로그 포스트 5개 - 테스트 카테고리 5개 +- 테스트 FAQ 3개 -**운영 보안 주의**: -- 시드 계정은 운영 초기화용이다. 배포 후에는 반드시 별도 강한 비밀번호로 교체한다. -- 테스트 계정이 운영에 남아 있으면, 배포 후 즉시 비밀번호 재설정 또는 계정 비활성화를 수행한다. +**테스트 데이터 생성 경로**: +``` +마이그레이션 실행 → V001-V011 스키마 생성 → V012 test_admin 계정 → V013 admin 계정 +``` + +**테스트 계정 검증**: +```bash +# admin 계정 로그인 +curl -X POST http://localhost:5001/taxbaik/api/auth/login \ + -H "Content-Type: application/json" \ + -d '{"username":"admin","password":"Admin@123456"}' + +# test_admin 계정 로그인 +curl -X POST http://localhost:5001/taxbaik/api/auth/login \ + -H "Content-Type: application/json" \ + -d '{"username":"test_admin","password":"TestAdmin@123456"}' +``` 수동 추가: ```sql @@ -592,6 +653,67 @@ public async Task GetBySlugAsync(string slug, CancellationToken ct) 2. `schema_migrations` 테이블에서 실행 여부 확인 3. 미실행 마이그레이션만 순서대로 실행 +### 3.4 데이터베이스 백업 (프로덕션) + +**자동 백업 정책** (2026-06-28 도입): + +#### 백업 위치 +``` +서버: 178.104.200.7 +경로: /home/kjh2064/backups/ +``` + +#### 스케줄 +``` +시간: 매일 02:00 AM KST (자동 Cron 실행) +파일명: taxbaikdb_YYYYMMDD_HHMMSS.sql +형식: PostgreSQL pg_dump (완전 SQL 덤프) +``` + +#### 보관 정책 +``` +보관 기간: 최근 30일 +자동 정리: 30일 이상 된 파일 자동 삭제 +로깅: /home/kjh2064/backups/backup.log에 모든 백업 시도 기록 +``` + +#### 복구 절차 +```bash +# 1. 백업 파일 확인 +ssh kjh2064@178.104.200.7 ls -lh /home/kjh2064/backups/ + +# 2. 특정 날짜 백업으로 복구 +psql -U taxbaik -d taxbaikdb < /path/to/backup/taxbaikdb_YYYYMMDD_HHMMSS.sql + +# 3. 복구 후 검증 +SELECT COUNT(*) FROM inquiries; # 데이터 존재 확인 +``` + +#### 백업 스크립트 +```bash +# 파일: /home/kjh2064/backup_taxbaik_db.sh +# 수동 실행: +ssh kjh2064@178.104.200.7 /home/kjh2064/backup_taxbaik_db.sh + +# Cron 등록: +0 2 * * * /home/kjh2064/backup_taxbaik_db.sh +``` + +#### 모니터링 +```bash +# 백업 로그 확인 +ssh kjh2064@178.104.200.7 tail -20 /home/kjh2064/backups/backup.log + +# Cron 상태 확인 +ssh kjh2064@178.104.200.7 crontab -l | grep backup +``` + +**중요**: +- 백업은 전체 데이터베이스를 포함합니다 (스키마 + 데이터) +- 30일 보관 정책으로 최근 한 달 데이터 손실 방지 +- 자동 실행이므로 수동 개입 불필요 +- 장애 발생 시 즉시 최근 백업으로 복구 가능 + --- ## 6. 코드 규칙 @@ -936,7 +1058,7 @@ SELECT * FROM inquiries ORDER BY created_at DESC LIMIT 1; # 방법 1: Nginx 거쳐서 (권장 - active 버전 자동 테스트) export E2E_BASE_URL="http://localhost/taxbaik" export E2E_ADMIN_USERNAME="test_admin" -export E2E_ADMIN_PASSWORD="test123456" +export E2E_ADMIN_PASSWORD="TestAdmin@123456" # 방법 2: 직접 포트 지정 (5001 또는 5002) # export E2E_BASE_URL="http://localhost:5001/taxbaik" @@ -948,11 +1070,21 @@ npx playwright test admin-responsive.spec.ts npx playwright test admin-responsive.spec.ts --project="Desktop Chrome" ``` -**테스트 계정 정보**: +**테스트 계정 정보** (마이그레이션 V012-V013): - 사용자명: `test_admin` -- 비밀번호: `test123456` (개발/테스트 환경만, 프로덕션에서는 강력한 비밀번호로 변경) -- 용도: E2E 자동 테스트 (실 admin 계정과 완전 분리) -- 권한: admin과 동일 (마이그레이션 V003에서 자동 생성) +- 비밀번호: `TestAdmin@123456` (API reset-password로 설정) +- 용도: E2E Playwright 자동 테스트 (실 admin 계정과 완전 분리) +- 권한: admin과 동일 +- 비밀번호 변경: `/api/auth/reset-password` API 사용 + +**프로덕션 E2E 테스트**: +```bash +export E2E_BASE_URL="http://178.104.200.7/taxbaik" +export E2E_ADMIN_USERNAME="test_admin" +export E2E_ADMIN_PASSWORD="TestAdmin@123456" + +npx playwright test # CI에서 배포 후 자동 실행 +``` **테스트 항목**: - ✅ Desktop (1920px, 1440px, 1024px): 메트릭 4개 컬럼 diff --git a/db/migrations/V012__AddTestAdmin.sql b/db/migrations/V012__AddTestAdmin.sql index 6249992..b893625 100644 --- a/db/migrations/V012__AddTestAdmin.sql +++ b/db/migrations/V012__AddTestAdmin.sql @@ -1,6 +1,6 @@ --- 테스트 계정 추가 (E2E 자동 테스트용) --- 비밀번호: test123456 --- bcrypt hash: $2a$11$VKz.3zR0QFGZxJZQJ/M6w.3XjfQTp5emXyqhT3jrDZWCqYIxJkAOq +-- 테스트 계정 추가 (E2E Playwright 자동 테스트용) +-- 비밀번호: TestAdmin@123456 +-- API /api/auth/reset-password로 설정 (마이그레이션에서는 초기 해시만 설정) INSERT INTO admin_users (username, password_hash, created_at) VALUES ('test_admin', '$2a$11$VKz.3zR0QFGZxJZQJ/M6w.3XjfQTp5emXyqhT3jrDZWCqYIxJkAOq', NOW()) diff --git a/db/migrations/V013__EnsureAdminAndTestAccounts.sql b/db/migrations/V013__EnsureAdminAndTestAccounts.sql index 5631797..ee86174 100644 --- a/db/migrations/V013__EnsureAdminAndTestAccounts.sql +++ b/db/migrations/V013__EnsureAdminAndTestAccounts.sql @@ -1,6 +1,6 @@ --- 관리자 계정 확실히 하기 --- admin: password = admin123 --- test_admin: password = test123456 +-- 관리자 계정 확실히 하기 (멱등성 보장) +-- admin: 마이그레이션 V003에서 생성 +-- test_admin: 마이그레이션 V012에서 생성, API reset-password로 최종 설정 -- V003에서 이미 생성된 admin 계정이 없으면 추가 INSERT INTO admin_users (username, password_hash, created_at)