This repository contains the public Sentinel documentation. A Sentinel SRE serves it through the fcms plane (file CMS). Staging uses https://sn-docs.dwp.solutions. Production uses https://docs.ndx-sentinel.com on a dedicated VM.
sentinel.yaml SRE root config (port 8290, default_kit: sn.docs)
sn.docs/
kit.yaml fcms kit (public, cms_full_html, 600s render cache)
ct/ Markdown source of truth — one .md per doc, frontmatter:
title, description, type, tags, status.
index.md is the public landing page (do not overwrite).
ct/README.md old-filename → slug mapping (MAP block, used by relink)
tp/ Go templates (docs.gohtml = render, home.gohtml = landing)
pb/ static assets (style.css, favicon.ico)
pg/home.yaml default-kit catch-all page at /
fl/ smoke tests (validated by `sentinel sre validate`)
tools/relink.py rewrites old relative doc links → /slug links
tools/bundle_docs.py OKF / NotebookLM sidecar (writes notebooklm/ only)
notebooklm/ generated index.md + sentinel-docs.md — not fcms content
sentinel harness start -p . -d --port 8290
curl http://127.0.0.1:8290/hl
# JSON: /fcms , /fcms/sn/docs/<slug>
# HTML: /fcms/render/sn/docs/docs/<slug>
# assets: /kt/sn/docs/pb/*- Create
sn.docs/ct/<slug>.md. - Add
title,description, and the required OKFtype. - Select
Overview,Guide,Reference, orPlaybookfor the type. - Add
tagsandstatus. - Add the slug to the sidebar in
sn.docs/tp/docs.gohtml. - Link the document from
index.md. - Regenerate the NotebookLM bundle:
python3 tools/bundle_docs.pyThe script writes notebooklm/index.md and notebooklm/sentinel-docs.md.
The public homepage is ct/index.md.
Never write generated output into ct/.
The harness file watcher detects ct/ changes without a reload.
Changes to kit.yaml, tp/, or pg/ need a kit reload or harness restart.
The kit reload endpoint is POST /hl/kt/sn/docs/rl.
The production VM runs the same SRE repository.
-
Checkout: Clone
github.com/ndx-au/sentinel-docsto the VM. Poll themainbranch. -
Harness: Start
sentinel harness start -p <repo> -d --port 8290. The harness binds0.0.0.0. Restrict the port so only the host reverse proxy can reach it. For a container proxy, permit its bridge network to reach the host process. -
public_url: Set
public_urlin the productionsentinel.yamltohttps://docs.ndx-sentinel.com. Keep the staging value separate through configuration for each host. If the harness supports an environment or configuration override, you can use that override. If a production override breaks staging, do not commit it tomain. -
Reverse proxy: Configure Caddy or an equivalent reverse proxy on the VM:
docs.ndx-sentinel.com { encode gzip handle /kt/sn/docs/pb/* { reverse_proxy 127.0.0.1:8290 } handle { rewrite * /fcms/render/sn/docs/docs{path} reverse_proxy 127.0.0.1:8290 } }Public requests use clean slugs. The reverse proxy maps
/getting-startedto/fcms/render/sn/docs/docs/getting-started. It does not expose the JSON API (/fcms/...,/cm/...). -
Deploy model: Use a Sentinel trigger and flow in this SRE to poll
main. After new commits, pullmain. The file watcher detectsct/changes. Afterkit.yaml/tp//pg/changes, reload the kit withPOST /hl/kt/sn/docs/rlor restart the harness. A future CI workflow can replace polling and request reloads when necessary. -
main protection: After production is operational, enable branch protection and a PR workflow.
- Point
sn-docs.dwp.solutionsat the staging host behind a private reverse proxy. - Configure TLS for that zone.
- Forward requests to
127.0.0.1:8290or the equivalent Docker host gateway. - Use the production rewrite rules above.