Documentation

Provider Integrations

How to configure domain ownership, wildcard contributor DNS, Postmark email, Stripe Checkout, Google Search Console, and IndexNow for a reusable DesertCMS install.

Source: PROVIDER_INTEGRATIONS.md

DesertCMS is designed to be installed for any site owner, not only for one production domain. A reusable install has three layers of setup:

  • Server config controls the canonical master domain and filesystem paths.
  • Admin settings control site identity, contributor onboarding, email, shop pricing, and indexing.
  • External provider accounts control DNS, transactional email verification, payments, and search-console access.

Master Domain

The canonical master domain is site_url in /etc/desertcms.conf:

site_name = DesertCMS
site_url = https://example.com
public_root = /var/www/htdocs/desertcms-site

The installer writes site_url from the domain entered during setup and asks for the public root directory name under /var/www/htdocs. Automated installs can pass --public-root-name example-site. Public URLs, canonical links, sitemap URLs, Google OAuth callback URLs, IndexNow key location, shop callback URLs, contributor invite links, and password reset links are all based on site_url.

Admin Settings > Site Settings controls the public site name, logo, favicon, homepage, SEO defaults, indexing credentials, and themes. It does not rewrite the server's canonical host. Change site_url in the instance config when the domain changes, then rebuild.

DNS

For the master site, point the apex domain at the server:

A      @      <server IPv4>
AAAA   @      <server IPv6>      # optional
CNAME  www    example.com        # optional

For contributor sites, set Admin Settings > Contributors > Contributor domain root to the parent domain, usually the same host as site_url:

example.com

Then add wildcard DNS at the authoritative DNS provider:

A      *      <server IPv4>
AAAA   *      <server IPv6>      # optional

Wildcard DNS lets alexs.example.com, jordanr.example.com, and future contributor subdomains resolve without manually adding each record. DesertCMS still issues and serves normal per-host TLS certificates through acme-client; the wildcard DNS is for routing, not a wildcard certificate.

Postmark

Postmark is used for transactional email:

  • contributor invitations
  • contributor request received notifications
  • approval and denial emails
  • contributor site password setup emails
  • access grant emails
  • admin password reset emails

Configure it in Admin Settings > Contributors:

Send email: verified-sender@example.com
Receiving email for contributor requests: review@example.com
Postmark server token: <server token>

The sender must be verified in Postmark for the domain. Contributor sites inherit the master Postmark sender and token during provisioning so password setup and future reset emails can be sent from the contributor site's admin flow.

Stripe

Stripe is used only by the Shop module. Enable and configure it in Admin Settings > Modules > Shop:

Stripe secret key: sk_live_...
Stripe webhook secret: whsec_...
Webhook tolerance: 300

The standard shop lives on the master domain at:

https://example.com/shop

Configure the Stripe webhook endpoint as:

https://example.com/shop/stripe/webhook

The shop creates Stripe Checkout Sessions and records Stripe webhook event IDs to prevent duplicate fulfillment. A full-rights purchase marks the order paid, records the full-rights sale, disables every rights option for that listing, and removes it from the public catalog.

Stripe settings are per CMS instance. Contributor sites do not receive the master Stripe keys automatically; configure a contributor site's Shop settings separately only if that contributor site should sell through its own Stripe account.

Google Search Console

Google Search Console submission lives in Admin Settings > Site Settings > Indexing.

Create a Google OAuth web client for the site owner and add this redirect URI:

https://example.com/admin/site-settings/google/callback

Then save these fields in DesertCMS:

OAuth client ID
OAuth client secret
Search Console property

The property should match the site added in Search Console, commonly:

https://example.com/

After saving, click Connect Google account. The connected Google account must have access to that Search Console property. Rebuild and submit sends the current sitemap URL to Google Search Console.

Google Search Console tokens are stored in the local settings table for that CMS instance. Contributor sites need their own Google Search Console connection if they should submit their own sitemap independently.

IndexNow

IndexNow is configured in Admin Settings > Site Settings > Indexing.

Enable IndexNow and leave the key blank to let DesertCMS generate one. On submission, DesertCMS:

  • writes <key>.txt to the public root
  • reads public URLs from sitemap.xml
  • sends the host, key, key location, and URL list to the IndexNow endpoint
  • records the submission status in site settings

IndexNow uses the configured site_url host for the submission payload. Contributor sites need their own IndexNow key and submission if they should submit independently.

Instance Boundaries

Settings are intentionally per CMS instance:

  • Master site: owns contributor request review, contributor site lifecycle, master Gallery and Posts surfacing, and its own shop/search settings.
  • Contributor site: owns its own pages, posts, media originals, public derivatives, sessions, admins, SEO settings, IndexNow settings, and optional shop settings.
  • Shared application code: /usr/local/www/desertcms/.
  • Separate configs and databases: /etc/desertcms.conf, /etc/desertcms-<site>.conf, /var/desertcms/, and /var/desertcms-sites/<site>/.

The root workers apply system-level changes. The admin CGI queues work but does not directly write root-owned httpd, acme-client, or /etc/desertcms-<site>.conf files.

Use Admin Settings > Master Control after provider setup. It gives the reusable-install operator a single view of contributor subCMS health, provider readiness, queue failures, generated paths, backups, DNS, TLS certificate visibility, and the shared DesertCMS version running across the fleet. Queue rows include job review links with worker step logs and retry controls for failed provisioning.

For migrated or manually registered contributor sites, Master Control includes admin repair actions. Repair stored paths fills empty OpenBSD-standard config/data/public path fields, and Create missing backups creates first backups for sites that do not already have one.

Do not register another standalone master domain as a contributor site. On a shared VPS, keep additional master instances in separate configs and list them in the primary config:

standalone_master_configs = /etc/desertcms-desertcms.conf

Contributor sites are strict subdomains of the configured contributor root. For example, with contributor_domain_root = desertarchives.com, kaleb.desertarchives.com is a contributor subCMS and desertcms.com is not.

Launch Checklist

  • site_url points at the master domain in /etc/desertcms.conf.
  • DNS apex A/AAAA records point at the server.
  • Optional www alias resolves to the same server before enabling it.
  • Contributor domain root is saved in Admin Settings > Contributors.
  • Wildcard DNS points *.<root> at the server for automatic contributor subdomains.
  • Postmark sender is verified and the server token is saved.
  • Stripe keys and webhook secret are saved only for shop-enabled instances.
  • Stripe webhook endpoint is https://<domain>/shop/stripe/webhook.
  • Google OAuth redirect URI is https://<domain>/admin/site-settings/google/callback.
  • Google Search Console property matches the canonical site URL.
  • IndexNow is enabled for each site that should submit its sitemap.
  • Root cron workers are installed for contributor site queue and CMS upgrades.
  • Admin Settings > Master Control shows no unresolved queue, path, backup, DNS, or TLS alerts for launch-critical contributor sites.

Provider References

  • Google Search Console API sitemap submission: <https://developers.google.com/webmaster-tools/v1/sitemaps/submit>
  • Stripe Checkout Sessions API: <https://docs.stripe.com/api/checkout/sessions/create>
  • Stripe webhook signature verification: <https://docs.stripe.com/webhooks/signature>
  • Postmark email API: <https://postmarkapp.com/developer/api/email-api>
  • IndexNow API: <https://www.indexnow.org/documentation>