diff --git a/.gitignore b/.gitignore index 5ff8172..cbf84ae 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,5 @@ _site/ -_docs/ +_docs/* assets/external-docs/ .external-docs/ .sass-cache/ diff --git a/Dockerfile b/Dockerfile index e07803c..3b8067a 100644 --- a/Dockerfile +++ b/Dockerfile @@ -6,9 +6,11 @@ WORKDIR /srv/content USER root ENV BUNDLE_PATH=/srv/bundle -RUN apk add --no-cache python3 bash \ - && mkdir -p /srv/bundle && \ - chmod -R 777 /srv/bundle +RUN apt-get update && apt-get install -y --no-install-recommends \ + python3 bash \ + && rm -rf /var/lib/apt/lists/* \ + && mkdir -p /srv/bundle \ + && chmod -R 777 /srv/bundle # Keep container running root for gem installation and avoid permission issues -# Scripts will handle gem install automatically +# Scripts will handle gem install automatically \ No newline at end of file diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..1ad27db --- /dev/null +++ b/Makefile @@ -0,0 +1,48 @@ +COMPOSE_FILE := ./docker-compose.yaml +CONTAINER := anylog-docs + +# Directory to mount as the documentation source. +# Override on the command line, e.g.: +# make up LOCAL_DOCS=/path/to/docs +LOCAL_DOCS ?= . + +.PHONY: up logs down clean check-dir help + +.DEFAULT_GOAL := help + +help: + @echo "Usage: make [target] [LOCAL_DOCS=/path/to/docs]" + @echo "" + @echo "Targets:" + @echo " up Start the docs container (docker compose up -d)" + @echo " logs Follow logs for the $(CONTAINER) container" + @echo " down Stop the docs container (docker compose down)" + @echo " clean Stop and remove containers, volumes, and images" + @echo " help Show this message" + @echo "" + @echo "LOCAL_DOCS defaults to '.' and sets the mounted documentation directory." + +# Validate LOCAL_DOCS exists before doing anything, unless it's "." +check-dir: + @if [ "$(LOCAL_DOCS)" != "." ] && [ ! -d "$(LOCAL_DOCS)" ]; then \ + echo "Failed to locate Docker directory: $(LOCAL_DOCS)"; \ + exit 1; \ + fi + +up: check-dir + LOCAL_DOCS=$(LOCAL_DOCS) docker compose -f $(COMPOSE_FILE) up --build -d + +logs: + docker logs -f $(CONTAINER) + +down: check-dir + LOCAL_DOCS=$(LOCAL_DOCS) docker compose -f $(COMPOSE_FILE) down + +clean: check-dir + LOCAL_DOCS=$(LOCAL_DOCS) docker compose -f $(COMPOSE_FILE) down -v --rmi all + +# Catch-all: anything that isn't a defined target is an invalid option +%: + @echo "Invalid option: $@" + @$(MAKE) --no-print-directory help + @exit 1 \ No newline at end of file diff --git a/README.md b/README.md index 7988b0d..9a665b2 100644 --- a/README.md +++ b/README.md @@ -1,103 +1,82 @@ # AnyLog Docs -This is the technical documentation for [AnyLog Edge Data Fabric](https://www.anylog.network/), built with Jekyll and hosted on GitHub Pages. +This is the technical documentation for [AnyLog Edge Data Fabric](https://www.anylog.network/), built with Jekyll and +hosted on GitHub Pages. ---- +This repository is the **backend** — it builds and serves the documentation site. The actual documentation content lives +in a separate repository; see [Documentation Source](#documentation-source) below. -## Goal - -We decided to Provide the documentation via a website at **https://anylog.network/docs** using Jekyll (same theme as OpenHorizon), replacing raw GitHub repo access with a structured, navigable site comparable to EdgeX or ReadTheDocs. - ---- +**Goal**: We decided to provide the documentation via a website at **https://anylog.network/docs** using Jekyll (same +theme as OpenHorizon), replacing raw GitHub repo access with a structured, navigable site comparable to EdgeX or +ReadTheDocs. -## Documentation Source +**Reference**: Source Repositories -Documentation content is sourced from the public -AnyLog-co/documentation -repository on the `main` branch. +| Repo | Default Branch | Purpose | +|---|---|---| +| [AnyLog-co/documentation](https://github.com/AnyLog-co/documentation) | main | Documentation content — source of truth, synced into this site | +| [AnyLog-co/anylog-docs.github.io](https://github.com/AnyLog-co/anylog-docs.github.io) | main | This repo — the Jekyll backend that builds and serves the site | -Do not edit generated Markdown files in `_docs/` in this repository. The Jekyll build runs -`.github/scripts/sync_external_docs.py`, which clones `AnyLog-co/documentation`, converts every upstream `.md` -file into a Jekyll collection page, copies supporting assets into `assets/external-docs/`, and regenerates the sidebar -navigation. -The GitHub Pages workflow rebuilds on pushes and pull requests in this repository, manual workflow dispatch, an hourly -schedule, and `repository_dispatch` events of type `documentation-updated`. +--- -For immediate publishing when `AnyLog-co/documentation` changes, add a workflow in that repository that sends a -`repository_dispatch` event to this repository after pushes to `main`. Without that dispatch, the scheduled rebuild -will still pick up upstream changes within the next hourly run. +## Quick Start (Local Deployment) ---- +1. Make sure you have `make`, `docker`, and `docker compose` installed. +2. Clone this repo (the backend) and the [content repository](https://github.com/AnyLog-co/documentation). +3. From this repo, start the docs locally, pointing `LOCAL_DOCS` at your local clone of the content repo: -## Contributing +```shell +make up LOCAL_DOCS=${PATH to documentation} -This documentation is implementing a change control process. Therefore the repository follows a **PR-based workflow** -Documentation changes are managed through pull requests against the `main` branch, which is the branch viewed when accessing the documentation URL (see above). +# Example +make up LOCAL_DOCS=/mnt/c/Users/oshad/AnyLog-docs/documentation +``` -**Required actions :** -- Find the file you want to update and fork it from `main` (or create a new file) -- IF you work locally - 1. Make sure your local copy is in sync with `main`: - ```bash - git fetch origin - git rebase origin/main - ``` - 2. Create a feature branch or fork the file, make your changes, then open a pull request **against `main`** +4. Open **http://localhost:4000** in your browser. Edits to files under `LOCAL_DOCS` are picked up live — no restart +needed. -- once edited, create a **pull request** for review and inclusion at the next update cycle +5. When you're done: -*note:* direct pushes to `main` are blocked -*note2:* GitHub Pages builds and publishes automatically once the PR is merged +```shell +make down +``` ---- - -## Reference : Source repositories - -| Repo | Purpose | Status | -|---|---|---| -| **https://github.com/AnyLog-co/documentation** | Old docs — ~279 files, comprehensive but unorganised, not a website | Source of truth for migration | -| **EdgeLake documentation site** | Ori's first Jekyll attempt — limited, semi-organised | To be deprecated | -| **https://github.com/AnyLog-co/anylog-docs.github.io** (branch: `main`) | New Jekyll site — active development | Work in progress | +> If `LOCAL_DOCS` is omitted, it defaults to `.` (this repo itself) — you almost always want to point it at your content +> repo clone instead. --- -## Adding or Updating Content - -### 1. Create or edit a page +## Maintaining the Backend -Documentation pages live in the upstream `AnyLog-co/documentation` repository. Create a new Markdown file or edit an existing one there: +This repo wraps a small Docker setup with a `Makefile` for convenience. The three pieces: -``` -/.md -``` +**`Makefile`** — the entry point for local development. -The sync script adds Jekyll front matter automatically. Page titles can still come from upstream front matter or headings, but the left sidebar label is always the Markdown filename without the `.md` extension. +| Target | What it does | +|---|---| +| `up` | `docker compose up --build -d` — builds and starts the container | +| `down` | `docker compose down` — stops the container | +| `logs` | `docker logs -f anylog-docs` — follows the container's logs | +| `clean` | `docker compose down -v --rmi all` — stops the container and removes its volumes and images | +| `help` | Prints usage (also the default target if you just run `make`) | -If you do add front matter upstream, this site recognizes the `title` and `description` fields: +All targets accept `LOCAL_DOCS=`. `up`, `down`, and `clean` validate that the path exists before doing anything (unless it's left at the default `.`). -```yaml ---- -title: Introduction to AnyLog -description: Understanding AnyLog's architecture, node types, and core concepts. -layout: page ---- - -``` -Evey file **must** contain a header change log so when reading it one knows when changed / who did it / what date and Anylog version, use this table format -| Date of change | Relevant Anylog code version | Author | Description | -|---|---|---|---| -| - | - | - | Documentation Copyright Anylog.co 2026 | -| 2026-04-19 | All | Eric Aquaronne | update readme for Anylog | +**`docker-compose.yaml`** — defines a single `docs` service, built from the local `Dockerfile`: +- Exposes port `4000` (the Jekyll site) and `35729` (LiveReload). +- Runs `.github/scripts/dev-start.sh` as its startup command. +- Mounts `${LOCAL_DOCS:-.}` to `/srv/documentation` (the content source) and this repo to `/srv/content` (the Jekyll site itself), both `cached` for performance. +- Persists Bundler's gem cache in a named volume (`bundle-cache`) mounted at `/srv/bundle`, so `bundle install` doesn't rerun from scratch on every rebuild. +**`Dockerfile`** — built on `jekyll/jekyll:4`, with `python3` and `bash` installed for the repo's helper scripts. It +runs as `root` to avoid gem-install and bundle permission issues; `BUNDLE_PATH` is set to `/srv/bundle` to match +the compose volume above. -### 2. Register it in the navigation +### Navigation / Sidebar Generation -Navigation is generated from the synced upstream files. The left sidebar section title is the folder that contains the Markdown file; root-level Markdown files are grouped under `Documentation`. +Navigation is generated from the synced upstream files. The left sidebar section title is the folder that contains the +Markdown file; root-level Markdown files are grouped under `Documentation`. `.github/scripts/navigation.py` is now only used for optional ordering overrides for known slugs: @@ -112,121 +91,36 @@ ITEM_ORDER = { } ``` -The slug is the synced path without the `.md` extension after the sync script normalizes spaces and punctuation. The sidebar display name is the synced filename without `.md`. The order of slugs within each section controls the order they appear in the sidebar. - -`navigation.py` is consumed by `validate_docs.py`, which scans the generated `_docs/` directory and writes the `nav` block in `_config.yml`. This runs automatically on `docker compose up` and in GitHub Actions — you do not need to invoke it manually. - ---- - -## Editing/Writing Guidelines - -- **Use absolute permalink paths** for links between doc pages — Jekyll builds each page at `/docs/
//` regardless of which folder the source file is in, so relative paths will break: -```markdown - [Install](/docs/getting-started/installing-anylog/) - [Background Services](/docs/network-services/background-services/#rest-service) -``` - The slug is always the filename without `.md`, lowercased, under its section directory name (also lowercased with hyphens). -- **External links** must open in a new tab: -```html - Link text -``` -- Keep front matter `description` to a single sentence — it appears as the subtitle under the page title -- Keep to short sentences, add drawings/pics (PNG files) to make it easy to understand for readers that probably will be more OT than IT skills base - ---- - -- The title at the top is also used as the page title, there's no need for double title -**Example**: How not to define the Makefile -```markdown ---- -title: Introduction to AnyLog -description: Understanding AnyLog's architecture, node types, and core concepts. -layout: page ---- - -# Introduction to AnyLog -[content] -``` - ---- - -## Leveraging Claude LLM to Update a Doc Page - -A reliable pattern for getting Claude to rewrite or update a page while keeping it consistent with the rest of the docs: - -1. Provide the **raw GitHub URL** of the file to update — in GitHub, open the file and click **Raw**, then copy the address bar URL -2. Provide the **raw GitHub URL** of an existing page whose layout you want the output to match -3. Include the required front matter block in your prompt -4. Ask Claude to rewrite the first file to match the structure and style of the second +The slug is the synced path without the `.md` extension after the sync script normalizes spaces and punctuation. The +sidebar display name is the synced filename without `.md`. The order of slugs within each section controls the order +they appear in the sidebar. -Keep the prompt substantive — include at least a short paragraph describing the intent and audience for each major section you want changed, not just bullet points. The more context you give about tone, audience, and structure, the better the result. +`navigation.py` is consumed by `validate_docs.py`, which scans the generated `_docs/` directory and writes the `nav` +block in `_config.yml`. This runs automatically on `docker compose up` and in GitHub Actions — you do not need to +invoke it manually. -### Sample prompt +### Running Without Make -The following is a real example using `remote-gui.md`. Copy and adapt it for any page you want to update. - ---- - -> I need you to update the AnyLog documentation page for the Remote GUI. -> -> **File to update (raw URL):** -> `https://raw.githubusercontent.com/AnyLog-co/anylog-docs.github.io/refs/heads/main/_docs/Tools-UI/remote-gui.md` -> -> **Example file to match in style and structure (raw URL):** -> `https://raw.githubusercontent.com/AnyLog-co/anylog-docs.github.io/refs/heads/main/_docs/Getting-Started/getting-started.md` -> -> **Required front matter — keep this exactly at the top of the file:** -> ```yaml -> --- -> title: Remote GUI -> description: Architecture and developer reference for the AnyLog Remote GUI. -> layout: page -> --- -> ``` -> -> **What to change:** -> -> The current page reads like internal notes — it's dense and assumes the reader already knows the codebase. Rewrite it so a new developer joining the project can follow it from top to bottom. The architecture diagram and key terminology table are good and should stay, but the surrounding prose needs more context. -> -> The "Running locally" section currently has two terminal blocks with commands that aren't explained — add a sentence before each block describing what it does and why. The `uvicorn` command in particular looks like it may have a path issue (`CLI.local-cli-backend.main:app` uses dots but the `cd` above already entered the subdirectory); please flag that or correct it. -> -> The "Plugin system" section is the most important part for contributors — expand the intro paragraph to explain *when* someone would want to build a plugin versus modifying a core feature. Keep the code examples as-is. -> -> Use absolute permalink paths for links to other pages in `_docs/` — e.g. `/docs/network-services/background-services/`. Any link to an external repo or external site should use `` format. Do not change any section headings — the navigation relies on them. - ---- - -Adjust the URLs, front matter, and the description of changes to match whatever page you are working on. - ---- - - - -## Local Development with Docker - -The easiest way to preview the docs locally is via Docker — no Ruby or Jekyll installation required. - -**Prerequisites:** [Docker](https://docs.docker.com/get-docker/) and [Docker Compose](https://docs.docker.com/compose/install/) +You can drive Docker Compose directly instead of going through `make`: ```bash git clone https://github.com/AnyLog-co/anylog-docs.github.io.git cd anylog-docs.github.io -docker compose up -d -``` -Once running, open your browser to **http://localhost:4000**. +LOCAL_DOCS=/path/to/AnyLog-co/documentation docker compose up --build -d +``` -The container mounts your local `_docs/` directory, so edits are reflected live — no restart needed. To stop: +Open **http://localhost:4000**. To stop: ```bash docker compose down ``` -**Troubleshooting:** If the container exits immediately with a bundle write permissions error (`There was an error while trying to write to /srv/bundle`), run: +> Don't skip `LOCAL_DOCS` here — without it, the compose file falls back to mounting the current directory (this repo) +> as the documentation source, which has no content to render. + +**Troubleshooting:** If the container exits immediately with a bundle write-permissions error (`There was an error +while trying to write to /srv/bundle`), clear the cached volume and retry: ```bash docker compose down -v @@ -235,7 +129,7 @@ docker compose up -d The `-v` flag removes the cached volume so it gets recreated with the correct permissions. -## Local Mac Development +### Local Mac Development Use the local launcher when you want to run Jekyll directly on macOS without Docker: @@ -259,3 +153,57 @@ Or let the launcher install Homebrew Ruby 3.3: ```bash python3 scripts/dev.py --install-ruby ``` + +--- + +## Documentation Source + +Documentation content is sourced from the public +AnyLog-co/documentation +repository on the `main` branch. + +Do not edit generated Markdown files in `_docs/` in this repository. The Jekyll build runs +`.github/scripts/sync_external_docs.py`, which clones `AnyLog-co/documentation`, converts every upstream `.md` +file into a Jekyll collection page, copies supporting assets into `assets/external-docs/`, and regenerates the sidebar +navigation. + +The GitHub Pages workflow rebuilds on pushes and pull requests in this repository, manual workflow dispatch, an hourly +schedule, and `repository_dispatch` events of type `documentation-updated`. + +For immediate publishing when `AnyLog-co/documentation` changes, add a workflow in that repository that sends a +`repository_dispatch` event to this repository after pushes to `main`. Without that dispatch, the scheduled rebuild +will still pick up upstream changes within the next hourly run. + +**Editing documentation content itself — creating or updating pages, front matter, page IDs, and formatting +conventions — happens in the content repo, not here:** +- Content repo: [AnyLog-co/documentation](https://github.com/AnyLog-co/documentation) +- How to update documentation: [HOWTO.md](https://github.com/AnyLog-co/documentation/blob/os-dev/HOWTO.md) + +--- + +## Contributing + +Changes to **this repository** (the Jekyll backend itself — templates, build scripts, `Makefile`, CI config, etc.) +follow the same staged workflow as the content repo: this repository is implementing a change control process, so it +follows a **PR-based workflow** against the **`pre-develop`** branch, not `main`. `main` is the published branch +backing the live documentation URL (see [Documentation Source](#documentation-source)); changes land there once +`pre-develop` is promoted to `main`. + +**Required actions:** +- Find the file you want to update and branch/fork it from `pre-develop` (or create a new file) +- If you work locally: + 1. Make sure your local copy is in sync with `pre-develop`: + ```bash + git fetch origin + git rebase origin/pre-develop + ``` + 2. Create a feature branch or fork the file, make your changes, then open a pull request **against `pre-develop`** + +- Once edited, create a **pull request** for review and inclusion at the next update cycle + +*Note:* direct pushes to `pre-develop` are blocked. +*Note 2:* merging into `pre-develop` does not publish immediately — the live site rebuilds once `pre-develop` is +promoted to `main`. + +> Content authoring conventions (page creation, front matter, permalinks, image paths) live in the content repo's +> [HOWTO.md](https://github.com/AnyLog-co/documentation/blob/os-dev/HOWTO.md), not in this repository. \ No newline at end of file diff --git a/_config.yml b/_config.yml index c8aedf7..b0e85d2 100644 --- a/_config.yml +++ b/_config.yml @@ -216,156 +216,170 @@ nav: url: "/docs/04-southbound-interfaces/01-southbound-interfaces/" file: "04-southbound-interfaces/01-southbound-interfaces.md" source_path: "04- Southbound Interfaces/01- Southbound Interfaces.md" + - kind: "page" + title: "Mapping Policy" + match_path: "/docs/04-southbound-interfaces/02-mapping-policy/" + slug: "04-southbound-interfaces/02-mapping-policy" + url: "/docs/04-southbound-interfaces/02-mapping-policy/" + file: "04-southbound-interfaces/02-mapping-policy.md" + source_path: "04- Southbound Interfaces/02- Mapping Policy.md" - kind: "section" title: "Direct Connectors" - match_path: "/docs/04-southbound-interfaces/02-direct-connectors/" + match_path: "/docs/04-southbound-interfaces/03-direct-connectors/" children: - kind: "page" title: "REST" - match_path: "/docs/04-southbound-interfaces/02-direct-connectors/01-rest/" - slug: "04-southbound-interfaces/02-direct-connectors/01-rest" - url: "/docs/04-southbound-interfaces/02-direct-connectors/01-rest/" - file: "04-southbound-interfaces/02-direct-connectors/01-rest.md" - source_path: "04- Southbound Interfaces/02- Direct Connectors/01- REST.md" + match_path: "/docs/04-southbound-interfaces/03-direct-connectors/01-rest/" + slug: "04-southbound-interfaces/03-direct-connectors/01-rest" + url: "/docs/04-southbound-interfaces/03-direct-connectors/01-rest/" + file: "04-southbound-interfaces/03-direct-connectors/01-rest.md" + source_path: "04- Southbound Interfaces/03- Direct Connectors/01- REST.md" - kind: "page" title: "Message Broker" - match_path: "/docs/04-southbound-interfaces/02-direct-connectors/02-message-broker/" - slug: "04-southbound-interfaces/02-direct-connectors/02-message-broker" - url: "/docs/04-southbound-interfaces/02-direct-connectors/02-message-broker/" - file: "04-southbound-interfaces/02-direct-connectors/02-message-broker.md" - source_path: "04- Southbound Interfaces/02- Direct Connectors/02- Message Broker.md" + match_path: "/docs/04-southbound-interfaces/03-direct-connectors/02-message-broker/" + slug: "04-southbound-interfaces/03-direct-connectors/02-message-broker" + url: "/docs/04-southbound-interfaces/03-direct-connectors/02-message-broker/" + file: "04-southbound-interfaces/03-direct-connectors/02-message-broker.md" + source_path: "04- Southbound Interfaces/03- Direct Connectors/02- Message Broker.md" - kind: "section" title: "Industrial Connectors" - match_path: "/docs/04-southbound-interfaces/03-industrial-connectors/" + match_path: "/docs/04-southbound-interfaces/04-industrial-connectors/" children: + - kind: "page" + title: "PLC Mapping" + match_path: "/docs/04-southbound-interfaces/04-industrial-connectors/01-plc-mapping/" + slug: "04-southbound-interfaces/04-industrial-connectors/01-plc-mapping" + url: "/docs/04-southbound-interfaces/04-industrial-connectors/01-plc-mapping/" + file: "04-southbound-interfaces/04-industrial-connectors/01-plc-mapping.md" + source_path: "04- Southbound Interfaces/04- Industrial Connectors/01- PLC Mapping.md" - kind: "page" title: "Modbus" - match_path: "/docs/04-southbound-interfaces/03-industrial-connectors/01-modbus/" - slug: "04-southbound-interfaces/03-industrial-connectors/01-modbus" - url: "/docs/04-southbound-interfaces/03-industrial-connectors/01-modbus/" - file: "04-southbound-interfaces/03-industrial-connectors/01-modbus.md" - source_path: "04- Southbound Interfaces/03- Industrial Connectors/01- Modbus.md" + match_path: "/docs/04-southbound-interfaces/04-industrial-connectors/02-modbus/" + slug: "04-southbound-interfaces/04-industrial-connectors/02-modbus" + url: "/docs/04-southbound-interfaces/04-industrial-connectors/02-modbus/" + file: "04-southbound-interfaces/04-industrial-connectors/02-modbus.md" + source_path: "04- Southbound Interfaces/04- Industrial Connectors/02- Modbus.md" - kind: "page" title: "OPC-UA" - match_path: "/docs/04-southbound-interfaces/03-industrial-connectors/02-opc-ua/" - slug: "04-southbound-interfaces/03-industrial-connectors/02-opc-ua" - url: "/docs/04-southbound-interfaces/03-industrial-connectors/02-opc-ua/" - file: "04-southbound-interfaces/03-industrial-connectors/02-opc-ua.md" - source_path: "04- Southbound Interfaces/03- Industrial Connectors/02- OPC-UA.md" + match_path: "/docs/04-southbound-interfaces/04-industrial-connectors/03-opc-ua/" + slug: "04-southbound-interfaces/04-industrial-connectors/03-opc-ua" + url: "/docs/04-southbound-interfaces/04-industrial-connectors/03-opc-ua/" + file: "04-southbound-interfaces/04-industrial-connectors/03-opc-ua.md" + source_path: "04- Southbound Interfaces/04- Industrial Connectors/03- OPC-UA.md" - kind: "page" title: "EtherIP" - match_path: "/docs/04-southbound-interfaces/03-industrial-connectors/03-etherip/" - slug: "04-southbound-interfaces/03-industrial-connectors/03-etherip" - url: "/docs/04-southbound-interfaces/03-industrial-connectors/03-etherip/" - file: "04-southbound-interfaces/03-industrial-connectors/03-etherip.md" - source_path: "04- Southbound Interfaces/03- Industrial Connectors/03- EtherIP.md" + match_path: "/docs/04-southbound-interfaces/04-industrial-connectors/04-etherip/" + slug: "04-southbound-interfaces/04-industrial-connectors/04-etherip" + url: "/docs/04-southbound-interfaces/04-industrial-connectors/04-etherip/" + file: "04-southbound-interfaces/04-industrial-connectors/04-etherip.md" + source_path: "04- Southbound Interfaces/04- Industrial Connectors/04- EtherIP.md" - kind: "page" title: "DNP3" - match_path: "/docs/04-southbound-interfaces/03-industrial-connectors/04-dnp3/" - slug: "04-southbound-interfaces/03-industrial-connectors/04-dnp3" - url: "/docs/04-southbound-interfaces/03-industrial-connectors/04-dnp3/" - file: "04-southbound-interfaces/03-industrial-connectors/04-dnp3.md" - source_path: "04- Southbound Interfaces/03- Industrial Connectors/04- DNP3.md" + match_path: "/docs/04-southbound-interfaces/04-industrial-connectors/05-dnp3/" + slug: "04-southbound-interfaces/04-industrial-connectors/05-dnp3" + url: "/docs/04-southbound-interfaces/04-industrial-connectors/05-dnp3/" + file: "04-southbound-interfaces/04-industrial-connectors/05-dnp3.md" + source_path: "04- Southbound Interfaces/04- Industrial Connectors/05- DNP3.md" - kind: "section" title: "DNP3" - match_path: "/docs/04-southbound-interfaces/03-industrial-connectors/04-1-dnp3/" + match_path: "/docs/04-southbound-interfaces/04-industrial-connectors/05-1-dnp3/" children: - kind: "page" title: "DNP3 - Deploying Connector via Script" - match_path: "/docs/04-southbound-interfaces/03-industrial-connectors/04-1-dnp3/01-dnp3-deploying-connector-via-script/" - slug: "04-southbound-interfaces/03-industrial-connectors/04-1-dnp3/01-dnp3-deploying-connector-via-script" - url: "/docs/04-southbound-interfaces/03-industrial-connectors/04-1-dnp3/01-dnp3-deploying-connector-via-script/" - file: "04-southbound-interfaces/03-industrial-connectors/04-1-dnp3/01-dnp3-deploying-connector-via-script.md" - source_path: "04- Southbound Interfaces/03- Industrial Connectors/04-1 DNP3/01- DNP3 - Deploying Connector via Script.md" + match_path: "/docs/04-southbound-interfaces/04-industrial-connectors/05-1-dnp3/01-dnp3-deploying-connector-via-script/" + slug: "04-southbound-interfaces/04-industrial-connectors/05-1-dnp3/01-dnp3-deploying-connector-via-script" + url: "/docs/04-southbound-interfaces/04-industrial-connectors/05-1-dnp3/01-dnp3-deploying-connector-via-script/" + file: "04-southbound-interfaces/04-industrial-connectors/05-1-dnp3/01-dnp3-deploying-connector-via-script.md" + source_path: "04- Southbound Interfaces/04- Industrial Connectors/05-1 DNP3/01- DNP3 - Deploying Connector via Script.md" - kind: "page" title: "DNP3 - Mapping-Policies" - match_path: "/docs/04-southbound-interfaces/03-industrial-connectors/04-1-dnp3/02-dnp3-mapping-policies/" - slug: "04-southbound-interfaces/03-industrial-connectors/04-1-dnp3/02-dnp3-mapping-policies" - url: "/docs/04-southbound-interfaces/03-industrial-connectors/04-1-dnp3/02-dnp3-mapping-policies/" - file: "04-southbound-interfaces/03-industrial-connectors/04-1-dnp3/02-dnp3-mapping-policies.md" - source_path: "04- Southbound Interfaces/03- Industrial Connectors/04-1 DNP3/02- DNP3 - Mapping-Policies.md" + match_path: "/docs/04-southbound-interfaces/04-industrial-connectors/05-1-dnp3/02-dnp3-mapping-policies/" + slug: "04-southbound-interfaces/04-industrial-connectors/05-1-dnp3/02-dnp3-mapping-policies" + url: "/docs/04-southbound-interfaces/04-industrial-connectors/05-1-dnp3/02-dnp3-mapping-policies/" + file: "04-southbound-interfaces/04-industrial-connectors/05-1-dnp3/02-dnp3-mapping-policies.md" + source_path: "04- Southbound Interfaces/04- Industrial Connectors/05-1 DNP3/02- DNP3 - Mapping-Policies.md" - kind: "page" title: "DNP3 - TLS test certificates" - match_path: "/docs/04-southbound-interfaces/03-industrial-connectors/04-1-dnp3/03-dnp3-tls-test-certificates/" - slug: "04-southbound-interfaces/03-industrial-connectors/04-1-dnp3/03-dnp3-tls-test-certificates" - url: "/docs/04-southbound-interfaces/03-industrial-connectors/04-1-dnp3/03-dnp3-tls-test-certificates/" - file: "04-southbound-interfaces/03-industrial-connectors/04-1-dnp3/03-dnp3-tls-test-certificates.md" - source_path: "04- Southbound Interfaces/03- Industrial Connectors/04-1 DNP3/03- DNP3 - TLS test certificates.md" + match_path: "/docs/04-southbound-interfaces/04-industrial-connectors/05-1-dnp3/03-dnp3-tls-test-certificates/" + slug: "04-southbound-interfaces/04-industrial-connectors/05-1-dnp3/03-dnp3-tls-test-certificates" + url: "/docs/04-southbound-interfaces/04-industrial-connectors/05-1-dnp3/03-dnp3-tls-test-certificates/" + file: "04-southbound-interfaces/04-industrial-connectors/05-1-dnp3/03-dnp3-tls-test-certificates.md" + source_path: "04- Southbound Interfaces/04- Industrial Connectors/05-1 DNP3/03- DNP3 - TLS test certificates.md" - kind: "section" title: "Monitoring" - match_path: "/docs/04-southbound-interfaces/04-monitoring/" + match_path: "/docs/04-southbound-interfaces/05-monitoring/" children: - kind: "page" title: "Node Monitoring" - match_path: "/docs/04-southbound-interfaces/04-monitoring/01-node-monitoring/" - slug: "04-southbound-interfaces/04-monitoring/01-node-monitoring" - url: "/docs/04-southbound-interfaces/04-monitoring/01-node-monitoring/" - file: "04-southbound-interfaces/04-monitoring/01-node-monitoring.md" - source_path: "04- Southbound Interfaces/04- Monitoring/01- Node Monitoring.md" + match_path: "/docs/04-southbound-interfaces/05-monitoring/01-node-monitoring/" + slug: "04-southbound-interfaces/05-monitoring/01-node-monitoring" + url: "/docs/04-southbound-interfaces/05-monitoring/01-node-monitoring/" + file: "04-southbound-interfaces/05-monitoring/01-node-monitoring.md" + source_path: "04- Southbound Interfaces/05- Monitoring/01- Node Monitoring.md" - kind: "page" title: "Syslog" - match_path: "/docs/04-southbound-interfaces/04-monitoring/02-syslog/" - slug: "04-southbound-interfaces/04-monitoring/02-syslog" - url: "/docs/04-southbound-interfaces/04-monitoring/02-syslog/" - file: "04-southbound-interfaces/04-monitoring/02-syslog.md" - source_path: "04- Southbound Interfaces/04- Monitoring/02- Syslog.md" + match_path: "/docs/04-southbound-interfaces/05-monitoring/02-syslog/" + slug: "04-southbound-interfaces/05-monitoring/02-syslog" + url: "/docs/04-southbound-interfaces/05-monitoring/02-syslog/" + file: "04-southbound-interfaces/05-monitoring/02-syslog.md" + source_path: "04- Southbound Interfaces/05- Monitoring/02- Syslog.md" - kind: "section" title: "RPC & Media Streaming" - match_path: "/docs/04-southbound-interfaces/05-rpc-and-media-streaming/" + match_path: "/docs/04-southbound-interfaces/06-rpc-and-media-streaming/" children: - kind: "page" title: "gRPC" - match_path: "/docs/04-southbound-interfaces/05-rpc-and-media-streaming/01-grpc/" - slug: "04-southbound-interfaces/05-rpc-and-media-streaming/01-grpc" - url: "/docs/04-southbound-interfaces/05-rpc-and-media-streaming/01-grpc/" - file: "04-southbound-interfaces/05-rpc-and-media-streaming/01-grpc.md" - source_path: "04- Southbound Interfaces/05- RPC & Media Streaming/01- gRPC.md" + match_path: "/docs/04-southbound-interfaces/06-rpc-and-media-streaming/01-grpc/" + slug: "04-southbound-interfaces/06-rpc-and-media-streaming/01-grpc" + url: "/docs/04-southbound-interfaces/06-rpc-and-media-streaming/01-grpc/" + file: "04-southbound-interfaces/06-rpc-and-media-streaming/01-grpc.md" + source_path: "04- Southbound Interfaces/06- RPC & Media Streaming/01- gRPC.md" - kind: "page" title: "Video Streaming" - match_path: "/docs/04-southbound-interfaces/05-rpc-and-media-streaming/02-video-streaming/" - slug: "04-southbound-interfaces/05-rpc-and-media-streaming/02-video-streaming" - url: "/docs/04-southbound-interfaces/05-rpc-and-media-streaming/02-video-streaming/" - file: "04-southbound-interfaces/05-rpc-and-media-streaming/02-video-streaming.md" - source_path: "04- Southbound Interfaces/05- RPC & Media Streaming/02- Video Streaming.md" + match_path: "/docs/04-southbound-interfaces/06-rpc-and-media-streaming/02-video-streaming/" + slug: "04-southbound-interfaces/06-rpc-and-media-streaming/02-video-streaming" + url: "/docs/04-southbound-interfaces/06-rpc-and-media-streaming/02-video-streaming/" + file: "04-southbound-interfaces/06-rpc-and-media-streaming/02-video-streaming.md" + source_path: "04- Southbound Interfaces/06- RPC & Media Streaming/02- Video Streaming.md" - kind: "section" title: "Third-Party" - match_path: "/docs/04-southbound-interfaces/06-third-party/" + match_path: "/docs/04-southbound-interfaces/07-third-party/" children: - kind: "page" title: "node-RED" - match_path: "/docs/04-southbound-interfaces/06-third-party/01-node-red/" - slug: "04-southbound-interfaces/06-third-party/01-node-red" - url: "/docs/04-southbound-interfaces/06-third-party/01-node-red/" - file: "04-southbound-interfaces/06-third-party/01-node-red.md" - source_path: "04- Southbound Interfaces/06- Third-Party/01- node-RED.md" + match_path: "/docs/04-southbound-interfaces/07-third-party/01-node-red/" + slug: "04-southbound-interfaces/07-third-party/01-node-red" + url: "/docs/04-southbound-interfaces/07-third-party/01-node-red/" + file: "04-southbound-interfaces/07-third-party/01-node-red.md" + source_path: "04- Southbound Interfaces/07- Third-Party/01- node-RED.md" - kind: "page" title: "Telegraf" - match_path: "/docs/04-southbound-interfaces/06-third-party/02-telegraf/" - slug: "04-southbound-interfaces/06-third-party/02-telegraf" - url: "/docs/04-southbound-interfaces/06-third-party/02-telegraf/" - file: "04-southbound-interfaces/06-third-party/02-telegraf.md" - source_path: "04- Southbound Interfaces/06- Third-Party/02- Telegraf.md" + match_path: "/docs/04-southbound-interfaces/07-third-party/02-telegraf/" + slug: "04-southbound-interfaces/07-third-party/02-telegraf" + url: "/docs/04-southbound-interfaces/07-third-party/02-telegraf/" + file: "04-southbound-interfaces/07-third-party/02-telegraf.md" + source_path: "04- Southbound Interfaces/07- Third-Party/02- Telegraf.md" - kind: "page" title: "EdgeX" - match_path: "/docs/04-southbound-interfaces/06-third-party/03-edgex/" - slug: "04-southbound-interfaces/06-third-party/03-edgex" - url: "/docs/04-southbound-interfaces/06-third-party/03-edgex/" - file: "04-southbound-interfaces/06-third-party/03-edgex.md" - source_path: "04- Southbound Interfaces/06- Third-Party/03- EdgeX.md" + match_path: "/docs/04-southbound-interfaces/07-third-party/03-edgex/" + slug: "04-southbound-interfaces/07-third-party/03-edgex" + url: "/docs/04-southbound-interfaces/07-third-party/03-edgex/" + file: "04-southbound-interfaces/07-third-party/03-edgex.md" + source_path: "04- Southbound Interfaces/07- Third-Party/03- EdgeX.md" - kind: "page" title: "Kubearmor" - match_path: "/docs/04-southbound-interfaces/06-third-party/04-kubearmor/" - slug: "04-southbound-interfaces/06-third-party/04-kubearmor" - url: "/docs/04-southbound-interfaces/06-third-party/04-kubearmor/" - file: "04-southbound-interfaces/06-third-party/04-kubearmor.md" - source_path: "04- Southbound Interfaces/06- Third-Party/04- Kubearmor.md" + match_path: "/docs/04-southbound-interfaces/07-third-party/04-kubearmor/" + slug: "04-southbound-interfaces/07-third-party/04-kubearmor" + url: "/docs/04-southbound-interfaces/07-third-party/04-kubearmor/" + file: "04-southbound-interfaces/07-third-party/04-kubearmor.md" + source_path: "04- Southbound Interfaces/07- Third-Party/04- Kubearmor.md" - kind: "page" title: "Data Ingestion" - match_path: "/docs/04-southbound-interfaces/07-data-ingestion/" - slug: "04-southbound-interfaces/07-data-ingestion" - url: "/docs/04-southbound-interfaces/07-data-ingestion/" - file: "04-southbound-interfaces/07-data-ingestion.md" - source_path: "04- Southbound Interfaces/07- Data Ingestion.md" + match_path: "/docs/04-southbound-interfaces/08-data-ingestion/" + slug: "04-southbound-interfaces/08-data-ingestion" + url: "/docs/04-southbound-interfaces/08-data-ingestion/" + file: "04-southbound-interfaces/08-data-ingestion.md" + source_path: "04- Southbound Interfaces/08- Data Ingestion.md" - kind: "section" title: "Northbound Connectors" match_path: "/docs/05-northbound-connectors/" @@ -459,19 +473,26 @@ nav: file: "06-networking-and-security/04-using-rest.md" source_path: "06- Networking & Security/04- Using REST.md" - kind: "page" - title: "Message Broker" - match_path: "/docs/06-networking-and-security/05-message-broker/" - slug: "06-networking-and-security/05-message-broker" - url: "/docs/06-networking-and-security/05-message-broker/" - file: "06-networking-and-security/05-message-broker.md" - source_path: "06- Networking & Security/05- Message Broker.md" + title: "MQTT Message Broker" + match_path: "/docs/06-networking-and-security/05-mqtt-message-broker/" + slug: "06-networking-and-security/05-mqtt-message-broker" + url: "/docs/06-networking-and-security/05-mqtt-message-broker/" + file: "06-networking-and-security/05-mqtt-message-broker.md" + source_path: "06- Networking & Security/05- MQTT Message Broker.md" + - kind: "page" + title: "Kafka Message Client" + match_path: "/docs/06-networking-and-security/05-1-kafka-message-client/" + slug: "06-networking-and-security/05-1-kafka-message-client" + url: "/docs/06-networking-and-security/05-1-kafka-message-client/" + file: "06-networking-and-security/05-1-kafka-message-client.md" + source_path: "06- Networking & Security/05-1 Kafka Message Client.md" - kind: "page" title: "Connectors To Data Sources" - match_path: "/docs/06-networking-and-security/05-1-connectors-to-data-sources/" - slug: "06-networking-and-security/05-1-connectors-to-data-sources" - url: "/docs/06-networking-and-security/05-1-connectors-to-data-sources/" - file: "06-networking-and-security/05-1-connectors-to-data-sources.md" - source_path: "06- Networking & Security/05-1 Connectors To Data Sources.md" + match_path: "/docs/06-networking-and-security/05-2-connectors-to-data-sources/" + slug: "06-networking-and-security/05-2-connectors-to-data-sources" + url: "/docs/06-networking-and-security/05-2-connectors-to-data-sources/" + file: "06-networking-and-security/05-2-connectors-to-data-sources.md" + source_path: "06- Networking & Security/05-2 Connectors To Data Sources.md" - kind: "section" title: "Network" match_path: "/docs/06-networking-and-security/06-network/" @@ -683,33 +704,26 @@ nav: file: "08-blockchain-and-metadata/03-1-blockchain-full-circle.md" source_path: "08- Blockchain & Metadata/03-1 Blockchain Full Circle.md" - kind: "page" - title: "Mapping Policy" - match_path: "/docs/08-blockchain-and-metadata/04-mapping-policy/" - slug: "08-blockchain-and-metadata/04-mapping-policy" - url: "/docs/08-blockchain-and-metadata/04-mapping-policy/" - file: "08-blockchain-and-metadata/04-mapping-policy.md" - source_path: "08- Blockchain & Metadata/04- Mapping Policy.md" - - kind: "page" - title: "Unitfied Namespace" - match_path: "/docs/08-blockchain-and-metadata/05-unitfied-namespace/" - slug: "08-blockchain-and-metadata/05-unitfied-namespace" - url: "/docs/08-blockchain-and-metadata/05-unitfied-namespace/" - file: "08-blockchain-and-metadata/05-unitfied-namespace.md" - source_path: "08- Blockchain & Metadata/05- Unitfied Namespace.md" + title: "Unified Namespace" + match_path: "/docs/08-blockchain-and-metadata/04-unified-namespace/" + slug: "08-blockchain-and-metadata/04-unified-namespace" + url: "/docs/08-blockchain-and-metadata/04-unified-namespace/" + file: "08-blockchain-and-metadata/04-unified-namespace.md" + source_path: "08- Blockchain & Metadata/04- Unified Namespace.md" - kind: "page" title: "UNS Custom Dynamic Examples" - match_path: "/docs/08-blockchain-and-metadata/05-1-uns-custom-dynamic-examples/" - slug: "08-blockchain-and-metadata/05-1-uns-custom-dynamic-examples" - url: "/docs/08-blockchain-and-metadata/05-1-uns-custom-dynamic-examples/" - file: "08-blockchain-and-metadata/05-1-uns-custom-dynamic-examples.md" - source_path: "08- Blockchain & Metadata/05-1 UNS Custom Dynamic Examples.md" + match_path: "/docs/08-blockchain-and-metadata/04-1-uns-custom-dynamic-examples/" + slug: "08-blockchain-and-metadata/04-1-uns-custom-dynamic-examples" + url: "/docs/08-blockchain-and-metadata/04-1-uns-custom-dynamic-examples/" + file: "08-blockchain-and-metadata/04-1-uns-custom-dynamic-examples.md" + source_path: "08- Blockchain & Metadata/04-1 UNS Custom Dynamic Examples.md" - kind: "page" title: "UNS Custom Examples" - match_path: "/docs/08-blockchain-and-metadata/05-2-uns-custom-examples/" - slug: "08-blockchain-and-metadata/05-2-uns-custom-examples" - url: "/docs/08-blockchain-and-metadata/05-2-uns-custom-examples/" - file: "08-blockchain-and-metadata/05-2-uns-custom-examples.md" - source_path: "08- Blockchain & Metadata/05-2 UNS Custom Examples.md" + match_path: "/docs/08-blockchain-and-metadata/04-2-uns-custom-examples/" + slug: "08-blockchain-and-metadata/04-2-uns-custom-examples" + url: "/docs/08-blockchain-and-metadata/04-2-uns-custom-examples/" + file: "08-blockchain-and-metadata/04-2-uns-custom-examples.md" + source_path: "08- Blockchain & Metadata/04-2 UNS Custom Examples.md" - kind: "section" title: "Data Management" match_path: "/docs/09-data-management/" @@ -802,6 +816,13 @@ nav: url: "/docs/09-data-management/06-query-profiling/" file: "09-data-management/06-query-profiling.md" source_path: "09- Data Management/06- Query Profiling.md" + - kind: "page" + title: "Creating and Managing a Non-Time-Series Table" + match_path: "/docs/09-data-management/07-creating-and-managing-a-non-time-series-table/" + slug: "09-data-management/07-creating-and-managing-a-non-time-series-table" + url: "/docs/09-data-management/07-creating-and-managing-a-non-time-series-table/" + file: "09-data-management/07-creating-and-managing-a-non-time-series-table.md" + source_path: "09- Data Management/07- Creating and Managing a Non-Time-Series Table.md" - kind: "section" title: "Edge Data Manager" match_path: "/docs/10-edge-data-manager/" @@ -818,19 +839,19 @@ nav: match_path: "/docs/11-extended-services/" children: - kind: "page" - title: "LLM Dashboard Generation" - match_path: "/docs/11-extended-services/01-llm-dashboard-generation/" - slug: "11-extended-services/01-llm-dashboard-generation" - url: "/docs/11-extended-services/01-llm-dashboard-generation/" - file: "11-extended-services/01-llm-dashboard-generation.md" - source_path: "11- Extended Services/01- LLM Dashboard Generation.md" + title: "Performance" + match_path: "/docs/11-extended-services/01-performance/" + slug: "11-extended-services/01-performance" + url: "/docs/11-extended-services/01-performance/" + file: "11-extended-services/01-performance.md" + source_path: "11- Extended Services/01- Performance.md" - kind: "page" - title: "mcpAI" - match_path: "/docs/11-extended-services/02-mcpai/" - slug: "11-extended-services/02-mcpai" - url: "/docs/11-extended-services/02-mcpai/" - file: "11-extended-services/02-mcpai.md" - source_path: "11- Extended Services/02- mcpAI.md" + title: "LLM Dashboard Generation" + match_path: "/docs/11-extended-services/02-llm-dashboard-generation/" + slug: "11-extended-services/02-llm-dashboard-generation" + url: "/docs/11-extended-services/02-llm-dashboard-generation/" + file: "11-extended-services/02-llm-dashboard-generation.md" + source_path: "11- Extended Services/02- LLM Dashboard Generation.md" - kind: "page" title: "Federated Learning" match_path: "/docs/11-extended-services/03-federated-learning/" @@ -838,6 +859,13 @@ nav: url: "/docs/11-extended-services/03-federated-learning/" file: "11-extended-services/03-federated-learning.md" source_path: "11- Extended Services/03- Federated Learning.md" + - kind: "page" + title: "mcpAI" + match_path: "/docs/11-extended-services/04-mcpai/" + slug: "11-extended-services/04-mcpai" + url: "/docs/11-extended-services/04-mcpai/" + file: "11-extended-services/04-mcpai.md" + source_path: "11- Extended Services/04- mcpAI.md" - kind: "section" title: "Examples & Use Cases" match_path: "/docs/12-examples-and-use-cases/" diff --git a/_includes/home_content.html b/_includes/home_content.html index 4727df3..fd205ab 100644 --- a/_includes/home_content.html +++ b/_includes/home_content.html @@ -8,6 +8,11 @@

AnyLog Documentation

diff --git a/docker-compose.yaml b/docker-compose.yaml index 80c679d..527c1aa 100644 --- a/docker-compose.yaml +++ b/docker-compose.yaml @@ -7,9 +7,12 @@ services: - "4000:4000" - "35729:35729" command: bash /srv/content/.github/scripts/dev-start.sh + environment: + - ANYLOG_DOCS_SOURCE_DIR=/srv/documentation volumes: - - .:/srv/content:cached # your docs project - - bundle-cache:/srv/bundle # Docker-managed volume for gems + - ${LOCAL_DOCS:-.}:/srv/documentation:cached + - .:/srv/content:cached + - bundle-cache:/srv/bundle volumes: bundle-cache: \ No newline at end of file