운영 배포와 첫날 점검 — Web Deploy, NAT 루프백, 외부 노출 점검
InfraWatch를 개발 PC에서 Web Deploy 원격 배포로 운영 서버에 올리고, 첫 배포 때 부딪힌 문제를 정리했다. PowerShell 5.1의 인수 따옴표와 인코딩 함정, NAT 루프백, 화면 가로 넘침, 바깥에서 실제 요청으로 한 노출 점검과 쿠키 Secure 누락까지 다룬다.
애드소프트 기술블로그
애드소프트 박재호입니다. IIS·ASP.NET·Docker·메일서버를 직접 운영하며 겪은 문제와 해결 과정을 기록합니다.
InfraWatch를 개발 PC에서 Web Deploy 원격 배포로 운영 서버에 올리고, 첫 배포 때 부딪힌 문제를 정리했다. PowerShell 5.1의 인수 따옴표와 인코딩 함정, NAT 루프백, 화면 가로 넘침, 바깥에서 실제 요청으로 한 노출 점검과 쿠키 Secure 누락까지 다룬다.
처음엔 SSH로 메일 서버에서 postqueue를 원격 실행하려 했지만, SSH도 없고 Rspamd는 루프백에만 열린 다른 PC라 같은 워커를 에이전트 모드로 두고 웹 API로 통신하게 바꿨다. API 키 해시 인증, 10분 예약, 큐 지연 사유 묶기, 멀티테넌트 도메인 자동 등록까지 정리했다.
점검 결과를 메일 알림으로 바꾸는 규칙을 DB와 메일을 모르는 순수 함수로 분리하고 표 형태 테스트로 고정했다. 상태 전이 표, DedupeKey 설계, 만료 임계값 1회성, 복구 알림 조건, 1분 간격 재시도와 영구 오류 구분, 하루 1회 일일 요약까지 정리했다.
메일 서버 IP가 블랙리스트(RBL)에 올랐는지 DNS 조회로 매시간 확인하는 점검을 만들었다. 공용 DNS에서 Spamhaus가 차단 코드 대신 NXDOMAIN을 돌려줘 "미등재"로 오판하던 함정을 테스트 항목 127.0.0.2 검증으로 막고, 운영은 Spamhaus DQS 무료 키로 해결한 과정을 정리했다.
메일 도메인의 A·MX·SPF·DKIM·DMARC·PTR을 한 번에 점검하는 DNS 점검을 만들었다. SPF의 DNS 조회 10회 제한을 include를 따라가며 세는 방법, 하위 도메인 DMARC를 상위 도메인 정책으로 판정하는 규칙, 레코드가 바뀌었을 때만 알리는 변경 감지까지 정리했다.
도메인 만료일을 .kr은 KISA WHOIS 43번 포트로, 그 외는 IANA RDAP 부트스트랩으로 찾아 조회하게 했다. 호스트명에서 등록 도메인을 뽑는 규칙, 한글·영문이 섞인 WHOIS 응답 해석, 조회가 실패할 때의 수동 만료일, 일수 기준 판정과 테스트까지 정리했다.
TcpClient와 SslStream으로 직접 핸드셰이크를 해서 검증 오류가 있어도 인증서 정보를 끝까지 모으는 SSL 점검을 만들었다. 587·143·110처럼 평문으로 시작하는 메일 포트의 STARTTLS 업그레이드, StreamReader 함정, 판정 규칙과 인증서 갱신 감지까지 정리했다.
웹·메일 서버의 SSL 인증서, 도메인 만료, DNS, 메일 서버 상태를 주기적으로 점검하고 이상이 있으면 메일로 알려 주는 InfraWatch를 만들었다. 설계 문서로 점검 명세와 알림 규칙을 먼저 정하고, Phase 0~9를 거쳐 운영 배포까지 한 과정을 연재 첫 글로 정리했다.
창 없이 트레이에 상주하는 WPF 앱을 배포 가능한 상태로 마무리했다. Mutex와 이벤트로 만든 단일 인스턴스, 다시 시작 없이 바뀌는 단축키·테마·언어, 범위 외였던 영어 화면을 하루 안에 넣은 문구 표 구조, 155MB에서 70MB로 줄인 단일 exe와 그 대가까지 정리하며 연재를 마친다.
1차는 한 PC 전용이지만 2차 여러 PC 동기화를 대비해 Id는 GUID, 모든 엔티티에 UpdatedAt, 삭제는 소프트 삭제로 정했다. 이 결정이 JSON 가져오기의 충돌 처리(더 최신인 쪽 유지)로 바로 쓰인 과정과, 고정 GUID 샘플, VACUUM INTO 백업, EF Core에서 만난 함정을 정리했다.