# WSL 내부 Docker 환경 마이그레이션 계획

## 1. 현재 구조 (문제점)

```
┌─ Windows 11 (NTFS) ─────────────────────────────────────┐
│  C:/work/@KD_SAM/SAM/                                    │
│  ├── api/     (406MB)   소스코드                          │
│  ├── react/   (649MB)   소스 20MB + node_modules 629MB   │
│  ├── mng/     (89MB)    소스코드                          │
│  ├── 5130/    (799MB)   레거시                            │
│  ├── docker/  (237MB)   Docker 설정 + SSL                │
│  └── docs/    (57MB)    문서                              │
│                                                           │
│  ──── 9P 프로토콜 (느림) ────                              │
│                                                           │
│  ┌─ Docker Desktop (WSL2 backend) ──────────────────┐    │
│  │  nginx, api, react, mng, legacy, mysql            │    │
│  │  바인드 마운트가 Windows NTFS 경유 → 느림          │    │
│  │                                                    │    │
│  │  extra_hosts: api.sam.kr → host-gateway            │    │
│  │  → React SSR API 호출이 Docker 밖으로 나감          │    │
│  └────────────────────────────────────────────────────┘    │
└───────────────────────────────────────────────────────────┘
```

### 병목 3가지

| # | 병목 | 원인 | 영향 |
|---|------|------|------|
| 1 | **파일 I/O 느림** | Windows NTFS → WSL2 ext4 간 9P 프로토콜 | HMR 3~5초, npm install 수분 |
| 2 | **API 호출 우회** | extra_hosts로 Docker→WSL호스트→Docker 왕복 | API 호출마다 +10~20ms |
| 3 | **파일 감시 폴링** | inotify 불가 → 3초 폴링 | 코드 변경 반영 3초 지연 |

### 현재 시스템 사양

| 항목 | 값 |
|------|-----|
| RAM | 32GB |
| CPU | 20 논리 코어 |
| .wslconfig | 없음 (기본값) |
| WSL 배포판 | docker-desktop만 있음 |
| Docker | Docker Desktop (WSL2 backend) |

### 현재 DB 크기

| DB | 크기 |
|----|------|
| samdb | 177 MB |
| sam | 25 MB |
| chandj | 21 MB |
| 기타 (backup 등) | ~20 MB |
| **합계** | **~250 MB** |

### 현재 실행 중 컨테이너

| 컨테이너 | 상태 |
|----------|------|
| nginx | Running (26h) |
| mysql | Running (25h) |
| api | Running (19h) |
| mng | Running (26h) |
| legacy | Running (26h) |
| react | **Not Running** |
| phpmyadmin | **Not Running** |

---

## 2. 목표 구조

```
┌─ WSL2 Ubuntu 24.04 (ext4 네이티브) ─────────────────────┐
│                                                           │
│  ~/sam/                                                   │
│  ├── api/     ← git clone (네이티브 ext4)                 │
│  ├── react/   ← git clone (네이티브 ext4)                 │
│  ├── mng/     ← git clone (네이티브 ext4)                 │
│  ├── 5130/    ← 파일 복사 (git 없으면)                    │
│  ├── docker/  ← 복사 + 수정                               │
│  └── docs/    ← 복사                                      │
│                                                           │
│  ┌─ Docker Engine (WSL 네이티브) ───────────────────┐    │
│  │  바인드 마운트 = 같은 ext4 → 네이티브 속도         │    │
│  │                                                    │    │
│  │  서비스 간 통신: Docker 내부 DNS 직접 연결          │    │
│  │  → extra_hosts 불필요                              │    │
│  │  → 파일 폴링 불필요 (inotify 정상 작동)            │    │
│  └────────────────────────────────────────────────────┘    │
│                                                           │
│  Windows에서 접근: \\wsl$\Ubuntu-24.04\home\user\sam      │
│  VSCode: Remote WSL 확장으로 편집                          │
│                                                           │
└───────────────────────────────────────────────────────────┘
```

### 개선 효과 예상

| 항목 | 현재 | 목표 | 개선폭 |
|------|------|------|--------|
| 파일 I/O | 9P (느림) | ext4 네이티브 | **5~10배** |
| Next.js HMR | 3~5초 | 0.3~1초 | **3~5배** |
| npm install | 3~5분 | 30초~1분 | **3~5배** |
| API 내부 호출 | Docker→WSL→Docker | Docker 내부 직접 | **2~3배** |
| 파일 감시 | 3초 폴링 | inotify 즉시 | **즉시 반영** |

---

