231 lines
5.9 KiB
Markdown
231 lines
5.9 KiB
Markdown
# AutonetSellCar 배포 체크리스트
|
|
|
|
## 환경 정보
|
|
|
|
| 항목 | 서버4 (개발) | 서버2 (운영) |
|
|
|------|-------------|-------------|
|
|
| IP | 192.168.0.204 | 192.168.0.202 |
|
|
| OS | Windows | Ubuntu 22.04 |
|
|
| Frontend 포트 | 3000 | 3000 (운영), 3001 (스테이징) |
|
|
| Backend 포트 | 8000 | 8000 (운영), 8001 (스테이징) |
|
|
|
|
---
|
|
|
|
## 1. 서버2 디렉토리 구조
|
|
|
|
```
|
|
/opt/autonet/
|
|
├── git/autonet.git/ # Git bare repository
|
|
├── staging/ # 스테이징 코드
|
|
├── production/ # 운영 코드
|
|
│ ├── frontend/
|
|
│ │ ├── Dockerfile
|
|
│ │ ├── .env.production # ★ NEXT_PUBLIC_API_URL 설정
|
|
│ │ └── ...
|
|
│ ├── backend/
|
|
│ │ ├── Dockerfile
|
|
│ │ ├── autonet.db # ★ 데이터베이스
|
|
│ │ └── uploads/ # ★ 이미지 파일
|
|
│ └── docker-compose.production.yml
|
|
├── releases/ # 롤백용 아카이브
|
|
├── scripts/ # 배포 스크립트
|
|
└── logs/ # 로그
|
|
```
|
|
|
|
---
|
|
|
|
## 2. 핵심 설정 파일
|
|
|
|
### 2.1 Frontend 환경변수 (.env.production)
|
|
|
|
**파일 위치**: `/opt/autonet/production/frontend/.env.production`
|
|
|
|
```env
|
|
NEXT_PUBLIC_API_URL=http://192.168.0.202:8000
|
|
```
|
|
|
|
⚠️ **중요**: Next.js는 **빌드 시점**에 `NEXT_PUBLIC_*` 변수를 코드에 포함시킵니다.
|
|
- 런타임에 환경변수를 바꿔도 적용 안됨
|
|
- 환경변수 변경 후 반드시 **이미지 재빌드** 필요
|
|
|
|
### 2.2 Dockerfile (Frontend)
|
|
|
|
**파일 위치**: `/opt/autonet/production/frontend/Dockerfile`
|
|
|
|
빌드 시 환경변수 적용을 위해 다음이 포함되어야 함:
|
|
|
|
```dockerfile
|
|
# builder 단계에서
|
|
ARG NEXT_PUBLIC_API_URL=http://192.168.0.202:8000
|
|
ENV NEXT_PUBLIC_API_URL=$NEXT_PUBLIC_API_URL
|
|
```
|
|
|
|
### 2.3 docker-compose.production.yml
|
|
|
|
```yaml
|
|
version: '3.8'
|
|
services:
|
|
frontend:
|
|
build: ./frontend
|
|
container_name: autonet-frontend
|
|
ports:
|
|
- "3000:3000"
|
|
environment:
|
|
- NODE_ENV=production
|
|
depends_on:
|
|
- backend
|
|
|
|
backend:
|
|
build: ./backend
|
|
container_name: autonet-backend
|
|
ports:
|
|
- "8000:8000"
|
|
volumes:
|
|
- ./backend/uploads:/app/uploads # ★ 이미지 영속화
|
|
- ./backend/autonet.db:/app/autonet.db # ★ DB 영속화
|
|
```
|
|
|
|
---
|
|
|
|
## 3. 데이터 이전 체크리스트
|
|
|
|
### 3.1 데이터베이스 (autonet.db)
|
|
|
|
| 단계 | 명령어 | 확인 |
|
|
|------|--------|------|
|
|
| 서버4에서 복사 | `scp backend/autonet.db damon@192.168.0.202:/tmp/` | [ ] |
|
|
| 서버2 컨테이너에 복사 | `docker cp /tmp/autonet.db autonet-backend:/app/` | [ ] |
|
|
| 파일 확인 | `docker exec autonet-backend ls -la /app/autonet.db` | [ ] |
|
|
| 백엔드 재시작 | `docker restart autonet-backend` | [ ] |
|
|
|
|
### 3.2 업로드 이미지 (uploads/)
|
|
|
|
| 단계 | 명령어 | 확인 |
|
|
|------|--------|------|
|
|
| 서버4에서 압축 | `tar -cvf uploads.tar uploads` | [ ] |
|
|
| 서버2로 복사 | `scp uploads.tar damon@192.168.0.202:/tmp/` | [ ] |
|
|
| 압축 해제 | `cd /tmp && tar -xvf uploads.tar` | [ ] |
|
|
| 컨테이너에 복사 | `docker cp /tmp/uploads/. autonet-backend:/app/uploads/` | [ ] |
|
|
| 파일 확인 | `docker exec autonet-backend ls -la /app/uploads/` | [ ] |
|
|
|
|
---
|
|
|
|
## 4. 이미지 URL 문제 디버깅
|
|
|
|
### 4.1 현재 문제
|
|
|
|
브라우저에서 이미지 요청 URL이 `http://localhost:8000/...`으로 되어 있음.
|
|
→ 다른 PC에서 접속하면 localhost가 그 PC를 가리키므로 이미지 안 보임.
|
|
|
|
### 4.2 올바른 이미지 URL
|
|
|
|
```
|
|
http://192.168.0.202:8000/uploads/cars/39/image_0.jpg
|
|
```
|
|
|
|
### 4.3 원인 분석
|
|
|
|
1. **api.ts에서 API_BASE_URL 설정 확인**
|
|
- 파일: `frontend/src/lib/api.ts`
|
|
- `NEXT_PUBLIC_API_URL` 환경변수 사용 여부
|
|
|
|
2. **이미지 URL 생성 로직 확인**
|
|
- 이미지 URL이 어디서 생성되는지
|
|
- 백엔드에서 전체 URL 반환? vs 프론트엔드에서 조합?
|
|
|
|
3. **빌드 시점 환경변수 확인**
|
|
- `.env.production` 파일 존재 여부
|
|
- Dockerfile에서 ARG/ENV 설정 여부
|
|
|
|
---
|
|
|
|
## 5. 디버깅 명령어
|
|
|
|
### 5.1 프론트엔드 환경변수 확인
|
|
|
|
```bash
|
|
# 컨테이너 환경변수
|
|
docker exec autonet-frontend printenv | grep API
|
|
|
|
# .env.production 파일 내용
|
|
cat /opt/autonet/production/frontend/.env.production
|
|
```
|
|
|
|
### 5.2 백엔드 API 테스트
|
|
|
|
```bash
|
|
# 이미지 직접 접근 테스트
|
|
curl -I http://192.168.0.202:8000/uploads/cars/39/image_0.jpg
|
|
|
|
# API 응답에서 이미지 URL 확인
|
|
curl http://192.168.0.202:8000/api/cars/39 | jq '.images'
|
|
```
|
|
|
|
### 5.3 컨테이너 상태 확인
|
|
|
|
```bash
|
|
docker ps -a
|
|
docker logs autonet-frontend --tail 20
|
|
docker logs autonet-backend --tail 20
|
|
```
|
|
|
|
---
|
|
|
|
## 6. 재빌드 절차
|
|
|
|
### 6.1 Frontend 재빌드 (환경변수 변경 시)
|
|
|
|
```bash
|
|
cd /opt/autonet/production
|
|
|
|
# 1. 컨테이너 중지/삭제
|
|
docker rm -f autonet-frontend
|
|
|
|
# 2. 이미지 삭제
|
|
docker rmi production_frontend
|
|
|
|
# 3. .env.production 확인
|
|
cat frontend/.env.production
|
|
|
|
# 4. 재빌드
|
|
docker build --no-cache -t production_frontend ./frontend
|
|
|
|
# 5. 실행
|
|
docker run -d \
|
|
--name autonet-frontend \
|
|
--network autonet-production-network \
|
|
-p 3000:3000 \
|
|
production_frontend
|
|
|
|
# 6. 확인
|
|
docker ps | grep frontend
|
|
docker logs autonet-frontend --tail 10
|
|
```
|
|
|
|
---
|
|
|
|
## 7. 현재 상태 점검 명령어
|
|
|
|
서버2에서 순서대로 실행:
|
|
|
|
```bash
|
|
# 1. 컨테이너 상태
|
|
docker ps -a
|
|
|
|
# 2. 프론트엔드 환경변수
|
|
docker exec autonet-frontend printenv | grep -E "(API|NODE)"
|
|
|
|
# 3. .env.production 파일
|
|
cat /opt/autonet/production/frontend/.env.production
|
|
|
|
# 4. Dockerfile 환경변수 설정
|
|
grep -A2 "ARG NEXT_PUBLIC" /opt/autonet/production/frontend/Dockerfile
|
|
grep "ENV NEXT_PUBLIC" /opt/autonet/production/frontend/Dockerfile
|
|
|
|
# 5. 백엔드 이미지 파일 존재 확인
|
|
docker exec autonet-backend ls /app/uploads/cars/ | head -5
|
|
|
|
# 6. 백엔드 이미지 직접 접근 테스트
|
|
curl -I http://localhost:8000/uploads/cars/39/image_0.jpg
|
|
```
|