# AutonetSellCar.com 배포 가이드 ## 서버 구성 ``` server5 (집 Win11) ↓ Remote Desktop server4 (회사 Win11, 개발서버) ↓ SSH / Git Push server1 (192.168.0.201) - NPM (Nginx Proxy Manager) server2 (192.168.0.202) - 운영서버 (Docker) server3 (192.168.0.203) - grantech.kr ``` ## 배포 흐름 ``` [server4 개발] │ ▼ git push staging main [server2 스테이징 자동 배포] │ ▼ ssh server2 "/opt/autonet/scripts/deploy.sh promote" [server2 운영 배포] ``` --- ## 일반 배포 (코드만 변경) ```bash # 1. 커밋 git add -A && git commit -m "변경 내용" # 2. 스테이징 배포 (자동) git push staging main # 3. 운영 승격 ssh damon@192.168.0.202 "/opt/autonet/scripts/deploy.sh promote" ``` --- ## DB 스키마 변경 시 (중요!) ### SQLite 특성 - SQLAlchemy 모델에 컬럼 추가해도 **DB에 자동 반영 안 됨** - Docker 재시작해도 DB 볼륨은 유지됨 - **반드시 수동으로 ALTER TABLE 실행 필요!** ### 새 컬럼 추가 시 체크리스트 ``` □ 1. backend/app/models/*.py - 모델에 컬럼 추가 □ 2. backend/app/schemas/*.py - 스키마에 필드 추가 □ 3. backend/app/api/*.py - API 기본값 설정 □ 4. git commit & push □ 5. 운영 배포 후 DB에 컬럼 추가 (아래 명령어) □ 6. 테스트 ``` ### DB 컬럼 추가 명령어 ```bash # 운영서버 DB에 컬럼 추가 ssh damon@192.168.0.202 "docker exec autonet-backend python -c \" import sqlite3 for db in ['/app/autonet.db', '/app/autonet_data.db']: try: conn = sqlite3.connect(db) conn.execute('ALTER TABLE 테이블명 ADD COLUMN 컬럼명 타입 DEFAULT 기본값') conn.commit() print(f'{db}: OK') except Exception as e: print(f'{db}: {e}') \"" ``` ### 예시: cc_per_banner_view 컬럼 추가 ```bash ssh damon@192.168.0.202 "docker exec autonet-backend python -c \" import sqlite3 for db in ['/app/autonet.db', '/app/autonet_data.db']: try: conn = sqlite3.connect(db) conn.execute('ALTER TABLE system_settings ADD COLUMN cc_per_banner_view REAL DEFAULT 0.1') conn.commit() print(f'{db}: OK') except Exception as e: print(f'{db}: {e}') \"" ``` ### SQLite 타입 매핑 | Python/SQLAlchemy | SQLite | |-------------------|--------| | Integer | INTEGER | | Float | REAL | | String | TEXT | | Boolean | INTEGER (0/1) | | DateTime | TEXT | --- ## 롤백 ```bash # 직전 버전으로 롤백 ssh damon@192.168.0.202 "/opt/autonet/scripts/deploy.sh rollback" # 특정 버전으로 롤백 ssh damon@192.168.0.202 "/opt/autonet/scripts/deploy.sh rollback-to 20260101_094303" # 릴리즈 목록 확인 ssh damon@192.168.0.202 "/opt/autonet/scripts/deploy.sh status" ``` --- ## 서버 상태 확인 ```bash # 컨테이너 상태 ssh damon@192.168.0.202 "docker ps" # 백엔드 로그 ssh damon@192.168.0.202 "docker logs autonet-backend --tail 50" # 프론트엔드 로그 ssh damon@192.168.0.202 "docker logs autonet-frontend --tail 50" # DB 테이블 확인 ssh damon@192.168.0.202 "docker exec autonet-backend python -c \" import sqlite3 conn = sqlite3.connect('/app/autonet.db') cursor = conn.cursor() cursor.execute('PRAGMA table_info(system_settings)') for row in cursor.fetchall(): print(row) \"" ``` --- ## SSH 키 설정 (server4 → server1,2,3) ```powershell # 공개키 확인 cat ~/.ssh/id_ed25519.pub # 각 서버에 등록 # server1,2,3 각각에서: nano ~/.ssh/authorized_keys # 공개키 붙여넣기 ``` --- ## 자주 발생하는 문제 ### 1. "no such column" 에러 - **원인**: 코드에 새 컬럼 추가했지만 DB에는 없음 - **해결**: ALTER TABLE로 컬럼 추가 (위 참고) ### 2. "Failed to save settings" 에러 - **원인**: 보통 DB 스키마 불일치 - **확인**: `docker logs autonet-backend --tail 30` - **해결**: 누락된 컬럼 추가 ### 3. 번역 안 됨 - **원인**: i18n.ts에 해당 단어 번역 없음 - **해결**: CAR_TRANSLATIONS에 번역 추가 ### 4. 배포 후 변경사항 안 보임 - **프론트엔드**: 브라우저 캐시 클리어 (Ctrl+Shift+R) - **백엔드**: 컨테이너 재시작 확인 ### 5. "Login failed" / SQLite 에러 - **원인**: `.env` 파일이 디렉토리로 생성되어 환경변수 로드 실패 - **증상**: `(sqlite3.OperationalError) no such column` 에러 - **확인**: `ls -la /opt/autonet/production/backend/.env` - **해결**: ```bash # .env가 디렉토리인 경우 rm -rf /opt/autonet/production/backend/.env # .env 파일 재생성 (개발서버에서 복사 또는 수동 생성) # 컨테이너 재시작 cd /opt/autonet/production && docker-compose -f docker-compose.production.yml up -d --force-recreate ``` --- ## .env 파일 관리 (중요!) ### 운영서버 .env 파일 위치 ``` /opt/autonet/production/backend/.env /opt/autonet/production/agent/.env (빈 파일) ``` ### .env가 없거나 디렉토리로 생성된 경우 **증상**: 이메일이 안 보내짐, `[DEV]` 로그 출력 **해결**: ```bash # .env가 디렉토리로 잘못 생성된 경우 ssh damon@192.168.0.202 "rm -rf /opt/autonet/production/backend/.env" # 개발서버에서 .env 복사 또는 수동 생성 scp backend/.env damon@192.168.0.202:/opt/autonet/production/backend/.env # 컨테이너 재시작 ssh damon@192.168.0.202 "cd /opt/autonet/production && docker compose -f docker-compose.production.yml down && docker compose -f docker-compose.production.yml up -d" ``` ### 필수 환경변수 | 변수 | 설명 | 예시 | |------|------|------| | SMTP_USER | Gmail 계정 | autonetsellcar@gmail.com | | SMTP_PASSWORD | 앱 비밀번호 | (16자리) | | AZURE_TRANSLATOR_KEY | Azure 번역 API 키 | (API 키) | | STRIPE_SECRET_KEY | Stripe 결제 키 | sk_live_... | --- ## 변경 이력 | 날짜 | 변경 내용 | DB 변경 | |------|----------|---------| | 2026-01-01 | .env 파일 문제 해결 (디렉토리→파일), deploy.sh rsync에서 .env 제외, docker-compose env_file 방식 | - | | 2026-01-01 | 강력한 비밀번호 정책 및 로그인 보안 강화 | users: failed_login_attempts, locked_until, password_reset_required | | 2026-01-01 | 삭제된 사용자 재가입 허용 수정 | - | | 2026-01-01 | inquiries 테이블 누락 컬럼 추가 | inquiries: category, subject 등 8개 컬럼 | | 2026-01-01 | 운영서버 .env 파일 생성 (SMTP 설정) | - | | 2026-01-01 | cc_per_banner_view 설정 추가 | system_settings.cc_per_banner_view (REAL) | | 2026-01-01 | 마이스터 번역 추가 | - | --- **이 문서는 새 세션 시작 시 CLAUDE.md와 함께 반드시 읽어주세요!**