# πŸš€ 배포 μ•ˆμ „μ„± 체크리슀트 ## βœ… DB λ§ˆμ΄κ·Έλ ˆμ΄μ…˜ 검증 ν•„μˆ˜μ‚¬ν•­ ### **배포 μ „ ν•„μˆ˜ 확인사항** #### 1. λ§ˆμ΄κ·Έλ ˆμ΄μ…˜ 파일 쑴재 확인 ```bash # λ‘œμ»¬μ—μ„œ 확인 ls -la backend/migrations/013_add_inbox_workflow_system.sql # 배포 μ„œλ²„μ—μ„œ 확인 (배포 ν›„) docker-compose exec backend ls -la /app/migrations/013_add_inbox_workflow_system.sql ``` #### 2. DB μ—°κ²° 및 κΆŒν•œ 확인 ```bash # DB μ—°κ²° ν…ŒμŠ€νŠΈ docker-compose exec db psql -U mproject -d mproject -c "SELECT version();" # λ§ˆμ΄κ·Έλ ˆμ΄μ…˜ 둜그 ν…Œμ΄λΈ” 쑴재 확인 docker-compose exec db psql -U mproject -d mproject -c "\d migration_log" ``` #### 3. λ§ˆμ΄κ·Έλ ˆμ΄μ…˜ μ‹€ν–‰ (배포 μ‹œ) ```bash # 1단계: 파일 볡사 docker cp backend/migrations/013_add_inbox_workflow_system.sql [DB_CONTAINER_NAME]:/tmp/ # 2단계: λ§ˆμ΄κ·Έλ ˆμ΄μ…˜ μ‹€ν–‰ docker-compose exec db psql -U mproject -d mproject -f /tmp/013_add_inbox_workflow_system.sql # 3단계: μ‹€ν–‰ κ²°κ³Ό 확인 docker-compose exec db psql -U mproject -d mproject -c "SELECT * FROM migration_log WHERE migration_file = '013_add_inbox_workflow_system.sql';" ``` #### 4. ν…Œμ΄λΈ” ꡬ쑰 검증 ```bash # issues ν…Œμ΄λΈ” ꡬ쑰 확인 docker-compose exec db psql -U mproject -d mproject -c "\d issues" # μƒˆλ‘œμš΄ μ»¬λŸΌλ“€ 쑴재 확인 docker-compose exec db psql -U mproject -d mproject -c " SELECT column_name, data_type, is_nullable, column_default FROM information_schema.columns WHERE table_name = 'issues' AND column_name IN ( 'review_status', 'disposal_reason', 'custom_disposal_reason', 'disposed_at', 'reviewed_by_id', 'reviewed_at', 'original_data', 'modification_log' );" ``` #### 5. ENUM νƒ€μž… 검증 ```bash # review_status ENUM 확인 docker-compose exec db psql -U mproject -d mproject -c "\dT+ review_status" # disposal_reason_type ENUM 확인 docker-compose exec db psql -U mproject -d mproject -c "\dT+ disposal_reason_type" ``` #### 6. 인덱슀 검증 ```bash # μƒˆλ‘œμš΄ μΈλ±μŠ€λ“€ 확인 docker-compose exec db psql -U mproject -d mproject -c " SELECT indexname, tablename, indexdef FROM pg_indexes WHERE tablename = 'issues' AND indexname IN ( 'idx_issues_review_status', 'idx_issues_reviewed_by_id', 'idx_issues_disposed_at' );" ``` #### 7. μ œμ•½ 쑰건 검증 ```bash # 체크 μ œμ•½ 쑰건 확인 docker-compose exec db psql -U mproject -d mproject -c " SELECT constraint_name, check_clause FROM information_schema.check_constraints WHERE constraint_name IN ( 'chk_disposal_reason_required', 'chk_custom_reason_logic' );" ``` --- ## πŸ”§ 배포 μ‹œ μ‹€ν–‰ 슀크립트 ### **μžλ™ λ§ˆμ΄κ·Έλ ˆμ΄μ…˜ 슀크립트** ```bash #!/bin/bash # deploy_migration.sh echo "πŸš€ DB λ§ˆμ΄κ·Έλ ˆμ΄μ…˜ μ‹œμž‘..." # 1. λ§ˆμ΄κ·Έλ ˆμ΄μ…˜ 파일 쑴재 확인 if [ ! -f "backend/migrations/013_add_inbox_workflow_system.sql" ]; then echo "❌ λ§ˆμ΄κ·Έλ ˆμ΄μ…˜ 파일이 μ‘΄μž¬ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€!" exit 1 fi # 2. DB μ»¨ν…Œμ΄λ„ˆ μƒνƒœ 확인 if ! docker-compose ps db | grep -q "Up"; then echo "❌ DB μ»¨ν…Œμ΄λ„ˆκ°€ μ‹€ν–‰λ˜μ§€ μ•Šμ•˜μŠ΅λ‹ˆλ‹€!" exit 1 fi # 3. λ§ˆμ΄κ·Έλ ˆμ΄μ…˜ 파일 볡사 echo "πŸ“ λ§ˆμ΄κ·Έλ ˆμ΄μ…˜ 파일 볡사 쀑..." docker cp backend/migrations/013_add_inbox_workflow_system.sql $(docker-compose ps -q db):/tmp/ # 4. λ§ˆμ΄κ·Έλ ˆμ΄μ…˜ μ‹€ν–‰ echo "⚑ λ§ˆμ΄κ·Έλ ˆμ΄μ…˜ μ‹€ν–‰ 쀑..." docker-compose exec -T db psql -U mproject -d mproject -f /tmp/013_add_inbox_workflow_system.sql # 5. μ‹€ν–‰ κ²°κ³Ό 확인 echo "πŸ” λ§ˆμ΄κ·Έλ ˆμ΄μ…˜ κ²°κ³Ό 확인 쀑..." MIGRATION_COUNT=$(docker-compose exec -T db psql -U mproject -d mproject -t -c "SELECT COUNT(*) FROM migration_log WHERE migration_file = '013_add_inbox_workflow_system.sql' AND status = 'SUCCESS';") if [ "$MIGRATION_COUNT" -eq 1 ]; then echo "βœ… λ§ˆμ΄κ·Έλ ˆμ΄μ…˜μ΄ μ„±κ³΅μ μœΌλ‘œ μ™„λ£Œλ˜μ—ˆμŠ΅λ‹ˆλ‹€!" else echo "❌ λ§ˆμ΄κ·Έλ ˆμ΄μ…˜ 싀행에 μ‹€νŒ¨ν–ˆμŠ΅λ‹ˆλ‹€!" exit 1 fi # 6. λ°±μ—”λ“œ μž¬μ‹œμž‘ (μƒˆλ‘œμš΄ λͺ¨λΈ 적용) echo "πŸ”„ λ°±μ—”λ“œ μž¬μ‹œμž‘ 쀑..." docker-compose restart backend echo "πŸŽ‰ 배포 μ™„λ£Œ!" ``` --- ## ⚠️ 배포 μ‹œ μ£Όμ˜μ‚¬ν•­ ### **1. λ°±μ—… ν•„μˆ˜** ```bash # 배포 μ „ DB λ°±μ—… docker-compose exec db pg_dump -U mproject mproject > backup_$(date +%Y%m%d_%H%M%S).sql ``` ### **2. λ‘€λ°± κ³„νš** ```bash # 문제 λ°œμƒ μ‹œ λ‘€λ°± (λ§ˆμ΄κ·Έλ ˆμ΄μ…˜ μ „ λ°±μ—…μœΌλ‘œ 볡원) docker-compose exec -T db psql -U mproject -d mproject < backup_YYYYMMDD_HHMMSS.sql ``` ### **3. 단계별 검증** - βœ… λ§ˆμ΄κ·Έλ ˆμ΄μ…˜ 파일 쑴재 - βœ… DB μ—°κ²° μƒνƒœ - βœ… λ§ˆμ΄κ·Έλ ˆμ΄μ…˜ μ‹€ν–‰ - βœ… ν…Œμ΄λΈ” ꡬ쑰 검증 - βœ… λ°±μ—”λ“œ μž¬μ‹œμž‘ - βœ… API λ™μž‘ ν…ŒμŠ€νŠΈ ### **4. λͺ¨λ‹ˆν„°λ§** ```bash # 배포 ν›„ 둜그 λͺ¨λ‹ˆν„°λ§ docker-compose logs -f backend docker-compose logs -f db ``` --- ## πŸ“‹ 배포 μ™„λ£Œ ν›„ 확인사항 ### **1. API μ—”λ“œν¬μΈνŠΈ ν…ŒμŠ€νŠΈ** ```bash # μˆ˜μ‹ ν•¨ API ν…ŒμŠ€νŠΈ (κ΅¬ν˜„ ν›„) curl -H "Authorization: Bearer YOUR_TOKEN" http://localhost:16080/api/inbox/ # 뢀적합 μƒνƒœ λ³€κ²½ ν…ŒμŠ€νŠΈ curl -X PUT -H "Authorization: Bearer YOUR_TOKEN" \ -H "Content-Type: application/json" \ -d '{"review_status": "in_progress"}' \ http://localhost:16080/api/issues/1/review-status ``` ### **2. ν”„λ‘ νŠΈμ—”λ“œ νŽ˜μ΄μ§€ μ ‘κ·Ό** - βœ… μˆ˜μ‹ ν•¨ νŽ˜μ΄μ§€ λ‘œλ“œ 확인 - βœ… κΆŒν•œ μ‹œμŠ€ν…œ λ™μž‘ 확인 - βœ… 데이터 ν‘œμ‹œ 확인 ### **3. μ›Œν¬ν”Œλ‘œμš° ν…ŒμŠ€νŠΈ** - βœ… 폐기 처리 ν…ŒμŠ€νŠΈ - βœ… μˆ˜μ • 이λ ₯ μ €μž₯ ν…ŒμŠ€νŠΈ - βœ… μƒνƒœ λ³€κ²½ ν…ŒμŠ€νŠΈ --- ## 🚨 문제 λ°œμƒ μ‹œ λŒ€μ‘ ### **일반적인 λ¬Έμ œλ“€** #### 1. λ§ˆμ΄κ·Έλ ˆμ΄μ…˜ 파일 λˆ„λ½ ```bash # ν•΄κ²°: 파일 μˆ˜λ™ 볡사 scp backend/migrations/013_add_inbox_workflow_system.sql server:/path/to/project/ ``` #### 2. κΆŒν•œ 문제 ```bash # ν•΄κ²°: 파일 κΆŒν•œ μ‘°μ • chmod 644 backend/migrations/013_add_inbox_workflow_system.sql ``` #### 3. DB μ—°κ²° μ‹€νŒ¨ ```bash # ν•΄κ²°: DB μ»¨ν…Œμ΄λ„ˆ μž¬μ‹œμž‘ docker-compose restart db ``` #### 4. λ§ˆμ΄κ·Έλ ˆμ΄μ…˜ 쀑볡 μ‹€ν–‰ - λ§ˆμ΄κ·Έλ ˆμ΄μ…˜ νŒŒμΌμ€ 쀑볡 μ‹€ν–‰ λ°©μ§€ 둜직 포함 - `migration_log` ν…Œμ΄λΈ”λ‘œ μ‹€ν–‰ 이λ ₯ 좔적 --- **이 체크리슀트λ₯Ό λ”°λΌν•˜λ©΄ 배포 μ‹œ DB λ§ˆμ΄κ·Έλ ˆμ΄μ…˜μ΄ μ•ˆμ „ν•˜κ²Œ μ μš©λ©λ‹ˆλ‹€!** βœ