# cfdav A minimal WebDAV → Cloudflare R2 service built on Cloudflare Workers + Hono, with D1 metadata and a small admin UI (Cloudflare Pages). ## ✅ Project Purpose - Provide a **lightweight WebDAV gateway** backed by Cloudflare R2 - Support **multi-user isolation** (each user sees only their own file tree) - Offer a **simple admin UI** to manage users (add/delete) --- ## ✅ Features - WebDAV endpoints: OPTIONS, PROPFIND, GET, HEAD, PUT, MKCOL, DELETE, MOVE, COPY, LOCK, UNLOCK, PROPPATCH - Basic Auth (multi-user in D1; bootstrap admin supported) - Metadata stored in D1 (SQLite) - File content stored in R2 (binding: FILES) - Windows WebDAV compatibility headers (DAV + MS-Author-Via) - Admin UI (Cloudflare Pages) for user management --- ## ✅ Deployment Flow (Production) ### 1) Install ```bash pnpm install ``` ### 2) Configure `wrangler.toml` Edit `wrangler.toml` and fill real IDs: ```toml [[d1_databases]] binding = "DB" database_name = "cfdav-db" database_id = "YOUR_D1_DATABASE_ID" [[r2_buckets]] binding = "FILES" bucket_name = "YOUR_R2_BUCKET" [vars] ENVIRONMENT = "production" BASIC_USER = "YOUR_BOOTSTRAP_EMAIL" BASIC_PASS = "YOUR_BOOTSTRAP_PASSWORD" ``` ### 3) Create D1 + apply migrations ```bash wrangler d1 create cfdav-db wrangler d1 migrations apply cfdav-db --remote ``` ### 4) Create R2 bucket ```bash wrangler r2 bucket create ``` ### 5) Deploy Worker ```bash wrangler deploy ``` --- ## ✅ Admin UI (Cloudflare Pages) ### 1) Create Pages Project ```bash wrangler pages project create cfdav-admin --production-branch main ``` ### 2) Deploy static UI ```bash cd web wrangler pages deploy . --project-name cfdav-admin ``` ### 3) Login - API Base: `https://` - Email/Password: your admin account --- ## ✅ User Management ### Bootstrap admin If `users` table is empty, first login with: - `BASIC_USER` - `BASIC_PASS` This account will be auto-created as **admin**. ### Create user via UI Open the Pages admin UI and create users from the form. ### Create user via CLI (optional) ```bash node tools/hash.mjs wrangler d1 execute cfdav-db --remote --command \ "INSERT INTO users (id,email,password_hash,is_admin,created_at) VALUES ('','user@example.com','',0,'')" ``` --- ## ✅ WebDAV Usage ### Endpoint ``` https:///dav/ ``` ### Example (curl) ```bash # upload curl -u user@example.com:password -T ./file.txt https:///dav/file.txt # list curl -u user@example.com:password -X PROPFIND -H 'Depth: 1' https:///dav/ # download curl -u user@example.com:password https:///dav/file.txt ``` ### Windows Mount (Explorer) - 右键“此电脑” → “映射网络驱动器” → 地址: `https:///dav/` - 账号:邮箱 - 密码:对应密码 ### macOS Finder - Finder → “前往” → “连接服务器” - 输入:`https:///dav/` --- ## ✅ Required Config Parameters - **Cloudflare API Token** (Workers + D1 + R2 + Pages权限) - **CLOUDFLARE_ACCOUNT_ID** - `D1 database_id` - `R2 bucket_name` - `BASIC_USER` / `BASIC_PASS` --- ## Notes - WebDAV endpoint: `/dav` - Admin API: `/api/admin/users` - R2 binding: `FILES` - D1 binding: `DB`