docs: Update CLAUDE.md with CI/CD workflow documentation

- Add CI/CD auto-deployment flow diagram
- Add 'Claude Code 작업 규칙' section (no direct server edits)
- Update deployment commands to use CI/CD
- Add DB schema change process with ALTER TABLE examples
- Document deploy.sh promote/rollback/status commands
- Add change history for CI/CD implementation
This commit is contained in:
AutonetSellCar Deploy
2026-01-04 10:24:37 +09:00
parent 15dc8e563c
commit 27f7c81aaa

138
CLAUDE.md
View File

@@ -70,34 +70,55 @@ ssh server2 "docker stop autonet-frontend 2>/dev/null; docker rm autonet-fronten
| **스테이징** | https://staging.autonetsellcar.com | 테스트용 (먼저 배포) | | **스테이징** | https://staging.autonetsellcar.com | 테스트용 (먼저 배포) |
| **프로덕션** | https://autonetsellcar.com | 실서비스 (테스트 후 배포) | | **프로덕션** | https://autonetsellcar.com | 실서비스 (테스트 후 배포) |
### 배포 순서 (반드시 준수!) ### CI/CD 자동 배포 흐름 (2025-01-04 적용)
``` ```
┌─────────────────────────────────────────────────────────────┐ ┌─────────────────────────────────────────────────────────────┐
│ 1. 개발 PC에서 코드 수정 │ │ 1. 로컬 PC에서 코드 수정 │
│ D:\Workspace\claudeCode\AutonetSellCar.com\ │ │ D:\Workspace\claudeCode\AutonetSellCar.com\ │
└─────────────────────────────────────────────────────────────┘ └─────────────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────────┐ ┌─────────────────────────────────────────────────────────────┐
│ 2. Git 커밋 및 푸시 │ 2. Git 커밋 및 푸시 → ★ 스테이징 자동 배포!
│ git add . │ │ git add . │
│ git commit -m "변경 내용" │ │ git commit -m "변경 내용" │
│ git push staging main │ │ git push staging main │
│ → post-receive hook이 자동으로 스테이징 빌드/배포 │
└─────────────────────────────────────────────────────────────┘ └─────────────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────────┐ ┌─────────────────────────────────────────────────────────────┐
│ 3. 스테이징 서버 배포 │ 3. 스테이징 테스트
- /opt/autonet/staging/frontend 에서 빌드 https://staging.autonetsellcar.com 에서 충분히 테스트
│ - https://staging.autonetsellcar.com 에서 테스트 │
└─────────────────────────────────────────────────────────────┘ └─────────────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────────┐ ┌─────────────────────────────────────────────────────────────┐
│ 4. 스테이징에서 충분히 테스트 후 → 프로덕션 배포 │ │ 4. 프로덕션 배포 (deploy.sh promote)
- /opt/autonet/production/frontend 에서 빌드 ssh server2 "/opt/autonet/scripts/deploy.sh promote"
- https://autonetsellcar.com 확인 → 스테이징 소스를 프로덕션으로 복사 및 빌드/배포
└─────────────────────────────────────────────────────────────┘ └─────────────────────────────────────────────────────────────┘
``` ```
### ⚠️ 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 저장소 정보 ### Git 저장소 정보
| 항목 | 값 | | 항목 | 값 |
@@ -106,30 +127,36 @@ ssh server2 "docker stop autonet-frontend 2>/dev/null; docker rm autonet-fronten
| 브랜치 | `main` | | 브랜치 | `main` |
| 원격 이름 | `staging` | | 원격 이름 | `staging` |
### 스테이징 배포 명령어 ### CI/CD 배포 명령어
```bash ```bash
# 1. 소스 동기화 # ★ 스테이징 배포 (자동) - git push만 하면 됨!
scp -r frontend/src damon@192.168.0.202:/opt/autonet/staging/frontend/ git add .
git commit -m "변경 내용 설명"
git push staging main
# → post-receive hook이 자동으로:
# 1. /opt/autonet/staging/ 에 소스 체크아웃
# 2. docker compose로 frontend/backend 빌드 및 재시작
# 2. .env.production 설정 # ★ 프로덕션 배포 (수동 promote)
ssh server2 "echo 'NEXT_PUBLIC_API_URL=https://staging.autonetsellcar.com' > /opt/autonet/staging/frontend/.env.production" 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 ```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" 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"
# 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"
``` ```
--- ---
@@ -156,16 +183,22 @@ DB_NAME=autonet_staging # Production은 autonet
- Frontend: `NEXT_PUBLIC_API_URL=https://staging.autonetsellcar.com` (build arg) - Frontend: `NEXT_PUBLIC_API_URL=https://staging.autonetsellcar.com` (build arg)
- Backend: `.env` 파일을 볼륨 마운트로 연결 - Backend: `.env` 파일을 볼륨 마운트로 연결
### 소스 코드 동기화 ### 소스 코드 동기화 (CI/CD로 자동화됨)
**⚠️ 중요**: Staging 디렉토리는 Git 저장소가 아님! Production과 수동 동기화 필요 **✅ CI/CD 적용 후**: `git push staging main`만 하면 자동으로 스테이징에 배포됩니다.
```bash ```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 재빌드 # 프로덕션 배포 (promote 명령)
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" 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 초기 데이터 복사 ### 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 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. 프로젝트 구조 ## 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 | **Staging DB 분리**: `autonet_staging` DB 생성, Production/Staging 환경 완전 분리 |
| 2025-01-03 | **My Vehicles 기능**: 직접 구매 차량을 My Request 페이지에 표시 | | 2025-01-03 | **My Vehicles 기능**: 직접 구매 차량을 My Request 페이지에 표시 |
| 2024-12-31 | **Admin Settings 기능 추가**: Show Dealer Comment 토글, Korean Domestic + Export Customs 금액 설정 | | 2024-12-31 | **Admin Settings 기능 추가**: Show Dealer Comment 토글, Korean Domestic + Export Customs 금액 설정 |