← 봇 셋업 가이드 목록으로
🚀
세상에 내보내기 · 배포

내 도메인 서브주소에
페이지 띄우기

봇이 만든 페이지를 something.내도메인으로 올리는 전체 순서. 한 번 해두면 다음부터는 봇이 혼자 해.

대상 정적 랜딩 · 폼 있는 원페이지
필요한 것 도메인 하나 · Vercel 계정
검증 2026.8 사관학교 랜딩 실제 배포
🐱

뽀야: 봇한테 "랜딩 하나 만들어줘" 하면 페이지는 나와. 문제는 그다음이야 — 나온 주소가 openclaw-workshop-landing-9f2k3.vercel.app 같은 암호문이라 누구한테 보낼 수가 없어. 오늘 하는 건 그 페이지를 내 도메인 주소로 갈아 끼우는 일이야. 그리고 이게 핵심인데, 한 번 제대로 깔아두면 두 번째부터는 봇이 혼자 한다. 사람이 손댈 일이 사라지는 지점이 어디인지까지 같이 볼게.

🤔 이걸 안 하면 무슨 일이 생기냐면

"도메인 연결"이라는 말 대신, 실제로 벌어지는 장면 셋이야.

장면 1 — 만든 페이지 주소를 사람들한테 보낼 수가 없다.
Vercel이 준 주소는 우리프로젝트-9f2k3-daht-mad-ais-projects.vercel.app 같은 모양이야. 카톡에 붙이면 스팸처럼 보이고, 명함에도 못 넣고, 다음에 배포하면 앞의 해시가 또 바뀌어.→ 내 도메인 서브주소를 별칭으로 붙이면 주소가 고정돼. 4장에서 해.
장면 2 — 나는 잘 열리는데, 남이 열면 로그인 화면이 뜬다.
링크를 뿌린 뒤에 "이거 왜 로그인하라는데요?" 하고 연락이 와. 나는 Vercel에 로그인된 브라우저로 봤으니 멀쩡했던 거야. 새로 만든 프로젝트는 기본이 비공개거든.→ 이걸 배포 보호라고 해. 2장에서 끈다.
장면 3 — 서브도메인을 하나 더 만들 때마다 사람이 불려 나온다.
도메인 산 곳(가비아 같은 데)에 로그인해서 CNAME을 손으로 넣어야 하면, 봇은 거기 계정이 없으니 매번 사람이 붙어야 해. 페이지 5개 만들면 5번 불려 나오는 거야.→ 네임서버를 Vercel로 한 번 옮겨두면 그 일이 통째로 사라져. 3장이 그 얘기야.

이 셋을 막는 게 오늘 할 일이야. 순서는 배포 → 공개 → (최초 1회) 네임서버 → 서브도메인 → 폼. 이 중 사람이 꼭 해야 하는 건 3장 딱 한 번이고, 나머지는 봇이 명령어로 한다.

1

등장인물 넷 — 뭐가 뭔지부터

"도메인 연결"이 헷갈리는 건 서로 다른 넷을 한 단어로 부르기 때문이다
왜 헷갈리냐면 — 도메인 하나를 띄우는 데 서로 다른 회사·서로 다른 화면 넷이 끼어들어. 어디서 뭘 고쳐야 하는지 몰라서 엉뚱한 화면을 붙들고 있게 되는 거야. 그래서 이름부터 갈라놓을게.

우체국으로 비유하면 이래.

핵심 한 줄: 네임서버를 Vercel로 한 번 옮겨두면, 이후 모든 서브도메인은 봇이 Vercel 명령어로 직접 만든다. 등기소(가비아)는 다시 안 건드려. 반대로 안 옮기면 서브도메인마다 사람이 로그인해서 CNAME을 손으로 넣어야 해 — 봇에는 그 계정이 없으니까.
2

페이지 만들고 Vercel에 올리기

먼저 암호문 주소로라도 살아있게 만든다
뭘 하는 거냐면 — 내 컴퓨터에 있는 index.html을 인터넷에 올려서, 임시 주소로라도 열리게 만드는 단계야. 도메인은 아직 안 붙여. 살아있는 걸 먼저 확인하고 나중에 이름표를 갈아 끼우는 순서가 훨씬 안전해.
cd <프로젝트폴더>            # index.html + (선택) api/*.js
# vercel.json 예: {"cleanUrls": true}
npx vercel deploy --prod --yes --scope <내스코프>
vercel deploy를 아무 폴더에서나 부르지 마. 레포 루트에서 부르면 Root Directory가 없는 유령 프로젝트가 새로 생기고, 그 프로젝트가 레포 전체를 통째로 공개해 버려. 실제로 한 번 겪었어(2026-08-25). 폴더를 정확히 잡고 부를 것.
3

배포 보호 끄기 — 남이 열 수 있게

새 프로젝트는 기본이 비공개다
뭘 하는 거냐면 — Vercel은 새 프로젝트에 Vercel Authentication(SSO) 을 기본으로 켜둬. 회사 내부용 미리보기를 남이 못 보게 하려는 배려인데, 공개 랜딩에는 방해야. 외부인이 열면 로그인 화면으로 튕겨(응답이 302로 /sso-api로 감). 이걸 끄는 단계야.
# Vercel CLI 토큰 위치: ~/Library/Application Support/com.vercel.cli/auth.json 의 "token"
curl -s -X PATCH "https://api.vercel.com/v9/projects/<PRJ_ID>?teamId=<TEAM_ID>" \
  -H "Authorization: Bearer <VERCEL_TOKEN>" -H "Content-Type: application/json" \
  -d '{"ssoProtection":null,"passwordProtection":null}'
