1.6 KiB
1.6 KiB
Cloudflare R2 File Drive
A simple FTP-style web UI built with Next.js App Router. Users can register/login (email + password), upload files or entire folders, list them, download via signed URLs, and delete. Files are stored in Cloudflare R2 (S3-compatible); metadata and users are stored in SQLite via Prisma.
Setup
- Install deps (already checked in
package-lock.json):
npm install
- Copy
env.exampleto.env.local(or set env vars another way) and fill:
DATABASE_URL="file:./dev.db"(default SQLite)R2_ENDPOINT="https://<account-id>.r2.cloudflarestorage.com"R2_REGION="auto"R2_ACCESS_KEY_ID,R2_SECRET_ACCESS_KEYR2_BUCKETJWT_SECRET(long random string)PORT/NEXT_PORT(defaults set to 4000 to avoid 3000)
- Create DB & Prisma client:
npx prisma db push
npx prisma generate
- Run dev server on port 4000:
npm run dev
# overrides: PORT=4500 npm run dev
- Production:
npm run build
PORT=4000 npm run start
Usage
- Register or log in at
/registeror/login. - Dashboard at
/dashboard:- Upload files or folders (uses
webkitdirectory; folder structure is preserved in keys). - Files are stored under a user-specific prefix in R2; metadata kept in SQLite.
- Download uses short-lived signed URLs; delete removes from R2 and DB.
- Upload files or folders (uses
Notes
- Middleware protects
/dashboardand/api/files/*; auth cookie is HttpOnly JWT. - To change ports, set
PORT/NEXT_PORTor pass-pto scripts; defaults avoid 3000. - R2 endpoint format:
https://<account-id>.r2.cloudflarestorage.com.