## 3. 마이그레이션 단계

### Phase 1: WSL Ubuntu 설치 + 기본 설정 (10분)

```bash
# 1-1. Ubuntu 24.04 설치
wsl --install -d Ubuntu-24.04

# 1-2. 초기 설정 (Ubuntu 내부)
sudo apt update && sudo apt upgrade -y

# 1-3. 기본 도구 설치
sudo apt install -y git curl wget unzip
```

### Phase 2: Docker Engine 설치 (10분)

> Docker Desktop 대신 WSL 내부에 Docker Engine 직접 설치

```bash
# 2-1. Docker 공식 GPG 키 + 저장소 추가
sudo apt install -y ca-certificates gnupg
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $(. /etc/os-release && echo $VERSION_CODENAME) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

# 2-2. Docker Engine 설치
sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin

# 2-3. 현재 사용자를 docker 그룹에 추가
sudo usermod -aG docker $USER

# 2-4. Docker 시작
sudo service docker start
```

### Phase 3: .wslconfig 설정 (2분)

> Windows 측에서 WSL 리소스 할당

**파일**: `C:\Users\codeb\.wslconfig`

```ini
[wsl2]
memory=12GB
processors=8
swap=4GB
localhostForwarding=true
```

> 32GB RAM 중 12GB 할당 (Docker + 6개 컨테이너 충분)

### Phase 4: 소스코드 가져오기 (10~15분)

```bash
# 4-1. 디렉토리 구조 생성
mkdir -p ~/sam

# 4-2. Git clone (소스코드만, vendor/node_modules 제외)
cd ~/sam
git clone http://114.203.209.83:3000/SamProject/sam-api.git api
git clone http://114.203.209.83:3000/SamProject/sam-react.git react
git clone http://114.203.209.83:3000/SamProject/sam-manage.git mng

# 4-3. 각 저장소 브랜치 맞추기
cd ~/sam/api && git checkout develop
cd ~/sam/mng && git checkout sam-kkk

# 4-4. Git 사용자 설정
git config --global user.name "강영보"
git config --global user.email "sam-kkk@codebridge-x.com"

# 4-5. 레거시(5130) - Git 저장소가 없으면 Windows에서 복사
cp -r /mnt/c/work/@KD_SAM/SAM/5130 ~/sam/5130

# 4-6. Docker 설정 복사
cp -r /mnt/c/work/@KD_SAM/SAM/docker ~/sam/docker

# 4-7. 문서 복사
cp -r /mnt/c/work/@KD_SAM/SAM/docs ~/sam/docs

# 4-8. .env 파일 복사 (git에 포함 안 된 경우)
cp /mnt/c/work/@KD_SAM/SAM/api/.env ~/sam/api/.env
cp /mnt/c/work/@KD_SAM/SAM/react/.env ~/sam/react/.env
cp /mnt/c/work/@KD_SAM/SAM/mng/.env ~/sam/mng/.env
cp /mnt/c/work/@KD_SAM/SAM/5130/.env ~/sam/5130/.env 2>/dev/null
```

### Phase 5: Docker 설정 수정 (5분)

#### 5-1. docker-compose.yml 수정

**변경사항**:

| 항목 | 변경 전 | 변경 후 | 이유 |
|------|---------|---------|------|
| extra_hosts | `api.sam.kr:host-gateway` | **제거** | Docker 내부 DNS로 충분 |
| WATCHPACK_POLLING | `3000` | **제거** | ext4에서 inotify 정상 작동 |
| CHOKIDAR_USEPOLLING | `true` | **제거** | 폴링 불필요 |
| CHOKIDAR_INTERVAL | `3000` | **제거** | 폴링 불필요 |

#### 5-2. React 환경변수 수정 (SSR 내부 통신 최적화)

```yaml
react:
  environment:
    - NEXT_PUBLIC_API_URL=https://api.sam.kr       # 브라우저용 (유지)
    - API_URL_INTERNAL=http://api:9000             # SSR용 (추가)
    # 아래 3줄 제거
    # - WATCHPACK_POLLING=3000
    # - CHOKIDAR_USEPOLLING=true
    # - CHOKIDAR_INTERVAL=3000
  # extra_hosts 제거
```

#### 5-3. Windows hosts 파일 유지

**`C:\Windows\System32\drivers\etc\hosts`** (기존과 동일):
```
127.0.0.1  dev.sam.kr api.sam.kr mng.sam.kr admin.sam.kr 5130.sam.kr
```

> WSL2의 localhostForwarding=true 덕분에 Windows에서 localhost로 WSL 포트 접근 가능

