# Gifticon Platform Docker Runbook (Dev/Prod 통합) 이 문서는 Gifticon Platform의 Docker 기반 실행 환경을 운영/배포 관점에서 정리한 통합 런북이다. 포함 범위: - 컨테이너 역할/연동 구조 - 프록시(HTTPS terminate) 구조 - 정상 동작 테스트(필수 체크리스트) - 스케줄/큐/메일/캐시 관련 대표 장애 사례 및 해결 - 배포 절차(운영 권장 루틴) - 운영 하드닝(보안/안정성) 권장사항 - 데이터 영속성/백업 --- ## 0. 아키텍처 개요 ### 0.1 컨테이너 구성(대표) - `gifticon-web` : Nginx (Web 도메인, 정적/라우팅 + PHP-FPM upstream) - `gifticon-admin` : Nginx (Admin 도메인, 인증/허용 IP 적용 가능) - `gifticon-app` : PHP-FPM + Laravel (비즈니스 로직) - `gifticon-worker` : Laravel queue worker (Redis 큐 처리) - `gifticon-scheduler` : Laravel scheduler (schedule:work 상시 실행) - `gifticon-db` : MariaDB (개발/임시용. 리얼에서는 RDS 사용 가능) - `gifticon-redis` : Redis (cache/session/queue) - (mailpit: 개발용 SMTP 테스트 — 현재 제거 완료) ### 0.2 프록시(NAS/nginx-proxy/CloudFront) 연결 외부에서 HTTPS로 들어오면 프록시가 HTTPS를 terminate 하고 내부 도커는 HTTP로 통신한다. 예시(NAS nginx-proxy): - `https://four.syye.net` → `http://:8091` (gifticon-web) - `https://shot.syye.net` → `http://:8092` (gifticon-admin) 운영에서도: - CloudFront(HTTPS) → EC2(HTTP) → Docker(gifticon-web/admin) 동일 패턴으로 적용 가능. 프록시에서 전달 헤더: - `Host` - `X-Forwarded-Proto=https` - `X-Forwarded-For` - `X-Forwarded-Host` --- ## 1. docker-compose 주요 역할/의미 ### 1.1 gifticon-web (nginx) - 역할: Web 도메인용 Nginx - 포트: 8091:80 (호스트 노출) - 볼륨: - `./src:/var/www/html:ro` (소스 read-only) - `./nginx/web/default.conf:/etc/nginx/conf.d/default.conf:ro` ### 1.2 gifticon-admin (nginx) - 역할: Admin 도메인용 Nginx - 포트: 8092:80 - 볼륨: - `./src:/var/www/html:ro` - `./nginx/admin/default.conf:/etc/nginx/conf.d/default.conf:ro` - `./nginx/auth:/etc/nginx/auth:ro` (허용 IP, basic auth 등 정책 적용) ### 1.3 gifticon-app (php-fpm + laravel) - 역할: Laravel 실행 - depends_on: db, redis - UID/GID 매핑으로 호스트 파일 권한 문제 방지 - 주의: `artisan tinker` 실행 시 PsySH가 HOME 디렉토리에 쓰기를 시도할 수 있음 → `docker exec -it -e HOME=/tmp gifticon-app php artisan tinker` 권장 ### 1.4 gifticon-worker (queue) - 역할: Redis 큐 처리 - command: `php artisan queue:work ...` - 운영 포인트: - **Closure Job(익명 함수 dispatch) 금지**: 직렬화/경로 오류 발생 가능 - 반드시 Job 클래스로 구현 ### 1.5 gifticon-scheduler (schedule) - 역할: `php artisan schedule:work` 상시 실행 - Laravel 12 기준 스케줄 정의는 `routes/console.php`에서 가능 - `withoutOverlapping()` 사용 시 `->name()`을 먼저 지정해야 함 (name 없는 상태에서 withoutOverlapping 호출하면 LogicException) ### 1.6 gifticon-db (mariadb) - 역할: 개발/임시 DB - 영속성: `db_data` 볼륨 사용 (재시작해도 유지) - **주의:** `docker compose down -v`는 볼륨 삭제(데이터 삭제) ### 1.7 gifticon-redis - 역할: cache/session/queue - 영속성: `redis_data` 볼륨(appendonly) 사용 --- ## 2. 운영(리얼) 서버 적용 원칙 ### 2.1 APP_ENV / APP_DEBUG 운영 권장: - `APP_ENV=production` - `APP_DEBUG=false` (디버그/스택노출 위험) ### 2.2 캐시 전략(운영 배포 후 권장) 운영 배포 직후: - `php artisan optimize:clear` - `php artisan config:cache` - `php artisan route:cache` - `php artisan view:cache` > 템플릿 변경 후 메일/뷰가 반영 안 되는 문제는 대부분 view cache 또는 worker 재시작 누락. ### 2.3 secrets 관리 - .env 민감정보(키/비번/SMTP/토큰)는 저장소 커밋 금지 - 운영 서버에서는 `.env` 권한 600 + 배포 파이프라인에서 주입 권장 --- ## 3. “정상 동작” 점검 체크리스트 (필수) ### 3.1 컨테이너 상태 확인 ```bash docker ps --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}"