


# 런타임 점검/테스트 & 장애 대응 체크리스트 (Gifticon Platform)

이 문서는 Gifticon Platform 도커 환경에서  
- **연동관계가 정상 작동하는지 테스트**  
- **문제 발생(500/큐/스케줄/메일) 시 어디부터 확인할지**  
- **운영 배포 루틴**  

을 한 번에 정리한 문서다.

---

## 3. 런타임 정상 동작 점검 (필수)

### 3.2 Laravel 기본 상태 확인 (필수)

```bash
docker exec -it gifticon-app php artisan about
```

확인 포인트:
- Environment: `production`
- Debug Mode: `OFF`
- Cache: `redis`
- Session: `redis`
- Queue: `redis`
- Mail: `smtp`
- URL: **프록시 뒤에서 도메인이 정상적으로 잡히는지** (Host/Forwarded 헤더 전달 정상 여부)

---

### 3.3 Redis 연결 확인

Redis 자체:

```bash
docker exec -it gifticon-redis redis-cli ping
# PONG 기대
```

Laravel cache 테스트:

```bash
docker exec -it -e HOME=/tmp gifticon-app php artisan tinker
> cache()->put('ping','pong',60);
> cache()->get('ping');
# "pong" 기대
```

---

### 3.4 DB 연결 확인

```bash
docker exec -it -e HOME=/tmp gifticon-app php artisan tinker
> \DB::select('select 1 as ok');
# ok=1 기대
```

---

### 3.5 Queue(워커) 동작 확인

권장: **Job 클래스로 테스트**  
- 테스트 Job 예: `QueuePingJob` (`ShouldQueue`)

dispatch 후 워커가 처리했는지 로그로 확인

dispatch:

```bash
docker exec -it -e HOME=/tmp gifticon-app php artisan tinker
> dispatch(new \App\Jobs\QueuePingJob());
```

워커 로그:

```bash
docker logs --tail=200 gifticon-worker
```

Laravel log:

```bash
docker exec -it gifticon-app sh -lc "tail -n 200 storage/logs/laravel.log | tail -n 200"
```

중요:
- `dispatch(function(){ ... })` 형태의 **Closure Job은 운영 금지**
- 직렬화 오류(“Failed to serialize job…”)가 발생할 수 있음 → **항상 Job 클래스로 구현**

---

### 3.6 Scheduler 동작 확인

스케줄 등록 확인:

```bash
docker exec -it gifticon-app php artisan schedule:list
```

스케줄러 컨테이너 실행 확인:

```bash
docker exec -it gifticon-scheduler ps aux
# php artisan schedule:work 확인
```

스케줄이 실제 실행되는지(로그 기반):
- 예: 매분 실행되는 Closure/Job을 하나 두고 로그 확인

---

### 3.7 Mail 발송 확인

메일은 “발송 성공/실패 로그”를 남기는 것이 운영에 유리하다.

메일 발송 로그 확인:

```bash
docker exec -it gifticon-app sh -lc "tail -n 200 storage/logs/laravel.log | egrep 'mail_send_attempt|mail_send_done|mail_send_debug|mail failed' | tail -n 200"
```

메일 템플릿 수정 후 반영이 안 되면:
- `view:clear` + `optimize:clear` + `gifticon-worker` 재시작이 핵심

---

## 4. 장애/오류 발생 시 “우선 확인 순서”

### 4.1 사이트 500 에러 (웹/관리자 공통)

Nginx 로그 확인:

```bash
docker logs --tail=200 gifticon-web
docker logs --tail=200 gifticon-admin
```

Laravel 앱 로그 확인:

```bash
docker exec -it gifticon-app sh -lc "tail -n 300 storage/logs/laravel.log"
```

env/cache 꼬임 대응(가장 흔함):

```bash
docker exec -it gifticon-app php artisan optimize:clear
docker restart gifticon-app gifticon-worker gifticon-scheduler
```

퍼미션/스토리지 확인:
- `storage/logs`, `storage/framework/*` 쓰기 실패 여부
- UID/GID 매핑, 호스트 권한 점검

---

### 4.2 Queue 관련 장애

#### (A) RedisException: Connection refused

원인 후보:
- redis 컨테이너 다운
- env/config cache 꼬임으로 redis host가 127.0.0.1로 잡힘
- 워커가 예전 캐시 상태 유지

