---
status: FIVE_SERVICE_PASSIVE_STANDBY_FENCE_STAGED_DEFAULT_OFF
service_count: 5
production_processes_restarted: false
production_changed: false
current_continuity: false
---

# 5개 서비스 passive standby fence

## 목적

메인 서버와 같은 application package를 PC standby에 그대로 실행하면 HTTP 쓰기뿐 아니라 GET 경로의 session 갱신, Socket.IO 이벤트, 주문 자동확정, point/reward 재시도, storage refresh와 chain proof worker가 중복 실행될 수 있다. 따라서 DB 복제나 traffic 전환보다 먼저 standby를 fail-closed 상태로 기동할 수 있어야 한다.

## 적용 서비스

- AISFOR
- AISTALK
- AISFOR Group
- AISMALL
- PLAI Sharing

각 서비스에 `PLAI_SERVICE_MODE=PASSIVE_STANDBY`일 때만 활성화되는 fence를 추가했다. 환경변수를 지정하지 않은 기본값은 `PRIMARY`이므로 현재 production 동작은 바뀌지 않는다.

## passive 동작

- session/database middleware보다 앞에서 동적 application route 차단
- POST/PUT/PATCH/DELETE 등 쓰기 요청 503 차단
- `/__plai/standby-health`는 DB·session 없이 200 제공
- public/upload/download/media 정적 복구 자료의 GET/HEAD만 허용
- Socket.IO 연결 fail-closed
- transaction submission과 validator runtime 금지
- AISFOR의 network/point/blockchain-proof/push worker 시작 금지
- AISMALL의 order auto-confirm와 backfill 시작 금지
- PLAI Sharing의 subtitle resume, point reversal retry, storage backfill/status worker 시작 금지
- standby와 worker/write/validator/transaction 활성 flag가 함께 주어지면 시작 단계에서 거부

## 검증

`scripts/passive-service-fleet-fence-self-test.js`가 다섯 로컬 module과 실제 entry source를 읽어 다음을 합성 검증했다.

- PRIMARY 기본 경로가 요청을 그대로 통과시킴
- passive health 200
- static GET 통과
- dynamic GET 503
- write 503
- Socket 연결 거부
- worker·transaction·validator 상태 false
- 위험한 환경 flag 조합 거부

네트워크 요청, DB 연결, DNS 변경, 외부 전송, validator 시작, production process 재시작은 수행하지 않았다.

추가 loopback process canary에서 다섯 서비스를 port 55108·55110·55112·55114·55116에 하나씩 실제 기동했다. 모든 서비스가 health 200, dynamic GET 503, POST 503을 반환했고 각 프로세스 종료 뒤 다섯 port가 모두 닫혔다. 합성 loopback Mongo/Redis 주소만 주입했으며 passive bootstrap은 DB·session 초기화를 건너뛰었다.

## 남은 단계

이 fence는 passive service package를 PC에 안전하게 배포하기 위한 선행조건이지 자동 승격 장치가 아니다. 다음에는 격리된 port에서 각 서비스를 passive profile로 실제 기동해 health/static/fence를 HTTP로 확인하고, signed promotion lease와 data replica가 준비되기 전에는 동적 route를 열 수 없도록 해야 한다.

증거: `evidence/passive-service-fleet-fence-self-test-redacted.json`
