Skip to content

feat(db): postgres 를 Workers VPC(터널 직결)로 연결 지원 - #89

Merged
mack-erel merged 3 commits into
mainfrom
feat/workers-vpc-db
Jul 29, 2026
Merged

feat(db): postgres 를 Workers VPC(터널 직결)로 연결 지원#89
mack-erel merged 3 commits into
mainfrom
feat/workers-vpc-db

Conversation

@mack-erel

Copy link
Copy Markdown
Owner

요약

Hyperdrive 를 거치지 않고 wrangler vpc_networks 바인딩(Cloudflare Tunnel)으로 사설망 Postgres 에 직결하는 경로를 추가한다. 프로덕션(idp.hyochan.site)은 이미 이 경로로 전환되어 정상 동작 중이다 (/api/healthok).

변경 내용

  • src/lib/server/db/vpc-socket.ts (신규): postgres.js 의 socket 옵션에 주입하는 VPC 소켓 어댑터. postgres.js cf 폴리필과 동일한 이벤트 인터페이스를 VPC binding.connect() 위에 재구현해 드라이버 TCP 를 터널로 라우팅한다.
    • postgres.js 는 options.socket 이 있으면 socket.connect() 를 호출하지 않고 곧바로 startup 메시지를 write 하므로, 팩토리 호출 시점에 즉시 연결을 열고 ready 전 write 는 WritableStream 버퍼링에 맡긴다. 재연결 시에도 팩토리가 다시 호출되어 매번 새 소켓을 연다.
    • VPC connect() 는 현재 plaintext TCP 전용 — sslmode 없는 연결 문자열과 함께 사용해야 한다.
  • src/lib/server/db/index.ts: Workers postgres 경로에서 platform.env.VPC 가 있으면 어댑터를 주입. VPC 바인딩이 없는 배포(Hyperdrive/직결/Node)는 기존 동작 그대로.
  • src/app.d.ts: VPC 바인딩 optional 타입 추가.
  • chore(deps): wrangler 4.112 → 4.115.

배포 설정(wrangler.prod.jsonc 는 gitignore 대상)은 hyperdrive 대신:

"vpc_networks": [{ "binding": "VPC", "tunnel_id": "<tunnel-id>", "remote": true }]

접속 정보는 wrangler secret put DATABASE_URL 로 주입한다.

검증

  • 최소 프로브 워커로 VPC 바인딩 raw TCP 핸드셰이크 확인 (Postgres SSLRequest → "N" 응답 수신)
  • postgres.js + 어댑터 조합으로 select 1 성공 (wrangler dev remote 바인딩)
  • 프로덕션 배포 후 /api/health{"status":"ok","db":"ready"}, /login 200
  • lint / svelte-check (1445 files, 0 errors) 통과

🤖 Generated with Claude Code

mack-erel and others added 3 commits July 30, 2026 03:58
Hyperdrive 를 거치지 않고 wrangler vpc_networks 바인딩(Cloudflare Tunnel)으로
사설망 Postgres 에 직결한다. postgres.js 의 socket 옵션에 VPC 소켓 어댑터를
주입해 드라이버 TCP 를 터널로 라우팅하며, 접속 주소/계정은 DATABASE_URL
secret 이 제공한다. VPC 바인딩이 없는 배포(Hyperdrive/직결/Node)는 기존
동작 그대로다.

- vpc-socket.ts: postgres.js cf 폴리필과 동일한 이벤트 인터페이스를
  VPC binding.connect() 위에 재구현. options.socket 사용 시 postgres.js 가
  socket.connect() 를 호출하지 않으므로 팩토리 호출 즉시 연결을 연다.
- plaintext TCP 전용(VPC connect 제약) — sslmode 없는 연결 문자열 필요.

Co-Authored-By: Claude Fable 5 <[email protected]>
GHSA-mh99-v99m-4gvg (brace-expansion <=5.0.7 DoS),
GHSA-r28c-9q8g-f849 (postcss <=8.5.17 source map path traversal)

Co-Authored-By: Claude Fable 5 <[email protected]>
@mack-erel
mack-erel merged commit 1efa92f into main Jul 29, 2026
6 checks passed
@mack-erel
mack-erel deleted the feat/workers-vpc-db branch July 29, 2026 19:08
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant