# Docker 설정 가이드

## 개요

SAM 프로젝트는 Docker Compose를 사용하여 로컬 개발 환경을 구성합니다.

## 서비스 구성

### docker-compose.yml 구조

```yaml
services:
  nginx:      # 리버스 프록시
  api:        # Laravel 12 API (PHP 8.4)
  mng:        # Laravel 12 관리자 패널 (PHP 8.4)
  react:      # Next.js 15 (Node 20)
  design:     # 디자인 시스템 (Storybook)
  mysql:      # MySQL 8.0
```

## 서비스별 상세

### 1. nginx - 리버스 프록시

**이미지**: `nginx:latest`

**포트**: 80

**도메인 매핑**:
- `api.sam.kr` → Laravel API 서버
- `mng.sam.kr`, `admin.sam.kr` → Laravel 관리자 패널
- `dev.sam.kr` → Next.js 프론트엔드

**주요 기능**:
- 보안 규칙 적용 (경로 탐색 공격 차단)
- User-Agent 필터링 (보안 스캔 도구 차단)
- WebSocket 지원 (Next.js HMR)
- 정적 자산 캐싱

**설정 파일**: `docker/nginx/nginx.conf`

### 2. api - Laravel 12 API 서버

**이미지**: `php:8.4-fpm`

**기술 스택**:
- PHP 8.4-fpm
- Composer 2
- Supervisor (nginx + php-fpm)

**PHP 확장**:
- zip
- mysqli
- pdo
- pdo_mysql
- intl

**환경 변수**:
- `DB_HOST=sam-mysql-1`
- `DB_PORT=3306`
- `DB_DATABASE=samdb`
- `DB_USERNAME=samuser`
- `DB_PASSWORD=sampass`

**볼륨**:
- `../api:/var/www/api` - 소스 코드
- `../docker/api/nginx.conf` - Nginx 설정
- `../docker/api/supervisord.conf` - Supervisor 설정
- `../docker/api/uploads.ini` - PHP 업로드 설정

**작업 디렉토리**: `/var/www/api`

### 3. mng - Laravel 12 관리자 패널

**이미지**: `php:8.4-fpm`

**기술 스택**:
- PHP 8.4-fpm
- Pure Blade + Tailwind CSS
- Composer 2
- Supervisor (nginx + php-fpm)

**환경 변수**: api와 동일

**볼륨**:
- `../mng:/var/www/mng` - 소스 코드
- `../docker/mng/nginx.conf` - Nginx 설정
- `../docker/mng/supervisord.conf` - Supervisor 설정
- `../docker/mng/uploads.ini` - PHP 업로드 설정

**작업 디렉토리**: `/var/www/mng`

### 4. react - Next.js 15 프론트엔드

**이미지**: `node:20-alpine`

**기술 스택**:
- Node.js 20
- Next.js 15
- React 19.2.0

**포트**: 3000 (내부)

**환경 변수**:
- `NEXT_PUBLIC_API_BASE_URL=http://api.sam.kr`
- `NEXT_PUBLIC_ADMIN_URL=http://admin.sam.kr`
- `NEXT_PUBLIC_API_KEY` (선택)
- `NEXT_PUBLIC_APP_NAME=SAM`
- `NODE_ENV=development`

**볼륨**:
- `../react:/app` - 소스 코드
- `/app/node_modules` - node_modules 격리
- `/app/.next` - Next.js 빌드 캐시

**작업 디렉토리**: `/app`

**개발 서버**: `npm run dev` (포트 3000)

### 5. mysql - MySQL 데이터베이스

**이미지**: `mysql:8.0`

**포트**: 3306

**환경 변수**:
- `MYSQL_DATABASE=samdb`
- `MYSQL_USER=samuser`
- `MYSQL_PASSWORD=sampass`
- `MYSQL_ROOT_PASSWORD=root`

**볼륨**:
- `db_data:/var/lib/mysql` - 데이터 영구 저장
- `../docker/mysql/init.sql` - 초기화 스크립트

## 네트워크

### samnet (bridge network)

모든 서비스가 `samnet` 네트워크에 연결되어 서로 통신할 수 있습니다.

**서비스 간 통신**:
- `api.sam.kr` → `mysql:3306`
- `mng.sam.kr` → `mysql:3306`
- `nginx` → `api:9000` (PHP-FPM)
- `nginx` → `mng:9000` (PHP-FPM)
- `nginx` → `react:3000` (Next.js)

## 사용 방법

### 초기 설정

```bash
# 1. Docker 디렉토리로 이동
cd docker

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

# 3. 서비스 상태 확인
docker-compose ps
```

### 개발 워크플로우

```bash
# 서비스 시작
docker-compose up -d

# 로그 확인
docker-compose logs -f

# 특정 서비스 재시작
docker-compose restart api

# 서비스 중지
docker-compose down
```

### 컨테이너 내부 작업

```bash
# API 컨테이너에서 마이그레이션
docker-compose exec api php artisan migrate

# MNG 컨테이너에서 Composer 설치
docker-compose exec mng composer install

# React 컨테이너에서 npm 설치
docker-compose exec react npm install

# MySQL 접속
docker-compose exec mysql mysql -u samuser -psampass samdb
```

## 환경 변수 설정

### .env 파일

각 애플리케이션 디렉토리(`api/`, `mng/`, `react/`)에 `.env` 파일을 생성해야 합니다.

**api/.env 예시**:
```env
APP_NAME=SAM API
APP_ENV=local
APP_KEY=
APP_DEBUG=true
APP_URL=http://api.sam.kr

DB_CONNECTION=mysql
DB_HOST=sam-mysql-1
DB_PORT=3306
DB_DATABASE=samdb
DB_USERNAME=samuser
DB_PASSWORD=sampass
```

**mng/.env 예시**:
```env
APP_NAME=SAM MNG
APP_ENV=local
APP_KEY=
APP_DEBUG=true
APP_URL=http://mng.sam.kr

DB_CONNECTION=mysql
DB_HOST=sam-mysql-1
DB_PORT=3306
DB_DATABASE=samdb
DB_USERNAME=samuser
DB_PASSWORD=sampass
```

**react/.env.local 예시**:
```env
NEXT_PUBLIC_API_BASE_URL=http://api.sam.kr
NEXT_PUBLIC_ADMIN_URL=http://admin.sam.kr
NEXT_PUBLIC_API_KEY=your-api-key
NEXT_PUBLIC_APP_NAME=SAM
```

## 호스트 파일 설정

로컬에서 도메인 접근을 위해 `/etc/hosts` 파일에 다음을 추가:

```bash
127.0.0.1 api.sam.kr
127.0.0.1 mng.sam.kr
127.0.0.1 admin.sam.kr
127.0.0.1 dev.sam.kr
```

## 트러블슈팅

### 포트 충돌

```bash
# 포트 사용 확인
lsof -i :80
lsof -i :3306

# 포트를 사용하는 프로세스 종료
kill -9 <PID>
```

### 볼륨 권한 문제

```bash
# storage 디렉토리 권한 설정
docker-compose exec api chmod -R 775 storage
docker-compose exec mng chmod -R 775 storage
```

### 컨테이너 재빌드

```bash
# 특정 서비스 재빌드
docker-compose build --no-cache api

# 모든 서비스 재빌드
docker-compose build --no-cache
```

### 로그 확인

```bash
# 모든 서비스 로그
docker-compose logs -f

# 특정 서비스 로그
docker-compose logs -f api
docker-compose logs -f react

# Nginx 에러 로그
docker-compose exec nginx tail -f /var/log/nginx/api.sam.kr_error.log
```

### 데이터베이스 초기화

```bash
# 볼륨 삭제 (주의: 모든 데이터 삭제)
docker-compose down -v

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

## 보안 설정

### Nginx 보안 규칙

`docker/nginx/nginx.conf`에 다음 보안 규칙이 적용되어 있습니다:

1. **경로 탐색 공격 차단**:
   - `../`, `..\`, `etc/passwd`, `.env`, `.git` 등 차단

2. **보안 스캔 도구 차단**:
   - sqlmap, nikto, nmap, masscan 등 User-Agent 필터링

3. **정적 자산 캐싱**:
   - 30일 캐시 설정

## 프로덕션 배포

프로덕션 환경에서는 다음을 고려해야 합니다:

1. **HTTPS 설정**: SSL/TLS 인증서 적용
2. **환경 변수**: `.env` 파일 보안 관리
3. **볼륨 백업**: 데이터베이스 정기 백업
4. **리소스 제한**: 컨테이너 메모리/CPU 제한 설정
5. **로그 관리**: 로그 로테이션 설정

## 관련 문서

- [시스템 아키텍처](./02-architecture.md)
- [개발 명령어](./05-development.md)
- [보안 가이드](./08-security.md)

---

**업데이트**: 2025-12-26 (admin→mng 전환, design 서비스 추가)

