Protomaps on Cloudflare
Installation
1. Upload to R2
Uploading via Web UI is limited to 300 MB.
Use rclone to upload larger PMTiles archives to R2.
Name your uploads to storage with the .pmtiles
extension. Your tile requests to the Workers URL will look like /FILENAME/0/0/0.ext
for the archive FILENAME.pmtiles
.
2. Create Worker with Web Console
In the Workers tab of the Cloudflare dashboard, choose Create a Service.
Leave the default HTTP handler option.
in Settings for your worker, choose Variables > R2 Bucket Bindings > Add Binding.
Create variable with name
BUCKET
and select your R2 bucket from Step 1.Choose Save and Deploy.
in Quick Edit, paste in this code: index.js.
- Choose Save and Deploy.
Your worker should now be active at its *.workers.dev
domain.
Make a request for /FILENAME/0/0/0.EXT
to verify tiles are served.
Alternative: Use Wrangler
Clone the PMTiles repository and change to the
serverless/cloudflare
directory.npm install
inPMTiles/js
to get the dependencies of the core JS libraryAlso
npm install
inPMTiles/serverless/cloudflare
Copy
wrangler.toml.example
towrangler.toml
Edit
wrangler.toml
, replacingbucket_name
with your bucket.Publish the worker:
npm run deploy
3. Create Worker Route
For the cache to work, the worker must be assigned a zone on your own domain, not workers.dev
.
- In Websites > your domain > DNS, Add a CNAME entry pointing to your
workers.dev
domain:
In Websites > your domain > Workers Routes, Choose Add Route.
for Route, enter
SUBDOMAIN.mydomain.com/*
for Service, choose the name of your Worker. for Environment, choose
production
.
Verify your deployment is working on SUBDOMAIN.mydomain.com
by checking for the Cf-Cache-Status
header with a value of HIT
on tile requests. This may take 2-3 attempts.
Example with curl
for vector tiles and TileJSON:
curl -v https://subdomain.mydomain.com/FILENAME/0/0/0.mvt curl -v https://subdomain.mydomain.com/FILENAME.json
Configuration
Optional environment variables can be set set in [vars]
of wrangler.toml
or in the Workers web console.
PMTILES_PATH
- A string likefolder/{name}.pmtiles
specifying the path to archives in your bucket. Default{name}.pmtiles
DeprecatedTILES_PATH
- a string likeprefix/{name}/{z}/{x}/{y}.{ext}
specifying the tile path exposed by the worker. Default{name}/{z}/{x}/{y}.{ext}
PUBLIC_HOSTNAME
- Optional, override the absolute hostname in TileJSON responses. Exampletiles.example.com
ALLOWED_ORIGINS
- a comma-separated list of allowed CORS origins. Default none. Examples:https://example.com,https://localhost:3000
,*
CACHE_MAX_AGE
: max age in the Cloudflare cache, in seconds. default 86400, or 1 day.
Cost Estimate
- Cloudflare Workers is $5 USD per month with 10 million requests a day, plus $0.50 per additional million.
- Cloudflare R2 incurs costs for storage, write requests and read requests. These will only happon on tile cache misses.
Cache Invalidation
- For Cloudflare, "Purge Cache" applies to all cached resources in the zone (domain). It's recommended to deploy on a dedicated zone for this reason.