1. Cloudflare 워커 등록
개인 계정(wks0968@gmail.com) 의 Workers 서비스에 직접 등록 — Pages 가 아닌 Workers Script 형태.
| Account | Wks0968@gmail.com's Account |
|---|---|
| Account ID | f737a94bd27dd7ccd5c92cf058998d50 |
| Worker name | rust-workers-dashboard |
| Script tag | 57e4be9fe5994a1a9326944a10ca1da2 |
| Module 형식 | has_modules · build/worker/shim.mjs (worker-build 산출) |
| Handlers | fetch, init + 6 named WASM 클래스 |
| Usage model | standard |
| 최초 생성 | 2026-05-09 16:36 UTC |
| 마지막 배포 | 2026-05-10 07:34 UTC |
| 버전 수 | v29 (29회 배포) |
| Compatibility | 배포본 2025-01-01 · wrangler.toml 은 2026-04-01 (다음 배포 시 갱신) |
| workers.dev subdomain | enabled previews_enabled |
| Custom domain | 없음 workers.dev 서브도메인만 운영 |
| Smart Placement | mode smart · status INSUFFICIENT_INVOCATIONS (트래픽 적어 자동 배치 대기) |
2. D1 데이터베이스
| UUID | dc08ec5e-d973-4ddb-ba09-03ad0d89fb5c |
|---|---|
| Name | rust-workers-dashboard |
| Region | APAC (서버 ICN · 서울 colo 응답) |
| File size | 64 KB (65,536 B) |
| Tables | 3 (+ 내부 _cf_KV) |
| Read replication | disabled |
| Worker binding | DB (wrangler.toml [[d1_databases]]) |
| SQL 응답 | 0.47ms (서버측) |
실측 row 카운트
| 테이블 | row | 비고 |
|---|---|---|
notes | 105 | title / content / created_at |
tags | 32 | name UNIQUE / color (hex) |
activity | 487 | action / entity / summary (CRUD 로그) |
3. 라이브 응답 확인
| 경로 | 상태 | TTFB | 응답 size |
|---|---|---|---|
/ (overview) | 200 | 1311 ms (cache MISS) | 4.9 KB |
/healthz | 200 | 460 ms | 2 B |
측정 위치 한국 → CF edge. /healthz 460ms 가 RTT 바닥값 — Smart Placement 가 활성화되면 D1 region(APAC) 와 정합 후 더 감소 예상.
4. 스택
| 레이어 | 기술 | 비고 |
|---|---|---|
| 런타임 | Cloudflare Workers (V8 isolate) | edge · startup ~1ms |
| 언어 | Rust 2024 edition | MSRV 1.85 · cdylib → wasm32 |
| HTTP | workers-rs 0.8 | Router + #[event(fetch)] |
| 템플릿 | maud 0.27 | Rust 매크로 DSL · XSS 자동 escape |
| 클라 | HTMX 2.0.6 (+ ext-preload) | fragment swap · OOB · hover prefetch |
| DB | Cloudflare D1 (edge SQLite) | batch · prepared statement |
| 디자인 토큰 | Open Props (Tier 1) + semantic Tier 2 | vanilla 2026 CSS |
| CSS 기능 | @layer · light-dark() · container queries · color-mix(in oklch) | 빌드 도구 0 |
5. 라우트 (16개, 모두 SSR)
| 경로 | 메서드 | 응답 |
|---|---|---|
/ | GET | overview 페이지 (Workers Cache API · 30s) |
/notes | GET | 첫 20 row + sentinel |
/notes-page?cursor=ID | GET | fragment (다음 20 row + sentinel) |
/notes | POST | row + OOB count |
/notes/:id | GET / PUT / DELETE | row / row / OOB count |
/notes/:id/edit | GET | edit form fragment |
/tags | GET / POST | 페이지 / chip + OOB count |
/tags/:id | DELETE | OOB count |
/activity | GET | 30 row read-only |
/settings | GET | 정적 페이지 |
/healthz | GET | "ok" |
/static/open-props.min.css | GET | max-age=1년, immutable |
/static/app.css | GET | max-age=1일, immutable |
/static/manifest.json · /static/icon.svg · /sw.js | GET | PWA assets |
6. 폴더 구조
rust-workers-dashboard/
├── Cargo.toml # edition 2024, MSRV 1.85, maud 0.27, worker 0.8
├── wrangler.toml # Smart Placement, D1 binding (DB)
├── Justfile # check · clippy · test · ci · dev · deploy · smoke · bench · release
├── .github/workflows/ # fmt + check + clippy + test (-D warnings) + nextest
├── docs/design-system.md # 2-Tier 토큰 + Open Props
├── migrations/0001_init.sql# 3 테이블 + seed
├── scripts/ # smoke.sh · bench.sh
├── static/open-props.min.css
└── src/
├── lib.rs # entrypoint + Router (~30 LOC, 16 routes)
├── error.rs # AppError + handle()
├── validation.rs # 길이·색상·id·cursor + unit test
├── middleware.rs # 보안 헤더 (CSP / nosniff / HSTS)
├── models/ # Note · Tag · Activity · OverviewCounts
├── repo/ # D1 batch + keyset cursor
├── views/ # maud DSL — page + partial 모두 포함
└── routes/ # overview · notes · tags · activity · settings · staticfiles · misc
7. 커밋 흐름 (36 commits · main 단일)
| 국면 | 커밋 범위 | 요지 |
|---|---|---|
| ① 디자인 시스템 도입 | d8cc453 | 2-Tier 토큰 + Open Props + 컴포넌트 표준화 |
| ② 성능 | cc7d973 ~ 0c8b205 | keyset 무한스크롤 · CSS 외부화 · 인위 지연 0ms |
| ③ PWA | a033475 ~ f6e6c29 | Critical CSS inline + Service Worker |
| ④ 템플릿 전환 | 4c4fc74 | askama 0.13 → maud 0.27 |
| ⑤ KV 캐시 실험 | 12523aa → 760053b | 도입 후 1인 데모엔 부적합 → 제거 |
| ⑥ e2e 마이그레이션 | 45d15c6 ~ ac7fa27 | TS Playwright 제거 → Rust + chromiumoxide |
| ⑦ CI 2026 모범 | fbc6114 ~ 6772110 | MSRV · rustfmt · clippy · deny · audit · machete · coverage · nextest 병렬 |
| ⑧ 최근 정리 | bdf0473 | compatibility_date 2026-04-01 + tooling drift 정리 |
8. 보안 헤더 (middleware.rs)
| 헤더 | 값 |
|---|---|
| Content-Security-Policy | default-src 'self' + unpkg.com (HTMX) |
| X-Frame-Options | DENY |
| X-Content-Type-Options | nosniff |
| Strict-Transport-Security | max-age=31536000; includeSubDomains |
| Referrer-Policy | strict-origin-when-cross-origin |
| Permissions-Policy | interest-cohort · camera · microphone · geolocation 차단 |
추가 방어: maud 자동 escape (XSS) · D1 prepared statement (SQL injection) · chars().count() 한글 정확 길이 검증.
9. 결론
- 등록 형태: Workers Script (Pages 아님) · workers.dev 서브도메인만 · 커스텀 도메인 없음
- 리전: D1 APAC + Smart Placement (대기 중) — 한국 ↔ ICN colo, TTFB 460ms RTT floor
- 운영 안정성: 29회 배포 · CI 풀스택 (fmt/clippy/nextest/deny/audit/coverage) · Rust e2e (chromiumoxide)
- 비용: Free tier (10만 req/일, D1 5GB · 25M reads/일) · 현재 D1 64KB 사용
- 다음 액션 후보: compatibility_date 갱신 재배포 · 커스텀 도메인 binding (선택) · KV 재실험 또는 D1 Read Replication 활성