# error-page `*.takits.me`가 컨테이너 다운으로 502/503/504가 날 때, DSM 기본 에러창 대신 쓰는 공통 nginx. DSM 리버스 프록시가 **앱 포트에 직접** 붙으면, 그 포트가 닫혀 있을 때 나스가 에러 페이지를 그립니다. 이 컨테이너는 항상 `127.0.0.1:4098`에서 떠 있고, `Host`로 실제 앱에 넘긴 뒤 업스트림이 죽었을 때만 공통 페이지를 보여 줍니다. ``` 브라우저 → DSM RP (HTTPS) → 127.0.0.1:4098 (error-page) └─ Host가 takits.me 이면 127.0.0.1:4889 ``` 앱의 404/500은 가로채지 않습니다. ## 배포 `develop`에서 작업한 뒤 `main`에 머지하면 Gitea Actions가 아래 경로로 파일을 동기화하고 컨테이너를 재생성합니다. ```text /volume1/09_container_manager/14_error-page ``` 수동 실행: ```bash cd /volume1/09_container_manager/14_error-page docker compose up -d ``` 확인: ```bash curl -sI http://127.0.0.1:4098/healthz curl -sI -H "Host: unknown.takits.me" http://127.0.0.1:4098/ ``` 두 번째가 `502`와 커스텀 HTML이면 정상입니다. ## DSM 리버스 프록시 1. `upstreams.map`에 호스트 → **지금 DSM에 적어 둔 목적지 포트**를 넣습니다. 2. 해당 호스트의 리버스 프록시 목적지를 `127.0.0.1:4098`로 바꿉니다. (앱 포트로 두면 나스 에러창이 그대로입니다.) 3. WebSocket이 필요한 호스트는 DSM에서 WS를 그대로 켭니다. 4. SSL은 지금처럼 DSM이 종료합니다. 한 줄 추가 후: ```bash docker exec error-page nginx -s reload ``` 와일드카드 `*.takits.me` → `127.0.0.1:4098` 한 규칙으로 모아도 됩니다. 맵에 없는 호스트는 공통 에러 페이지가 뜹니다. ## 파일 | 파일 | 역할 | |------|------| | `upstreams.map` | 호스트별 앱 포트 | | `html/index.html` | 502/503/504 페이지 | | `nginx.conf` | 프록시 + 에러 가로채기 |