Cloudflare Workers and Pages already provide the Fetch/Web APIs needed for WebDAV verbs, so the storage integration uses a small local helper instead of adding a Node-oriented WebDAV client. The channel now participates in upload, read, delete, move, rename, channel listing, and runtime config, with chunked uploads explicitly guarded because WebDAV has no portable server-side compose primitive. Constraint: Preserve Pages Functions and generated Worker deployment paths Constraint: No new npm dependency for WebDAV client behavior Rejected: Add a WebDAV npm client | likely Node API/compatibility and package-lock churn Rejected: Treat WebDAV as External URL only | not a complete storage channel lifecycle Confidence: high Scope-risk: moderate Directive: WebDAV here is third-party storage; keep it distinct from the built-in /dav server settings Tested: npm test; node worker/generate-routes.js; npx wrangler deploy --dry-run --config worker/wrangler.toml; git diff --cached --check Not-tested: Live third-party WebDAV provider credentials; Digest-only WebDAV authentication
🗂️Open-source file hosting solution, supporting Docker and serverless deployment, supporting multiple storage channels such as Telegram, Discord, Cloudflare R2, S3, Huggingface, WebDAV, etc., supporting WebDAV protocol and various RESTful APIs.
Important
Please check the announcement for upgrade notes on version 2.0!
Announcement
Pinned
- If you encounter issues during deployment or usage, please carefully read the documentation, FAQ, and existing issues first.
- Note: This repository is a remake of the Telegraph-Image project. If you like this project, please support the original one as well.
V2.7.1+ Cloudflare Pages Build Output Directory Change
Starting from v2.7.1, frontend build output has been moved to the
frontend-distdirectory. Cloudflare Pages users need to manually update the build configuration:
- Go to Cloudflare Dashboard → Your Pages project →
Settings→Build- Edit
Build configuration, changeBuild output directoryfrom/to/frontend-dist- Save and redeploy
Docker and Workers users are not affected.
2026.3.4 V2.6.2 Docker Image Rebuild Notice
The Docker image has been rebuilt in this release, involving changes to the base image, directory structure, and database, bringing optimizations in concurrency, memory management, and more. To ensure data safety, please back up your data before upgrading.
Before Upgrading: Back Up Data
- Back up data: Download the backup file from the admin panel (if you were using local R2 storage, you need to download and re-upload all files)
- Back up the data folder
Upgrade Steps
Pull the latest image:
docker compose pullStart the container with the new image:
docker compose up -dVerify the container is running properly:
docker compose logs -fOnce you confirm there are no errors in the logs, you're good to go.
Restore data: Restore all data from the admin panel (R2 files from the old version need to be re-uploaded)
Rollback to Previous Version
If something goes wrong after upgrading, follow these steps to roll back:
Stop the container:
docker compose downPull the previous image version:
# amd64 docker pull marseventh/cloudflare-imgbed@sha256:896dc1b79883 # arm docker pull marseventh/cloudflare-imgbed@sha256:b5442ccc198cAlso update the
imagefield indocker-compose.ymlto the old version tag, then restart:docker compose up -dNotes:
- Make sure the backup is complete before upgrading, and back up the data folder if necessary
- If you have a custom
docker-compose.yml(e.g., custom ports, environment variables), preserve those settings during the upgrade- For issues, please check the documentation and existing issues first, or submit a new issue
2025.2.6 Version 2.0 Upgrade Notes
The v2.0 version has been released, with many changes and optimizations compared to v1.0. However, the beta version may have potential instability. If you prefer stability, you may delay updating.
Due to changes in the build command, this update requires manual operation. Please follow these steps:
- Sync your forked repository to the latest version (ignore if already synced automatically)
- Go to the Pages management page, enter
Settings->Build, edit theBuild configuration, and set theBuild commandtonpm install- All new version settings have been migrated to the Admin Panel -> System Settings interface, so generally no need to configure environment variables anymore. Settings made in the system settings interface will override environment variable settings. However, to ensure compatibility of images uploaded via the Telegram channel with the old version, please keep any previously set Telegram-related environment variables!
- After confirming the above settings are correct, go to the Pages management page, enter
Deployments, andRetrythe last failed deployment.
Notification About Switching to Telegram Channel
Due to abuse of the telegraph image hosting, the upload channel has switched to Telegram Channel. Please update to the latest version (see the last section of chapter 3.1 for update instructions) and set
TG_BOT_TOKENandTG_CHAT_IDaccording to the deployment requirements in the documentation, otherwise upload functionality will not work.Also, the KV database is now mandatory; if not configured before, please configure it as per the documentation.
For issues, please check section 5 FAQ first.
1. Introduction
Free file hosting solution with full lifecycle features including upload, management, read, and delete, supporting authentication, directories, image moderation, random images, and other features (see Feature Docs for details).
2. Document
Provides detailed deployment documentation, feature docs, development plans, update logs, FAQ, and more to help you get started quickly.
3. Demo
Demo Address: CloudFlare ImgBed Access Password: cfbed
4. Tips
-
WebDAV storage channel: Besides the built-in
/davWebDAV server, this project can also use a third-party WebDAV server as an upload storage channel. Configure a fixed channel withWEBDAV_BASE_URL; optional variables areWEBDAV_USERNAME,WEBDAV_PASSWORD,WEBDAV_PUBLIC_URL,WEBDAV_HEADERS(JSON object string), andWEBDAV_CREATE_DIRECTORY=false. Runtime channel config uses:{ "webdav": { "loadBalance": { "enabled": false }, "channels": [{ "name": "dav-main", "type": "webdav", "baseUrl": "https://dav.example.com/remote.php/dav/files/user/imgbed/", "username": "user", "password": "pass", "publicUrl": "https://cdn.example.com/imgbed/", "enabled": true }] } }The implementation uses Fetch/Web APIs only, so it is compatible with Cloudflare Pages Functions and Workers deployments. Basic authentication and no-auth WebDAV endpoints are supported; Digest-only providers are not supported. WebDAV chunked uploads are intentionally disabled, so large uploads must stay within your Cloudflare request body limits.
-
Frontend is open source, see MarSeventh/Sanyue-ImgHub.
-
Desktop software is open source, see MarSeventh/satellite.
-
Ecosystem: We welcome community participation in the ecosystem construction. Feel free to submit PRs or Issues, and high-quality content can be found on the official ecosystem page.
-
Sponsor: Maintaining the project is not easy. If you like it, please support the author. Your support is the motivation to keep going~
-
Sponsors: Thanks to the following sponsors for supporting this project!
-
Contributors: Thanks to the following contributors for their selfless contributions!
5. Star History
If you like the project, please give a free star✨✨✨, thank you very much!
6. Special Sponsors
-
CloudFlare & EdgeOne:Provides CDN acceleration, and security protection
-
svyun:Provides cloud computing resources support
-
Linux DO: Genuine · Friendly · United · Expert








