vignette/docs/ops/tailscale-vnet-runtime-2026-06-27.md
2026-06-27 16:08:41 +09:00

4.2 KiB

Tailscale / vnet 런타임 메모 — 2026-06-27

결론

  • Tailnet 전용 접속점은 https://alpaca-home.taile93291.ts.net이다.
  • 현재 머신에서 tailscale serve 루트 HTTPS가 http://127.0.0.1:5173으로 연결된다.
  • Tailnet 런타임은 API를 8010에 띄우고, Vite proxy가 VITE_API_PROXY_TARGET=http://127.0.0.1:8010을 보도록 분리했다. 기존 8000 reloader 잔류와 충돌하지 않게 하기 위해서다.
  • Tailnet dev-login은 AUTH_DEV_LOGIN_EXTRA_ORIGINS=["https://alpaca-home.taile93291.ts.net"]가 있을 때만 dev 환경에서 열린다. prod에서는 계속 차단된다.
  • Tailnet dev-origin에서는 Google OAuth 버튼을 비활성화하고, 직접 /api/auth/login?provider=google을 열어도 local_oauth_unavailable 안내로 되돌린다. 현재 redirect URI가 https://api-vignette.chanpaca.net/auth/callback로 고정되어 있어 Tailnet API가 만든 OAuth state를 public API callback이 검증할 수 없기 때문이다. 원격 수동검증은 로컬 테스트 계정으로 계속을 사용한다.
  • Vite proxy는 원래 프론트 Host/proto를 X-Forwarded-Host/X-Forwarded-Proto로 API에 넘긴다. 이 헤더가 없으면 dev OAuth 차단 redirect가 public 로그인으로 새는 회귀가 생긴다.
  • scripts/dev-up.ps1는 API 포트와 VITE_API_PROXY_TARGET을 같은 값으로 강제한다. Vite가 8010을 보는데 API가 8000/8002로 떠서 /api/auth/config가 500을 내던 회귀를 막기 위한 조치다.

검증

  • tailscale serve status:
    • https://alpaca-home.taile93291.ts.nethttp://127.0.0.1:5173
  • GET https://alpaca-home.taile93291.ts.net/login200
  • GET https://alpaca-home.taile93291.ts.net/api/auth/configdev_login_enabled: true
  • POST https://alpaca-home.taile93291.ts.net/api/auth/dev-login + cookie 재사용 GET /api/auth/me200
  • GET https://alpaca-home.taile93291.ts.net/api/auth/login?provider=google&next=%2Flearn302 https://alpaca-home.taile93291.ts.net/login?oauth=local_oauth_unavailable
  • Playwright DOM 확인: https://alpaca-home.taile93291.ts.net/login로컬 테스트, 학습자, 교수자, 관리자, 로컬 테스트 계정으로 계속이 표시된다.
  • Tailnet auth readiness E2E: PLAYWRIGHT_BASE_URL=https://alpaca-home.taile93291.ts.net PLAYWRIGHT_SKIP_WEB_SERVER=1 npx playwright test e2e/auth.spec.ts --project=chromium-desktop --grep "shows Google OAuth readiness"1 passed
  • Tailnet dev-login E2E: PLAYWRIGHT_BASE_URL=https://alpaca-home.taile93291.ts.net PLAYWRIGHT_SKIP_WEB_SERVER=1 npx playwright test e2e/auth.spec.ts --project=chromium-desktop --grep "shows Google OAuth readiness|logs in locally"2 passed
  • 로컬 리스너:
    • gateway 127.0.0.1:9099
    • Tailnet API 127.0.0.1:8010
    • web 127.0.0.1:5173

공개 vnet.18ka.net 상태

코드와 스크립트는 vnet.18ka.net / api-vnet.18ka.net을 인식하도록 준비했다.

  • backend FRONTEND_ORIGIN_MAP 기본값:
    • api-vignette.chanpaca.nethttps://vignette.chanpaca.net
    • api-vnet.18ka.nethttps://vnet.18ka.net
  • frontend public API fallback:
    • vnet.18ka.nethttps://api-vnet.18ka.net
  • scripts/start-public-runtime.ps1vnet.18ka.net web preview(5174)와 api-vnet.18ka.net API(8001) ingress를 생성하도록 갱신했다.

아직 live 완료가 아닌 이유:

  • 현재 vnet.18ka.netapi-vnet.18ka.net은 DNS가 없다.
  • 현재 cloudflared 인증 컨텍스트는 18ka.net zone을 관리하지 못한다. cloudflared tunnel route dns vignette vnet.18ka.net 실행 시 원하는 18ka.net이 아니라 vnet.18ka.net.chanpaca.net 레코드를 만들었다.
  • prod API는 현재 127.0.0.1:8001에서 db:true, engine:true로 건강하다. 다만 api-vnet.18ka.net DNS가 없어 외부 vnet 도메인으로는 아직 도달할 수 없다.
  • Google OAuth Console에도 https://api-vnet.18ka.net/auth/callback을 Authorized redirect URI로 추가해야 실제 Google 로그인이 완료된다.

재기동 명령

powershell -NoProfile -ExecutionPolicy Bypass -File scripts\start-tailscale-runtime.ps1

공개 vnet은 DB와 DNS가 준비된 뒤:

powershell -NoProfile -ExecutionPolicy Bypass -File scripts\start-public-runtime.ps1