Skip to main content

Deployment

The docs site is a static Docusaurus app in apps/docs.

Local commands​

pnpm --filter @dealmeld/docs run validate:openapi
pnpm --filter @dealmeld/docs run build
pnpm --filter @dealmeld/docs run dev

Hosting target​

Deploy the docs app as a dedicated Coolify resource in the DealMeld production project/environment and point docs.dealmeld.io at it.

Use this Coolify resource contract:

SettingValue
Resource namedeammeld-docs
Projectks40wk8wwo4sogcw0ok8gs4c
Environmentsckswko8s4k0sw0osgkgs08c
RepositoryDigitalMeld/dealmeld
Production branchmaster
Build typeDockerfile
DockerfileDockerfile.docs
Exposed port80
Custom domaindocs.dealmeld.io

Keep the docs site separate from the main dealmeld.io app and API resources so docs deployments can be promoted, rolled back, and invalidated independently.

Dockerfile.docs builds the Docusaurus site from source and serves the generated static files with Nginx. Do not deploy ignored local apps/docs/build artifacts directly.

DNS​

Create the DNS record required by Coolify/Traefik for docs.dealmeld.io. Keep HTTPS forced at the edge.

Cache behavior​

  • Cache hashed assets aggressively.
  • Keep HTML cache TTL short enough to publish docs fixes quickly.
  • Invalidate the site after OpenAPI reference changes.

Security headers​

The API reference loads the exact Scalar standalone asset from jsDelivr with Subresource Integrity. Keep the pinned URL and sha384 value in src/pages/api-reference.tsx in sync when upgrading Scalar.

Deploy the docs site with the CSP emitted by docusaurus.config.ts and the Nginx response headers in apps/docs/nginx.conf. static/_headers is retained for compatibility with static-host platforms that use _headers files, but the production Coolify deployment uses the Nginx config in the docs container. Do not add broader script sources.

Build gates​

The docs build validates static/openapi/dealmeld.openapi.yaml before generating the static site. Broken OpenAPI should fail the docs build.

After deployment, smoke the public edge:

curl -fsS https://docs.dealmeld.io/ >/dev/null
curl -fsS https://docs.dealmeld.io/api-reference >/dev/null
curl -fsS https://docs.dealmeld.io/openapi/dealmeld.openapi.yaml >/dev/null
curl -fsSI https://docs.dealmeld.io/ | grep -i '^content-security-policy:'