Vercel 대시보드에서 클릭으로도 돼. Project → Settings → Deployment Protection → Vercel Authentication 끄기. 위 curl은 봇이 사람 없이 하려고 쓰는 길이야.
4

(최초 1회) 네임서버를 Vercel로 옮기기

사람이 딱 한 번 하고, 그 뒤로는 안 부른다
뭘 하는 거냐면 — 등기소(가비아)에 "이 도메인 질문은 앞으로 Vercel이 받는다"고 등록하는 단계야. 도메인당 평생 한 번. 이걸 해두면 서브도메인·레코드 추가가 전부 Vercel 쪽 일이 되고, 봇이 명령어로 처리할 수 있게 돼.

가비아 기준 경로야. 도메인 관리 → 도메인 상세 → 네임서버/DNS호스트/DNSSEC → 네임서버 [설정] → 라디오는 네임서버(가비아 네임서버 아님) → 1차 ns1.vercel-dns.com / 2차 ns2.vercel-dns.com, 나머지 줄은 🗑 로 삭제 → 저장.

dig +short foo.nodak.co.kr @ns1.vercel-dns.com
노닥은 이미 끝났어 (2026-08-20). 그래서 *.nodak.co.kr 새 서브도메인은 다음 장부터 봇이 혼자 한다. 아롱이처럼 자기 도메인을 붙이는 경우엔 이 장을 한 번 해줘야 해.
5

서브도메인 붙이기 — 봇이 직접

여기부터가 매번 반복되는 실제 작업이다
뭘 하는 거냐면 — "이 프로젝트를 sub.내도메인 이름으로도 서비스해"라고 Vercel에 등록하는 단계야. 네임서버가 이미 Vercel이면 주소록에 줄을 추가할 필요도 없어 — 와일드카드가 이미 깔려 있어서 이름만 붙이면 바로 붙는다.
npx vercel domains add <sub>.nodak.co.kr <프로젝트명> --scope <내스코프>
npx vercel domains verify <sub>.nodak.co.kr --scope <내스코프>   # verified:true 확인

검증은 둘 다 봐.

dig +short <sub>.nodak.co.kr @ns1.vercel-dns.com   # 64.29.x.x 나오면 Vercel쪽 OK
curl -sI https://<sub>.nodak.co.kr                 # 전파 후 200
6

페이지 안의 폼을 Airtable로 받기

에어테이블 폼을 안 쓰고, 내 페이지에서 바로 받는 법
왜 이 장이 필요하냐면 — 신청을 받으려고 에어테이블 기본 폼으로 링크를 보내면, 우리 브랜드 페이지에서 갑자기 남의 화면으로 튕겨나가. 그래서 폼을 내 페이지 안에 두고 싶은데, 문제가 하나 있어. 정적 페이지는 비밀 키를 들고 있을 수 없어 — 페이지 소스는 누구나 볼 수 있으니까 거기 API 키를 적으면 그대로 털려. 그래서 중간에 심부름꾼을 하나 둬.
서버리스 함수가 뭐냐면 — 평소엔 꺼져 있다가 누가 부를 때만 잠깐 켜지는 작은 서버야. api/apply.js 파일 하나 두면 /api/apply 주소가 생겨. 비밀 키는 이 안에서만 읽으니까 페이지 소스에는 안 남아. 서버를 따로 사서 켜둘 필요가 없어서 "서버가 없다(서버리스)"고 부르는 거야.

환경변수 주입은 이렇게 해.

curl -s -X POST "https://api.vercel.com/v10/projects/<PRJ_ID>/env?teamId=<TEAM_ID>" \
  -H "Authorization: Bearer <VERCEL_TOKEN>" -H "Content-Type: application/json" \
  -d '{"key":"AIRTABLE_TOKEN","value":"<PAT>","type":"encrypted","target":["production","preview","development"]}'
외부 API가 "허용되지 않은 IP"로 막을 수 있어. Airtable은 안 그러는데 Solapi(문자 발송) 같은 서비스는 IP 허용목록을 쓰거든. Vercel 함수는 나갈 때 IP가 고정이 아니라서 그런 서비스는 콘솔에서 IP 제한을 풀어줘야 통과해 (2026-08-21에 여기서 한 번 막혔어).

✅ 끝났는지 확인하는 5줄

  1. curl -sI https://<sub>.내도메인 → 200 (302면 배포 보호가 아직 켜져 있음)
  2. 시크릿창으로 열어보기 — 내 로그인 상태에 속지 않으려고
  3. 주소창에 자물쇠 표시 (HTTPS 자동 발급 확인)
  4. 폼 한 건 실제로 제출 → Airtable에 들어왔나 → 그 테스트 레코드 삭제
  5. 페이지 소스 보기(Ctrl+U)에서 API 키가 안 보이는지
7

참고 값 (시크릿 아님)

🐱

뽀야 마무리: 제일 많이 막히는 데는 배포 보호(2장) 랑 네임서버(3장) 야. 둘 다 "나는 잘 되는데 남이 열면 안 되는" 모양으로 나타나서 원인을 엉뚱한 데서 찾게 돼. 링크 뿌리기 전에 시크릿창으로 한 번 열어봐. 그게 제일 확실해 🐾

← {{SERIES_LABEL}} 목록으로