Files
sam-docs/WSL_MIGRATION_PLAN.md
강영보 220ab78041 docs: [bending] 절곡품 전용 테이블 분리 완료 문서
- README: bending_items 266건 + bending_models 62건 DB 검증 완료
- README: 하장바 검색 문제 해결 (10건 정상)
- README: bending_data JSON 통합, bending_item_mappings DROP
- README: LOT 코드 체계, 테이블 관계도, 레거시 대응표 갱신
- step1: 데이터분석 업데이트
- step5: canvas 그리기 추가
- .gitattributes CRLF→LF 정규화
2026-03-19 20:04:17 +09:00

353 lines
12 KiB
Markdown

# 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 원본은 그대로 보존.