# Vexplor 온프레미스(공장) 배포 가이드

## 개요

이 가이드는 Vexplor를 **공장 내부 서버(온프레미스)**에 배포하는 방법을 설명합니다.

**Watchtower**를 사용하여 Harbor에 새 이미지가 푸시되면 **자동으로 업데이트**됩니다.

---

## 사전 요구사항

### 서버 요구사항

| 항목 | 최소 사양 | 권장 사양 |
| :--- | :--- | :--- |
| OS | Ubuntu 20.04+ | Ubuntu 22.04 LTS |
| CPU | 4 Core | 8 Core |
| RAM | 8 GB | 16 GB |
| Disk | 50 GB | 100 GB SSD |
| Network | Harbor 접근 가능 | - |

### 필수 소프트웨어

```bash
# Docker 설치 확인
docker --version    # 20.10 이상

# Docker Compose 설치 확인
docker compose version   # v2.0 이상
```

---

## 1단계: 초기 설정

### 1.1 배포 폴더 생성

```bash
# 배포 폴더 생성
sudo mkdir -p /opt/vexplor
cd /opt/vexplor

# 파일 복사 (또는 git clone)
# deploy/onpremise/ 폴더의 내용을 복사
```

### 1.2 환경 변수 설정

```bash
# 예제 파일 복사
cp env.example .env

# 편집
nano .env
```

**필수 수정 항목:**

```bash
# 서버 IP (이 서버의 실제 IP)
SERVER_IP=192.168.0.100

# 회사 코드
COMPANY_CODE=SPIFOX

# DB 비밀번호 (강력한 비밀번호 설정)
DB_PASSWORD=MySecurePassword123!

# JWT 시크릿 (32자 이상)
JWT_SECRET=your-super-secret-jwt-key-minimum-32-chars

# Harbor 인증 정보
HARBOR_USER=your_username
HARBOR_PASSWORD=your_password
```

### 1.3 Harbor 레지스트리 로그인

Watchtower가 이미지를 당겨올 수 있도록 Docker 로그인이 필요합니다.

```bash
# Harbor 로그인
docker login harbor.wace.me

# Username: (입력)
# Password: (입력)

# 로그인 성공 확인
cat ~/.docker/config.json
```

---

## 2단계: 서비스 실행

### 2.1 서비스 시작

```bash
cd /opt/vexplor

# 이미지 다운로드 & 실행
docker compose up -d

# 상태 확인
docker compose ps
```

### 2.2 정상 동작 확인

```bash
# 모든 컨테이너 Running 상태 확인
docker compose ps

# 로그 확인
docker compose logs -f

# 개별 서비스 로그
docker compose logs -f backend
docker compose logs -f frontend
docker compose logs -f watchtower
```

### 2.3 웹 접속 테스트

```
프론트엔드: http://SERVER_IP:80
백엔드 API: http://SERVER_IP:3001/health
```

---

## 3단계: 자동 업데이트 확인

### Watchtower 동작 확인

```bash
# Watchtower 로그 확인
docker compose logs -f watchtower
```

**정상 로그 예시:**

```
watchtower  | time="2024-12-28T10:00:00+09:00" level=info msg="Checking for updates..."
watchtower  | time="2024-12-28T10:00:05+09:00" level=info msg="Found new image harbor.wace.me/vexplor/vexplor-backend:latest"
watchtower  | time="2024-12-28T10:00:10+09:00" level=info msg="Stopping container vexplor-backend"
watchtower  | time="2024-12-28T10:00:15+09:00" level=info msg="Starting container vexplor-backend"
```

### 업데이트 주기 변경

```bash
# .env 파일에서 변경
UPDATE_INTERVAL=3600  # 1시간마다 확인

# 변경 후 watchtower 재시작
docker compose restart watchtower
```

---

## 운영 가이드

### 서비스 관리 명령어

```bash
# 모든 서비스 상태 확인
docker compose ps

# 모든 서비스 중지
docker compose stop

# 모든 서비스 시작
docker compose start

# 모든 서비스 재시작
docker compose restart

# 모든 서비스 삭제 (데이터 유지)
docker compose down

# 모든 서비스 삭제 + 볼륨 삭제 (주의: 데이터 삭제됨!)
docker compose down -v
```

### 로그 확인

```bash
# 전체 로그 (실시간)
docker compose logs -f

# 특정 서비스 로그
docker compose logs -f backend
docker compose logs -f frontend
docker compose logs -f database

# 최근 100줄만
docker compose logs --tail=100 backend
```

### 수동 업데이트 (긴급 시)

자동 업데이트를 기다리지 않고 즉시 업데이트하려면:

```bash
# 최신 이미지 다운로드
docker compose pull

# 재시작
docker compose up -d
```

### 특정 버전으로 롤백

```bash
# .env 파일에서 버전 지정
IMAGE_TAG=v1.0.0

# 재시작
docker compose up -d
```

---

## 백업 가이드

### DB 백업

```bash
# 백업 디렉토리 생성
mkdir -p /opt/vexplor/backups

# PostgreSQL 백업
docker compose exec database pg_dump -U vexplor vexplor > /opt/vexplor/backups/backup_$(date +%Y%m%d_%H%M%S).sql
```

### 업로드 파일 백업

```bash
# 볼륨 위치 확인
docker volume inspect vexplor_backend_uploads

# 또는 직접 복사
docker cp vexplor-backend:/app/uploads /opt/vexplor/backups/uploads_$(date +%Y%m%d)
```

### 자동 백업 스크립트 (Cron)

```bash
# crontab 편집
crontab -e

# 매일 새벽 3시 DB 백업
0 3 * * * docker compose -f /opt/vexplor/docker-compose.yml exec -T database pg_dump -U vexplor vexplor > /opt/vexplor/backups/backup_$(date +\%Y\%m\%d).sql
```

---

## 문제 해결

### 컨테이너가 시작되지 않음

```bash
# 로그 확인
docker compose logs backend

# 일반적인 원인:
# 1. 환경 변수 누락 → .env 파일 확인
# 2. 포트 충돌 → netstat -tlnp | grep 3001
# 3. 메모리 부족 → free -h
```

### DB 연결 실패

```bash
# DB 컨테이너 상태 확인
docker compose logs database

# DB 직접 접속 테스트
docker compose exec database psql -U vexplor -d vexplor -c "SELECT 1"
```

### Watchtower가 업데이트하지 않음

```bash
# Watchtower 로그 확인
docker compose logs watchtower

# Harbor 인증 확인
docker pull harbor.wace.me/vexplor/vexplor-backend:latest

# 라벨 확인 (라벨이 있는 컨테이너만 업데이트)
docker inspect vexplor-backend | grep watchtower
```

### 디스크 공간 부족

```bash
# 사용하지 않는 이미지/컨테이너 정리
docker system prune -a

# 오래된 로그 정리
docker compose logs --tail=0 backend  # 로그 초기화
```

---

## 보안 권장사항

1. **방화벽 설정**: 필요한 포트(80, 3001)만 개방
2. **SSL/TLS**: Nginx 리버스 프록시 + Let's Encrypt 적용 권장
3. **정기 백업**: 최소 주 1회 DB 백업
4. **로그 모니터링**: 비정상 접근 감시

---

## 연락처

배포 관련 문의: [담당자 이메일]

