개발 진행 현황

점검 기록

Vault 봉인과 호스트 디스크 부족 감지

문제

서비스의 readiness와 기대 target 소실은 슬롯을 기준으로 감지한다. 이 신호만으로 Vault의 봉인이나 호스트 디스크 부족을 구분할 수는 없다.

호스트 디스크는 VM마다 배포하는 node-agent의 node_exporter와 cowork-host 알림 규칙으로 감지한다. 수집 대상은 log-agent와 같은 방식으로 deploy/prod/slots/node-agent-<host>.json에서 derive하며(단일 출처), deploy/iac/prepare.py가 log-agent와 나란히 호스트마다 node-agent-<host> 유닛을 생성해 같은 Ansible 루프(unit.yml)로 적용한다 — 해당 slot이 있는 호스트만 대상이라 Vault·github-app은 자동으로 빠진다. 현재 slot은 11개 application 서비스(gateway 포함)와 공유 서비스(redis·kafka·livekit)·monitoring 호스트까지 총 16개가 있다. Vault 호스트는 전용 애플리케이션 슬롯이 없어 사설 IP를 커밋된 파일에서 끌어올 수 없으므로 아직 slot이 없다 — 실제 IP를 아는 사람이 node-agent-vault.json을 추가해야 한다. 그 전까지는 Vault VM의 디스크 부족이 coworkHostDiskSpaceLow/Critical로 잡히지 않는다. github-app VM은 별도 저장소 (cowork-github-app)가 소유하므로 이 node-agent 롤아웃 범위에서 제외한다.

9100 포트 인그레스는 deploy/prod/slots.py의 firewall()이 application 슬롯의 기존 포트와 같은 peers로 자동 허용하며, prepare.py가 호스트마다 설정하는 cowork_firewall_target을 통해 다음 IaC apply에 반영된다 — 단 gateway는 애초에 cowork_firewall_target이 설정되지 않는 호스트라 이 경로에 포함되지 않는다. config는 이 함수가 아니라 별도 경로(config-firewall.py render)로 방화벽을 렌더링하므로 firewall() 출력과 무관하며, 9100을 열려면 그 스크립트를 직접 고쳐야 한다. 공유 서비스(redis·kafka·livekit)·Vault처럼 슬롯이 없는 호스트는 slots.py가 관여하지 않는 별도 방화벽(deploy/iac/shared/firewall.py, Vault 자체 방화벽)을 쓰므로 마찬가지로 범위 밖이다. 공유 서비스 방화벽은 카탈로그에 선언한 포트만 다루므로 9100 도달 여부는 VM 기본 정책에 달려 있고 아직 확인하지 않았다. 즉 9100 인그레스가 실제로 열리는 곳은 gateway·config를 제외한 10개 application 호스트뿐이다. Vault seal 감지 경로도 아직 없다.

할 일

  • node-agent-vault.json에 실제 Vault VM 사설 IP를 채운다.
  • gateway·config·공유 서비스(redis·kafka·livekit)·Vault VM에 9100 인그레스를 각자의 방화벽 경로에 맞게 추가한다(gateway/config는 전용 스크립트, 공유 서비스는 deploy/iac/shared/firewall.py, Vault는 자체 방화벽).
  • Vault seal의 수집·알림 경로를 마련한다.
  • 현재 디스크 여유를 측정하고 필요한 정리는 릴리스 보존 작업과 함께 수행한다.

검증

  • Vault seal·디스크 부족이 정한 시간과 경로로 감지되는지 수동 확인한다.
  • 과거 장애 수치를 재사용하지 않고 실제 서비스·호스트의 관측값을 확인한다.

완료 조건

  • Vault seal과 호스트 디스크 부족을 구분하여 감지하고 알린다.