nextagencyio / drupal-cloud-project
Decoupled Drupal template with GraphQL, OAuth, and Next.js integration for headless CMS development
Package info
github.com/nextagencyio/decoupled-project
Type:project
pkg:composer/nextagencyio/drupal-cloud-project
Requires
- composer/installers: ^2.3
- cweagans/composer-patches: ^2.0
- drupal/admin_toolbar: ^3.4
- drupal/admin_toolbar_tools: ^3.4
- drupal/core-composer-scaffold: ^11.2
- drupal/core-project-message: ^11.2
- drupal/core-recipe-unpack: ^11.2
- drupal/core-recommended: ^11.2
- drupal/decoupled_preview_iframe: dev-3543929-drupal-11-fixes
- drupal/default_content: ^2.0@alpha
- drupal/field_group: ^3.6
- drupal/gin: ^5.0
- drupal/gin_login: ^2.1
- drupal/gin_toolbar: ^3.0
- drupal/graphql: ^4.7
- drupal/graphql_compose: ^2.2
- drupal/paragraphs: ^1.18
- drupal/pathauto: ^1.13
- drupal/simple_oauth: 5.2.x-dev
- drush/drush: ^13.6
- nextagencyio/json_import: 1.x-dev
Conflicts
- dev-main
- v1.0.2
- v1.0.1
- v1.0.0
- dev-feat/full-stack-templates
- dev-feature/dc-chrome-header
- dev-test/simple-oauth-6x-graphql-5x
- dev-experiment/fly-provisioning
- dev-experiment/railway-parked
- dev-feature/content-creator-chatbot
- dev-feature/clean-profile
- dev-upsun
- dev-wodby
- dev-pantheon
- dev-feature/chatbot
This package is auto-updated.
Last update: 2026-04-24 17:24:14 UTC
README
Drupal 11 installation powering the headless backend for
decoupled.io. Custom dc_core install profile,
FrankenPHP-based Docker image, and a fly.toml for building + pushing
the image to Fly.io.
This repo is application code only. Provisioning of Fly tenant apps —
the orchestration that spins up a new Drupal site per customer — lives in
the decoupled-dashboard
repo under scripts/fly/. If you're looking for bin/provision-tenant.sh,
it moved there.
Stack
- Drupal 11 on PHP 8.5
- FrankenPHP (Caddy + PHP worker mode) — Dockerfile + Caddyfile in repo root
- PostgreSQL (Drupal runs on Postgres via
settings.platform.php) - APCu for hot cache bins via Drupal's chainedfast backend
- dc_core install profile (see
web/profiles/dc_core/)- Custom modules:
dc_chatbot,dc_config,dc_import,dc_mail,dc_puck,dc_revalidate - GraphQL Compose for headless API
- OAuth consumers auto-generated per install via
hook_install()
- Custom modules:
Local development
DDEV-based local dev (see .ddev/config.yaml):
ddev start ddev composer install ddev drush site:install dc_core -y
Building the Fly image
Every tenant on Fly pulls its image from the decoupled-drupal-frankenphp
Fly app's registry. To ship a new image:
fly deploy
This builds the FrankenPHP image on Fly's builder, pushes it to
registry.fly.io/decoupled-drupal-frankenphp, and redeploys the source app.
New tenants provisioned after this automatically pick up the new image
(the dashboard's provisioner resolves the current tag at create time).
Rolling the image out to existing tenants is the dashboard's
fly-fleet-deploy.yml GitHub Action — it loops over every tenant-* app
and fly deploys them against the new tag. Run from the dashboard repo.
Repository structure
Dockerfile FrankenPHP build
Caddyfile Caddy config (serves /app/web)
frankenphp-worker.php FrankenPHP worker bootstrap
fly.toml Fly config for the source app
composer.json Drupal + contrib dependencies
docker/
├── apcu.ini Enables APCu (shipped disabled in the image)
└── drupal-settings.php Committed settings.php shim
web/
├── profiles/
│ └── dc_core/ Install profile + custom modules
├── sites/
│ └── default/
│ ├── settings.platform.php Reads DATABASE_URL / HASH_SALT from env
│ └── settings.platformsh.php (legacy, unused on Fly)
└── ...
Requirements
- PHP 8.3+ (or DDEV, which brings its own). Production images run PHP 8.5 via
dunglas/frankenphp:1-php8.5. - Composer 2
flyctlfor deploying the source image to Fly- Drupal 11
License
GPL-2.0-or-later (same as Drupal core).