실제로 발생한 장애와 해결 과정.
http://192.168.0.240:8181 접속 시 로딩만 계속 돌다가 "The API is not healthy" 표시Up 2 days 로 멀쩡해 보임curl -o /dev/null -s -w "%{http_code}\n" http://192.168.0.240:8181/ # 200
curl -o /dev/null -s -w "%{http_code}\n" http://192.168.0.240:8181/api/ # 502
프론트엔드(openresty)는 정적 파일을 계속 서비스하지만 Node 백엔드가 죽어 있었다.
컨테이너가 Up 인 건 s6가 컨테이너 자체는 유지하기 때문.
로그:
Startup Error: connect ECONNREFUSED 172.19.0.2:3306
NPM 백엔드가 DB 주소를 IP로 고정해 두었는데, DB 컨테이너가 재시작되면서
IP가 바뀌어 연결하지 못했다. 백엔드는 재시도를 포기하고 그대로 죽어 있었고,
이미 생성된 프록시 설정 파일은 nginx가 계속 서비스했다.
DB_MYSQL_HOST: nginx-proxy-manager-db # IP → 컨테이너 이름
sudo docker restart nginx-proxy-manager-db
# "ready for connections" 확인 후
sudo docker restart nginx-proxy-manager
① 감시가 얕으면 장애를 못 잡는다
Uptime Kuma가 / 만 보고 있어서 200이 나왔다. 백엔드가 죽은 /api/ 는 확인하지 않았다.
http://192.168.0.240:8181/api/ ← 이걸로 변경
포트가 열려 있는가가 아니라 그 서비스가 실제로 일하고 있는가를 보는 URL로 잡을 것.
같은 이유로 Vaultwarden은 /alive, Jellyfin은 /health 를 쓴다.
② 컨테이너 간 주소는 이름으로
IP는 재시작마다 바뀔 수 있다. 같은 스택에 두면 도커가 DNS를 제공한다.
③ 자원 이력이 없어 원인 추정이 어려웠다
"새벽 4시에 메모리가 부족했나"를 확인할 방법이 없었다. → Beszel 도입.
별도 정리 → 시놀로지 도커 함정
요약:
DSM과 Nginx Proxy Manager 타일에만 수치가 표시되지 않음.
services.yaml 에서 widget: 하위 항목들이 같은 들여쓰기 레벨에 있었다.
- DSM:
widget:
type: diskstation # ❌ widget의 자식이 아니라 형제
url: ...
한 단계 들여쓰기.
- DSM:
widget:
type: diskstation # ✅
url: ...
들여쓰기를 고치자 Authentication failed. 2FA enabled. 오류가 발생.
Synology DSM 위젯은 2단계 인증을 통과하지 못한다.
위젯을 쓰려면 2FA 없는 관리자 계정이 필요한데,
DSM 관리 포트가 외부에 열려 있는 상태에서 그런 계정을 만드는 건 위험하다고 판단.
CPU·메모리는 Beszel, 디스크는 Scrutiny가 더 자세히 보여주므로 위젯을 제거하고
링크와 상태 표시등만 남겼다.