diff --git a/CLAUDE.md b/CLAUDE.md index b4451e1..6551794 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -70,34 +70,55 @@ ssh server2 "docker stop autonet-frontend 2>/dev/null; docker rm autonet-fronten | **스테이징** | https://staging.autonetsellcar.com | 테스트용 (먼저 배포) | | **프로덕션** | https://autonetsellcar.com | 실서비스 (테스트 후 배포) | -### 배포 순서 (반드시 준수!) +### CI/CD 자동 배포 흐름 (2025-01-04 적용) ``` ┌─────────────────────────────────────────────────────────────┐ -│ 1. 개발 PC에서 코드 수정 │ +│ 1. 로컬 PC에서 코드 수정 │ │ D:\Workspace\claudeCode\AutonetSellCar.com\ │ └─────────────────────────────────────────────────────────────┘ ↓ ┌─────────────────────────────────────────────────────────────┐ -│ 2. Git 커밋 및 푸시 │ +│ 2. Git 커밋 및 푸시 → ★ 스테이징 자동 배포! │ │ git add . │ │ git commit -m "변경 내용" │ │ git push staging main │ +│ → post-receive hook이 자동으로 스테이징 빌드/배포 │ └─────────────────────────────────────────────────────────────┘ ↓ ┌─────────────────────────────────────────────────────────────┐ -│ 3. 스테이징 서버 배포 │ -│ - /opt/autonet/staging/frontend 에서 빌드 │ -│ - https://staging.autonetsellcar.com 에서 테스트 │ +│ 3. 스테이징 테스트 │ +│ https://staging.autonetsellcar.com 에서 충분히 테스트 │ └─────────────────────────────────────────────────────────────┘ ↓ ┌─────────────────────────────────────────────────────────────┐ -│ 4. 스테이징에서 충분히 테스트 후 → 프로덕션 배포 │ -│ - /opt/autonet/production/frontend 에서 빌드 │ -│ - https://autonetsellcar.com 확인 │ +│ 4. 프로덕션 배포 (deploy.sh promote) │ +│ ssh server2 "/opt/autonet/scripts/deploy.sh promote" │ +│ → 스테이징 소스를 프로덕션으로 복사 및 빌드/배포 │ └─────────────────────────────────────────────────────────────┘ ``` +### ⚠️ Claude Code 작업 규칙 (중요!) + +**반드시 CI/CD 프로세스를 따르세요:** + +1. **로컬에서만 코드 수정** - 서버 파일 직접 수정 금지! +2. **git push staging main** - 스테이징 자동 배포 +3. **테스트 후 promote** - 프로덕션 배포 +4. **DB 스키마 변경 시** - ALTER TABLE 명령어 별도 실행 필요 (아래 참조) + +```bash +# ❌ 잘못된 방식 (절대 금지!) +ssh server2 "vim /opt/autonet/production/backend/app/main.py" # 서버 직접 수정 +scp backend/app/main.py server2:/opt/autonet/production/backend/app/ # 수동 복사 + +# ✅ 올바른 방식 +# 1. 로컬에서 수정 +# 2. git add . && git commit -m "변경 내용" && git push staging main +# 3. 스테이징 테스트 +# 4. ssh server2 "/opt/autonet/scripts/deploy.sh promote" +``` + ### Git 저장소 정보 | 항목 | 값 | @@ -106,30 +127,36 @@ ssh server2 "docker stop autonet-frontend 2>/dev/null; docker rm autonet-fronten | 브랜치 | `main` | | 원격 이름 | `staging` | -### 스테이징 배포 명령어 +### CI/CD 배포 명령어 ```bash -# 1. 소스 동기화 -scp -r frontend/src damon@192.168.0.202:/opt/autonet/staging/frontend/ +# ★ 스테이징 배포 (자동) - git push만 하면 됨! +git add . +git commit -m "변경 내용 설명" +git push staging main +# → post-receive hook이 자동으로: +# 1. /opt/autonet/staging/ 에 소스 체크아웃 +# 2. docker compose로 frontend/backend 빌드 및 재시작 -# 2. .env.production 설정 -ssh server2 "echo 'NEXT_PUBLIC_API_URL=https://staging.autonetsellcar.com' > /opt/autonet/staging/frontend/.env.production" +# ★ 프로덕션 배포 (수동 promote) +ssh server2 "/opt/autonet/scripts/deploy.sh promote" +# → staging 소스를 production으로 복사 후 빌드/배포 -# 3. Docker 빌드 및 재시작 -ssh server2 "cd /opt/autonet/staging/frontend && docker build --no-cache -t staging-frontend . && docker stop autonet-frontend-staging; docker rm autonet-frontend-staging; docker run -d --name autonet-frontend-staging --restart unless-stopped -p 3001:3000 staging-frontend" +# 상태 확인 +ssh server2 "/opt/autonet/scripts/deploy.sh status" + +# 롤백 (문제 발생 시) +ssh server2 "/opt/autonet/scripts/deploy.sh rollback" ``` -### 프로덕션 배포 명령어 +### 수동 배포 (비상시에만 사용) ```bash -# 1. 소스 동기화 -scp -r frontend/src damon@192.168.0.202:/opt/autonet/production/frontend/ +# 스테이징 수동 빌드 +ssh server2 "cd /opt/autonet/staging && docker compose -f docker-compose.staging.yml build --no-cache && docker compose -f docker-compose.staging.yml up -d" -# 2. .env.production 설정 (HTTPS 필수!) -ssh server2 "echo 'NEXT_PUBLIC_API_URL=https://autonetsellcar.com' > /opt/autonet/production/frontend/.env.production" - -# 3. Docker 빌드 및 재시작 -ssh server2 "cd /opt/autonet/production/frontend && docker build --no-cache -t production-frontend . && docker stop autonet-frontend; docker rm autonet-frontend; docker run -d --name autonet-frontend --restart unless-stopped -p 3000:3000 production-frontend" +# 프로덕션 수동 빌드 +ssh server2 "cd /opt/autonet/production && docker compose -f docker-compose.production.yml build --no-cache && docker compose -f docker-compose.production.yml up -d" ``` --- @@ -156,16 +183,22 @@ DB_NAME=autonet_staging # Production은 autonet - Frontend: `NEXT_PUBLIC_API_URL=https://staging.autonetsellcar.com` (build arg) - Backend: `.env` 파일을 볼륨 마운트로 연결 -### 소스 코드 동기화 +### 소스 코드 동기화 (CI/CD로 자동화됨) -**⚠️ 중요**: Staging 디렉토리는 Git 저장소가 아님! Production과 수동 동기화 필요 +**✅ CI/CD 적용 후**: `git push staging main`만 하면 자동으로 스테이징에 배포됩니다. ```bash -# Production → Staging 소스 동기화 -ssh damon@192.168.0.202 "rsync -av --exclude='node_modules' --exclude='.next' /opt/autonet/production/frontend/ /opt/autonet/staging/frontend/" +# 스테이징 배포 (자동) +git push staging main # post-receive hook이 자동으로 staging에 체크아웃 및 빌드 -# Staging Frontend 재빌드 -ssh damon@192.168.0.202 "cd /opt/autonet/staging && docker compose -f docker-compose.staging.yml build --no-cache frontend-staging && docker compose -f docker-compose.staging.yml up -d frontend-staging" +# 프로덕션 배포 (promote 명령) +ssh server2 "/opt/autonet/scripts/deploy.sh promote" # staging → production 복사 및 빌드 +``` + +**수동 동기화 (비상시에만)**: +```bash +# Production → Staging 소스 동기화 (일반적으로 필요 없음) +ssh damon@192.168.0.202 "rsync -av --exclude='node_modules' --exclude='.next' /opt/autonet/production/frontend/ /opt/autonet/staging/frontend/" ``` ### Staging DB 초기 데이터 복사 @@ -176,6 +209,48 @@ PGPASSWORD='roskfl@1122' pg_dump -h 192.168.0.201 -U admin -d autonet --data-onl PGPASSWORD='roskfl@1122' psql -h 192.168.0.201 -U admin -d autonet_staging ``` +### ⚠️ DB 스키마 변경 시 (중요!) + +**SQLAlchemy 모델 변경만으로는 DB가 자동 업데이트되지 않습니다!** + +코드에서 새 컬럼을 추가하면, 반드시 수동으로 ALTER TABLE을 실행해야 합니다: + +```bash +# 1. 먼저 Staging DB에 적용하여 테스트 +ssh server1 "docker exec -it postgres-primary psql -U admin -d autonet_staging -c \" +ALTER TABLE users ADD COLUMN IF NOT EXISTS new_column VARCHAR(255) DEFAULT ''; +\"" + +# 2. 테스트 후 Production DB에 적용 +ssh server1 "docker exec -it postgres-primary psql -U admin -d autonet -c \" +ALTER TABLE users ADD COLUMN IF NOT EXISTS new_column VARCHAR(255) DEFAULT ''; +\"" +``` + +**DB 스키마 변경 체크리스트**: +1. `backend/app/models/` 에서 모델 수정 +2. Staging DB에 ALTER TABLE 실행 +3. git push staging main (코드 배포) +4. Staging에서 테스트 +5. Production DB에 ALTER TABLE 실행 +6. deploy.sh promote (프로덕션 배포) + +**최근 추가된 컬럼 예시** (2025-01-04): +```sql +-- users 테이블 +ALTER TABLE users ADD COLUMN IF NOT EXISTS cash_cc_balance FLOAT DEFAULT 0; + +-- system_settings 테이블 +ALTER TABLE system_settings ADD COLUMN IF NOT EXISTS marketing_enabled BOOLEAN DEFAULT false; +ALTER TABLE system_settings ADD COLUMN IF NOT EXISTS marketing_telegram_enabled BOOLEAN DEFAULT false; +ALTER TABLE system_settings ADD COLUMN IF NOT EXISTS marketing_telegram_bot_token VARCHAR(255) DEFAULT ''; +ALTER TABLE system_settings ADD COLUMN IF NOT EXISTS marketing_telegram_channel_id VARCHAR(255) DEFAULT ''; +ALTER TABLE system_settings ADD COLUMN IF NOT EXISTS marketing_telegram_message_template TEXT DEFAULT ''; +ALTER TABLE system_settings ADD COLUMN IF NOT EXISTS marketing_facebook_enabled BOOLEAN DEFAULT false; +ALTER TABLE system_settings ADD COLUMN IF NOT EXISTS marketing_instagram_enabled BOOLEAN DEFAULT false; +ALTER TABLE system_settings ADD COLUMN IF NOT EXISTS marketing_auto_post_on_banner BOOLEAN DEFAULT false; +``` + --- ## 1. 프로젝트 구조 @@ -834,6 +909,9 @@ Import 시 자동 번역 (Azure API) | 날짜 | 변경 내용 | |------|----------| +| 2025-01-04 | **CI/CD 자동 배포 시스템 구축**: git push → 스테이징 자동 배포, deploy.sh promote → 프로덕션 배포 | +| 2025-01-04 | **docker-compose 통합**: 개별 docker run 대신 docker-compose.staging.yml/production.yml 사용 | +| 2025-01-04 | **CLAUDE.md CI/CD 워크플로우 문서화**: 서버 직접 수정 금지, DB 스키마 변경 프로세스 추가 | | 2025-01-03 | **Staging DB 분리**: `autonet_staging` DB 생성, Production/Staging 환경 완전 분리 | | 2025-01-03 | **My Vehicles 기능**: 직접 구매 차량을 My Request 페이지에 표시 | | 2024-12-31 | **Admin Settings 기능 추가**: Show Dealer Comment 토글, Korean Domestic + Export Customs 금액 설정 |