자동화

서버가 20개를 넘으면 뭐가 떠 있는지 모른다 — 자동으로 찾아내는 사이트맵

systemd 유닛을 스캔해 실행 중인 서비스를 자동 발견하고 포트까지 추론하는 대시보드를 만들었다. 목록을 손으로 관리하지 않기로 한 이유.

개인 프로젝트 서버가 스무 개를 넘어가면서 새로운 문제가 생겼다. 지금 뭐가 떠 있는지 모른다.

주소를 기억 못 해서 .env를 열어보고, 포트를 찾고, 브라우저에 친다. 어떤 건 죽어 있는데 몇 주째 모르고 있었다.

처음엔 링크 목록을 하나 만들었다. 두 달 만에 절반이 틀렸다. 서비스를 추가하고 목록에 안 넣거나, 포트를 바꾸고 안 고치거나.

손으로 관리하는 목록은 반드시 낡는다. 그래서 자동으로 찾아내게 만들었다.

systemd 에서 서비스를 발견한다

핵심은 목록을 만들지 않는 것이다. 대신 실제로 등록돼 돌고 있는 것을 읽는다.

systemctl --user 의 enabled 유닛을 스캔해서, 그중 프로젝트 디렉토리 아래에 있는 것만 추린다. 서비스가 추가되거나 삭제되면 코드를 고치지 않아도 반영된다.

이 방식의 장점은 진실의 출처가 하나라는 것이다. 목록과 실제가 어긋날 수 없다. 목록이 곧 실제이기 때문이다.

포트는 추론해야 했다

여기서 어려운 부분이 나왔다. 서비스는 찾았는데 주소를 모른다.

각 프로젝트가 포트를 저장하는 방식이 제각각이었다. .env를 쓰는 건 같은데 키 이름이 다르다.

PORT
APP_PORT
DASHBOARD_PORT
HRR_PORT
IMAGE_SERVER_HTTP_PORT

프로젝트를 만들 때마다 그때그때 이름을 붙인 결과다. 지금 와서 전부 통일하는 건 각 프로젝트를 다 손봐야 하는 일이라, 대신 읽는 쪽에서 여러 키를 받아들이게 했다.

.env에서 못 찾으면 run.sh의 기본값에서 찾는다. 그것도 없으면 포트 미상으로 표시한다.

이건 타협이다. 이상적으로는 규약을 하나로 정하는 게 맞다. 그런데 이미 돌고 있는 스무 개를 멈추고 고치는 비용과 읽는 쪽에서 흡수하는 비용을 비교하면 후자가 쌌다.

“떠 있음”과 “응답함”은 다르다

상태 표시에서 배운 게 있다.

처음엔 systemctl --user is-active 결과만 봤다. 그런데 이게 active인데도 실제로는 응답하지 않는 경우가 있었다. 프로세스는 살아 있는데 내부에서 멈춰 있거나, 포트를 못 잡았거나, 크래시 루프를 도는 중이거나.

그래서 실제 포트에 TCP 프로브를 함께 한다. 두 신호가 다르면 그게 더 유용한 정보다. “프로세스는 있는데 응답이 없다”는 것 자체가 문제 신호다.

이걸 원격 서버까지 확장했다. 북마크에 등록된 다른 머신의 서비스도 TCP로 찔러본다. 로컬만 보면 전체 상황을 알 수 없기 때문이다.

다운된 것만 빠르게 보기

대시보드에서 가장 자주 쓰는 기능은 의외로 “응답없음 N개” 필터였다.

전체 목록을 훑는 건 가끔이다. 평소에는 “뭐 죽었나”만 확인한다. 그래서 헤더에 다운 개수를 띄우고, 누르면 다운된 것만 보이게 했다.

대시보드를 만들 때 “가장 자주 보는 화면”을 기본으로 두는 게 낫다. 전체 목록을 기본으로 두면 매번 필터를 걸게 된다.

여러 출처를 합칠 때 우선순위를 정한다

가상 데스크톱(VD)별로 서비스를 묶어 보는 기능이 있는데, 여기서 “어느 서비스가 어느 VD에 속하는가” 정보를 여러 곳에서 가져온다.

  • 작업 관리 도구가 내보내는 배치표
  • 브라우저 북마크의 폴더 이름
  • 수동 지정

이게 서로 다를 수 있다. 그래서 우선순위를 명시했다. 배치표가 있으면 그게 이기고, 없으면 북마크를 쓴다.

이유가 있다. 북마크로는 원리적으로 못 맞추는 게 있다. 포트를 열지 않는 데몬은 북마크에 등록될 수 없다. 반면 배치표는 디렉토리 기준이라 포트가 없어도 매칭된다.

여기에 더해 각 카드에 출처 표시를 붙였다. layout:dir, layout:name, bookmark:..., override 중 어디서 왔는지 보인다.

이게 디버깅에 크게 도움이 됐다. 배치가 이상할 때 “왜 여기 있지”를 바로 알 수 있다. 여러 출처를 합치는 시스템에서는 결과만 보여주면 안 된다. 어디서 왔는지도 보여줘야 한다.

PWA 로 만든 이유

휴대폰 홈 화면에 아이콘으로 두고 싶었다. 침대에서 “서버 살아 있나” 확인할 때 브라우저를 열고 주소를 치는 것보다 아이콘을 누르는 게 낫다.

manifest.webmanifest와 아이콘만 추가하면 되니 비용이 거의 없었다. 앱을 따로 만들 이유가 없는 종류의 도구다.

정리

  • 손으로 관리하는 서비스 목록은 반드시 낡는다. 실제로 등록된 것을 읽어야 한다
  • 설정 키 이름이 프로젝트마다 다르면, 전부 고치는 것보다 읽는 쪽에서 흡수하는 게 쌀 때가 있다
  • “프로세스가 살아 있음”과 “응답함”은 다르다. 둘 다 확인하고 차이를 보여준다
  • 가장 자주 보는 화면(다운된 것만)을 기본 동선에 둔다
  • 여러 출처를 합칠 때는 우선순위를 정하고, 결과에 출처를 함께 표시한다