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_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)

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_id
  • R2 bucket_name
  • BASIC_USER / BASIC_PASS

Notes

  • WebDAV endpoint: /dav
  • Admin API: /api/admin/users
  • R2 binding: FILES
  • D1 binding: DB
Description
No description provided
Readme 50 KiB
Languages
TypeScript 78.9%
JavaScript 13.8%
HTML 7.3%