Add SOLD OUT badge and improve deployment docs
- Add SOLD OUT overlay on car detail page image - Add SOLD OUT badge next to car name - Add Sold Out status in Admin Cars detail view - Add soldout field to Car TypeScript interface - Create PRODUCTION_VALUES.md for deployment reference - Update CLAUDE.md with CRITICAL deployment section - Update TROUBLESHOOTING.md with recurring errors 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
@@ -233,9 +233,162 @@ docker exec autonet-frontend sh -c "grep -r 'localhost:8000' /app/.next/static/c
|
||||
|
||||
---
|
||||
|
||||
---
|
||||
|
||||
## 2026-01-02: 반복되는 배포 오류 종합 (CRITICAL)
|
||||
|
||||
### 문제 1: DB_NAME 오류 (`mongolcar` vs `autonet`)
|
||||
|
||||
**증상**:
|
||||
- 사이트에 차량/배너 없음
|
||||
- API가 빈 배열 `[]` 반환
|
||||
- 로그인은 되지만 데이터 없음
|
||||
|
||||
**원인**:
|
||||
- 수동 `docker run` 시 DB_NAME을 `mongolcar`로 잘못 입력
|
||||
- PostgreSQL에 `mongolcar`와 `autonet` 두 DB가 존재
|
||||
- `mongolcar`는 비어있고, 실제 데이터는 `autonet`에 있음
|
||||
|
||||
**확인 방법**:
|
||||
```bash
|
||||
# 현재 연결된 DB 확인
|
||||
ssh server2 "docker exec autonet-backend python -c \"from app.config import get_settings; print('DB_NAME:', get_settings().DB_NAME)\""
|
||||
|
||||
# DB별 데이터 확인
|
||||
ssh server1 "docker exec postgres-primary psql -U admin -d autonet -c 'SELECT COUNT(*) FROM cars;'"
|
||||
ssh server1 "docker exec postgres-primary psql -U admin -d mongolcar -c 'SELECT COUNT(*) FROM cars;'"
|
||||
```
|
||||
|
||||
**해결**:
|
||||
- `DB_NAME=autonet` 확인 후 컨테이너 재시작
|
||||
- CLAUDE.md의 표준 명령어 복사해서 사용
|
||||
|
||||
---
|
||||
|
||||
### 문제 2: 비밀번호 `@` 파싱 오류
|
||||
|
||||
**증상**:
|
||||
- `could not translate host name "1122@192.168.0.201"`
|
||||
- 백엔드 컨테이너 계속 재시작
|
||||
|
||||
**원인**:
|
||||
- `DB_PASSWORD=roskfl@1122`의 `@`가 URL에서 호스트 구분자로 인식됨
|
||||
- `config.py`에 `quote_plus()` URL 인코딩이 없거나, Docker 이미지가 오래됨
|
||||
|
||||
**확인 방법**:
|
||||
```bash
|
||||
# config.py에 quote_plus 있는지 확인
|
||||
ssh server2 "docker exec autonet-backend cat /app/app/config.py | grep quote_plus"
|
||||
```
|
||||
|
||||
**해결**:
|
||||
1. `config.py`에 `quote_plus()` 적용 확인
|
||||
2. Docker 이미지 재빌드: `docker build --no-cache -t production-backend ./backend`
|
||||
|
||||
---
|
||||
|
||||
### 문제 3: 이미지 404 (잘못된 uploads 경로)
|
||||
|
||||
**증상**:
|
||||
- `/uploads/cars/40/image_0.jpg` → 404
|
||||
- Hero 배너에 기본 이미지만 표시
|
||||
|
||||
**원인**:
|
||||
- Production 컨테이너가 잘못된 경로 마운트: `/home/damon/mongolcar/data/uploads` (비어있음!)
|
||||
- 실제 이미지는 `/opt/autonet/production/backend/uploads`에 있음
|
||||
|
||||
**확인 방법**:
|
||||
```bash
|
||||
# 올바른 경로 (파일 있어야 함)
|
||||
ssh server2 "ls /opt/autonet/production/backend/uploads/cars/ | head -5"
|
||||
|
||||
# 잘못된 경로 (비어있음!)
|
||||
ssh server2 "ls /home/damon/mongolcar/data/uploads/cars/ 2>/dev/null || echo 'Empty or not exists'"
|
||||
```
|
||||
|
||||
**해결**:
|
||||
- 볼륨 마운트를 `-v /opt/autonet/production/backend/uploads:/app/uploads`로 변경
|
||||
- CLAUDE.md의 표준 명령어 사용
|
||||
|
||||
---
|
||||
|
||||
### 문제 4: Mixed Content (HTTPS/HTTP)
|
||||
|
||||
**증상**:
|
||||
- 브라우저 콘솔에 Mixed Content 오류
|
||||
- API 요청 실패
|
||||
- 사이트에 기본 이미지만 표시
|
||||
|
||||
**원인**:
|
||||
- Frontend가 `NEXT_PUBLIC_API_URL=http://192.168.0.202:8000`으로 빌드됨
|
||||
- HTTPS 페이지에서 HTTP API 호출 시 브라우저가 차단
|
||||
|
||||
**확인 방법**:
|
||||
```bash
|
||||
# 빌드된 JS에서 API URL 확인
|
||||
ssh server2 "docker exec autonet-frontend grep -r '192.168.0.202:8000' /app/.next/static/chunks/ | head -1"
|
||||
```
|
||||
|
||||
**해결**:
|
||||
```bash
|
||||
# Frontend 빌드 전 필수!
|
||||
ssh server2 "echo 'NEXT_PUBLIC_API_URL=https://autonetsellcar.com' > /home/damon/mongolcar/frontend/.env.production"
|
||||
ssh server2 "cd /home/damon/mongolcar/frontend && docker build --no-cache -t production-frontend ."
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 문제 5: .env 파일이 디렉토리로 생성됨
|
||||
|
||||
**증상**:
|
||||
- 로그인 실패
|
||||
- `(sqlite3.OperationalError) no such column` 에러
|
||||
- 환경변수 로드 실패
|
||||
|
||||
**원인**:
|
||||
- docker-compose 볼륨 마운트 시 `.env` 파일이 없으면 디렉토리로 생성됨
|
||||
|
||||
**확인 방법**:
|
||||
```bash
|
||||
ssh server2 "ls -la /opt/autonet/production/backend/.env"
|
||||
# 'd'로 시작하면 디렉토리 (문제!)
|
||||
```
|
||||
|
||||
**해결**:
|
||||
```bash
|
||||
# 디렉토리면 삭제 후 파일로 재생성
|
||||
ssh server2 "rm -rf /opt/autonet/production/backend/.env"
|
||||
ssh server2 "cat > /opt/autonet/production/backend/.env << 'EOF'
|
||||
USE_SQLITE=False
|
||||
DB_HOST=192.168.0.201
|
||||
DB_PORT=5432
|
||||
DB_NAME=autonet
|
||||
DB_USER=admin
|
||||
DB_PASSWORD=roskfl@1122
|
||||
EOF"
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 재발 방지 체크리스트
|
||||
|
||||
배포 시 반드시 확인:
|
||||
|
||||
- [ ] DB_NAME이 `autonet`인가? (절대 `mongolcar` 아님!)
|
||||
- [ ] Uploads 경로가 `/opt/autonet/production/backend/uploads`인가?
|
||||
- [ ] Frontend `.env.production`에 `https://autonetsellcar.com`이 설정되어 있는가?
|
||||
- [ ] `--no-cache`로 이미지를 빌드했는가?
|
||||
- [ ] 배포 후 `curl https://autonetsellcar.com/api/hero-banners/`로 데이터 확인했는가?
|
||||
|
||||
---
|
||||
|
||||
## 변경 이력
|
||||
|
||||
| 날짜 | 문제 | 해결 |
|
||||
|------|------|------|
|
||||
| 2026-01-02 | DB_NAME 오류 (mongolcar vs autonet) | DB_NAME=autonet 확인, 표준 명령어 사용 |
|
||||
| 2026-01-02 | 비밀번호 @ 파싱 오류 | quote_plus() URL 인코딩 적용 |
|
||||
| 2026-01-02 | 이미지 404 (잘못된 uploads 경로) | /opt/autonet/production/backend/uploads 사용 |
|
||||
| 2026-01-02 | Mixed Content 오류 | NEXT_PUBLIC_API_URL=https://autonetsellcar.com |
|
||||
| 2024-12-30 | 운영서버 이미지 미표시 (배너) | 소스 코드 동기화 + Docker 재빌드 |
|
||||
| 2024-12-30 | 차량 상세 이미지 미표시 | `getImageUrl()` 함수 수정 |
|
||||
|
||||
Reference in New Issue
Block a user