catalyst.net.nz / silverstripe-cloudflare
This module aims to relieve the stress of using Cloudflare caching with any SilverStripe project. Adds extension hooks that clears Cloudflare's cache for a specific page when that page is published or unpublished.
Installs: 15
Dependents: 0
Suggesters: 0
Security: 0
Stars: 0
Watchers: 1
Forks: 1
Open Issues: 0
Type:silverstripe-vendormodule
Requires
- php: ^8
- ext-curl: *
- ext-json: *
- psr/cache: *
- silverstripe/cms: ^5
- symbiote/silverstripe-queuedjobs: ^5
README
Introduction
The intention of this module is to relieve the double-handling required when updating any of your pages within the CMS of SilverStripe while being behind Cloudflare. When a page is Published or Unpublished a call will be made to the relevant Cloudflare endpoint to clear the cache of the URL/Page you just published/unpublished.
This allows you to see your changes instantly in the preview window without having to worry about logging into the Cloud Flare dashboard to purge the cache yourself.
Cloudflare allows you to have multiple domains registered under a single account. This module is versatile in the sense that it will automatically detect which Zone ID is to be used alongside the domain that this module is installed on. Therefore beyond the two configuration settings required below there is no additional setup required. You can "plug and play" this module in as many locations as you want which means you don't have to worry about tracking down the relevant Zone ID (you can only get it via the API).
Remember: Always keep your API authentication details secure. If you are concerned with your credentials being on someone else's machine; have them set up their own Cloudflare account.
Note: The detected Zone ID will always be shown in the SilverStripe Administration panel whilst viewing the "Cloudflare" menu item. To bypass this, set CLOUDFLARE_ZONE_ID as an environment variable, obtained from the Cloudflare dashboard
Why is this module forked?
This module is a fork of the original SteadLane module, which was written for Silverstripe 3 and featured on the Silverstripe blog. The parent repository was upgraded to Silverstripe 4, but necessary changes needed to make the module work for Silverstripe 5 are not being reviewed or accepted. This has led to numerous forks being maintained by community members, which makes it difficult to track and check out with Composer. In addition, the Cloudflare API itself has evolved somewhat, leading to a fairly significant rewrite.
The repository is hosted here, to support our own client work and enable others to continue providing contributions.
Features
- Dynamic Zone ID Detection. You can bypass this by setting CLOUDFLARE_ZONE_ID as an environment variable, obtained from the dashboard
- Intelligent Purging
- If you modify the title or URL of any page: All cache for the pages on that server name will be purged.
- If you modify the contents of any page: Only the cache for that page will be purged. This can be done automatically on publish
- If you modify any page that has a parent, the page you modified and all of it's parents will be purged too.
- Manual Purging
- The administration area for this module allows you to either purge all css files, all javascript files, all image files or ... all pages on a specific website.
Unlike the original module, this version deliberately avoids the purge_everything action. It is more appropriate to use Cloudflare's Dashboard if this functionality is required.
Installation
This module only supports installation via Composer:
composer require catalyst.net.nz/silverstripe-cloudflare
For Silverstripe 5.3+, use the 3.0.0 tag. For older versions, use the older tags: issues raised for these older versions are unlikely to be fixed.
Run /dev/build
afterwards and ?flush=1
for good measure for SilverStripe to become aware of this module
Configuration
You're going to need an API key issued by Cloudflare for your zone.
- Login to Cloudflare. Go to Profile > API Tokens > Create Token
- You need to issue a token called "Cache Purges" with "Zone.Zone, Zone.Cache Purge" permissions. Limit this to one specific zone if possible.
- Define environment variables in
.env
:
CLOUDFLARE_AUTH_KEY="ABCDEFGHIJKLMNOPQRSTUVWXYZ"
#Optional:
CLOUDFLARE_ZONE_ID="... obtained from dashboard ..."
CLOUDFLARE_SERVER_NAME=" ... explicitly defined hostname ... "
You can explicitly define the CLOUDFLARE_ZONE_ID
variable if your API key does not allow you to read Zone information. When setting CLOUDFLARE_SERVER_NAME
, you are telling the module to only issue purge commands for this specific hostname. This must match any caching or rewrite rules defined in your zone. For example, if your production domain name is "www.example.org", set "www.example.org" not "example.org".
Cache Rules
It is recommended that you add the below to your Cloudflare Cache Rules as no-cache
Rule | Comments |
---|---|
example.org/*stage=Stage* |
It is outside the scope of this module to handle cache purging for drafts. Drafts should never need to be cached as they're not usable on the front end |
example.org/Security/* |
Prevents caching of the login page etc |
example.org/admin/* |
Prevents caching of the Administrator Panel |
example.org/dev/* |
Prevents caching of the development tools |
Troubleshooting and FAQ
Q. The SS Cloudflare administrator section is blank!
A. If the Cloudflare administration panel isn't loading correctly, a quick ?flush=1
will resolve this issue.
Q. The SS Cloudflare footer always says "Zone ID: UNABLE TO DETECT". A. This module dynamically retrieves your Zone ID by using the domain you have accessed the website with, unless you have configured it to bypass this. Ensure this domain is correctly registered under your Cloudflare account. If the issue persists, please open a ticket in our issue tracker and provide as much information you can.
Contributing, Bugs & Issues
If you feel you can improve this module in any way, shape or form please do not hesitate to submit an issue, or a PR for review. To report a bug or an issue please use our issue tracker.
License
This module is distributed under the BSD-3 Clause license.