지금 제 미니PC는 포트 하나 열지 않고 서비스 10여 개를 인터넷에 내보내고 있습니다. 그리고 지난 2주 동안, 이 서버는 세 번 조용히 죽었습니다 — 감시등은 내내 초록불이었는데요.
안녕하세요, 23기 "24시간 AI 서버 스터디" 스터디장 온어닷 입니다.
2주차에 올렸던 이사 이야기의 후편이자, 4주차 데모데이를 맞은 마지막 글입니다.
수강생이 아닌 분께는 "비개발자가 집 서버를 인터넷에 공개하고도 살아남는 법"에 대한 답으로 읽어주시면 됩니다. 저는 여전히 코드를 못 쓰는 비개발자이고, 이번에도 — 한 달 통산으로도 — 명령어는 0줄입니다.
1. 관찰 72시간 — 합격은 했는데, 만점은 아니었다
"이관 직후 72시간은 고치지 않고 진단만 한다"는 규율을 적용했었습니다. 그 3일 사이 실제로 하나가 걸렸습니다. 지식관리 DB의 색인 작업(문서를 검색 가능한 형태로 바꾸는 매시간 작업)이 매시간 실패하고 있었던 겁니다.
원인은 허무했습니다.
이사 때 코드는 옮겼는데, 그 코드가 쓰는 부품 상자(의존성 패키지)를 안 옮긴 것.
책상은 왔는데 의자가 안 온 이사였달까요. 부품 설치 한 번, 밀린 3일치 작업 소화 한 번으로 끝났고, 관찰 72시간은 공식 통과됐습니다.
덤도 하나 있었습니다. 글엔 안 썼지만 데스크탑(WSL2) 시절 속을 썩이던 증상이 있었는데 — 예약 작업이 시계가 어긋나서 조용히 건너뛰는 문제였습니다. 진짜 리눅스로 옮기자 그게 그냥 사라졌습니다. 고친 게 아니라, 사라진 겁니다.
이사하고나서 얻은 첫 성과였습니다.
2. 사고 1 — 워치독은 초록불인데, 안에선 3일간 죽어 있었다
관찰 기간이 끝난 8월 1일 밤, 작은 위화감이 있었습니다.
봇 하나가 "메모리 백업 실패"라고 중얼거렸고, 아침 브리핑(봇이 매일 아침 보내주는 요약 보고)에서 늘 오던 섹션 하나가 사라져 있었습니다. 큰 고장은 아닌 것 같은데 어딘가 찜찜해서, Claude에게 에이전트 3개를 병렬로 풀어 전수 감사를 시켰습니 다. "이관 이후 뭔가 조용히 죽은 게 있는지 전부 뒤져봐."
결과는 8건. 그중 제일 큰 건은 이랬습니다 — 이사 때 파일을 복사하면서 소유권(어느 계정이 파일 주인인지)이 미묘하게 바뀌어, 봇들이 자기 작업 기록을 남기는 폴더에 글을 못 쓰게 된 것. 그래서 봇들의 세션 기록과 지식 수집이 3일간 전멸해 있었습니다.
무서운 건 이겁니다. 그 3일 동안 워치독(서비스가 살아 있는지 지키는 감시 프로그램)은 계속 초록불이었습니다. 워치독은 "프로세스가 살아 있는가"를 보는데, 봇들은 살아 있긴 했거든요. 살아서, 쓰기에 실패하고 있었을 뿐.
죽은 것은 워치독이 잡는다. 살아서 실패하는 것은 아무도 모른다.
8건은 당일 전부 수리됐습니다. 그날 밤 "백업 완료 972개"라는 메시지가 왔을 때 — 이사 이후 첫 성공이었습니다 — 솔직히 좀 허탈하게 웃었습니다. 성공 선언까지 해놓고 이제야 진짜 성공이라니.
3. 사고 2 — 재발 방지 장치를 만들었더니, 그 장치가 사고를 숨겼다
전수 감사에서 근본 원인 하나가 드러났습니다.
이 볼트(지식 저장소)에 글을 쓰는 주체가 넷이었습니다. 제 계정, 봇 컨테이너, 비서 봇, 동기화 프로그램.
넷이 한 폴더에 사이좋게 쓰려면 보이지 않는 권한 약속이 필요한데, 그 약속은 어느 문서에도 적혀 있지 않았습니다. 문서에 없으니 이사 체크리스트에 오를 수도 없었고, 이사가 그 약속을 깨뜨린 겁니다.
그래서 Claude와 두 가지를 만들었습니다. ① 누가 어디에 쓰는지를 못 박은 계약 문서, ② 매시간 실제로 써보고 확인하는 감시 장치(쓰기 프로브). 이제 같은 사고는 안 나겠지, 했습니다.
다음 날, 그 감시 장치의 맹점이 드러났습니다. 비서 봇의 세션 저장이 이사 이후 계속 실패하고 있었는데, 새 감시 장치는 태연히 초록불이었습니다. 왜냐 — 프로브는 기존 파일에 덮어쓰기를 해보는 방식이었는데, 실제로 고장 난 것은 새 파일 만들기였거든요. 시험 문제가 실제 시험 범위와 달랐던 겁니다. 프로브를 "지우고 새로 만들기" 방식으로 전부 교체했습니다.
감시 장치는 실제 실패와 똑같은 동작을 해야 한다. "비슷한" 동작을 검사하는 감시는 초록불로 사고를 덮는다.
4. 포트 하나 안 열고, 세상에 공개
사고 수습과 병행해서, 공개 작업이 진행됐습니다. 구조는 이렇습니다.
공유기에 구멍 하나 뚫지 않고, 집 주소 한 번 노출하지 않고, 서비스 10여 개가 세상에 공개됐다.
개통 첫날의 일화 하나. 새 주소를 열자마자 접속이 안 되길래 고장인 줄 알고 원인 추적을 시작하려는데 — 90초 뒤에 저절로 해결됐습니다. 인증서(자물쇠) 발급 대기 시간이었던 거죠. 아무것도 안 고치는 게 정답인 장애도 있더군요. 장애 대응의 첫 질문을 하나 배웠습니다: "이것은 고장인가, 기다림인가?"
5. "무료 한도 100%" 메일은 청구서가 아니라 초대장이었다
8월 3일, 클라우드 업체에서 메일이 왔습니다. "무료 한도 100% 사용."
포트폴리오 사이트의 이미지 저장소가 무료 요금제의 벽에 부딪힌 겁니다. 예전 같으면 유료 전환 버튼을 눌렀을 겁니다. 그런데 이번엔 메일을 읽다가 다른 생각이 먼저 들었습니다 — 잠깐, 나 집에 서버 있잖아?
하루 만에 저장소를 미니PC의 데이터베이스로 옮기고, 방금 만든 터널로 사이트와 연결했습니다. 클라우드 저장소는 해지. 이사 비용의 본전이 처음으로 회수된 날이었고, 이때부터 미니PC 위의 서비스가 불어나기 시작했습니다.
6. 지금 그 미니PC 위에서 돌아가는 것들
여기까지가 사고 이야기였다면, 지금부터는 사고를 견딘 시스템이 뭘 하고 있는지입니다. 데모데이니까, 저도 결과물을 시연 목록으로 보여드리겠습니다. 현재 컨테이너 22개, 서비스 묶음 6개가 돌아가고 있습니다. (아래 "스터디 연결" 열은 우리 23기 커리큘럼 기준입니다.)
서비스
하는 일
스터디 연결
강의 전사 서버
강의 녹음을 올리면 GPU가 받아쓰기 + 누가 말했는지 구분. 실시간 전사도 됨
3주차 "내 컴퓨터로 AI 모델 돌리기"의 확장판
강의안 배포 레인
1주차식으로 만든 강의 사이트를 세상에 내보내는 파이프라인 — 호스팅 + 축약링크 + QR까지 한 번에
1주차 제작 + 이 글 4절 공개 구조의 결합
에이전트 허브
텔레그램 봇 관문·작업 실행기·지식 검색(RAG — 내 문서를 찾아 근거로 답하는 방식) 등 10개 컨테이너
2주차 Agent SDK의 풀 버전
지식 Q&A
제 지식 DB에 웹으로 질문하면 출처를 달아 답변
〃
개인 앱 두 개
상담 챗봇, 설명 연습 도구 — 민감한 것이라 이중 잠금
4주차 여러분의 데모와 같은 층
특기 사항 세 가지만 꼽으면:
① GPU가 생겼습니다. 이사 당시 미니PC의 그래픽카드는 화면 출력용 골동품이었는데, 중고 RTX 3060을 달았습니다. 이제 강의 녹음이 외부 서비스 비용 없이 집에서 텍스트 자산으로 바뀝니다. (미리 말씀드리면 이건 스터디 범위 밖의 선택 사항입니다 — GPU 없이도 3주차 내용은 전부 됩니다. 저도 필요가 생겨서야 달았고요.)
② 무인 운영 체계가 완성됐습니다. 위의 사고들이 남긴 유산입니다 — 매시간·매일 도는 감시 장치 8종(봇 건강, 쓰기 프로브, 배포 상태, 토큰 만료...)이 이상을 발견하면 텔레그램으로 알리고, 백업은 매일·매주 자동, 지식 저장소는 15분마다 클라우드와 동기화됩니다. 사고 한 번당 장치 하나. 사고는 수업료였고, 장치가 영수증입니다.
③ 그런데도 한가합니다. 컨테이너 22개를 돌리면서 메모리는 30GB 중 4GB, 부하는 사실상 유휴 수준. 이런 봇들은 생각보다 가볍습니다.
7. 마지막 사고, 그리고 이사의 장례식
완결편답게 사고도 마무리 세트로 왔습니다.
8월 11일 — 이사 날 "일단 꺼두자" 하고 잠시 꺼두기 표시를 해둔 동기화 예약 작업이 2주간 그대로 잊혀 있던 것을 발견했습니다. 그 사이 세션 기록 39개가 지식 시스템에 전달되지 않고 있었는데, 경보는 한 번도 안 울렸습니다. 죽은 프로세스는 워치독이 잡지만, 애초에 돌지 않는 예약 작업은 침묵합니다. 그래서 마지막 감시 장치를 만들었습니다 — 프로세스가 아니라 "데이터가 신선한가"를 매시간 확인하는 신선도 감시. 어제 들어온 기록이 오늘 검색되는지를 보는 겁니다.
돌아보면 사고 세 번이 한 계단씩이었습니다. 살아 있는가(상태) → 진짜 그 동작을 하는가(동작) → 어제 것이 오늘 도착했는가(신선도). 감시가 이 사다리를 한 칸씩 올라간 거죠. 1편 체크리스트 7번에 "만료형 토큰은 조용한 실패 예약"이라고 적었었는데 — 그 "조용한 실패"가 예약대로, 세 번 왔습니다.
8월 13일 — 옛집 정리를 했습니다. 데스크탑에 남은 예약 작업·상주 프로그램·외부 연결을 전수 조사했더니, 이미 죽은 서비스 하나가 인터넷에 공개된 채 방치되어 있었습니다(예전에 열어둔 외부 공개 통로가 살아 있었던 것). 문을 닫고, 잔존 컨테이너 15개와 부속을 백업 검증 후 정리했습니다.
이사는 새집 입주로 끝나지 않는다. 옛집의 열린 문을 잠가야 끝난다.
7월 29일에 시작한 이사가, 보름 만에 진짜로 끝났습니다.
8. 배운 점 요약 — 2편의 체크리스트
1편의 체크리스트가 "이사를 잘하는 법"이었다면, 이번 것은 "이사 뒤에 살아남는 법"입니다. 별표(★)는 봇 1마리 단계에서도 당장 쓸 수 있는 것.
성공 선언 후 전수 감사 1회 ★ — 워치독이 초록불이어도, 이관 며칠 뒤 "조용히 죽은 것"을 한 번은 전부 뒤져라
암묵 계약은 이사를 못 넘는다 — 여러 주체가 한 자원을 쓰는 약속은 문서로 못 박고, 실제 동작으로 검사하라
감시는 실패와 같은 동작으로 — 덮어쓰기가 아니라 새로 만들기가 고장 났다면, 감시도 새로 만들기를 해봐야 한다
상태 감시에서 신선도 감시로 — "살아 있는가"가 아니라 "어제 것이 오늘 도착했는가"를 보라
"일단 꺼둔 것" 목록 ★ — 이관 중 임시로 끈 것은 반드시 복구 기한과 함께 적어두라 (안 그러면 2주간 침묵)
고장인가, 기다림인가 ★ — 새 주소·새 인증서는 90초를 기다려보고 나서 고쳐라
클라우드 한도 메일은 초대장 — 홈서버가 있다면, 무료 한도의 벽은 회수의 기회가 된다 (엄밀히는 "살아남는 법"이 아니라 "본전 뽑는 법"입니다만, 같이 적어둡니다)
옛집의 문 잠그기 — 구 서버의 공개 통로·예약 작업·상주 프로그램 정리까지가 이관이다
봇 1마리인 지금 단계라면 이 여덟 개를 다 만들 필요는 없습니다. 5번 메모 하나와 텔레그램 알림 하나면 충분히 시작입니다. 나머지는 사고가 나면 — 납니다 — 그때 하나씩 늘리시면 됩니다. 저도 그랬습니다.
9. 4주가 지났습니다 — 그리고 여전히, 명령어 0줄
1주차 — 바이브코딩으로 첫 API 서버. 제 컨테이너 22개(봇 11마리)의 출발점도 정확히 그것이었습니다
2주차 — Docker와 Agent SDK. 그 덕에 제 서버는 "이사 갈 수 있는 짐"이 됐고, 실제로 45분 만에 이사했습니다
3주차 — 로컬 모델과 Tailscale. 제가 폰에서 서 버를 만지고, GPU로 전사를 돌리는 그 통로입니다
4주차 — 오늘. 여러분의 데모와 제 결산이 만나는 날입니다
솔직한 고백으로 마무리하겠습니다. 이 서버에도 아직 안 한 숙제가 있습니다. 미니PC 자체를 재부팅해보는 리허설(전기가 나갔다 들어오면 스스로 일어나는지), 로그가 디스크를 채우지 않게 하는 설정 같은 것들. 압니다. 위에서 그렇게 당하고도 남는 게 숙제입니다. 서버 운영은 완성이 아니라 다음 사고 전에 하나 더 고쳐두는 일의 반복인 것 같습니다.
.
4주간 함께해주셔서 감사했습니다.
이 4주 과정이 궁금하신 분께 : https://homelab-ai-agent-study.vercel.app/