노트북을 들고 나가도 배포되게 — 두 대 운영의 CD 구멍, 그리고 아이콘 정비

10-05부터 운영은 두 대다. DB·Redis·추천 모델 서버는 상시 켜 둔 집 서버에 하나만 두고, GPU가 좋은 노트북은 집에 있으면 우선 서빙, 꺼지면 집 서버가 약 30초 안에 넘겨받는다. 오늘은 노트북을 집 밖으로 들고 나간 날 처음 드러난 구멍을 메웠다.

1. 노트북이 집 밖이면 GPU도 끊겼다 → Tailscale

  내용
상황 노트북을 다른 Wi-Fi에 붙이자 서빙에서 빠지는 건 설계대로였지만, 집 서버에 빌려주던 노트북 GPU까지 끊겨 채팅이 CPU로 느려졌다
원인 앱 서빙 연결과 GPU 터널이 둘 다 집 서버의 내부 IP로 SSH 했다 — 같은 공유기에서만 닿는다
해결 두 기기에 Tailscale(개인 무료)을 깔고 GPU 터널만 Tailscale IP로 옮겼다. 앱 서빙은 일부러 내부 IP로 남겼다 — 집 밖에서 노트북이 서빙하면 DB 쿼리가 매번 인터넷을 건너기 때문이다
결과 집 서버가 서빙하는 동안에도 홈 AI 채팅이 노트북 GPU의 7.8B 모델로 200·8.8초

2. 집 밖에서 머지하면 배포가 실패했다

  내용
상황 노트북이 집 밖일 때 PR을 머지하자 배포가 10분 타임아웃으로 실패했고, 실제로 서빙 중인 집 서버에는 새 버전이 가지 않았다
원인 배포 러너는 노트북 하나다. 1단계가 노트북 k3s 롤아웃인데, 새 파드가 집 서버 DB(내부 IP 경유)를 영원히 기다린다 → 잡 실패 → 2단계 “집 서버 동기화”가 실행되지 않았다. 동기화 스크립트의 기본 주소도 내부 IP였다
해결 배포 전에 집 서버 DB에 닿는지 먼저 본다. 안 닿으면 노트북은 빌드·적재·재시작 요청만 하고 기다리지 않는다(집에 돌아오면 새 버전으로 뜬다). 동기화는 Tailscale IP로 간다
검증 머지 전에 브랜치 그대로 workflow_dispatch로 운영 배포를 돌려 1분 29초 성공, 집 서버 이미지가 노트북 빌드와 일치하는 것까지 확인한 뒤 머지했다. 머지 후 자동 배포도 1분 22초 성공

교훈: Tailscale을 도입할 때 “GPU 터널”만 보고 같은 내부 IP를 쓰는 다른 경로(배포) 를 안 봤다. 주소 하나를 바꿀 때는 그 주소를 쓰는 곳을 전부 찾아야 한다.

3. 아이콘 정비

브라우저 탭과 홈 타일이 v0 기본 로고·사진이라 앱마다 전용 아이콘을 만들었다. 시안은 Gemini로 받고, 고른 시안을 SVG로 다시 그렸다(파비콘은 벡터가 선명하다).

  • Suvisdev: 코드 꺾쇠 ‹ › + 가운데 AI 반짝임. 헤더 이름 옆과 로그인 메뉴(구글 프로필처럼)에도 넣었다.
  • Mova: 말풍선 안에 재생 버튼. Gildle: 발자국 큰 패드를 S자 길이 가르는 모양 — 앱 런처 아이콘도 같은 모양으로 바꿔 1.0.5 번들을 만들었다.
  • 홈 배경은 회색 단색에서 얇은 선 격자로(가운데만 보이고 가장자리로 사라짐). 처음엔 흰 바탕이었는데 흰 상단바와 구분이 안 돼 아주 옅은 회색으로 내렸다.

실수 두 가지:

  • app/mova/icon.svg 파일 규칙으로 넣었는데 탭 아이콘이 안 바뀌었다. 루트 레이아웃이 metadata.icons를 직접 지정하면 하위 파일 규칙이 그걸 덮지 못한다 → 하위 레이아웃 metadata.icons로 지정해 해결.
  • 시안을 작게 보고 눈대중으로 그렸다가 구조가 다르다는 지적을 받았다 → 원본을 잘라 확대하고, 원본과 내 SVG를 나란히 렌더해 비교하는 방식으로 바꿨다.