네트워크 점검:

```bash
docker exec -it gifticon-worker sh -lc 'getent hosts gifticon-redis || true'
docker exec -it gifticon-worker sh -lc 'nc -vz gifticon-redis 6379 || true'
```

조치:

```bash
docker exec -it gifticon-app php artisan optimize:clear
docker restart gifticon-worker gifticon-app
```

#### (B) Closure Job 직렬화 오류

증상:
- “Failed to serialize job of type CallQueuedClosure …”

조치:
- Closure dispatch 금지
- Job 클래스로 전환

---

### 4.3 Scheduler 관련 장애

#### (A) withoutOverlapping 에러

증상:
- “A scheduled event name is required…”

조치:
- `withoutOverlapping()` 전에 `->name('...')` 필수

#### (B) Class not found (Job 클래스 없음)

증상:
- “Class App\Jobs\Xxx not found”

조치:
- 클래스 파일 존재/namespace 확인
- 캐시 제거 후 scheduler 재시작

```bash
docker exec -it gifticon-app php artisan optimize:clear
docker restart gifticon-scheduler
```

---

### 4.4 Mail 템플릿 반영 안 됨 / 변수 미정의

#### (A) 템플릿 수정했는데 메일이 그대로 옴

원인:
- view cache
- worker가 예전 캐시 상태로 계속 발송

조치:

```bash
docker exec -it gifticon-app php artisan view:clear
docker exec -it gifticon-app php artisan optimize:clear
docker restart gifticon-worker gifticon-app
```

#### (B) Undefined variable (Blade)

원인:
- 템플릿에서 사용 변수 준비(@php 블록)가 없거나 위치가 뒤에 있음
- include/section 구조상 변수가 선언되기 전에 참조됨

조치:
- `@section('content')` 시작 직후 `@php ... @endphp`로 변수를 선행 선언

---

## 5. 운영용 하드닝(보안/안정성) 권장

### 5.1 포트 직접 노출 최소화
운영에서는 8091/8092를 0.0.0.0로 열지 않고 reverse proxy 내부 네트워크로만 열어두는 구성을 권장.

### 5.2 healthcheck 추가 권장
- mariadb: mysqladmin ping
- redis: redis-cli ping
- app: php-fpm 포트 확인 또는 간단 artisan health command
- web/admin: curl localhost

### 5.3 read-only + tmpfs
Nginx 컨테이너는 가능하면:
- `read_only: true`
- `tmpfs: /var/cache/nginx, /var/run`
로 런타임 쓰기영역만 허용

### 5.4 관리자 접근 정책
- 관리자 도메인은 허용 IP만 접근 가능하게 (Nginx allow/deny)
- 비허용 IP는 웹 도메인으로 리다이렉트(정책 선택)
- 관리자 서비스는 web과 DB 권한/접근 범위를 분리하는 것이 최종 목표

---

## 6. 데이터 영속성/백업

### 6.1 MariaDB 데이터 보존
- db_data 볼륨이 유지되는 한 데이터 보존
- `docker compose down`은 기본적으로 볼륨 삭제하지 않음
- 아래는 데이터 삭제됨: `docker compose down -v`

### 6.2 Redis 데이터 보존
- redis_data 볼륨이 유지되는 한 데이터 보존(appendonly)

### 6.3 개발 DB 백업 예시
```bash
docker exec -it gifticon-db sh -lc 'mariadb-dump -uroot -p"$MARIADB_ROOT_PASSWORD" gifticon > /tmp/gifticon.sql'
docker cp gifticon-db:/tmp/gifticon.sql ./backup/gifticon.sql
```

운영에서 RDS 사용 시:
- RDS 자동 백업/스냅샷 정책 권장

---

## 7. 운영 배포 절차(권장 루틴)

1) 코드 업데이트 (git pull 등)

2) 빌드/업
```bash
docker compose up -d --build
```

3) Laravel 캐시 정리 및 재생성
```bash
docker exec -it gifticon-app php artisan optimize:clear
docker exec -it gifticon-app php artisan config:cache
docker exec -it gifticon-app php artisan route:cache
docker exec -it gifticon-app php artisan view:cache
```

4) worker/scheduler 재시작
```bash
docker restart gifticon-worker gifticon-scheduler
```