### Phase 6: DB 마이그레이션 (5~10분)

```bash
# 6-1. Windows Docker에서 DB 덤프 (Windows 측에서 실행)
# PowerShell 또는 Git Bash에서:
docker exec docker-mysql-1 mysqldump -uroot -proot --all-databases --routines --triggers > /mnt/c/temp/sam_db_dump.sql

# 6-2. WSL Ubuntu에서 Docker 컨테이너 시작 (MySQL만 먼저)
cd ~/sam/docker
docker compose up -d mysql
# MySQL 초기화 대기 (약 30초)
sleep 30

# 6-3. DB 덤프 복원
docker exec -i $(docker compose ps -q mysql) mysql -uroot -proot < /mnt/c/temp/sam_db_dump.sql
```

### Phase 7: 전체 서비스 빌드 + 실행 (10~15분)

```bash
cd ~/sam/docker

# 7-1. 이미지 빌드
docker compose build

# 7-2. 전체 서비스 시작
docker compose up -d

# 7-3. 상태 확인
docker compose ps

# 7-4. 로그 확인
docker compose logs -f --tail=50
```

### Phase 8: 검증 (5분)

| # | 확인 항목 | 방법 |
|---|----------|------|
| 1 | 서비스 실행 상태 | `docker compose ps` - 모든 컨테이너 Up |
| 2 | Nginx 접근 | 브라우저에서 `https://dev.sam.kr` 열기 |
| 3 | API 응답 | `curl -k https://api.sam.kr/api/health` |
| 4 | 관리자 접근 | `https://admin.sam.kr` 열기 |
| 5 | DB 연결 | phpMyAdmin (`http://localhost:8080`) |
| 6 | HMR 작동 | React 소스 수정 → 즉시 반영 확인 |
| 7 | 파일 감시 | `WATCHPACK_POLLING` 없이 변경 감지 확인 |

### Phase 9: Docker Desktop 정리 (선택)

```bash
# 기존 Docker Desktop 컨테이너 중지 (Windows에서)
docker compose -f C:/work/@KD_SAM/SAM/docker/docker-compose.yml down

# Docker Desktop 비활성화 또는 제거 (선택)
# → WSL Ubuntu Docker와 충돌 방지
```

---

## 4. 주의사항

### 포트 충돌

| 포트 | 용도 | 주의 |
|------|------|------|
| 80/443 | Nginx | Docker Desktop 먼저 중지해야 함 |
| 3306 | MySQL | 동시에 2개 MySQL 불가 |
| 8080 | phpMyAdmin | 충돌 가능 |

> **반드시 기존 Docker Desktop 컨테이너를 먼저 중지** 후 WSL Docker 시작

### VSCode 편집 환경

```
기존: VSCode에서 C:/work/@KD_SAM/SAM/ 직접 편집
변경: VSCode Remote WSL 확장 사용
  - Ctrl+Shift+P → "WSL: Connect to WSL"
  - ~/sam/ 폴더 열기
  - 터미널도 WSL Ubuntu 내부에서 실행
```

### Git 작업 흐름

```
기존: Windows Git Bash에서 커밋/푸시
변경: WSL Ubuntu 터미널에서 커밋/푸시 (동일한 원격 저장소)
  - 또는 VSCode Remote WSL의 Git 기능 사용
```

### 백업/롤백 계획

```
Windows 원본 소스: C:/work/@KD_SAM/SAM/ (그대로 보존)
Windows Docker: 컨테이너 중지만 (삭제 안 함)
DB 덤프: C:/temp/sam_db_dump.sql (보존)

문제 시 롤백:
  1. WSL Docker 중지: docker compose down
  2. Windows Docker 재시작: docker compose up -d
  → 5분 이내 원복 가능
```

---

## 5. 일정 요약

| Phase | 작업 | 소요 시간 |
|-------|------|----------|
| 1 | Ubuntu 설치 + 기본 설정 | 10분 |
| 2 | Docker Engine 설치 | 10분 |
| 3 | .wslconfig 설정 | 2분 |
| 4 | 소스코드 가져오기 | 10~15분 |
| 5 | Docker 설정 수정 | 5분 |
| 6 | DB 마이그레이션 | 5~10분 |
| 7 | 빌드 + 실행 | 10~15분 |
| 8 | 검증 | 5분 |
| 9 | Docker Desktop 정리 | 3분 |
| **합계** | | **약 60~75분** |

> 롤백 가능하므로 리스크 낮음. Windows 원본은 그대로 보존.
