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:
138
CLAUDE.md
138
CLAUDE.md
@@ -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 금액 설정 |
|
||||||
|
|||||||
Reference in New Issue
Block a user