안녕하세요, 23기 "24시간 AI 서버 스터디" 스터디장 온어닷입니다.
지난 글(미니PC 이사기) 말미에 예고를 하나 남겼었습니다
— "미니PC에 Cloudflare Tunnel + Caddy를 얹어 제 도메인으로 서비스를 공개하는 것, 잘 되면 다음 글로 이어가겠습니다." 그 다음 글입니다.
72시간 관찰 기간이 무사히 끝났고, 어제 하루 동안 미니PC의 문을 세상을 향해 열었습니다.
이번 주 3주차에 여러분이 만나는 Tailscale이 "나만 접속할 수 있는 통로"라면,
이번 글은 그 한 단계 다음 — "세상 누구나 접속하는 주소"를 집 미니PC에 붙이는 이야기입니다. 그리고 이 문을 열고 나니 예상 못 한 보너스가 하나 생겼는데, 강의 때마다 쓰던 bitly를 은퇴시키게 됐습니다. 여전히 저는 코드를 못 쓰는 비개발자이고, 이번에도 명령어는 거의 치지 않았습니다.
---
1. 배경 — 서버가 살아남았으니, 이제 일을 시켜야죠
이사 직후의 미니PC는 "잘 돌아가는 것"이 목표였습니다.
관찰 72시간이 끝나자 다음 질문이 자연스럽게 나왔습니다
— "이 서버, 나 말고 다른 사람에게도 보여줄 수 있지 않을까?"
마침 묵혀둔 숙제가 셋 있었습니다.
- 제 지식 DB에 질문하는 페이지가 있는데, 이관 이후 접속 통로가 없어 놀고 있었습니다
- 강의를 할 때마다 강의안 사이트를 매번 Vercel에 새로 배포하고 있었습니다 (프로젝트가 수십 개까지 불어남)
- 그동안 만든 서비스가 몇 개인지 저도 헷갈려서, 한눈에 보는 대시보드가 필요했습니다
셋 다 "집 서버를 인터넷에 공개할 수 있으면" 풀리는 문제였습니다.
다만 조건이 있었습니다 —
포트포워딩 없이, 집 IP 노출 없이.
2. 구조 — 문은 하나만 뚫고, 안내는 경비실이
쓴 도구는 두 개입니다. 둘 다 무료입니다.
- Cloudflare Tunnel —
집에서 클라우드플레어 쪽으로 바깥 방향 전화선을 하나 걸어두는 방식입니다.
외부 방문자는 클라우드플레어까지만 오고, 거기서 이 전화선을 타고 집으로 들어옵니다.
우리 집 주소(IP)는 아무에게도 안 알려주고, 방화벽에 구멍(포트포워딩)도 안 뚫습니다.
사실 이 터널은 이사 전부터 포트폴리오 사이트용으로 하나 있었고, 이번엔 있는 터널에 새 주소만 얹은 겁니다.
- Caddy —
터널을 타고 들어온 방문자를 "어느 방으로 안내할지" 정하는 경비실(리버스 프록시)입니다.
도커 컨테이너 하나, 설정 파일 하나가 전부입니다.
이렇게 열린 주소들:
| 주소 │ 하는 일 │ 비고 │
| ask.○○ │ 제 지식 DB(문서 5,700여 건)에 질문하는 페이지 │ 토큰 입력해야 답변 │
| lec.○○ │ 강의안 사이트 정적 호스팅 │ Vercel 반복 배포 대체 │
| dash.○○ │ 내 서비스 50개 목록 대시보드 │ 비밀번호 벽(Basic Auth) │
| dami.ai.kr │ 축약링크 (bitly 대체) │ 이 글의 주인공 │
여기서 2주차 Docker 연결 포인트 하나.
Caddy 설정 파일은 컨테이너에 바인드 마운트로 물려 있는데,
이런 파일은 "새 파일로 교체"하면 마운트가 조용히 끊어집니다(파일의 주민번호 격인 inode가 바뀌기 때문).
그래서 모든 수정은 같은 파일에 내용만 덮어쓰는 방식으로 했고, 적용은 재시작이 아니라 caddy reload — 서비스가 1초도 안 끊기고 설정이 바뀝니다. 비밀번호를 바꿀 때도, 링크를 추가할 때도요.
3. 도메인 사냥 — "남은 짧은 도메인이 없어요"
축약링크를 하려니 도메인이 문제였습니다.
lec.제도메인.com/강의폴더/ 는 수강생이 받아 적기엔 너무 깁니다.
그래서 짧은 도메인 사냥이 시작됐는데, 여기서 배운 게 많았습니다.
시도 1 — 후보 스윕.
Claude에게 짧은 후보들을 도메인 등록 조회(RDAP)로 일괄 확인시켰습니다. 예상대로 좋은 건 다 임자가 있었습니다.
시도 2 — 함정 발견.
조회에서 "빈 도메인"으로 나온 후보 두 개가, 실제 등록 사이트에 가보니 이미 등록돼 있었습니다. 교훈: 자동 조회의 "없음"은 참고용일 뿐, 최종 확인은 실제 등록기관에서. (지난 글의 "AI 산출물은 재검증" 원칙이 도메인 조회에도 그대로 적용되더군요.)
시도 3 — 관점 전환.
"남은 것 중에 고르기"를 포기하고, Claude에게 제 강의 스타일·포트폴리오·아이덴티티를 주고 저에게 맞는 도메인을 역으로 추천하게 했습니다. 그렇게 나온 것이 — dami.ai.kr.
처음엔 의심했습니다. "ai.kr? 이거 사설 업체가 도메인 쪼개 파는 거 아냐?" 그래서 사기 전에 검증부터 시켰습니다.
결과: ai.kr은 KISA(한국인터넷진흥원)가 운영하는 공식 국가도메인입니다.
2024년 12월에 신설돼 2025년 3월부터 일반 등록이 열린, co.kr급 정식 체계였습니다. 국제 표준 목록(Public Suffix List)에도 올라 있어서 클라우드플레어가 독립 도메인으로 무료 등록을 받아줍니다. 확인 끝, 바로 구입했습니다.
이름에 제 이름(다미)과 하는 일(AI)과 나라(kr)가 다 들어가는, 사냥해서는 절대 못 찾았을 도메인입니다. "남은 것 중 최선"이 아니라 "나를 설명하는 것"을 찾는 게 답이었습니다.
4. 사고 아닌 사고 — "보안 연결할 수 없음"
도메인을 연결하고 접속하니 브라우저가 말했습니다. "이 사이트는 보안 연결(HTTPS)을 제공할 수 없습니다."
예전 같으면 여기서 설정을 이것저것 바꿔보며 허둥댔을 겁니다.
이번엔 규칙대로 했습니다 — 아무것도 고치지 않고 진단만. Claude가 층별로 확인했습니다: 도메인 주소 조회는 되나? → 됨. 암호화 안 된 접속(HTTP)은 되나? → 됨. 그럼 남는 용의자는 하나 — HTTPS 인증서가 아직 발급 중. 새 도메인을 등록하면 클라우드플레어가 인증서를 만들어주는데, 이게 몇 분 걸립니다.
30초 간격으로 자동 재확인을 걸어두고 기다렸더 니, 약 90초 뒤 저절로 해결. 손댄 것 0건.
"방금 만든 것의 에러"는 고장이 아니라 '아직'일 때가 많다.
▎ 새 도메인, 새 배포, 새 인증서 직후의 에러는 먼저 "몇 분 기다리면 풀리는 종류인가"부터 의심하세요. 성급한 수정은 멀쩡한 설정을 망가뜨리는 지름길입니다.
5. 운영 장치 — 만들었으면 감시를 붙인다
지난 이사 글에서 "자동화를 만들 때마다 목록으로 기록하는 습관"을 말씀드렸는데, 이번엔 그 다음 단계입니다. 새 문을 열었으면, 그 문이 살아있는지 확인하는 장치까지가 한 세트.
- 매시간 공개 주소 4개를 실제로 두드려보는 감시 프로브를 붙였습니다. 재밌는 건 판정 기준인데 — 질문 페이지는 "200(정상)이면 OK", 비밀번호 벽 대시보드는 "401(거부)이어야 OK"입니다. 문전박대가 정상인 문도 있는 거죠. 만약 대시보드가 비밀번호 없이 200을 돌려주면 그게 바로 사고(벽 붕괴)입니다.
- 프로브에는 자가무장 장치를 넣었습니다. 아직 등록 안 된 주소는 실패해도 알림을 안 보내다가, 첫 성공을 본 순간부터 실패를 진짜 장애로 취급합니다. 새 서비스 붙일 때마다 "아직 안 만든 것" 오탐에 시달리지 않기 위해서요.
- 설정 파일과 링크 목록은 매일 밤 자동 백업에 편입시켰습니다. 링크가 늘어날수록 그 목록 자체가 자산이니까요.
6. 그래서, 강의 루틴이 이렇게 바뀌었습니다
마지막 조각은 이걸 반복 가능한 루틴으로 만드는 것이었습니다. 지금 제 강의 배포는 이렇게 끝납니다.
shorten ai1 https://lec.○○/강의폴더/ --qr
한 줄이면 —
① dami.ai.kr/땡떙땡 축약링크가 등록되고(무중단)
② 슬라이드에 넣을 QR 코드 PNG까지 생성됩니다.
수강생에게는 "다미 점 에이아이 점 케이알, 슬래시 에이아이일"이라고 불러주면 끝.
bitly 열어서 로그인하고 링크 만들던 루틴이 통째로 사라졌습니다.
그리고 이 전체 흐름(강의안 폴더 업로드 → 배포 확인 → 축약링크 → QR)을 Claude Code의 스킬(재사용 절차서)로 묶어뒀습니다. 다음 강의부터는 "이번 강의안 배포해줘" 한마디면 됩니다. 한 번 겪은 절차는 두 번째부터 자동화 대상 — 이 습관이 봇 11마리를 만든 그 습관입니다.
7. 배운 점 요약 — 재사용 가능한 체크리스트
1. 터널 방식 공개 — 포트포워딩 없이, 집 IP 노출 없이. 집 서버 공개는 "구멍 뚫기"가 아니라 "바깥으로 전화 걸기"로
2. 자동 조회의 "없음"을 믿지 말 것 — 도메인이든 뭐든, 최종 확인은 원본 소스(등록기관)에서
3. 도메인은 사냥 말고 설계 — "남은 것 중 최선"보다 "나를 설명하는 이름"을 역으로 추천받기
4. 사기 전 정체 검증 — ai.kr이 공식인지 확인하고 결제 (사설 재판매 도메인 함정 회피)
5. 방금 만든 것의 에러는 '아직'을 먼저 의심 — 인증서·배포·전파는 시간이 풀어주는 문제가 많다
6. 문전박대도 감시 대상 — 비밀번호 벽은 "거부(401)가 정상"으로 프로브. 200이 뜨면 그게 장애
7. 감시 장치엔 자가무장 — 첫 성공 전 실패는 침묵, 첫 성공 후 실패만 경보 (신규 서비스 오탐 방지)
8. 바인드 마운트 파일은 교체 금지 — 내용만 덮어쓰기 + 무중단 reload (2주차 Docker 심화 팁)
9. 반복될 절차는 즉시 스킬화 — 두 번째부터는 한마디로
8. 스터디장으로서 한마디 — 스터디 지도에서 지금 위치
이번에도 제가 한 일은 갈림길에서 고르기(공개 범위, 도메인, 비밀번호), 폰에서 링크가 열리는지 확인하기, "진행해줘"뿐이었습니다. 도메인 검증도, 인증서 진단도, 감시 프로브도 AI가 만들고 저는 "제대로 됐는지 확인하는 사람" 역할이었습니다.
스터디 지도에 놓아보면:
- 1주차 (완료) — 바이브코딩으로 서버 만들기 → 공개할 "알맹이"
- 2주차 (완료) — Docker → 이번 글의 Caddy·터널이 전부 이 형태로 돌아갑니다
- 3주차 (이번 주) — 로컬 LLM + Tailscale → "나만 접속"의 통로. 오늘 글은 그 다음 단계인 "세상에 공개"의 예고편이기도 합니다
- 4주차 — 데모데이. 여러분의 봇이 "내 폰에서만" 되는 것과 "주소만 알면 누구나" 되는 것의 차이를 그때 보여드릴 수 있을 겁니다
데모데이 때 자기 결과물에 자기이름.ai.kr 같은 간판을 달아보고 싶은 분 — 도메인 등록부터 터널 연결까지, 세션에서 물어봐주세요. 제가 어 제 밟은 길이라 지도가 따끈합니다.
스터디 소개(4주 빌드 청사진·도구 스택·준비물): https://homelab-ai-agent-study.vercel.app/