directus-cf-cache
directus-cf-cache copied to clipboard
Cache and limit direct access to the data managed on your Directus instance, powered by Cloudflare Workers, Workers KV and Cloudflare Pages.
directus-cf-cache
About
Cache and limit direct access to the data managed on your Directus instance, powered by Cloudflare Workers, Workers KV and Cloudflare Pages.
Features
- Always available API with live updates[^1].
- Origin Priority mode to serve content from your Directus instance, with fallback to the KV cache when unavailable.
- Cache Priority mode to serve content from the KV cache, with fallback to your Directus instance when unavailable.
- Origin Only mode to only serve content from your Directus instance.
- Cache Only mode to only serve content from the KV cache.
- Caching of image assets.
- Automatic updating of cache upon webhook trigger.
- Preset requests to prevent user from the tampering of query parameters.
- Full support of Directus Global Query Parameters.
- Demo Vue web application to showcase functionality.
Demo
-
Head over to the Directus instance at https://cztkclnq.directus.app.
-
Login with the following credentials.
- Email:
[email protected]
- Password:
abcd1234
- Email:
-
Create > update > delete your content.
Permissions have been set to prevent changes to certain items.
-
Check out your updates at https://directus-cf-cache.pages.dev.
https://user-images.githubusercontent.com/26413686/172551155-2adc79e7-fcef-43c0-b46a-2f69667cfa80.mov
Cloudflare Features Used
Cloudflare Workers
Fetching and storing content into Workers KV.
Serve requests either from the origin or the KV cache.
Workers KV
Store cached content retrieved from Directus.
Cloudflare Pages
Host the demo Vue 3 web application.
Installation Guide
Fork directus-cf-cache
Create a Fork of this GitHub repository as the deployments are pushed via GitHub Actions.
Set up Cloudflare Workers
- Sign up for a Cloudflare Workers account.
- Copy the Account ID shown in the Workers page somewhere.
- Copy the Subdomain shown in the Workers page somewhere.
- Head over to KV tab, add a new namespace and copy the Namespace ID somewhere.
- Head over to API Tokens and create a new Custom API Token with Permission of "Account/Worker Scripts/Edit".
- Copy the API Key somewhere, you will require it later.
Set up Directus
- If you already have a Directus instance, self-hosted or cloud, skip to point 5.
- Sign up for a Directus Cloud account.
- Create a new Project.
- Check your email for the login credentials.
- Login to your Directus instance.
- Head over to Settings > Data Model.
- Set up all your required collections, in the demo there are
articles
,projects
andpeople
. - Create a new collection with the following settings:
- Set name as
cf_cache_options
- Check the singleton checkbox
- Skip the configuration of other parameters and save.
- Set name as
- Click on Data Model.
- Create a new collection with the following settings
- Set name as
global_query_params
- Skip the configuration of other parameters and save.
- Set name as
- Create the following fields in
global_query_params
:-
description
withstring
type -
operation
withstring
type (eitherlist
orget
) -
collection
withstring
type (collection names that you want to cache) -
key
withstring
type (cache key to differentiate between presets) -
enabled
withboolean
-
query_params
withjson
(the query that will be sent with the request) -
file_paths
withcsv
(the paths containing files from the result) -
sort
withinteger
to be used for sorting
-
- Create the following fields in
cf_cache_options
:-
cache_mode
withstring
(origin_priority
,cache_priority
,origin_only
,cache_only
) -
preset_requests
withOne to Many Relationship
onglobal_query_params
with a foreign key ofcf_cache_option
. - Continue in advanced field creation mode.
- Click on
Relationship
and set the sort field assort
to enable sorting. - Skip the configuration of other parameters and save.
-
- Head over to Settings > Data Model
- Click on the kebab menu of
global_query_params
. - Select Make Collection Hidden.
- Click on the kebab menu of
- Head over to Settings > Webhooks
- Create a new webhook and give it a name.
- Set the URL as your Cloudflare Worker webhook endpoint.
- Add a new request header
Secret
with your secret and copy this value somewhere. - Toggle all actions to be turned on (create, update, delete).
- Select the collections that you wish to cache including
Cf Cache Options
- Head over to Settings > Roles & Permissions
- Create a new role and uncheck
App Access
. - Allow
All Access
forRead
column of the tables you wish to cache includingcf_cache_options
- Create a new user, enter a secure token and copy this value somewhere.
- Save all changes.
- Create a new role and uncheck
- Head over to Content > Cf Cache Options and configure your required caching settings.
Demo
cf_cache_options
configurationDemo
preset_requests
configuration
Set up Cloudflare Pages
- Sign up for a Cloudflare Pages account.
- Create a new project, selecting the fork of
directus-cf-cache
in your GitHub account. - Set the build output directory as
dist
. - Set the root directory path as
app
. - Create the following environment variables:
-
VITE_DIRECTUS_CF_CACHE_URL
with your Cloudflare Worker URL such ashttps://directus-cf-cache.<your workers subdomain>.workers.dev
. - After the first build is completed, pause the Automatic git deployments.
- Add a new deploy hook, copy the Deploy hook URL somewhere.
Configure GitHub Actions
-
Open the forked GitHub project > Settings > Secrets.
-
Create the following repository secrets:
You may refer to .env.sample for sample values.
-
CLOUDFLARE_ACCOUNTID
with the Account ID. -
CLOUDFLARE_PAGES_WEBHOOK_URL
with the Deploy hook URL. -
CLOUDFLARE_TOKEN
with the API Key. -
CLOUDFLARE_ZONEID
with the Zone ID, empty string unless you are using a custom domain. -
DIRECTUS_ACCESS_TOKEN
with the token. -
DIRECTUS_CF_CACHE_KV
with the Namespace ID. -
DIRECTUS_SERVER_URL
with the root URL of your Directus instance. -
DIRECTUS_WEBHOOK_SECRET
with the secret. -
WORKER_ROUTES
with your custom domain or the workers.dev route.
-
-
Click on the Actions tab, manually run the workflows.
Upcoming Features
- Paging of
list
results to handle bigger datasets - Integration with Cloudflare R2 for assets storage
- Utilize Directus Flows instead of Webhooks for a "push" approach
- Cache management API to manage content stored in the KV cache
- Have an idea? Open a discussion!
Developed by licitdev
[^1]: Changes may take up to 60 seconds to propagate globally when the request is served from the KV cache instead of the origin https://developers.cloudflare.com/workers/learning/how-kv-works