fb5f80cc20a38e59600d90580554ff3806f7e04d
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
pnpm install
2) Configure wrangler.toml
Edit wrangler.toml and fill real IDs:
[[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
wrangler d1 create cfdav-db
wrangler d1 migrations apply cfdav-db --remote
4) Create R2 bucket
wrangler r2 bucket create <your-bucket-name>
5) Deploy Worker
wrangler deploy
✅ Admin UI (Cloudflare Pages)
1) Create Pages Project
wrangler pages project create cfdav-admin --production-branch main
2) Deploy static UI
cd web
wrangler pages deploy . --project-name cfdav-admin
3) Login
- API Base:
https://<your-worker-domain> - Email/Password: your admin account
✅ User Management
Bootstrap admin
If users table is empty, first login with:
BASIC_USERBASIC_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)
node tools/hash.mjs <password>
wrangler d1 execute cfdav-db --remote --command \
"INSERT INTO users (id,email,password_hash,is_admin,created_at) VALUES ('<uuid>','user@example.com','<HASH>',0,'<ISO>')"
✅ WebDAV Usage
Endpoint
https://<your-worker-domain>/dav/
Example (curl)
# upload
curl -u user@example.com:password -T ./file.txt https://<your-domain>/dav/file.txt
# list
curl -u user@example.com:password -X PROPFIND -H 'Depth: 1' https://<your-domain>/dav/
# download
curl -u user@example.com:password https://<your-domain>/dav/file.txt
Windows Mount (Explorer)
- 右键“此电脑” → “映射网络驱动器” → 地址:
https://<your-domain>/dav/ - 账号:邮箱
- 密码:对应密码
macOS Finder
- Finder → “前往” → “连接服务器”
- 输入:
https://<your-domain>/dav/
✅ Required Config Parameters
- Cloudflare API Token (Workers + D1 + R2 + Pages权限)
- CLOUDFLARE_ACCOUNT_ID
D1 database_idR2 bucket_nameBASIC_USER/BASIC_PASS
Notes
- WebDAV endpoint:
/dav - Admin API:
/api/admin/users - R2 binding:
FILES - D1 binding:
DB
Description
Languages
TypeScript
78.9%
JavaScript
13.8%
HTML
7.3%