mirror of
https://github.com/kevinveenbirkenbach/computer-playbook.git
synced 2026-11-06 10:59:59 +00:00
refactor(mcp)!: derive admission from the client
allowed_consumers was twenty hand-kept lists of which fourteen were identical, so every new client meant an edit in every provider. A client now declares services.<own-entity>.mcp_consumer: true once and a provider refuses one with mcp_consumer: false, which is also what tells a deliberate exclusion apart from a forgotten entry. The group_names-gated consumer entries give the inventory resolver the co-deploy edge meta/mcp.yml never had: one of sixty-nine matrix rounds carried an MCP client before, twenty-three role/round pairs do now. bond 0.5 keeps the clients out of round 0 so the host memory budget still holds. BREAKING CHANGE: meta/mcp.yml no longer accepts allowed_consumers; declare services.<entity>.mcp_consumer on the client instead. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
1 parent
9dcf973b70
commit
83c1c729de
102 files changed
+1798
-170
No files matched your search
@@ -68,12 +68,12 @@ Every invokable role in the tested lifecycle envelope, with its upstream homepag
|
||||
| [Backup NFS](roles/svc-bkp-nfs-2-local/) | beta | Scheduled backup job for hard-linked differential rsync snapshots of an NFS export into the local backup tree | [🛠️](roles/svc-bkp-nfs-2-local/README.md#quick-setup) | [NFS Server](roles/svc-storage-nfs-server/) |
|
||||
| [Backup Remote Server](roles/svc-bkp-remote-2-local/) | beta | Scheduled pull-style backup replicating remote hosts onto this host over SSH and rsync as hard-linked snapshots | [🛠️](roles/svc-bkp-remote-2-local/README.md#quick-setup) | [Backup to External Device](roles/svc-bkp-local-2-device/) |
|
||||
| [Backup to External Device](roles/svc-bkp-local-2-device/) | beta | Plug-triggered systemd backup for hard-link deduplicated snapshots of the local backup tree onto a swappable USB device | [🛠️](roles/svc-bkp-local-2-device/README.md#quick-setup) | |
|
||||
| [Baserow](roles/web-app-baserow/) | beta | Self-hosted no-code database platform with a spreadsheet-like interface for building and collaborating on data | [🌐](https://baserow.io/) [🎬](https://www.youtube.com/watch?v=5yFMfP96_4M) [🛠️](roles/web-app-baserow/README.md#quick-setup) | [Backup Docker Volumes](roles/svc-bkp-volume-2-local/), [Corporate Design](roles/web-svc-css/), [Dashboard](roles/web-app-dashboard/), [Keycloak](roles/web-app-keycloak/), [Mailu](roles/web-app-mailu/), [Matomo](roles/web-app-matomo/), [PostgreSQL](roles/svc-db-postgres/), [Prometheus](roles/web-app-prometheus/), [Redis](roles/svc-db-redis/), [SeaweedFS](roles/web-app-seaweedfs/), [Tor Onion Service](roles/svc-net-tor/), [Universal Logout](roles/web-svc-logout/) |
|
||||
| [Baserow](roles/web-app-baserow/) | beta | Self-hosted no-code database platform with a spreadsheet-like interface for building and collaborating on data | [🌐](https://baserow.io/) [🎬](https://www.youtube.com/watch?v=5yFMfP96_4M) [🛠️](roles/web-app-baserow/README.md#quick-setup) | [Backup Docker Volumes](roles/svc-bkp-volume-2-local/), [Corporate Design](roles/web-svc-css/), [Dashboard](roles/web-app-dashboard/), [Flowise](roles/web-app-flowise/), [Hermes Agent](roles/web-app-hermes/), [Keycloak](roles/web-app-keycloak/), [Mailu](roles/web-app-mailu/), [Matomo](roles/web-app-matomo/), [Open WebUI](roles/web-app-openwebui/), [OpenClaw](roles/web-app-openclaw/), [PostgreSQL](roles/svc-db-postgres/), [Prometheus](roles/web-app-prometheus/), [Redis](roles/svc-db-redis/), [SeaweedFS](roles/web-app-seaweedfs/), [Tor Onion Service](roles/svc-net-tor/), [Universal Logout](roles/web-svc-logout/) |
|
||||
| [BigBlueButton](roles/web-app-bigbluebutton/) | beta | Self-hosted web conferencing platform for virtual classrooms, online meetings, and real-time collaboration | [🌐](https://bigbluebutton.org/) [🎬](https://www.youtube.com/watch?v=YRkQB6MJllI) [🛠️](roles/web-app-bigbluebutton/README.md#quick-setup) | [Backup Docker Volumes](roles/svc-bkp-volume-2-local/), [Collabora](roles/web-svc-collabora/), [Corporate Design](roles/web-svc-css/), [Coturn](roles/web-svc-coturn/), [Dashboard](roles/web-app-dashboard/), [Keycloak](roles/web-app-keycloak/), [Mailu](roles/web-app-mailu/), [Matomo](roles/web-app-matomo/), [Prometheus](roles/web-app-prometheus/), [Universal Logout](roles/web-svc-logout/) |
|
||||
| [Bluesky](roles/web-app-bluesky/) | beta | Self-hosted decentralized social network on the open AT Protocol, with its own Personal Data Server | [🌐](https://bsky.social/) [🛠️](roles/web-app-bluesky/README.md#quick-setup) | [Backup Docker Volumes](roles/svc-bkp-volume-2-local/), [Corporate Design](roles/web-svc-css/), [Dashboard](roles/web-app-dashboard/), [Keycloak](roles/web-app-keycloak/), [Mailu](roles/web-app-mailu/), [Matomo](roles/web-app-matomo/), [Prometheus](roles/web-app-prometheus/), [Tor Onion Service](roles/svc-net-tor/), [Universal Logout](roles/web-svc-logout/) |
|
||||
| [BookWyrm](roles/web-app-bookwyrm/) | beta | Self-hosted federated reading platform for book reviews and reading tracking across the Fediverse | [🌐](https://joinbookwyrm.com/) [🛠️](roles/web-app-bookwyrm/README.md#quick-setup) | [Backup Docker Volumes](roles/svc-bkp-volume-2-local/), [Corporate Design](roles/web-svc-css/), [Dashboard](roles/web-app-dashboard/), [Keycloak](roles/web-app-keycloak/), [Mailu](roles/web-app-mailu/), [Matomo](roles/web-app-matomo/), [PostgreSQL](roles/svc-db-postgres/), [Prometheus](roles/web-app-prometheus/), [Redis](roles/svc-db-redis/), [SeaweedFS](roles/web-app-seaweedfs/), [Tor Onion Service](roles/svc-net-tor/), [Universal Logout](roles/web-svc-logout/) |
|
||||
| [Bridgy Fed](roles/web-app-bridgy-fed/) | beta | Federation bridge connecting ActivityPub (Fediverse), the AT Protocol (Bluesky), and the IndieWeb | [🌐](https://fed.brid.gy/) [🛠️](roles/web-app-bridgy-fed/README.md#quick-setup) | [Corporate Design](roles/web-svc-css/), [Dashboard](roles/web-app-dashboard/), [Matomo](roles/web-app-matomo/), [Prometheus](roles/web-app-prometheus/), [Tor Onion Service](roles/svc-net-tor/) |
|
||||
| [Checkmk](roles/web-app-checkmk/) | beta | Open-source IT and application monitoring server behind SSO with native LDAP user management | [🌐](https://checkmk.com/) [🎬](https://www.youtube.com/watch?v=opO-SOgOJ1I) [🛠️](roles/web-app-checkmk/README.md#quick-setup) | [Backup Docker Volumes](roles/svc-bkp-volume-2-local/), [Corporate Design](roles/web-svc-css/), [Dashboard](roles/web-app-dashboard/), [Keycloak](roles/web-app-keycloak/), [Mailu](roles/web-app-mailu/), [Matomo](roles/web-app-matomo/), [OpenLDAP](roles/svc-db-openldap/), [Prometheus](roles/web-app-prometheus/), [Tor Onion Service](roles/svc-net-tor/), [Universal Logout](roles/web-svc-logout/) |
|
||||
| [Checkmk](roles/web-app-checkmk/) | beta | Open-source IT and application monitoring server behind SSO with native LDAP user management | [🌐](https://checkmk.com/) [🎬](https://www.youtube.com/watch?v=opO-SOgOJ1I) [🛠️](roles/web-app-checkmk/README.md#quick-setup) | [Backup Docker Volumes](roles/svc-bkp-volume-2-local/), [Corporate Design](roles/web-svc-css/), [Dashboard](roles/web-app-dashboard/), [Flowise](roles/web-app-flowise/), [Hermes Agent](roles/web-app-hermes/), [Keycloak](roles/web-app-keycloak/), [Mailu](roles/web-app-mailu/), [Matomo](roles/web-app-matomo/), [Open WebUI](roles/web-app-openwebui/), [OpenClaw](roles/web-app-openclaw/), [OpenLDAP](roles/svc-db-openldap/), [Prometheus](roles/web-app-prometheus/), [Tor Onion Service](roles/svc-net-tor/), [Universal Logout](roles/web-svc-logout/) |
|
||||
| [Chess](roles/web-app-chess/) | beta | Federated chess server for playing and following rule-validated games over ActivityPub across the Fediverse | [🌐](https://castling.club/) [🛠️](roles/web-app-chess/README.md#quick-setup) | [Backup Docker Volumes](roles/svc-bkp-volume-2-local/), [Corporate Design](roles/web-svc-css/), [Dashboard](roles/web-app-dashboard/), [Matomo](roles/web-app-matomo/), [PostgreSQL](roles/svc-db-postgres/), [Prometheus](roles/web-app-prometheus/), [Tor Onion Service](roles/svc-net-tor/) |
|
||||
| [Collabora](roles/web-svc-collabora/) | beta | Self-hosted online office backend for real-time in-browser editing of documents, spreadsheets, and presentations | [🌐](https://www.collaboraonline.com/) [🎬](https://www.youtube.com/@CollaboraOnline) [🛠️](roles/web-svc-collabora/README.md#quick-setup) | [Matomo](roles/web-app-matomo/), [Prometheus](roles/web-app-prometheus/), [Tor Onion Service](roles/svc-net-tor/) |
|
||||
| [Content Delivery Network](roles/web-svc-cdn/) | beta | Nginx-based content delivery network for serving shared static assets to internal web applications | [🛠️](roles/web-svc-cdn/README.md#quick-setup) | [Matomo](roles/web-app-matomo/), [Prometheus](roles/web-app-prometheus/), [Tor Onion Service](roles/svc-net-tor/) |
|
||||
@@ -90,31 +90,31 @@ Every invokable role in the tested lifecycle envelope, with its upstream homepag
|
||||
| [ERPNext](roles/web-app-erpnext/) | beta | Self-hosted open-source ERP suite for finance, CRM, inventory, manufacturing, HR, sales, and projects | [🌐](https://erpnext.com/) [🎬](https://www.youtube.com/watch?v=JlqE-BfDEUY) [🛠️](roles/web-app-erpnext/README.md#quick-setup) | [Backup Docker Volumes](roles/svc-bkp-volume-2-local/), [Corporate Design](roles/web-svc-css/), [Dashboard](roles/web-app-dashboard/), [Keycloak](roles/web-app-keycloak/), [Mailu](roles/web-app-mailu/), [MariaDB](roles/svc-db-mariadb/), [Matomo](roles/web-app-matomo/), [OpenLDAP](roles/svc-db-openldap/), [Prometheus](roles/web-app-prometheus/), [Redis](roles/svc-db-redis/), [Tor Onion Service](roles/svc-net-tor/), [Universal Logout](roles/web-svc-logout/) |
|
||||
| [EspoCRM](roles/web-app-espocrm/) | beta | Open-source CRM platform for managing sales, customer interactions, and business processes across teams | [🌐](https://www.espocrm.com/) [🎬](https://www.youtube.com/watch?v=TH6yJPTPLO0) [🛠️](roles/web-app-espocrm/README.md#quick-setup) | [Backup Docker Volumes](roles/svc-bkp-volume-2-local/), [Corporate Design](roles/web-svc-css/), [Dashboard](roles/web-app-dashboard/), [Keycloak](roles/web-app-keycloak/), [Mailu](roles/web-app-mailu/), [MariaDB](roles/svc-db-mariadb/), [Matomo](roles/web-app-matomo/), [OpenLDAP](roles/svc-db-openldap/), [Prometheus](roles/web-app-prometheus/), [Tor Onion Service](roles/svc-net-tor/), [Universal Logout](roles/web-svc-logout/) |
|
||||
| [Fediwall](roles/web-app-fediwall/) | beta | Self-hosted Fediverse wall for showing recent public posts by hashtag or account in a live masonry grid | [🌐](https://github.com/defnull/fediwall) [🛠️](roles/web-app-fediwall/README.md#quick-setup) | [Corporate Design](roles/web-svc-css/), [Dashboard](roles/web-app-dashboard/), [Friendica](roles/web-app-friendica/), [Mastodon](roles/web-app-mastodon/), [Matomo](roles/web-app-matomo/), [Prometheus](roles/web-app-prometheus/), [Tor Onion Service](roles/svc-net-tor/) |
|
||||
| [Fider](roles/web-app-fider/) | beta | Open-source community feedback platform for collecting, voting on, and prioritizing feature requests and ideas | [🌐](https://www.fider.io/) [🛠️](roles/web-app-fider/README.md#quick-setup) | [Corporate Design](roles/web-svc-css/), [Dashboard](roles/web-app-dashboard/), [Keycloak](roles/web-app-keycloak/), [Mailu](roles/web-app-mailu/), [Matomo](roles/web-app-matomo/), [PostgreSQL](roles/svc-db-postgres/), [Prometheus](roles/web-app-prometheus/), [SeaweedFS](roles/web-app-seaweedfs/), [Tor Onion Service](roles/svc-net-tor/), [Universal Logout](roles/web-svc-logout/) |
|
||||
| [Fider](roles/web-app-fider/) | beta | Open-source community feedback platform for collecting, voting on, and prioritizing feature requests and ideas | [🌐](https://www.fider.io/) [🛠️](roles/web-app-fider/README.md#quick-setup) | [Corporate Design](roles/web-svc-css/), [Dashboard](roles/web-app-dashboard/), [Flowise](roles/web-app-flowise/), [Hermes Agent](roles/web-app-hermes/), [Keycloak](roles/web-app-keycloak/), [Mailu](roles/web-app-mailu/), [Matomo](roles/web-app-matomo/), [Open WebUI](roles/web-app-openwebui/), [OpenClaw](roles/web-app-openclaw/), [PostgreSQL](roles/svc-db-postgres/), [Prometheus](roles/web-app-prometheus/), [SeaweedFS](roles/web-app-seaweedfs/), [Tor Onion Service](roles/svc-net-tor/), [Universal Logout](roles/web-svc-logout/) |
|
||||
| [File Server](roles/web-svc-file/) | beta | Static file server over HTTPS with directory listing, .well-known handling, and automatic TLS certificates | [🛠️](roles/web-svc-file/README.md#quick-setup) | [Corporate Design](roles/web-svc-css/), [Matomo](roles/web-app-matomo/), [Prometheus](roles/web-app-prometheus/), [Tor Onion Service](roles/svc-net-tor/) |
|
||||
| [Flowise](roles/web-app-flowise/) | beta | Low-code visual builder for creating, testing, and publishing LLM and RAG workflows as HTTP endpoints | [🌐](https://flowiseai.com/) [🎬](https://www.youtube.com/@FlowiseAI) [🛠️](roles/web-app-flowise/README.md#quick-setup) | [Backup Docker Volumes](roles/svc-bkp-volume-2-local/), [Baserow](roles/web-app-baserow/), [Corporate Design](roles/web-svc-css/), [Dashboard](roles/web-app-dashboard/), [Home Assistant](roles/web-app-homeassistant/), [Keycloak](roles/web-app-keycloak/), [LiteLLM Gateway](roles/svc-ai-litellm/), [Mailu](roles/web-app-mailu/), [Matomo](roles/web-app-matomo/), [Ollama](roles/svc-ai-ollama/), [PostgreSQL](roles/svc-db-postgres/), [Prometheus](roles/web-app-prometheus/), [Qdrant](roles/svc-db-qdrant/), [Tor Onion Service](roles/svc-net-tor/), [Universal Logout](roles/web-svc-logout/) |
|
||||
| [Friendica](roles/web-app-friendica/) | beta | Decentralized, federated social-networking platform for peer-to-peer communication and community building | [🌐](https://friendi.ca/) [🛠️](roles/web-app-friendica/README.md#quick-setup) | [Backup Docker Volumes](roles/svc-bkp-volume-2-local/), [Corporate Design](roles/web-svc-css/), [Dashboard](roles/web-app-dashboard/), [Keycloak](roles/web-app-keycloak/), [Mailu](roles/web-app-mailu/), [MariaDB](roles/svc-db-mariadb/), [Matomo](roles/web-app-matomo/), [OpenLDAP](roles/svc-db-openldap/), [Prometheus](roles/web-app-prometheus/), [Tor Onion Service](roles/svc-net-tor/), [Universal Logout](roles/web-svc-logout/) |
|
||||
| [Funkwhale](roles/web-app-funkwhale/) | beta | Self-hosted, federated platform for sharing, hosting, and streaming your own music and audio library | [🌐](https://www.funkwhale.audio/) [🛠️](roles/web-app-funkwhale/README.md#quick-setup) | [Backup Docker Volumes](roles/svc-bkp-volume-2-local/), [Corporate Design](roles/web-svc-css/), [Dashboard](roles/web-app-dashboard/), [Keycloak](roles/web-app-keycloak/), [Mailu](roles/web-app-mailu/), [Matomo](roles/web-app-matomo/), [OpenLDAP](roles/svc-db-openldap/), [PostgreSQL](roles/svc-db-postgres/), [Prometheus](roles/web-app-prometheus/), [Redis](roles/svc-db-redis/), [SeaweedFS](roles/web-app-seaweedfs/), [Tor Onion Service](roles/svc-net-tor/), [Typesense](roles/svc-db-typesense/), [Universal Logout](roles/web-svc-logout/) |
|
||||
| [FusionDirectory](roles/web-app-fusiondirectory/) | beta | Web-based LDAP administration interface for managing users, groups, and directory objects | [🌐](https://www.fusiondirectory.org/) [🎬](https://www.youtube.com/watch?v=dThpssnXGyk) [🛠️](roles/web-app-fusiondirectory/README.md#quick-setup) | [Backup Docker Volumes](roles/svc-bkp-volume-2-local/), [Corporate Design](roles/web-svc-css/), [Dashboard](roles/web-app-dashboard/), [Keycloak](roles/web-app-keycloak/), [Mailu](roles/web-app-mailu/), [Matomo](roles/web-app-matomo/), [OpenLDAP](roles/svc-db-openldap/), [Prometheus](roles/web-app-prometheus/), [Tor Onion Service](roles/svc-net-tor/), [Universal Logout](roles/web-svc-logout/) |
|
||||
| [Gitea](roles/web-app-gitea/) | beta | Lightweight self-hosted Git service for code collaboration, version control, and repository management | [🌐](https://about.gitea.com/) [🛠️](roles/web-app-gitea/README.md#quick-setup) | [Backup Docker Volumes](roles/svc-bkp-volume-2-local/), [Corporate Design](roles/web-svc-css/), [Dashboard](roles/web-app-dashboard/), [Keycloak](roles/web-app-keycloak/), [Mailu](roles/web-app-mailu/), [MariaDB](roles/svc-db-mariadb/), [Matomo](roles/web-app-matomo/), [OpenLDAP](roles/svc-db-openldap/), [Prometheus](roles/web-app-prometheus/), [Redis](roles/svc-db-redis/), [SeaweedFS](roles/web-app-seaweedfs/), [Tor Onion Service](roles/svc-net-tor/), [Universal Logout](roles/web-svc-logout/) |
|
||||
| [GitLab](roles/web-app-gitlab/) | beta | Self-hosted DevOps platform for Git source-code management, CI/CD pipelines, and issue tracking | [🌐](https://about.gitlab.com/) [🎬](https://www.youtube.com/watch?v=7q9Y1Cv-ib0) [🛠️](roles/web-app-gitlab/README.md#quick-setup) | [Backup Docker Volumes](roles/svc-bkp-volume-2-local/), [Corporate Design](roles/web-svc-css/), [Dashboard](roles/web-app-dashboard/), [Keycloak](roles/web-app-keycloak/), [Mailu](roles/web-app-mailu/), [Matomo](roles/web-app-matomo/), [PostgreSQL](roles/svc-db-postgres/), [Prometheus](roles/web-app-prometheus/), [Redis](roles/svc-db-redis/), [SeaweedFS](roles/web-app-seaweedfs/), [Tor Onion Service](roles/svc-net-tor/), [Universal Logout](roles/web-svc-logout/) |
|
||||
| [Gitea](roles/web-app-gitea/) | beta | Lightweight self-hosted Git service for code collaboration, version control, and repository management | [🌐](https://about.gitea.com/) [🛠️](roles/web-app-gitea/README.md#quick-setup) | [Backup Docker Volumes](roles/svc-bkp-volume-2-local/), [Corporate Design](roles/web-svc-css/), [Dashboard](roles/web-app-dashboard/), [Flowise](roles/web-app-flowise/), [Hermes Agent](roles/web-app-hermes/), [Keycloak](roles/web-app-keycloak/), [Mailu](roles/web-app-mailu/), [MariaDB](roles/svc-db-mariadb/), [Matomo](roles/web-app-matomo/), [Open WebUI](roles/web-app-openwebui/), [OpenClaw](roles/web-app-openclaw/), [OpenLDAP](roles/svc-db-openldap/), [Prometheus](roles/web-app-prometheus/), [Redis](roles/svc-db-redis/), [SeaweedFS](roles/web-app-seaweedfs/), [Tor Onion Service](roles/svc-net-tor/), [Universal Logout](roles/web-svc-logout/) |
|
||||
| [GitLab](roles/web-app-gitlab/) | beta | Self-hosted DevOps platform for Git source-code management, CI/CD pipelines, and issue tracking | [🌐](https://about.gitlab.com/) [🎬](https://www.youtube.com/watch?v=7q9Y1Cv-ib0) [🛠️](roles/web-app-gitlab/README.md#quick-setup) | [Backup Docker Volumes](roles/svc-bkp-volume-2-local/), [Corporate Design](roles/web-svc-css/), [Dashboard](roles/web-app-dashboard/), [Flowise](roles/web-app-flowise/), [Hermes Agent](roles/web-app-hermes/), [Keycloak](roles/web-app-keycloak/), [Mailu](roles/web-app-mailu/), [Matomo](roles/web-app-matomo/), [Open WebUI](roles/web-app-openwebui/), [OpenClaw](roles/web-app-openclaw/), [PostgreSQL](roles/svc-db-postgres/), [Prometheus](roles/web-app-prometheus/), [Redis](roles/svc-db-redis/), [SeaweedFS](roles/web-app-seaweedfs/), [Tor Onion Service](roles/svc-net-tor/), [Universal Logout](roles/web-svc-logout/) |
|
||||
| [Hermes Agent](roles/web-app-hermes/) | beta | Kernel-isolated agent runtime serving an OpenAI-compatible API, routed to models through the shared LLM gateway | [🌐](https://hermes-agent.nousresearch.com/) [🛠️](roles/web-app-hermes/README.md#quick-setup) | [Backup Docker Volumes](roles/svc-bkp-volume-2-local/), [Corporate Design](roles/web-svc-css/), [Dashboard](roles/web-app-dashboard/), [Home Assistant](roles/web-app-homeassistant/), [Kata & gVisor](roles/svc-virt-kata/), [Keycloak](roles/web-app-keycloak/), [LiteLLM Gateway](roles/svc-ai-litellm/), [Matomo](roles/web-app-matomo/), [Prometheus](roles/web-app-prometheus/), [Tor Onion Service](roles/svc-net-tor/) |
|
||||
| [Home Assistant](roles/web-app-homeassistant/) | beta | Smart-home automation hub with device integrations, dashboards and a built-in MCP server for AI agent access | [🌐](https://www.home-assistant.io/) [🛠️](roles/web-app-homeassistant/README.md#quick-setup) | [Backup Docker Volumes](roles/svc-bkp-volume-2-local/), [Dashboard](roles/web-app-dashboard/), [Prometheus](roles/web-app-prometheus/), [Tor Onion Service](roles/svc-net-tor/) |
|
||||
| [Home Assistant](roles/web-app-homeassistant/) | beta | Smart-home automation hub with device integrations, dashboards and a built-in MCP server for AI agent access | [🌐](https://www.home-assistant.io/) [🛠️](roles/web-app-homeassistant/README.md#quick-setup) | [Backup Docker Volumes](roles/svc-bkp-volume-2-local/), [Dashboard](roles/web-app-dashboard/), [Flowise](roles/web-app-flowise/), [Hermes Agent](roles/web-app-hermes/), [Open WebUI](roles/web-app-openwebui/), [OpenClaw](roles/web-app-openclaw/), [Prometheus](roles/web-app-prometheus/), [Tor Onion Service](roles/svc-net-tor/) |
|
||||
| [HTML Server](roles/web-svc-html/) | beta | NGINX vhost for serving static HTML websites over HTTPS with automatic Let's Encrypt certificates | [🛠️](roles/web-svc-html/README.md#quick-setup) | [Corporate Design](roles/web-svc-css/), [Matomo](roles/web-app-matomo/), [Prometheus](roles/web-app-prometheus/), [Tor Onion Service](roles/svc-net-tor/) |
|
||||
| [Hugo](roles/web-app-hugo/) | beta | Static site generator building HTML from an upstream Git repository at build time and serving it via nginx | [🌐](https://gohugo.io/) [🛠️](roles/web-app-hugo/README.md#quick-setup) | [Corporate Design](roles/web-svc-css/), [Dashboard](roles/web-app-dashboard/), [Matomo](roles/web-app-matomo/), [Prometheus](roles/web-app-prometheus/), [Tor Onion Service](roles/svc-net-tor/) |
|
||||
| [Imprint](roles/web-svc-legal/) | beta | NGINX-served static page rendering a legal imprint (Impressum) from a Jinja2 template | [🛠️](roles/web-svc-legal/README.md#quick-setup) | [HTML Server](roles/web-svc-html/), [Prometheus](roles/web-app-prometheus/), [Tor Onion Service](roles/svc-net-tor/) |
|
||||
| [Intel Driver](roles/drv-intel/) | alpha | Intel VA-API media driver for hardware-accelerated video decode and encode across Linux distributions | [🌐](https://github.com/intel/media-driver) [🛠️](roles/drv-intel/README.md#quick-setup) | |
|
||||
| [Jellyfin](roles/web-app-jellyfin/) | beta | Self-hosted media server for streaming and organizing movies, TV, music, and photos, with OIDC and LDAP login | [🌐](https://jellyfin.org/) [🎬](https://www.youtube.com/watch?v=0t3lSJL3B_Q) [🛠️](roles/web-app-jellyfin/README.md#quick-setup) | [Backup Docker Volumes](roles/svc-bkp-volume-2-local/), [Corporate Design](roles/web-svc-css/), [Dashboard](roles/web-app-dashboard/), [Keycloak](roles/web-app-keycloak/), [Matomo](roles/web-app-matomo/), [OpenLDAP](roles/svc-db-openldap/), [Prometheus](roles/web-app-prometheus/), [Tor Onion Service](roles/svc-net-tor/), [Universal Logout](roles/web-svc-logout/) |
|
||||
| [Jenkins](roles/web-app-jenkins/) | beta | Open-source automation server for CI/CD pipelines, builds, and plugin-driven deployment workflows | [🌐](https://www.jenkins.io/) [🎬](https://www.youtube.com/channel/UC5JBtmoz7ePk-33ZHimGiDQ) [🛠️](roles/web-app-jenkins/README.md#quick-setup) | [Backup Docker Volumes](roles/svc-bkp-volume-2-local/), [Corporate Design](roles/web-svc-css/), [Dashboard](roles/web-app-dashboard/), [Keycloak](roles/web-app-keycloak/), [Matomo](roles/web-app-matomo/), [OpenLDAP](roles/svc-db-openldap/), [Prometheus](roles/web-app-prometheus/), [Tor Onion Service](roles/svc-net-tor/), [Universal Logout](roles/web-svc-logout/) |
|
||||
| [Jellyfin](roles/web-app-jellyfin/) | beta | Self-hosted media server for streaming and organizing movies, TV, music, and photos, with OIDC and LDAP login | [🌐](https://jellyfin.org/) [🎬](https://www.youtube.com/watch?v=0t3lSJL3B_Q) [🛠️](roles/web-app-jellyfin/README.md#quick-setup) | [Backup Docker Volumes](roles/svc-bkp-volume-2-local/), [Corporate Design](roles/web-svc-css/), [Dashboard](roles/web-app-dashboard/), [Flowise](roles/web-app-flowise/), [Hermes Agent](roles/web-app-hermes/), [Keycloak](roles/web-app-keycloak/), [Matomo](roles/web-app-matomo/), [Open WebUI](roles/web-app-openwebui/), [OpenClaw](roles/web-app-openclaw/), [OpenLDAP](roles/svc-db-openldap/), [Prometheus](roles/web-app-prometheus/), [Tor Onion Service](roles/svc-net-tor/), [Universal Logout](roles/web-svc-logout/) |
|
||||
| [Jenkins](roles/web-app-jenkins/) | beta | Open-source automation server for CI/CD pipelines, builds, and plugin-driven deployment workflows | [🌐](https://www.jenkins.io/) [🎬](https://www.youtube.com/channel/UC5JBtmoz7ePk-33ZHimGiDQ) [🛠️](roles/web-app-jenkins/README.md#quick-setup) | [Backup Docker Volumes](roles/svc-bkp-volume-2-local/), [Corporate Design](roles/web-svc-css/), [Dashboard](roles/web-app-dashboard/), [Flowise](roles/web-app-flowise/), [Hermes Agent](roles/web-app-hermes/), [Keycloak](roles/web-app-keycloak/), [Matomo](roles/web-app-matomo/), [Open WebUI](roles/web-app-openwebui/), [OpenClaw](roles/web-app-openclaw/), [OpenLDAP](roles/svc-db-openldap/), [Prometheus](roles/web-app-prometheus/), [Tor Onion Service](roles/svc-net-tor/), [Universal Logout](roles/web-svc-logout/) |
|
||||
| [Jitsi Meet](roles/web-app-jitsi/) | beta | Self-hosted WebRTC platform for end-to-end-encryptable video conferencing with federated authentication | [🌐](https://jitsi.org/) [🎬](https://www.youtube.com/channel/UCyXuxN-aNUpRv0juUXLyjbw) [🛠️](roles/web-app-jitsi/README.md#quick-setup) | [Corporate Design](roles/web-svc-css/), [Dashboard](roles/web-app-dashboard/), [Keycloak](roles/web-app-keycloak/), [Mailu](roles/web-app-mailu/), [Matomo](roles/web-app-matomo/), [OpenLDAP](roles/svc-db-openldap/), [Prometheus](roles/web-app-prometheus/), [Universal Logout](roles/web-svc-logout/) |
|
||||
| [Joomla](roles/web-app-joomla/) | beta | Open-source content management system for building websites, intranets, and online applications without writing code | [🌐](https://www.joomla.org/) [🎬](https://www.youtube.com/user/joomla) [🛠️](roles/web-app-joomla/README.md#quick-setup) | [Backup Docker Volumes](roles/svc-bkp-volume-2-local/), [Corporate Design](roles/web-svc-css/), [Dashboard](roles/web-app-dashboard/), [Keycloak](roles/web-app-keycloak/), [Mailu](roles/web-app-mailu/), [MariaDB](roles/svc-db-mariadb/), [Matomo](roles/web-app-matomo/), [Prometheus](roles/web-app-prometheus/), [Tor Onion Service](roles/svc-net-tor/), [Universal Logout](roles/web-svc-logout/) |
|
||||
| [Kata & gVisor](roles/svc-virt-kata/) | beta | Kernel-isolating container runtimes that sandbox untrusted workloads in a microVM or a userspace kernel | [🌐](https://katacontainers.io/) [🛠️](roles/svc-virt-kata/README.md#quick-setup) | |
|
||||
| [Keycloak](roles/web-app-keycloak/) | beta | Self-hosted identity and access management platform for single sign-on, multi-factor authentication, and user federation | [🌐](https://www.keycloak.org/) [🛠️](roles/web-app-keycloak/README.md#quick-setup) | [Content Delivery Network](roles/web-svc-cdn/), [Corporate Design](roles/web-svc-css/), [Dashboard](roles/web-app-dashboard/), [Mailu](roles/web-app-mailu/), [Matomo](roles/web-app-matomo/), [PostgreSQL](roles/svc-db-postgres/), [Prometheus](roles/web-app-prometheus/), [Tor Onion Service](roles/svc-net-tor/) |
|
||||
| [KIX](roles/web-app-kix/) | beta | Open-source ITSM and helpdesk platform (OTRS fork) for ticketing, CMDB, knowledge base, and reporting | [🌐](https://www.kixdesk.com/en/) [🎬](https://www.youtube.com/watch?v=D62emos1FQ8) [🛠️](roles/web-app-kix/README.md#quick-setup) | [Backup Docker Volumes](roles/svc-bkp-volume-2-local/), [Corporate Design](roles/web-svc-css/), [Dashboard](roles/web-app-dashboard/), [Keycloak](roles/web-app-keycloak/), [Mailu](roles/web-app-mailu/), [Matomo](roles/web-app-matomo/), [OpenLDAP](roles/svc-db-openldap/), [PostgreSQL](roles/svc-db-postgres/), [Prometheus](roles/web-app-prometheus/), [Tor Onion Service](roles/svc-net-tor/), [Universal Logout](roles/web-svc-logout/) |
|
||||
| [LAM](roles/web-app-lam/) | beta | Web interface for administering LDAP directories: managing users, groups, and other directory objects | [🌐](https://www.ldap-account-manager.org/) [🛠️](roles/web-app-lam/README.md#quick-setup) | [Corporate Design](roles/web-svc-css/), [Dashboard](roles/web-app-dashboard/), [Keycloak](roles/web-app-keycloak/), [Matomo](roles/web-app-matomo/), [OpenLDAP](roles/svc-db-openldap/), [Prometheus](roles/web-app-prometheus/), [Tor Onion Service](roles/svc-net-tor/), [Universal Logout](roles/web-svc-logout/) |
|
||||
| [LibreTranslate](roles/web-svc-libretranslate/) | beta | Self-hosted open-source machine translation API for translating and detecting text across languages | [🌐](https://libretranslate.com/) [🛠️](roles/web-svc-libretranslate/README.md#quick-setup) | [Corporate Design](roles/web-svc-css/), [Keycloak](roles/web-app-keycloak/), [Matomo](roles/web-app-matomo/), [Prometheus](roles/web-app-prometheus/), [Tor Onion Service](roles/svc-net-tor/) |
|
||||
| [LibreTranslate](roles/web-svc-libretranslate/) | beta | Self-hosted open-source machine translation API for translating and detecting text across languages | [🌐](https://libretranslate.com/) [🛠️](roles/web-svc-libretranslate/README.md#quick-setup) | [Corporate Design](roles/web-svc-css/), [Flowise](roles/web-app-flowise/), [Hermes Agent](roles/web-app-hermes/), [Keycloak](roles/web-app-keycloak/), [Matomo](roles/web-app-matomo/), [Open WebUI](roles/web-app-openwebui/), [OpenClaw](roles/web-app-openclaw/), [Prometheus](roles/web-app-prometheus/), [Tor Onion Service](roles/svc-net-tor/) |
|
||||
| [LID Switch Driver](roles/drv-lid-switch/) | alpha | Power-aware systemd logind configuration for predictable laptop lid-close behavior across battery, AC, and docked states | [🛠️](roles/drv-lid-switch/README.md#quick-setup) | |
|
||||
| [Listmonk](roles/web-app-listmonk/) | beta | Self-hosted platform for newsletters and mailing lists with subscriber segmentation and campaign analytics | [🌐](https://listmonk.app/) [🛠️](roles/web-app-listmonk/README.md#quick-setup) | [Assets Server](roles/web-svc-asset/), [Corporate Design](roles/web-svc-css/), [Dashboard](roles/web-app-dashboard/), [Keycloak](roles/web-app-keycloak/), [Mailu](roles/web-app-mailu/), [Matomo](roles/web-app-matomo/), [PostgreSQL](roles/svc-db-postgres/), [Prometheus](roles/web-app-prometheus/), [SeaweedFS](roles/web-app-seaweedfs/), [Tor Onion Service](roles/svc-net-tor/), [Universal Logout](roles/web-svc-logout/) |
|
||||
| [Listmonk](roles/web-app-listmonk/) | beta | Self-hosted platform for newsletters and mailing lists with subscriber segmentation and campaign analytics | [🌐](https://listmonk.app/) [🛠️](roles/web-app-listmonk/README.md#quick-setup) | [Assets Server](roles/web-svc-asset/), [Corporate Design](roles/web-svc-css/), [Dashboard](roles/web-app-dashboard/), [Flowise](roles/web-app-flowise/), [Hermes Agent](roles/web-app-hermes/), [Keycloak](roles/web-app-keycloak/), [Mailu](roles/web-app-mailu/), [Matomo](roles/web-app-matomo/), [Open WebUI](roles/web-app-openwebui/), [OpenClaw](roles/web-app-openclaw/), [PostgreSQL](roles/svc-db-postgres/), [Prometheus](roles/web-app-prometheus/), [SeaweedFS](roles/web-app-seaweedfs/), [Tor Onion Service](roles/svc-net-tor/), [Universal Logout](roles/web-svc-logout/) |
|
||||
| [LiteLLM Admin UI](roles/web-app-litellm/) | beta | Browser-facing admin interface for the shared LLM gateway, published on its own domain behind the front proxy | [🌐](https://docs.litellm.ai/) [🛠️](roles/web-app-litellm/README.md#quick-setup) | [Dashboard](roles/web-app-dashboard/), [Keycloak](roles/web-app-keycloak/), [LiteLLM Gateway](roles/svc-ai-litellm/), [Prometheus](roles/web-app-prometheus/), [Tor Onion Service](roles/svc-net-tor/) |
|
||||
| [LiteLLM Gateway](roles/svc-ai-litellm/) | beta | OpenAI-compatible LLM gateway routing a single /v1 endpoint to local and hosted model backends with per-consumer keys | [🌐](https://docs.litellm.ai/) [🛠️](roles/svc-ai-litellm/README.md#quick-setup) | [LM Studio](roles/svc-ai-lmstudio/), [Ollama](roles/svc-ai-ollama/), [PostgreSQL](roles/svc-db-postgres/) |
|
||||
| [LittleJS](roles/web-app-littlejs/) | alpha | Self-hosted HTML5 game sandbox for browsing and running lightweight engine demos and games in the browser | [🌐](https://killedbyapixel.github.io/LittleJS/) [🎬](https://youtu.be/chuBzGjv7Ms) [🛠️](roles/web-app-littlejs/README.md#quick-setup) | [Content Delivery Network](roles/web-svc-cdn/), [Corporate Design](roles/web-svc-css/), [Dashboard](roles/web-app-dashboard/), [Matomo](roles/web-app-matomo/), [Prometheus](roles/web-app-prometheus/), [Tor Onion Service](roles/svc-net-tor/) |
|
||||
@@ -125,16 +125,16 @@ Every invokable role in the tested lifecycle envelope, with its upstream homepag
|
||||
| [Mastodon](roles/web-app-mastodon/) | beta | Self-hosted federated social network for microblogging, real-time timelines, and community moderation | [🌐](https://joinmastodon.org/) [🛠️](roles/web-app-mastodon/README.md#quick-setup) | [Backup Docker Volumes](roles/svc-bkp-volume-2-local/), [Corporate Design](roles/web-svc-css/), [Dashboard](roles/web-app-dashboard/), [Keycloak](roles/web-app-keycloak/), [Mailu](roles/web-app-mailu/), [Matomo](roles/web-app-matomo/), [PostgreSQL](roles/svc-db-postgres/), [Prometheus](roles/web-app-prometheus/), [Redis](roles/svc-db-redis/), [SeaweedFS](roles/web-app-seaweedfs/), [Tor Onion Service](roles/svc-net-tor/), [Universal Logout](roles/web-svc-logout/) |
|
||||
| [Matomo](roles/web-app-matomo/) | beta | Self-hosted, privacy-first web analytics platform for real-time visitor tracking and site metrics | [🌐](https://matomo.org/) [🎬](https://www.youtube.com/watch?v=Qc2kooLNDiU) [🛠️](roles/web-app-matomo/README.md#quick-setup) | [Backup Docker Volumes](roles/svc-bkp-volume-2-local/), [Corporate Design](roles/web-svc-css/), [Dashboard](roles/web-app-dashboard/), [MariaDB](roles/svc-db-mariadb/), [Prometheus](roles/web-app-prometheus/), [Tor Onion Service](roles/svc-net-tor/), [Universal Logout](roles/web-svc-logout/) |
|
||||
| [Matrix](roles/web-app-matrix/) | beta | Federated, end-to-end-encrypted messaging platform with a web client and protocol bridges to external chat networks | [🌐](https://matrix.org/) [🎬](https://www.youtube.com/watch?v=3AVsNqH_-9M) [🛠️](roles/web-app-matrix/README.md#quick-setup) | [Backup Docker Volumes](roles/svc-bkp-volume-2-local/), [Corporate Design](roles/web-svc-css/), [Coturn](roles/web-svc-coturn/), [Dashboard](roles/web-app-dashboard/), [Keycloak](roles/web-app-keycloak/), [LiteLLM Gateway](roles/svc-ai-litellm/), [Mailu](roles/web-app-mailu/), [Matomo](roles/web-app-matomo/), [OpenLDAP](roles/svc-db-openldap/), [PostgreSQL](roles/svc-db-postgres/), [Prometheus](roles/web-app-prometheus/), [SeaweedFS](roles/web-app-seaweedfs/), [Tor Onion Service](roles/svc-net-tor/), [Universal Logout](roles/web-svc-logout/) |
|
||||
| [Mattermost](roles/web-app-mattermost/) | beta | Open-source, self-hosted team messaging platform for real-time collaboration via channels, threads, and integrations | [🌐](https://mattermost.com/) [🎬](https://www.youtube.com/watch?v=szfZfQFUSnU) [🛠️](roles/web-app-mattermost/README.md#quick-setup) | [Backup Docker Volumes](roles/svc-bkp-volume-2-local/), [Content Delivery Network](roles/web-svc-cdn/), [Corporate Design](roles/web-svc-css/), [Dashboard](roles/web-app-dashboard/), [Keycloak](roles/web-app-keycloak/), [LiteLLM Gateway](roles/svc-ai-litellm/), [Mailu](roles/web-app-mailu/), [Matomo](roles/web-app-matomo/), [PostgreSQL](roles/svc-db-postgres/), [Prometheus](roles/web-app-prometheus/), [SeaweedFS](roles/web-app-seaweedfs/), [Tor Onion Service](roles/svc-net-tor/), [Universal Logout](roles/web-svc-logout/) |
|
||||
| [Mattermost](roles/web-app-mattermost/) | beta | Open-source, self-hosted team messaging platform for real-time collaboration via channels, threads, and integrations | [🌐](https://mattermost.com/) [🎬](https://www.youtube.com/watch?v=szfZfQFUSnU) [🛠️](roles/web-app-mattermost/README.md#quick-setup) | [Backup Docker Volumes](roles/svc-bkp-volume-2-local/), [Content Delivery Network](roles/web-svc-cdn/), [Corporate Design](roles/web-svc-css/), [Dashboard](roles/web-app-dashboard/), [Flowise](roles/web-app-flowise/), [Hermes Agent](roles/web-app-hermes/), [Keycloak](roles/web-app-keycloak/), [LiteLLM Gateway](roles/svc-ai-litellm/), [Mailu](roles/web-app-mailu/), [Matomo](roles/web-app-matomo/), [Open WebUI](roles/web-app-openwebui/), [OpenClaw](roles/web-app-openclaw/), [PostgreSQL](roles/svc-db-postgres/), [Prometheus](roles/web-app-prometheus/), [SeaweedFS](roles/web-app-seaweedfs/), [Tor Onion Service](roles/svc-net-tor/), [Universal Logout](roles/web-svc-logout/) |
|
||||
| [MCP Adapter](roles/svc-ai-mcp-adapter/) | alpha | Reusable per-provider MCP adapter exposing a narrow allowlisted read surface | [🌐](https://modelcontextprotocol.io/) [🛠️](roles/svc-ai-mcp-adapter/README.md#quick-setup) | |
|
||||
| [MediaWiki](roles/web-app-mediawiki/) | beta | Collaborative wiki platform for user-driven documentation with an extensible extension ecosystem and content management | [🌐](https://www.mediawiki.org/) [🎬](https://www.youtube.com/watch?v=-JnIjpRvgNY) [🛠️](roles/web-app-mediawiki/README.md#quick-setup) | [Backup Docker Volumes](roles/svc-bkp-volume-2-local/), [Corporate Design](roles/web-svc-css/), [Dashboard](roles/web-app-dashboard/), [Keycloak](roles/web-app-keycloak/), [LiteLLM Gateway](roles/svc-ai-litellm/), [Mailu](roles/web-app-mailu/), [MariaDB](roles/svc-db-mariadb/), [Matomo](roles/web-app-matomo/), [Prometheus](roles/web-app-prometheus/), [Tor Onion Service](roles/svc-net-tor/), [Universal Logout](roles/web-svc-logout/) |
|
||||
| [Memcached](roles/svc-db-memcached/) | beta | Central in-memory caching engine with per-consumer key-prefix isolation, usable centrally or as an embedded sidecar | [🌐](https://memcached.org/) [🛠️](roles/svc-db-memcached/README.md#quick-setup) | [Tor Onion Service](roles/svc-net-tor/) |
|
||||
| [MIG](roles/web-app-mig/) | alpha | Interactive graph visualization of all Infinito.Nexus roles and their dependencies for architecture transparency | [🛠️](roles/web-app-mig/README.md#quick-setup) | [Corporate Design](roles/web-svc-css/), [Dashboard](roles/web-app-dashboard/), [Matomo](roles/web-app-matomo/), [Prometheus](roles/web-app-prometheus/), [Tor Onion Service](roles/svc-net-tor/) |
|
||||
| [Mini-QR](roles/web-app-mini-qr/) | beta | Self-hosted browser tool for generating QR codes from text or URLs with privacy-friendly local rendering | [🌐](https://github.com/lyqht/mini-qr) [🛠️](roles/web-app-mini-qr/README.md#quick-setup) | [Corporate Design](roles/web-svc-css/), [Dashboard](roles/web-app-dashboard/), [Matomo](roles/web-app-matomo/), [Prometheus](roles/web-app-prometheus/), [Tor Onion Service](roles/svc-net-tor/) |
|
||||
| [Mobilizon](roles/web-app-mobilizon/) | beta | Federated, self-hosted platform for organizing events and building communities and groups | [🌐](https://joinmobilizon.org/) [🎬](https://framatube.org/c/mobilizon/videos) [🛠️](roles/web-app-mobilizon/README.md#quick-setup) | [Backup Docker Volumes](roles/svc-bkp-volume-2-local/), [Corporate Design](roles/web-svc-css/), [Dashboard](roles/web-app-dashboard/), [Keycloak](roles/web-app-keycloak/), [Mailu](roles/web-app-mailu/), [Matomo](roles/web-app-matomo/), [PostgreSQL](roles/svc-db-postgres/), [Prometheus](roles/web-app-prometheus/), [Tor Onion Service](roles/svc-net-tor/), [Universal Logout](roles/web-svc-logout/) |
|
||||
| [Moodle](roles/web-app-moodle/) | beta | Open-source learning management system for creating, managing, and delivering online courses and e-learning | [🌐](https://moodle.org/) [🎬](https://www.youtube.com/watch?v=3ORsUGVNxGs) [🛠️](roles/web-app-moodle/README.md#quick-setup) | [Backup Docker Volumes](roles/svc-bkp-volume-2-local/), [Corporate Design](roles/web-svc-css/), [Dashboard](roles/web-app-dashboard/), [Keycloak](roles/web-app-keycloak/), [LiteLLM Gateway](roles/svc-ai-litellm/), [Mailu](roles/web-app-mailu/), [MariaDB](roles/svc-db-mariadb/), [Matomo](roles/web-app-matomo/), [OpenLDAP](roles/svc-db-openldap/), [Prometheus](roles/web-app-prometheus/), [Tor Onion Service](roles/svc-net-tor/), [Universal Logout](roles/web-svc-logout/) |
|
||||
| [n8n](roles/web-app-n8n/) | beta | Self-hosted low-code automation platform for connecting services and building workflow integrations visually | [🌐](https://n8n.io/) [🎬](https://youtu.be/4cQWJViybAQ) [🛠️](roles/web-app-n8n/README.md#quick-setup) | [Backup Docker Volumes](roles/svc-bkp-volume-2-local/), [Corporate Design](roles/web-svc-css/), [Dashboard](roles/web-app-dashboard/), [Keycloak](roles/web-app-keycloak/), [LiteLLM Gateway](roles/svc-ai-litellm/), [Mailu](roles/web-app-mailu/), [Matomo](roles/web-app-matomo/), [PostgreSQL](roles/svc-db-postgres/), [Prometheus](roles/web-app-prometheus/), [Tor Onion Service](roles/svc-net-tor/), [Universal Logout](roles/web-svc-logout/) |
|
||||
| [Nextcloud](roles/web-app-nextcloud/) | beta | Self-hosted cloud platform for file sync, sharing, real-time collaboration, and team workspaces under your own domain | [🌐](https://nextcloud.com/) [🎬](https://youtu.be/3jcYJGQgenI?si=FDmoMSrAb9_WvviC) [🛠️](roles/web-app-nextcloud/README.md#quick-setup) | [Backup Docker Volumes](roles/svc-bkp-volume-2-local/), [BigBlueButton](roles/web-app-bigbluebutton/), [Collabora](roles/web-svc-collabora/), [Corporate Design](roles/web-svc-css/), [Coturn](roles/web-svc-coturn/), [Dashboard](roles/web-app-dashboard/), [Discourse](roles/web-app-discourse/), [GitLab](roles/web-app-gitlab/), [Keycloak](roles/web-app-keycloak/), [LiteLLM Gateway](roles/svc-ai-litellm/), [Mailu](roles/web-app-mailu/), [MariaDB](roles/svc-db-mariadb/), [Mastodon](roles/web-app-mastodon/), [Matomo](roles/web-app-matomo/), [Matrix](roles/web-app-matrix/), [Mattermost](roles/web-app-mattermost/), [OnlyOffice](roles/web-svc-onlyoffice/), [Open WebUI](roles/web-app-openwebui/), [OpenLDAP](roles/svc-db-openldap/), [OpenProject](roles/web-app-openproject/), [PeerTube](roles/web-app-peertube/), [Prometheus](roles/web-app-prometheus/), [Redis](roles/svc-db-redis/), [SeaweedFS](roles/web-app-seaweedfs/), [Tor Onion Service](roles/svc-net-tor/), [Universal Logout](roles/web-svc-logout/), [XWiki](roles/web-app-xwiki/), [Zammad](roles/web-app-zammad/) |
|
||||
| [Moodle](roles/web-app-moodle/) | beta | Open-source learning management system for creating, managing, and delivering online courses and e-learning | [🌐](https://moodle.org/) [🎬](https://www.youtube.com/watch?v=3ORsUGVNxGs) [🛠️](roles/web-app-moodle/README.md#quick-setup) | [Backup Docker Volumes](roles/svc-bkp-volume-2-local/), [Corporate Design](roles/web-svc-css/), [Dashboard](roles/web-app-dashboard/), [Flowise](roles/web-app-flowise/), [Hermes Agent](roles/web-app-hermes/), [Keycloak](roles/web-app-keycloak/), [LiteLLM Gateway](roles/svc-ai-litellm/), [Mailu](roles/web-app-mailu/), [MariaDB](roles/svc-db-mariadb/), [Matomo](roles/web-app-matomo/), [Open WebUI](roles/web-app-openwebui/), [OpenClaw](roles/web-app-openclaw/), [OpenLDAP](roles/svc-db-openldap/), [Prometheus](roles/web-app-prometheus/), [Tor Onion Service](roles/svc-net-tor/), [Universal Logout](roles/web-svc-logout/) |
|
||||
| [n8n](roles/web-app-n8n/) | beta | Self-hosted low-code automation platform for connecting services and building workflow integrations visually | [🌐](https://n8n.io/) [🎬](https://youtu.be/4cQWJViybAQ) [🛠️](roles/web-app-n8n/README.md#quick-setup) | [Backup Docker Volumes](roles/svc-bkp-volume-2-local/), [Corporate Design](roles/web-svc-css/), [Dashboard](roles/web-app-dashboard/), [Flowise](roles/web-app-flowise/), [Hermes Agent](roles/web-app-hermes/), [Keycloak](roles/web-app-keycloak/), [LiteLLM Gateway](roles/svc-ai-litellm/), [Mailu](roles/web-app-mailu/), [Matomo](roles/web-app-matomo/), [Open WebUI](roles/web-app-openwebui/), [OpenClaw](roles/web-app-openclaw/), [PostgreSQL](roles/svc-db-postgres/), [Prometheus](roles/web-app-prometheus/), [Tor Onion Service](roles/svc-net-tor/), [Universal Logout](roles/web-svc-logout/) |
|
||||
| [Nextcloud](roles/web-app-nextcloud/) | beta | Self-hosted cloud platform for file sync, sharing, real-time collaboration, and team workspaces under your own domain | [🌐](https://nextcloud.com/) [🎬](https://youtu.be/3jcYJGQgenI?si=FDmoMSrAb9_WvviC) [🛠️](roles/web-app-nextcloud/README.md#quick-setup) | [Backup Docker Volumes](roles/svc-bkp-volume-2-local/), [BigBlueButton](roles/web-app-bigbluebutton/), [Collabora](roles/web-svc-collabora/), [Corporate Design](roles/web-svc-css/), [Coturn](roles/web-svc-coturn/), [Dashboard](roles/web-app-dashboard/), [Discourse](roles/web-app-discourse/), [Flowise](roles/web-app-flowise/), [GitLab](roles/web-app-gitlab/), [Hermes Agent](roles/web-app-hermes/), [Keycloak](roles/web-app-keycloak/), [LiteLLM Gateway](roles/svc-ai-litellm/), [Mailu](roles/web-app-mailu/), [MariaDB](roles/svc-db-mariadb/), [Mastodon](roles/web-app-mastodon/), [Matomo](roles/web-app-matomo/), [Matrix](roles/web-app-matrix/), [Mattermost](roles/web-app-mattermost/), [OnlyOffice](roles/web-svc-onlyoffice/), [Open WebUI](roles/web-app-openwebui/), [OpenClaw](roles/web-app-openclaw/), [OpenLDAP](roles/svc-db-openldap/), [OpenProject](roles/web-app-openproject/), [PeerTube](roles/web-app-peertube/), [Prometheus](roles/web-app-prometheus/), [Redis](roles/svc-db-redis/), [SeaweedFS](roles/web-app-seaweedfs/), [Tor Onion Service](roles/svc-net-tor/), [Universal Logout](roles/web-svc-logout/), [XWiki](roles/web-app-xwiki/), [Zammad](roles/web-app-zammad/) |
|
||||
| [NFS Client](roles/svc-storage-nfs-client/) | beta | Client-side NFS setup for mounting a remote server export on every swarm node, with a deploy-time reachability probe | [🛠️](roles/svc-storage-nfs-client/README.md#quick-setup) | [NFS Server](roles/svc-storage-nfs-server/) |
|
||||
| [NFS Server](roles/svc-storage-nfs-server/) | beta | Kernel-level NFS server for exporting a shared directory tree with IP-restricted access for swarm-node hosts | [🛠️](roles/svc-storage-nfs-server/README.md#quick-setup) | [Backup NFS](roles/svc-bkp-nfs-2-local/) |
|
||||
| [Odoo ERP](roles/web-app-odoo/) | beta | Open-source ERP suite for CRM, sales, accounting, inventory, HR, and website management | [🌐](https://www.odoo.com/) [🎬](https://www.odoo.com/slides/getting-started-15) [🛠️](roles/web-app-odoo/README.md#quick-setup) | [Backup Docker Volumes](roles/svc-bkp-volume-2-local/), [Corporate Design](roles/web-svc-css/), [Dashboard](roles/web-app-dashboard/), [Keycloak](roles/web-app-keycloak/), [Mailu](roles/web-app-mailu/), [Matomo](roles/web-app-matomo/), [OpenLDAP](roles/svc-db-openldap/), [PostgreSQL](roles/svc-db-postgres/), [Prometheus](roles/web-app-prometheus/), [Redis](roles/svc-db-redis/), [Tor Onion Service](roles/svc-net-tor/), [Universal Logout](roles/web-svc-logout/) |
|
||||
@@ -155,10 +155,10 @@ Every invokable role in the tested lifecycle envelope, with its upstream homepag
|
||||
| [Pixelfed](roles/web-app-pixelfed/) | beta | Decentralized, federated platform for photo sharing and image feeds across the fediverse | [🌐](https://pixelfed.org/) [🛠️](roles/web-app-pixelfed/README.md#quick-setup) | [Backup Docker Volumes](roles/svc-bkp-volume-2-local/), [Corporate Design](roles/web-svc-css/), [Dashboard](roles/web-app-dashboard/), [Keycloak](roles/web-app-keycloak/), [Mailu](roles/web-app-mailu/), [MariaDB](roles/svc-db-mariadb/), [Matomo](roles/web-app-matomo/), [Prometheus](roles/web-app-prometheus/), [Redis](roles/svc-db-redis/), [SeaweedFS](roles/web-app-seaweedfs/), [Tor Onion Service](roles/svc-net-tor/), [Universal Logout](roles/web-svc-logout/) |
|
||||
| [PostgreSQL](roles/svc-db-postgres/) | beta | Containerized relational database with automated database, user, and privilege provisioning | [🌐](https://www.postgresql.org/) [🛠️](roles/svc-db-postgres/README.md#quick-setup) | [Backup Docker Volumes](roles/svc-bkp-volume-2-local/), [Tor Onion Service](roles/svc-net-tor/) |
|
||||
| [Postmarks](roles/web-app-postmarks/) | beta | Single-user ActivityPub bookmarking site federating public bookmarks to Mastodon and the Fediverse | [🌐](https://github.com/ckolderup/postmarks) [🛠️](roles/web-app-postmarks/README.md#quick-setup) | [Corporate Design](roles/web-svc-css/), [Dashboard](roles/web-app-dashboard/), [Keycloak](roles/web-app-keycloak/), [Matomo](roles/web-app-matomo/), [Prometheus](roles/web-app-prometheus/), [Tor Onion Service](roles/svc-net-tor/), [Universal Logout](roles/web-svc-logout/) |
|
||||
| [Pretix](roles/web-app-pretix/) | beta | Self-hosted ticketing platform for events with online sales, registration management, and secure payments | [🌐](https://pretix.eu/) [🎬](https://www.youtube.com/channel/UCG1Og1YUpgIJD4geAZLAp5g) [🛠️](roles/web-app-pretix/README.md#quick-setup) | [Backup Docker Volumes](roles/svc-bkp-volume-2-local/), [Corporate Design](roles/web-svc-css/), [Dashboard](roles/web-app-dashboard/), [Keycloak](roles/web-app-keycloak/), [Mailu](roles/web-app-mailu/), [Matomo](roles/web-app-matomo/), [PostgreSQL](roles/svc-db-postgres/), [Prometheus](roles/web-app-prometheus/), [Redis](roles/svc-db-redis/), [Tor Onion Service](roles/svc-net-tor/), [Universal Logout](roles/web-svc-logout/) |
|
||||
| [Prometheus](roles/web-app-prometheus/) | beta | Open-source monitoring and alerting toolkit for storing metrics as time-series data and querying them with PromQL | [🌐](https://prometheus.io/) [🎬](https://www.youtube.com/c/PrometheusIo) [🛠️](roles/web-app-prometheus/README.md#quick-setup) | [Backup Docker Volumes](roles/svc-bkp-volume-2-local/), [Corporate Design](roles/web-svc-css/), [Dashboard](roles/web-app-dashboard/), [Keycloak](roles/web-app-keycloak/), [Mailu](roles/web-app-mailu/), [Matomo](roles/web-app-matomo/), [Tor Onion Service](roles/svc-net-tor/), [Universal Logout](roles/web-svc-logout/) |
|
||||
| [Pretix](roles/web-app-pretix/) | beta | Self-hosted ticketing platform for events with online sales, registration management, and secure payments | [🌐](https://pretix.eu/) [🎬](https://www.youtube.com/channel/UCG1Og1YUpgIJD4geAZLAp5g) [🛠️](roles/web-app-pretix/README.md#quick-setup) | [Backup Docker Volumes](roles/svc-bkp-volume-2-local/), [Corporate Design](roles/web-svc-css/), [Dashboard](roles/web-app-dashboard/), [Flowise](roles/web-app-flowise/), [Hermes Agent](roles/web-app-hermes/), [Keycloak](roles/web-app-keycloak/), [Mailu](roles/web-app-mailu/), [Matomo](roles/web-app-matomo/), [Open WebUI](roles/web-app-openwebui/), [OpenClaw](roles/web-app-openclaw/), [PostgreSQL](roles/svc-db-postgres/), [Prometheus](roles/web-app-prometheus/), [Redis](roles/svc-db-redis/), [Tor Onion Service](roles/svc-net-tor/), [Universal Logout](roles/web-svc-logout/) |
|
||||
| [Prometheus](roles/web-app-prometheus/) | beta | Open-source monitoring and alerting toolkit for storing metrics as time-series data and querying them with PromQL | [🌐](https://prometheus.io/) [🎬](https://www.youtube.com/c/PrometheusIo) [🛠️](roles/web-app-prometheus/README.md#quick-setup) | [Backup Docker Volumes](roles/svc-bkp-volume-2-local/), [Corporate Design](roles/web-svc-css/), [Dashboard](roles/web-app-dashboard/), [Flowise](roles/web-app-flowise/), [Hermes Agent](roles/web-app-hermes/), [Keycloak](roles/web-app-keycloak/), [Mailu](roles/web-app-mailu/), [Matomo](roles/web-app-matomo/), [Open WebUI](roles/web-app-openwebui/), [OpenClaw](roles/web-app-openclaw/), [Tor Onion Service](roles/svc-net-tor/), [Universal Logout](roles/web-svc-logout/) |
|
||||
| [Proprietary Drivers](roles/drv-non-free/) | alpha | Proprietary GPU driver installer for Arch-based systems via mhwd nonfree hardware detection | [🛠️](roles/drv-non-free/README.md#quick-setup) | |
|
||||
| [Qdrant](roles/svc-db-qdrant/) | beta | Central vector database engine for storing and searching per-consumer embeddings shared across the stack | [🌐](https://qdrant.tech/) [🎬](https://www.youtube.com/watch?v=_opNdOa48Lc) [🛠️](roles/svc-db-qdrant/README.md#quick-setup) | [Backup Docker Volumes](roles/svc-bkp-volume-2-local/), [Tor Onion Service](roles/svc-net-tor/) |
|
||||
| [Qdrant](roles/svc-db-qdrant/) | beta | Central vector database engine for storing and searching per-consumer embeddings shared across the stack | [🌐](https://qdrant.tech/) [🎬](https://www.youtube.com/watch?v=_opNdOa48Lc) [🛠️](roles/svc-db-qdrant/README.md#quick-setup) | [Backup Docker Volumes](roles/svc-bkp-volume-2-local/), [Flowise](roles/web-app-flowise/), [Hermes Agent](roles/web-app-hermes/), [Open WebUI](roles/web-app-openwebui/), [OpenClaw](roles/web-app-openclaw/), [Tor Onion Service](roles/svc-net-tor/) |
|
||||
| [RabbitMQ](roles/svc-db-rabbitmq/) | beta | Shared message broker for async messaging with per-consumer virtual host and user isolation | [🌐](https://www.rabbitmq.com/) [🛠️](roles/svc-db-rabbitmq/README.md#quick-setup) | [Backup Docker Volumes](roles/svc-bkp-volume-2-local/), [Tor Onion Service](roles/svc-net-tor/) |
|
||||
| [Redirector](roles/web-opt-rdr-domains/) | beta | NGINX glue role for 301 redirects from source to target domains with automatic SSL for the source hosts | [🛠️](roles/web-opt-rdr-domains/README.md#quick-setup) | |
|
||||
| [Redis](roles/svc-db-redis/) | beta | In-memory key-value cache and store, shared centrally with per-consumer ACL isolation or embedded as a sidecar | [🌐](https://redis.io/) [🛠️](roles/svc-db-redis/README.md#quick-setup) | [Tor Onion Service](roles/svc-net-tor/) |
|
||||
@@ -168,7 +168,7 @@ Every invokable role in the tested lifecycle envelope, with its upstream homepag
|
||||
| [Semaphore UI](roles/web-app-semaphore/) | beta | Web UI and API for running Ansible, Terraform/OpenTofu, and shell automation on a schedule or on demand | [🌐](https://semaphoreui.com/) [🎬](https://www.youtube.com/watch?v=nzR4yDuZQMU) [🛠️](roles/web-app-semaphore/README.md#quick-setup) | [Backup Docker Volumes](roles/svc-bkp-volume-2-local/), [Corporate Design](roles/web-svc-css/), [Dashboard](roles/web-app-dashboard/), [Keycloak](roles/web-app-keycloak/), [Mailu](roles/web-app-mailu/), [Matomo](roles/web-app-matomo/), [OpenLDAP](roles/svc-db-openldap/), [PostgreSQL](roles/svc-db-postgres/), [Prometheus](roles/web-app-prometheus/), [Tor Onion Service](roles/svc-net-tor/), [Universal Logout](roles/web-svc-logout/) |
|
||||
| [Shopware](roles/web-app-shopware/) | beta | Open-source ecommerce platform built on Symfony and Vue.js for building and scaling online storefronts | [🌐](https://www.shopware.com/en/) [🎬](https://www.youtube.com/watch?v=bG57TZPYsyw) [🛠️](roles/web-app-shopware/README.md#quick-setup) | [Backup Docker Volumes](roles/svc-bkp-volume-2-local/), [Corporate Design](roles/web-svc-css/), [Dashboard](roles/web-app-dashboard/), [Keycloak](roles/web-app-keycloak/), [Mailu](roles/web-app-mailu/), [MariaDB](roles/svc-db-mariadb/), [Matomo](roles/web-app-matomo/), [OpenLDAP](roles/svc-db-openldap/), [Prometheus](roles/web-app-prometheus/), [Redis](roles/svc-db-redis/), [SeaweedFS](roles/web-app-seaweedfs/), [Tor Onion Service](roles/svc-net-tor/), [Universal Logout](roles/web-svc-logout/) |
|
||||
| [Simple Icons](roles/web-svc-simpleicons/) | beta | Containerized icon server for hosting the Simple Icons brand SVG and PNG collection for web and documentation use | [🌐](https://simpleicons.org/) [🛠️](roles/web-svc-simpleicons/README.md#quick-setup) | [Prometheus](roles/web-app-prometheus/), [Tor Onion Service](roles/svc-net-tor/) |
|
||||
| [Snipe‑IT](roles/web-app-snipe-it/) | beta | Open-source IT asset management system for tracking hardware and software inventory | [🌐](https://snipeitapp.com/) [🎬](https://www.youtube.com/watch?v=q0V6FAPc1ls) [🛠️](roles/web-app-snipe-it/README.md#quick-setup) | [Backup Docker Volumes](roles/svc-bkp-volume-2-local/), [Corporate Design](roles/web-svc-css/), [Dashboard](roles/web-app-dashboard/), [Keycloak](roles/web-app-keycloak/), [Mailu](roles/web-app-mailu/), [MariaDB](roles/svc-db-mariadb/), [Matomo](roles/web-app-matomo/), [OpenLDAP](roles/svc-db-openldap/), [Prometheus](roles/web-app-prometheus/), [Redis](roles/svc-db-redis/), [SeaweedFS](roles/web-app-seaweedfs/), [Tor Onion Service](roles/svc-net-tor/), [Universal Logout](roles/web-svc-logout/) |
|
||||
| [Snipe‑IT](roles/web-app-snipe-it/) | beta | Open-source IT asset management system for tracking hardware and software inventory | [🌐](https://snipeitapp.com/) [🎬](https://www.youtube.com/watch?v=q0V6FAPc1ls) [🛠️](roles/web-app-snipe-it/README.md#quick-setup) | [Backup Docker Volumes](roles/svc-bkp-volume-2-local/), [Corporate Design](roles/web-svc-css/), [Dashboard](roles/web-app-dashboard/), [Flowise](roles/web-app-flowise/), [Hermes Agent](roles/web-app-hermes/), [Keycloak](roles/web-app-keycloak/), [Mailu](roles/web-app-mailu/), [MariaDB](roles/svc-db-mariadb/), [Matomo](roles/web-app-matomo/), [Open WebUI](roles/web-app-openwebui/), [OpenClaw](roles/web-app-openclaw/), [OpenLDAP](roles/svc-db-openldap/), [Prometheus](roles/web-app-prometheus/), [Redis](roles/svc-db-redis/), [SeaweedFS](roles/web-app-seaweedfs/), [Tor Onion Service](roles/svc-net-tor/), [Universal Logout](roles/web-svc-logout/) |
|
||||
| [Social Home](roles/web-app-socialhome/) | alpha | Privacy-first social platform for households, federating peer-to-peer over WebRTC on an embedded SQLite store | [🌐](https://github.com/social-home-io/socialhome) [🛠️](roles/web-app-socialhome/README.md#quick-setup) | [Backup Docker Volumes](roles/svc-bkp-volume-2-local/), [Coturn](roles/web-svc-coturn/), [Dashboard](roles/web-app-dashboard/), [Prometheus](roles/web-app-prometheus/), [Tor Onion Service](roles/svc-net-tor/), [Universal Logout](roles/web-svc-logout/) |
|
||||
| [Sphinx](roles/web-app-sphinx/) | beta | Documentation generator that builds HTML from a source repository and serves it through a lightweight HTTP server | [🌐](https://www.sphinx-doc.org/) [🛠️](roles/web-app-sphinx/README.md#quick-setup) | [Corporate Design](roles/web-svc-css/), [Dashboard](roles/web-app-dashboard/), [Matomo](roles/web-app-matomo/), [Prometheus](roles/web-app-prometheus/), [Tor Onion Service](roles/svc-net-tor/) |
|
||||
| [Storage Optimizer](roles/svc-opt-ssd-hdd/) | beta | Tiering role placing Docker volumes on SSD or HDD by workload type, with symlinks keeping paths consistent | [🛠️](roles/svc-opt-ssd-hdd/README.md#quick-setup) | |
|
||||
@@ -183,12 +183,12 @@ Every invokable role in the tested lifecycle envelope, with its upstream homepag
|
||||
| [Wireguard](roles/svc-net-wireguard-core/) | alpha | Host-level WireGuard VPN service with wg-quick config, package install, and IP-forwarding sysctl for secure tunnels | [🌐](https://www.wireguard.com/) [🛠️](roles/svc-net-wireguard-core/README.md#quick-setup) | |
|
||||
| [Wireguard Client](roles/svc-net-wireguard-plain/) | alpha | Client-side WireGuard VPN role for stable connectivity with a systemd service and script that tune interface MTU | [🌐](https://www.wireguard.com/) [🛠️](roles/svc-net-wireguard-plain/README.md#quick-setup) | |
|
||||
| [WireGuard Client behind NAT](roles/svc-net-wireguard-firewalled/) | alpha | Networking helper for iptables forwarding and NAT masquerading of a WireGuard client running behind NAT or a firewall | [🛠️](roles/svc-net-wireguard-firewalled/README.md#quick-setup) | |
|
||||
| [WordPress](roles/web-app-wordpress/) | beta | Content management system for building and managing websites, blogs, and multisite networks with themes and plugins | [🌐](https://wordpress.org/) [🎬](https://www.youtube.com/wordpress) [🛠️](roles/web-app-wordpress/README.md#quick-setup) | [Backup Docker Volumes](roles/svc-bkp-volume-2-local/), [Corporate Design](roles/web-svc-css/), [Dashboard](roles/web-app-dashboard/), [Discourse](roles/web-app-discourse/), [Keycloak](roles/web-app-keycloak/), [LiteLLM Gateway](roles/svc-ai-litellm/), [Mailu](roles/web-app-mailu/), [MariaDB](roles/svc-db-mariadb/), [Matomo](roles/web-app-matomo/), [Prometheus](roles/web-app-prometheus/), [Tor Onion Service](roles/svc-net-tor/), [Universal Logout](roles/web-svc-logout/) |
|
||||
| [WordPress](roles/web-app-wordpress/) | beta | Content management system for building and managing websites, blogs, and multisite networks with themes and plugins | [🌐](https://wordpress.org/) [🎬](https://www.youtube.com/wordpress) [🛠️](roles/web-app-wordpress/README.md#quick-setup) | [Backup Docker Volumes](roles/svc-bkp-volume-2-local/), [Corporate Design](roles/web-svc-css/), [Dashboard](roles/web-app-dashboard/), [Discourse](roles/web-app-discourse/), [Flowise](roles/web-app-flowise/), [Hermes Agent](roles/web-app-hermes/), [Keycloak](roles/web-app-keycloak/), [LiteLLM Gateway](roles/svc-ai-litellm/), [Mailu](roles/web-app-mailu/), [MariaDB](roles/svc-db-mariadb/), [Matomo](roles/web-app-matomo/), [Open WebUI](roles/web-app-openwebui/), [OpenClaw](roles/web-app-openclaw/), [Prometheus](roles/web-app-prometheus/), [Tor Onion Service](roles/svc-net-tor/), [Universal Logout](roles/web-svc-logout/) |
|
||||
| [World Wide Web](roles/web-opt-rdr-www/) | beta | NGINX server blocks that permanently redirect www subdomains to their non-www apex domains | [🛠️](roles/web-opt-rdr-www/README.md#quick-setup) | [Tor Onion Service](roles/svc-net-tor/) |
|
||||
| [XMPP](roles/web-svc-xmpp/) | beta | Placeholder stub role for a future XMPP server/container deployment, implementation pending | [🌐](https://ejabberd.im/) [🛠️](roles/web-svc-xmpp/README.md#quick-setup) | [Backup Docker Volumes](roles/svc-bkp-volume-2-local/), [Keycloak](roles/web-app-keycloak/), [OpenLDAP](roles/svc-db-openldap/), [Prometheus](roles/web-app-prometheus/), [Tor Onion Service](roles/svc-net-tor/) |
|
||||
| [XWiki](roles/web-app-xwiki/) | beta | Self-hosted enterprise wiki and knowledge-management platform with collaboration and app-based extensibility | [🌐](https://www.xwiki.org/) [🎬](https://www.youtube.com/watch?v=8DePx30dh2g) [🛠️](roles/web-app-xwiki/README.md#quick-setup) | [Backup Docker Volumes](roles/svc-bkp-volume-2-local/), [Corporate Design](roles/web-svc-css/), [Dashboard](roles/web-app-dashboard/), [Keycloak](roles/web-app-keycloak/), [LiteLLM Gateway](roles/svc-ai-litellm/), [Mailu](roles/web-app-mailu/), [Matomo](roles/web-app-matomo/), [PostgreSQL](roles/svc-db-postgres/), [Prometheus](roles/web-app-prometheus/), [Tor Onion Service](roles/svc-net-tor/), [Universal Logout](roles/web-svc-logout/) |
|
||||
| [YOURLS](roles/web-app-yourls/) | beta | Self-hosted URL shortener for creating, tracking, and managing short links with built-in click analytics | [🌐](https://yourls.org/) [🛠️](roles/web-app-yourls/README.md#quick-setup) | [Corporate Design](roles/web-svc-css/), [Dashboard](roles/web-app-dashboard/), [Keycloak](roles/web-app-keycloak/), [MariaDB](roles/svc-db-mariadb/), [Matomo](roles/web-app-matomo/), [Prometheus](roles/web-app-prometheus/), [Tor Onion Service](roles/svc-net-tor/), [Universal Logout](roles/web-svc-logout/) |
|
||||
| [Zammad](roles/web-app-zammad/) | beta | Open-source helpdesk and ticketing system for handling customer requests via email, chat, phone, and web | [🌐](https://zammad.org/) [🎬](https://www.youtube.com/@zammadhq) [🛠️](roles/web-app-zammad/README.md#quick-setup) | [Backup Docker Volumes](roles/svc-bkp-volume-2-local/), [Corporate Design](roles/web-svc-css/), [Dashboard](roles/web-app-dashboard/), [Keycloak](roles/web-app-keycloak/), [LiteLLM Gateway](roles/svc-ai-litellm/), [Mailu](roles/web-app-mailu/), [Matomo](roles/web-app-matomo/), [Memcached](roles/svc-db-memcached/), [OpenLDAP](roles/svc-db-openldap/), [PostgreSQL](roles/svc-db-postgres/), [Prometheus](roles/web-app-prometheus/), [Redis](roles/svc-db-redis/), [Tor Onion Service](roles/svc-net-tor/), [Universal Logout](roles/web-svc-logout/) |
|
||||
| [Zammad](roles/web-app-zammad/) | beta | Open-source helpdesk and ticketing system for handling customer requests via email, chat, phone, and web | [🌐](https://zammad.org/) [🎬](https://www.youtube.com/@zammadhq) [🛠️](roles/web-app-zammad/README.md#quick-setup) | [Backup Docker Volumes](roles/svc-bkp-volume-2-local/), [Corporate Design](roles/web-svc-css/), [Dashboard](roles/web-app-dashboard/), [Flowise](roles/web-app-flowise/), [Hermes Agent](roles/web-app-hermes/), [Keycloak](roles/web-app-keycloak/), [LiteLLM Gateway](roles/svc-ai-litellm/), [Mailu](roles/web-app-mailu/), [Matomo](roles/web-app-matomo/), [Memcached](roles/svc-db-memcached/), [Open WebUI](roles/web-app-openwebui/), [OpenClaw](roles/web-app-openclaw/), [OpenLDAP](roles/svc-db-openldap/), [PostgreSQL](roles/svc-db-postgres/), [Prometheus](roles/web-app-prometheus/), [Redis](roles/svc-db-redis/), [Tor Onion Service](roles/svc-net-tor/), [Universal Logout](roles/web-svc-logout/) |
|
||||
|
||||
## Guides 📚
|
||||
|
||||
|
||||
@@ -83,6 +83,7 @@ The placement rule is per check. The catalog "Position" column uses these labels
|
||||
| `role-file-spot` | same or above | [test_file_spot.py](../../../../tests/lint/ansible/roles/test_file_spot.py) | Allows a `.py` file to carry a literal role-file path instead of the matching `ROLE_FILE_*` constant from `utils.roles.mapping`. Reserved for tests asserting the constant's value, migration scripts, or doc strings. |
|
||||
| `playwright-service-flag` | comment block above | [test_env_services_match.py](../../../../tests/integration/roles/playwright/test_env_services_match.py) | Exempts a top-level service in `roles/<role>/meta/services.yml` from the "must be registered as `<NAME>_SERVICE_ENABLED=` in `templates/playwright.env.j2`" check. |
|
||||
| `playwright-service-gate` | same or above | [test_spec_env_gates.py](../../../../tests/integration/roles/playwright/test_spec_env_gates.py) | Exempts a `<NAME>_SERVICE_ENABLED=` line in `roles/<role>/templates/playwright.env.j2` from the "must be gated in `files/playwright/playwright.spec.js`" check. |
|
||||
| `mcp-consumer-services-entry` | head of file | [test_mcp_consumer_services_entry.py](../../../../tests/lint/ansible/services/test_mcp_consumer_services_entry.py) | Exempts a server-capable `roles/<role>/meta/mcp.yml` from the "must carry a `"{{ '<client>' in group_names }}"`-gated `services.<client-entity>` entry for every role declaring `mcp_consumer: true`" check. Reserved for a provider that legitimately owns no co-deploy edge to its clients. |
|
||||
| `pkgmgr-deprecated` | same or above | [test_pkgmgr_deprecated.py](../../../../tests/lint/repository/dependencies/test_pkgmgr_deprecated.py) | Suppresses the warn-only deprecation notice for `include_role` / `import_role` of `pkgmgr` / `pkgmgr-install`. The check emits a `DeprecationWarning` locally and a GitHub Actions `::warning` annotation in CI. Prefer `pip install <name>` or `pip install git+<repo>`. |
|
||||
| `deprecated-http-header` | same or above | [test_no_deprecated_http_security_headers.py](../../../../tests/lint/repository/network/test_no_deprecated_http_security_headers.py) | Exempts a deprecated `add_header` / `Header set/add` line for `X-Frame-Options` / `X-XSS-Protection` / `X-Download-Options` / `X-Permitted-Cross-Domain-Policies`. Prefer Content-Security-Policy via the role's `meta/server.yml` (`csp.flags` / `csp.whitelist`). |
|
||||
| `container-name` | same or above | [test_mode_incompatible_keys.py](../../../../tests/lint/ansible/jinja/test_mode_incompatible_keys.py) | Allows a raw `container_name:` key in a `roles/*/templates/**/*.j2` template. Default path: route through the generic `compose_only` lookup (`{{ lookup('compose_only', 'container_name', NAME) }}`) so swarm-mode replicas do not collide on the static name. |
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
# MCP Service Block 🔌
|
||||
|
||||
A role declares `meta/mcp.yml` when it actually serves or consumes MCP. The file is a capability descriptor, not a service entry: no single role provides MCP, so the service registry cannot pair provider and consumer, and `allowed_consumers` does it instead. Vocabulary lives in [`utils/roles/applications/mcp.py`](../../../../../utils/roles/applications/mcp.py); the hard lint is [`test_mcp_schema.py`](../../../../../tests/lint/ansible/services/test_mcp_schema.py).
|
||||
A role declares `meta/mcp.yml` when it actually serves or consumes MCP. The file is a capability descriptor, not a service entry: no single role provides MCP, so the service registry cannot pair provider and consumer, and the `mcp_consumer` flag in `meta/services.yml` does it instead. Vocabulary lives in [`utils/roles/applications/mcp.py`](../../../../../utils/roles/applications/mcp.py); the hard lint is [`test_mcp_schema.py`](../../../../../tests/lint/ansible/services/test_mcp_schema.py).
|
||||
|
||||
`classification` is required and is one of `native_server`, `native_client`, `native_both`, `plugin_server`, `sidecar_server`, `adapter_server`. A role that cannot serve declares no `mcp` block at all.
|
||||
|
||||
@@ -22,8 +22,6 @@ mcp:
|
||||
owner: mcp-web-app-example # a dedicated non-login identity, never `administrator`
|
||||
source: token_store # token_store | credentials
|
||||
key: web-app-example
|
||||
allowed_consumers: # exact client application ids
|
||||
- web-app-openwebui
|
||||
endpoint:
|
||||
service_key: example # names a service entry in the same file
|
||||
path: /mcp
|
||||
@@ -84,7 +82,8 @@ A client-only block MUST NOT declare an `endpoint`.
|
||||
|
||||
- `classification` is required and MUST be deployable; all MCP-specific fields MUST be literals (only `enabled`/`shared` may carry Jinja).
|
||||
- `enabled`/`shared` MUST NOT name a peer role. Provider enablement is explicit operator or variant state; the variant axis lives in `meta/variants.yml`.
|
||||
- `direction: server | both` requires `auth`, `credential`, `allowed_consumers` and a complete `endpoint`.
|
||||
- `direction: server | both` requires `auth`, `credential`, a complete `endpoint`, and at least one admitted client.
|
||||
- Admission lives in `meta/services.yml`, not here. A client sets `services.<own-entity>.mcp_consumer: true` in its own role; a provider refuses one by setting `mcp_consumer: false` on that client's entry. [`test_mcp_consumer_services_entry.py`](../../../../../tests/lint/ansible/services/test_mcp_consumer_services_entry.py) requires every provider to carry a `"{{ '<client>' in group_names }}"`-gated entry for every declared client, so a round plans provider and client together.
|
||||
- `credential.owner` MUST NOT be `administrator`. Two providers resolving to the same owner and secret abort discovery.
|
||||
- `auth: none` requires `exposure: internal`.
|
||||
- `auth_subject: service_account | administrator` requires an explicit `tools.mutating_tools_enabled: false`.
|
||||
@@ -106,7 +105,7 @@ Prefer `exposure: internal`. A client inside the container network reaches the e
|
||||
|
||||
## Client discovery
|
||||
|
||||
Clients do not read the server list directly. [`lookup('mcp_servers')`](../../../../../plugins/lookup/mcp_servers.py) computes the intersection of the provider's `allowed_consumers` with the calling client's `supported_transports` and `supported_auths`, resolves each provider's declared credential, and returns:
|
||||
Clients do not read the server list directly. [`lookup('mcp_servers')`](../../../../../plugins/lookup/mcp_servers.py) computes the intersection of the provider's admitted clients, resolved by `derive_allowed_consumers` in [`utils/roles/applications/mcp.py`](../../../../../utils/roles/applications/mcp.py), with the calling client's `supported_transports` and `supported_auths`, resolves each provider's declared credential, and returns:
|
||||
|
||||
```yaml
|
||||
MCP_DISCOVERY: "{{ lookup('mcp_servers') }}"
|
||||
|
||||
@@ -12,6 +12,7 @@ drift away from the roles the way the hand-maintained disposition lists once
|
||||
did.
|
||||
"""
|
||||
|
||||
import sys
|
||||
from pathlib import Path
|
||||
|
||||
import yaml
|
||||
@@ -21,6 +22,11 @@ REPO_ROOT = Path(__file__).resolve().parents[6]
|
||||
ROLES_DIR = REPO_ROOT / "roles"
|
||||
REPORT = Path(__file__).resolve().parent / "audit.md"
|
||||
|
||||
sys.path.insert(0, str(REPO_ROOT))
|
||||
from utils.roles.applications.mcp import ( # noqa: E402
|
||||
derive_allowed_consumers,
|
||||
)
|
||||
|
||||
COLUMNS = (
|
||||
"role",
|
||||
"version",
|
||||
@@ -99,12 +105,26 @@ def _cell(value):
|
||||
return text.replace("|", r"\|") if text else EMPTY
|
||||
|
||||
|
||||
def _services_by_role():
|
||||
return {
|
||||
role_dir.name: _load(role_dir / "meta" / "services.yml")
|
||||
for role_dir in sorted(ROLES_DIR.iterdir())
|
||||
if role_dir.is_dir()
|
||||
}
|
||||
|
||||
|
||||
def rows():
|
||||
"""Yield one report row per role that owns MCP metadata."""
|
||||
services_by_role = _services_by_role()
|
||||
for mcp_path in sorted(ROLES_DIR.glob("*/meta/mcp.yml")):
|
||||
role_dir = mcp_path.parent.parent
|
||||
mcp = _load(mcp_path)
|
||||
tools = mcp.get("tools")
|
||||
consumers = (
|
||||
derive_allowed_consumers(role_dir.name, services_by_role)
|
||||
if mcp.get("direction") in ("server", "both")
|
||||
else []
|
||||
)
|
||||
yield {
|
||||
"role": f"`{role_dir.name}`",
|
||||
"version": _version(role_dir, mcp),
|
||||
@@ -121,7 +141,7 @@ def rows():
|
||||
else EMPTY
|
||||
),
|
||||
"implementation": _cell(mcp.get("implementation")),
|
||||
"consumers": _join(mcp.get("allowed_consumers")),
|
||||
"consumers": _join(consumers),
|
||||
"blocker": _cell(mcp.get("reason")),
|
||||
}
|
||||
|
||||
|
||||
@@ -12,27 +12,27 @@ not the version the MCP surface was verified against.
|
||||
|
||||
| role | version | source | transport | auth | subject | scope | tools | implementation | consumers | blocker |
|
||||
| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
|
||||
| `svc-db-qdrant` | v1.19.0 (MCP verified: v1.18.2) | [link](https://s.infinito.nexus/code) | streamable_http | bearer_token | service_account (`mcp-svc-db-qdrant`) | read-only | 2 | adapter | `web-app-openwebui`, `web-app-hermes`, `web-app-openclaw`, `web-app-flowise` | — |
|
||||
| `web-app-baserow` | 2.3.3 | [link](https://baserow.io/user-docs/mcp-server) | streamable_http | bearer_token | service_account (`mcp-web-app-baserow`) | read-only | 4 | adapter | `web-app-openwebui`, `web-app-hermes`, `web-app-openclaw` | — |
|
||||
| `web-app-checkmk` | 2.4.0p32 (MCP verified: 1.0.0) | [link](https://s.infinito.nexus/code) | streamable_http | bearer_token | service_account (`mcp-web-app-checkmk`) | read-only | 3 | adapter | `web-app-openwebui`, `web-app-hermes`, `web-app-openclaw` | — |
|
||||
| `web-app-fider` | stable (MCP verified: 1.0.0) | [link](https://s.infinito.nexus/code) | streamable_http | bearer_token | service_account (`mcp-web-app-fider`) | read-only | 3 | adapter | `web-app-openwebui`, `web-app-hermes`, `web-app-openclaw` | — |
|
||||
| `svc-db-qdrant` | v1.19.0 (MCP verified: v1.18.2) | [link](https://s.infinito.nexus/code) | streamable_http | bearer_token | service_account (`mcp-svc-db-qdrant`) | read-only | 2 | adapter | `web-app-flowise`, `web-app-hermes`, `web-app-openclaw`, `web-app-openwebui` | — |
|
||||
| `web-app-baserow` | 2.3.3 | [link](https://baserow.io/user-docs/mcp-server) | streamable_http | bearer_token | service_account (`mcp-web-app-baserow`) | read-only | 4 | adapter | `web-app-hermes`, `web-app-openclaw`, `web-app-openwebui` | — |
|
||||
| `web-app-checkmk` | 2.4.0p32 (MCP verified: 1.0.0) | [link](https://s.infinito.nexus/code) | streamable_http | bearer_token | service_account (`mcp-web-app-checkmk`) | read-only | 3 | adapter | `web-app-hermes`, `web-app-openclaw`, `web-app-openwebui` | — |
|
||||
| `web-app-fider` | stable (MCP verified: 1.0.0) | [link](https://s.infinito.nexus/code) | streamable_http | bearer_token | service_account (`mcp-web-app-fider`) | read-only | 3 | adapter | `web-app-hermes`, `web-app-openclaw`, `web-app-openwebui` | — |
|
||||
| `web-app-flowise` | 24-bookworm-slim (MCP verified: 3.1.4) | [link](https://github.com/FlowiseAI/Flowise/tree/flowise%403.1.4/packages/server/src/routes/custom-mcp-servers) | — | — | — | read-only | — | native | — | — |
|
||||
| `web-app-gitea` | 1.27.2 | [link](https://pkg.go.dev/gitea.com/gitea/gitea-mcp) | streamable_http | bearer_token | service_account (`mcp-web-app-gitea`) | read-only | 24 | adapter | `web-app-openwebui`, `web-app-hermes`, `web-app-openclaw` | — |
|
||||
| `web-app-gitlab` | — (MCP verified: 19.3.1) | [link](https://docs.gitlab.com/user/gitlab_duo/model_context_protocol/mcp_server/) | streamable_http | bearer_token | service_account (`mcp-web-app-gitlab`) | read-only | 14 | adapter | `web-app-openwebui`, `web-app-hermes`, `web-app-openclaw` | — |
|
||||
| `web-app-gitea` | 1.27.2 | [link](https://pkg.go.dev/gitea.com/gitea/gitea-mcp) | streamable_http | bearer_token | service_account (`mcp-web-app-gitea`) | read-only | 24 | adapter | `web-app-hermes`, `web-app-openclaw`, `web-app-openwebui` | — |
|
||||
| `web-app-gitlab` | — (MCP verified: 19.3.1) | [link](https://docs.gitlab.com/user/gitlab_duo/model_context_protocol/mcp_server/) | streamable_http | bearer_token | service_account (`mcp-web-app-gitlab`) | read-only | 14 | adapter | `web-app-hermes`, `web-app-openclaw`, `web-app-openwebui` | — |
|
||||
| `web-app-hermes` | v2026.7.20 | [link](https://hermes-agent.nousresearch.com/) | — | — | — | read-only | — | native | — | — |
|
||||
| `web-app-homeassistant` | 2026.7 | [link](https://www.home-assistant.io/integrations/mcp_server/) | streamable_http | bearer_token | service_account (`mcp-web-app-homeassistant`) | read-only | 10 | native | `web-app-openwebui`, `web-app-hermes`, `web-app-openclaw`, `web-app-flowise` | — |
|
||||
| `web-app-jellyfin` | 10.11.11 (MCP verified: 1.0.0) | [link](https://s.infinito.nexus/code) | streamable_http | bearer_token | service_account (`mcp-web-app-jellyfin`) | read-only | 3 | adapter | `web-app-openwebui`, `web-app-hermes`, `web-app-openclaw` | — |
|
||||
| `web-app-homeassistant` | 2026.7 | [link](https://www.home-assistant.io/integrations/mcp_server/) | streamable_http | bearer_token | service_account (`mcp-web-app-homeassistant`) | read-only | 10 | native | `web-app-flowise`, `web-app-hermes`, `web-app-openclaw`, `web-app-openwebui` | — |
|
||||
| `web-app-jellyfin` | 10.11.11 (MCP verified: 1.0.0) | [link](https://s.infinito.nexus/code) | streamable_http | bearer_token | service_account (`mcp-web-app-jellyfin`) | read-only | 3 | adapter | `web-app-hermes`, `web-app-openclaw`, `web-app-openwebui` | — |
|
||||
| `web-app-jenkins` | lts | [link](https://plugins.jenkins.io/mcp-server/) | streamable_http | bearer_token | service_account (`mcp-web-app-jenkins`) | read-only | 15 | adapter | `web-app-hermes`, `web-app-openclaw` | — |
|
||||
| `web-app-listmonk` | v6.2.0 (MCP verified: 1.0.0) | [link](https://s.infinito.nexus/code) | streamable_http | bearer_token | service_account (`mcp-web-app-listmonk`) | read-only | 3 | adapter | `web-app-openwebui`, `web-app-hermes`, `web-app-openclaw` | — |
|
||||
| `web-app-mattermost` | 11.10.1 | [link](https://docs.mattermost.com/agents/mcpserver/README.html) | streamable_http | bearer_token | service_account (`mcp-web-app-mattermost`) | read-only | 11 | adapter | `web-app-openwebui`, `web-app-hermes`, `web-app-openclaw` | — |
|
||||
| `web-app-moodle` | 8.3-fpm | [link](https://moodle.org/plugins/webservice_mcp) | streamable_http | bearer_token | service_account (`mcp-web-app-moodle`) | read-only | 5 | plugin | `web-app-openwebui`, `web-app-hermes`, `web-app-openclaw` | — |
|
||||
| `web-app-listmonk` | v6.2.0 (MCP verified: 1.0.0) | [link](https://s.infinito.nexus/code) | streamable_http | bearer_token | service_account (`mcp-web-app-listmonk`) | read-only | 3 | adapter | `web-app-hermes`, `web-app-openclaw`, `web-app-openwebui` | — |
|
||||
| `web-app-mattermost` | 11.10.1 | [link](https://docs.mattermost.com/agents/mcpserver/README.html) | streamable_http | bearer_token | service_account (`mcp-web-app-mattermost`) | read-only | 11 | adapter | `web-app-hermes`, `web-app-openclaw`, `web-app-openwebui` | — |
|
||||
| `web-app-moodle` | 8.3-fpm | [link](https://moodle.org/plugins/webservice_mcp) | streamable_http | bearer_token | service_account (`mcp-web-app-moodle`) | read-only | 5 | plugin | `web-app-hermes`, `web-app-openclaw`, `web-app-openwebui` | — |
|
||||
| `web-app-n8n` | 1.95.3 | [link](https://github.com/n8n-io/n8n/tree/n8n%401.95.3/packages/%40n8n/nodes-langchain/nodes/mcp) | sse | bearer_token | service_account (`mcp-web-app-n8n`) | read-only | 1 | native | `web-app-hermes`, `web-app-openclaw`, `web-app-openwebui` | — |
|
||||
| `web-app-nextcloud` | 34-fpm-alpine | [link](https://docs.nextcloud.com/server/latest/admin_manual/ai/app_context_agent.html) | streamable_http | app_password | service_account (`mcp-web-app-nextcloud`) | read-only | — | plugin | `web-app-openwebui`, `web-app-hermes`, `web-app-openclaw` | — |
|
||||
| `web-app-nextcloud` | 34-fpm-alpine | [link](https://docs.nextcloud.com/server/latest/admin_manual/ai/app_context_agent.html) | streamable_http | app_password | service_account (`mcp-web-app-nextcloud`) | read-only | — | plugin | `web-app-hermes`, `web-app-openclaw`, `web-app-openwebui` | — |
|
||||
| `web-app-openclaw` | 2026.7.1 | [link](https://openclaw.ai/) | — | — | — | read-only | — | native | — | — |
|
||||
| `web-app-openwebui` | 0.11.0 | [link](https://docs.openwebui.com/features/extensibility/mcp/) | — | — | — | read-only | — | native | — | — |
|
||||
| `web-app-pretix` | stable (MCP verified: 1.0.0) | [link](https://s.infinito.nexus/code) | streamable_http | bearer_token | service_account (`mcp-web-app-pretix`) | read-only | 3 | adapter | `web-app-openwebui`, `web-app-hermes`, `web-app-openclaw` | — |
|
||||
| `web-app-prometheus` | v3.14.0 (MCP verified: 1.0.0) | [link](https://s.infinito.nexus/code) | streamable_http | bearer_token | service_account (`mcp-web-app-prometheus`) | read-only | 3 | adapter | `web-app-openwebui`, `web-app-hermes`, `web-app-openclaw`, `web-app-flowise` | — |
|
||||
| `web-app-snipe-it` | — (MCP verified: 1.0.0) | [link](https://s.infinito.nexus/code) | streamable_http | bearer_token | service_account (`mcp-web-app-snipe-it`) | read-only | 3 | adapter | `web-app-openwebui`, `web-app-hermes`, `web-app-openclaw` | — |
|
||||
| `web-app-pretix` | stable (MCP verified: 1.0.0) | [link](https://s.infinito.nexus/code) | streamable_http | bearer_token | service_account (`mcp-web-app-pretix`) | read-only | 3 | adapter | `web-app-hermes`, `web-app-openclaw`, `web-app-openwebui` | — |
|
||||
| `web-app-prometheus` | v3.14.0 (MCP verified: 1.0.0) | [link](https://s.infinito.nexus/code) | streamable_http | bearer_token | service_account (`mcp-web-app-prometheus`) | read-only | 3 | adapter | `web-app-flowise`, `web-app-hermes`, `web-app-openclaw`, `web-app-openwebui` | — |
|
||||
| `web-app-snipe-it` | — (MCP verified: 1.0.0) | [link](https://s.infinito.nexus/code) | streamable_http | bearer_token | service_account (`mcp-web-app-snipe-it`) | read-only | 3 | adapter | `web-app-hermes`, `web-app-openclaw`, `web-app-openwebui` | — |
|
||||
| `web-app-wordpress` | 7.1.0 (MCP verified: 0.5.0) | [link](https://github.com/WordPress/mcp-adapter/tree/v0.5.0) | streamable_http | basic_auth | service_account (`mcp-web-app-wordpress`) | read-only | 3 | plugin | `web-app-hermes`, `web-app-openclaw` | — |
|
||||
| `web-app-zammad` | 7.1.2 (MCP verified: 1.0.0) | [link](https://s.infinito.nexus/code) | streamable_http | bearer_token | service_account (`mcp-web-app-zammad`) | read-only | 3 | adapter | `web-app-openwebui`, `web-app-hermes`, `web-app-openclaw` | — |
|
||||
| `web-svc-libretranslate` | v1.9.6 (MCP verified: 1.0.0) | [link](https://s.infinito.nexus/code) | streamable_http | bearer_token | service_account (`mcp-web-svc-libretranslate`) | read-only | 2 | adapter | `web-app-openwebui`, `web-app-hermes`, `web-app-openclaw` | — |
|
||||
| `web-app-zammad` | 7.1.2 (MCP verified: 1.0.0) | [link](https://s.infinito.nexus/code) | streamable_http | bearer_token | service_account (`mcp-web-app-zammad`) | read-only | 3 | adapter | `web-app-hermes`, `web-app-openclaw`, `web-app-openwebui` | — |
|
||||
| `web-svc-libretranslate` | v1.9.6 (MCP verified: 1.0.0) | [link](https://s.infinito.nexus/code) | streamable_http | bearer_token | service_account (`mcp-web-svc-libretranslate`) | read-only | 2 | adapter | `web-app-hermes`, `web-app-openclaw`, `web-app-openwebui` | — |
|
||||
@@ -45,7 +45,10 @@ from ansible.plugins.loader import lookup_loader
|
||||
from ansible.plugins.lookup import LookupBase
|
||||
|
||||
from utils.domains.primary_domain import get_primary_domain
|
||||
from utils.roles.applications.mcp import DEFAULT_MCP_TRANSPORT
|
||||
from utils.roles.applications.mcp import (
|
||||
DEFAULT_MCP_TRANSPORT,
|
||||
derive_allowed_consumers,
|
||||
)
|
||||
from utils.roles.entity.name import get_entity_name
|
||||
|
||||
if TYPE_CHECKING:
|
||||
@@ -124,6 +127,12 @@ class LookupModule(LookupBase):
|
||||
"applications", loader=self._loader, templar=getattr(self, "_templar", None)
|
||||
).run([], variables=vars_)[0]
|
||||
|
||||
services_by_role = {
|
||||
role_id: config.get("services")
|
||||
for role_id, config in applications.items()
|
||||
if isinstance(config, dict)
|
||||
}
|
||||
|
||||
scope = str(kwargs.get("scope", "host")).strip().lower()
|
||||
topic = kwargs.get("topic")
|
||||
direction_raw = kwargs.get("direction")
|
||||
@@ -197,7 +206,9 @@ class LookupModule(LookupBase):
|
||||
"source": credential.get("source"),
|
||||
"key": credential.get("key"),
|
||||
}
|
||||
entry["allowed_consumers"] = list(block.get("allowed_consumers") or [])
|
||||
entry["allowed_consumers"] = derive_allowed_consumers(
|
||||
str(role_id), services_by_role
|
||||
)
|
||||
tools = block.get("tools")
|
||||
tools = tools if isinstance(tools, dict) else {}
|
||||
entry["tools"] = list(tools.get("allowlist") or [])
|
||||
|
||||
@@ -21,18 +21,30 @@ flowchart LR
|
||||
subgraph deps [Dependencies]
|
||||
dep_svc_bkp_volume_2_local["svc-bkp-volume-2-local 💻"]
|
||||
dep_svc_net_tor["svc-net-tor 🐳🐝"]
|
||||
dep_web_app_flowise["web-app-flowise 🐳🐝"]
|
||||
dep_web_app_hermes["web-app-hermes 🐳🐝"]
|
||||
dep_web_app_openclaw["web-app-openclaw 🐳🐝"]
|
||||
dep_web_app_openwebui["web-app-openwebui 🐳🐝"]
|
||||
end
|
||||
subgraph role [svc-db-qdrant 🐳🐝]
|
||||
svc_qdrant["qdrant"]
|
||||
svc_qdrantmcp["qdrantmcp"]
|
||||
svc_tor["tor"]
|
||||
svc_container_backup["container_backup"]
|
||||
svc_openwebui["openwebui"]
|
||||
svc_hermes["hermes"]
|
||||
svc_openclaw["openclaw"]
|
||||
svc_flowise["flowise"]
|
||||
end
|
||||
subgraph dependents [Dependents]
|
||||
dpt_web_app_flowise["web-app-flowise 🐳🐝"]
|
||||
end
|
||||
dep_svc_bkp_volume_2_local -. "0..1" .-> svc_container_backup
|
||||
dep_svc_net_tor -. "0..1" .-> svc_tor
|
||||
dep_web_app_flowise -. "0..1" .-> svc_flowise
|
||||
dep_web_app_hermes -. "0..1" .-> svc_hermes
|
||||
dep_web_app_openclaw -. "0..1" .-> svc_openclaw
|
||||
dep_web_app_openwebui -. "0..1" .-> svc_openwebui
|
||||
svc_qdrant -. "0..1" .-> dpt_web_app_flowise
|
||||
```
|
||||
|
||||
|
||||
@@ -14,11 +14,6 @@ credential:
|
||||
owner: mcp-svc-db-qdrant
|
||||
source: credentials
|
||||
key: mcp_bearer
|
||||
allowed_consumers:
|
||||
- web-app-openwebui
|
||||
- web-app-hermes
|
||||
- web-app-openclaw
|
||||
- web-app-flowise
|
||||
endpoint:
|
||||
service_key: qdrantmcp
|
||||
path: /mcp
|
||||
|
||||
@@ -55,3 +55,23 @@ container_backup: # nocheck: bond-baseline backup host joins outside the variant
|
||||
bond: 1
|
||||
enabled: "{{ 'svc-bkp-volume-2-local' in group_names }}"
|
||||
shared: true
|
||||
# nocheck: playwright-service-flag MCP pairing is proven by the role's own MCP spec, not by a per-consumer gate
|
||||
openwebui:
|
||||
bond: 0.5
|
||||
enabled: "{{ 'web-app-openwebui' in group_names }}"
|
||||
shared: "{{ 'web-app-openwebui' in group_names }}"
|
||||
# nocheck: playwright-service-flag MCP pairing is proven by the role's own MCP spec, not by a per-consumer gate
|
||||
hermes:
|
||||
bond: 0.5
|
||||
enabled: "{{ 'web-app-hermes' in group_names }}"
|
||||
shared: "{{ 'web-app-hermes' in group_names }}"
|
||||
# nocheck: playwright-service-flag MCP pairing is proven by the role's own MCP spec, not by a per-consumer gate
|
||||
openclaw:
|
||||
bond: 0.5
|
||||
enabled: "{{ 'web-app-openclaw' in group_names }}"
|
||||
shared: "{{ 'web-app-openclaw' in group_names }}"
|
||||
# nocheck: playwright-service-flag MCP pairing is proven by the role's own MCP spec, not by a per-consumer gate
|
||||
flowise:
|
||||
bond: 0.5
|
||||
enabled: "{{ 'web-app-flowise' in group_names }}"
|
||||
shared: "{{ 'web-app-flowise' in group_names }}"
|
||||
@@ -10,9 +10,33 @@
|
||||
services:
|
||||
tor:
|
||||
enabled: true
|
||||
openwebui:
|
||||
enabled: false
|
||||
shared: false
|
||||
hermes:
|
||||
enabled: false
|
||||
shared: false
|
||||
openclaw:
|
||||
enabled: false
|
||||
shared: false
|
||||
flowise:
|
||||
enabled: false
|
||||
shared: false
|
||||
- mcp:
|
||||
enabled: false
|
||||
shared: false
|
||||
services:
|
||||
tor:
|
||||
enabled: true
|
||||
openwebui:
|
||||
enabled: true
|
||||
shared: true
|
||||
hermes:
|
||||
enabled: true
|
||||
shared: true
|
||||
openclaw:
|
||||
enabled: true
|
||||
shared: true
|
||||
flowise:
|
||||
enabled: true
|
||||
shared: true
|
||||
@@ -20,9 +20,13 @@ flowchart LR
|
||||
dep_svc_db_redis["svc-db-redis 🐳🐝"]
|
||||
dep_svc_net_tor["svc-net-tor 🐳🐝"]
|
||||
dep_web_app_dashboard["web-app-dashboard 🐳🐝"]
|
||||
dep_web_app_flowise["web-app-flowise 🐳🐝"]
|
||||
dep_web_app_hermes["web-app-hermes 🐳🐝"]
|
||||
dep_web_app_keycloak["web-app-keycloak 🐳🐝"]
|
||||
dep_web_app_mailu["web-app-mailu 🐳🐝"]
|
||||
dep_web_app_matomo["web-app-matomo 🐳🐝"]
|
||||
dep_web_app_openclaw["web-app-openclaw 🐳🐝"]
|
||||
dep_web_app_openwebui["web-app-openwebui 🐳🐝"]
|
||||
dep_web_app_prometheus["web-app-prometheus 🐳🐝"]
|
||||
dep_web_app_seaweedfs["web-app-seaweedfs 🐳🐝"]
|
||||
dep_web_svc_css["web-svc-css 💻"]
|
||||
@@ -45,6 +49,10 @@ flowchart LR
|
||||
svc_prometheus["prometheus"]
|
||||
svc_tor["tor"]
|
||||
svc_container_backup["container_backup"]
|
||||
svc_openwebui["openwebui"]
|
||||
svc_hermes["hermes"]
|
||||
svc_openclaw["openclaw"]
|
||||
svc_flowise["flowise"]
|
||||
end
|
||||
subgraph dependents [Dependents]
|
||||
dpt_web_app_flowise["web-app-flowise 🐳🐝"]
|
||||
@@ -55,9 +63,13 @@ flowchart LR
|
||||
dep_svc_db_redis -. "0..1" .-> svc_redis
|
||||
dep_svc_net_tor -. "0..1" .-> svc_tor
|
||||
dep_web_app_dashboard -. "0..1" .-> svc_dashboard
|
||||
dep_web_app_flowise -. "0..1" .-> svc_flowise
|
||||
dep_web_app_hermes -. "0..1" .-> svc_hermes
|
||||
dep_web_app_keycloak -. "0..1" .-> svc_sso
|
||||
dep_web_app_mailu -. "0..1" .-> svc_email
|
||||
dep_web_app_matomo -. "0..1" .-> svc_matomo
|
||||
dep_web_app_openclaw -. "0..1" .-> svc_openclaw
|
||||
dep_web_app_openwebui -. "0..1" .-> svc_openwebui
|
||||
dep_web_app_prometheus -. "0..1" .-> svc_prometheus
|
||||
dep_web_app_seaweedfs -. "0..1" .-> svc_seaweedfs
|
||||
dep_web_svc_css -. "0..1" .-> svc_css
|
||||
|
||||
@@ -15,10 +15,6 @@ credential:
|
||||
owner: mcp-web-app-baserow
|
||||
source: credentials
|
||||
key: mcp_bearer
|
||||
allowed_consumers:
|
||||
- web-app-openwebui
|
||||
- web-app-hermes
|
||||
- web-app-openclaw
|
||||
adapter:
|
||||
type: mcp_passthrough
|
||||
upstream_transport: sse
|
||||
|
||||
@@ -133,3 +133,24 @@ container_backup: # nocheck: bond-baseline backup host joins outside the variant
|
||||
bond: 1
|
||||
enabled: "{{ 'svc-bkp-volume-2-local' in group_names }}"
|
||||
shared: true
|
||||
# nocheck: playwright-service-flag MCP pairing is proven by the role's own MCP spec, not by a per-consumer gate
|
||||
openwebui:
|
||||
bond: 0.5
|
||||
enabled: "{{ 'web-app-openwebui' in group_names }}"
|
||||
shared: "{{ 'web-app-openwebui' in group_names }}"
|
||||
# nocheck: playwright-service-flag MCP pairing is proven by the role's own MCP spec, not by a per-consumer gate
|
||||
hermes:
|
||||
bond: 0.5
|
||||
enabled: "{{ 'web-app-hermes' in group_names }}"
|
||||
shared: "{{ 'web-app-hermes' in group_names }}"
|
||||
# nocheck: playwright-service-flag MCP pairing is proven by the role's own MCP spec, not by a per-consumer gate
|
||||
openclaw:
|
||||
bond: 0.5
|
||||
enabled: "{{ 'web-app-openclaw' in group_names }}"
|
||||
shared: "{{ 'web-app-openclaw' in group_names }}"
|
||||
# nocheck: playwright-service-flag MCP pairing is proven by the role's own MCP spec, not by a per-consumer gate
|
||||
flowise:
|
||||
bond: 0.5
|
||||
enabled: "{{ 'web-app-flowise' in group_names }}"
|
||||
shared: "{{ 'web-app-flowise' in group_names }}"
|
||||
mcp_consumer: false
|
||||
@@ -37,6 +37,18 @@
|
||||
shared: true
|
||||
tor:
|
||||
enabled: true
|
||||
openwebui:
|
||||
enabled: false
|
||||
shared: false
|
||||
hermes:
|
||||
enabled: false
|
||||
shared: false
|
||||
openclaw:
|
||||
enabled: false
|
||||
shared: false
|
||||
flowise:
|
||||
enabled: false
|
||||
shared: false
|
||||
mcp:
|
||||
enabled: true
|
||||
shared: true
|
||||
@@ -74,6 +86,18 @@
|
||||
shared: false # nocheck: variants-static-override backup shared stays literally true
|
||||
tor:
|
||||
enabled: true
|
||||
openwebui:
|
||||
enabled: true
|
||||
shared: true
|
||||
hermes:
|
||||
enabled: true
|
||||
shared: true
|
||||
openclaw:
|
||||
enabled: true
|
||||
shared: true
|
||||
flowise:
|
||||
enabled: true
|
||||
shared: true
|
||||
mcp:
|
||||
enabled: false
|
||||
shared: false
|
||||
@@ -19,9 +19,13 @@ flowchart LR
|
||||
dep_svc_db_openldap["svc-db-openldap 🐳🐝"]
|
||||
dep_svc_net_tor["svc-net-tor 🐳🐝"]
|
||||
dep_web_app_dashboard["web-app-dashboard 🐳🐝"]
|
||||
dep_web_app_flowise["web-app-flowise 🐳🐝"]
|
||||
dep_web_app_hermes["web-app-hermes 🐳🐝"]
|
||||
dep_web_app_keycloak["web-app-keycloak 🐳🐝"]
|
||||
dep_web_app_mailu["web-app-mailu 🐳🐝"]
|
||||
dep_web_app_matomo["web-app-matomo 🐳🐝"]
|
||||
dep_web_app_openclaw["web-app-openclaw 🐳🐝"]
|
||||
dep_web_app_openwebui["web-app-openwebui 🐳🐝"]
|
||||
dep_web_app_prometheus["web-app-prometheus 🐳🐝"]
|
||||
dep_web_svc_css["web-svc-css 💻"]
|
||||
dep_web_svc_logout["web-svc-logout 🐳🐝"]
|
||||
@@ -40,14 +44,22 @@ flowchart LR
|
||||
svc_tor["tor"]
|
||||
svc_container_backup["container_backup"]
|
||||
svc_checkmkmcp["checkmkmcp"]
|
||||
svc_openwebui["openwebui"]
|
||||
svc_hermes["hermes"]
|
||||
svc_openclaw["openclaw"]
|
||||
svc_flowise["flowise"]
|
||||
end
|
||||
dep_svc_bkp_volume_2_local -. "0..1" .-> svc_container_backup
|
||||
dep_svc_db_openldap -. "0..1" .-> svc_ldap
|
||||
dep_svc_net_tor -. "0..1" .-> svc_tor
|
||||
dep_web_app_dashboard -. "0..1" .-> svc_dashboard
|
||||
dep_web_app_flowise -. "0..1" .-> svc_flowise
|
||||
dep_web_app_hermes -. "0..1" .-> svc_hermes
|
||||
dep_web_app_keycloak -. "0..1" .-> svc_sso
|
||||
dep_web_app_mailu -. "0..1" .-> svc_email
|
||||
dep_web_app_matomo -. "0..1" .-> svc_matomo
|
||||
dep_web_app_openclaw -. "0..1" .-> svc_openclaw
|
||||
dep_web_app_openwebui -. "0..1" .-> svc_openwebui
|
||||
dep_web_app_prometheus -. "0..1" .-> svc_prometheus
|
||||
dep_web_svc_css -. "0..1" .-> svc_css
|
||||
dep_web_svc_logout -. "0..1" .-> svc_logout
|
||||
|
||||
@@ -14,10 +14,6 @@ credential:
|
||||
owner: mcp-web-app-checkmk
|
||||
source: credentials
|
||||
key: mcp_bearer
|
||||
allowed_consumers:
|
||||
- web-app-openwebui
|
||||
- web-app-hermes
|
||||
- web-app-openclaw
|
||||
endpoint:
|
||||
service_key: checkmkmcp
|
||||
path: /mcp
|
||||
|
||||
@@ -115,3 +115,24 @@ checkmkmcp:
|
||||
ports:
|
||||
internal:
|
||||
http: 8080
|
||||
# nocheck: playwright-service-flag MCP pairing is proven by the role's own MCP spec, not by a per-consumer gate
|
||||
openwebui:
|
||||
bond: 0.5
|
||||
enabled: "{{ 'web-app-openwebui' in group_names }}"
|
||||
shared: "{{ 'web-app-openwebui' in group_names }}"
|
||||
# nocheck: playwright-service-flag MCP pairing is proven by the role's own MCP spec, not by a per-consumer gate
|
||||
hermes:
|
||||
bond: 0.5
|
||||
enabled: "{{ 'web-app-hermes' in group_names }}"
|
||||
shared: "{{ 'web-app-hermes' in group_names }}"
|
||||
# nocheck: playwright-service-flag MCP pairing is proven by the role's own MCP spec, not by a per-consumer gate
|
||||
openclaw:
|
||||
bond: 0.5
|
||||
enabled: "{{ 'web-app-openclaw' in group_names }}"
|
||||
shared: "{{ 'web-app-openclaw' in group_names }}"
|
||||
# nocheck: playwright-service-flag MCP pairing is proven by the role's own MCP spec, not by a per-consumer gate
|
||||
flowise:
|
||||
bond: 0.5
|
||||
enabled: "{{ 'web-app-flowise' in group_names }}"
|
||||
shared: "{{ 'web-app-flowise' in group_names }}"
|
||||
mcp_consumer: false
|
||||
@@ -29,6 +29,18 @@
|
||||
tor:
|
||||
enabled: true
|
||||
|
||||
openwebui:
|
||||
enabled: false
|
||||
shared: false
|
||||
hermes:
|
||||
enabled: false
|
||||
shared: false
|
||||
openclaw:
|
||||
enabled: false
|
||||
shared: false
|
||||
flowise:
|
||||
enabled: false
|
||||
shared: false
|
||||
mcp:
|
||||
enabled: true
|
||||
shared: true
|
||||
@@ -63,6 +75,18 @@
|
||||
tor:
|
||||
enabled: true
|
||||
|
||||
openwebui:
|
||||
enabled: true
|
||||
shared: true
|
||||
hermes:
|
||||
enabled: true
|
||||
shared: true
|
||||
openclaw:
|
||||
enabled: true
|
||||
shared: true
|
||||
flowise:
|
||||
enabled: true
|
||||
shared: true
|
||||
mcp:
|
||||
enabled: false
|
||||
shared: false
|
||||
@@ -97,6 +121,18 @@
|
||||
tor:
|
||||
enabled: true
|
||||
|
||||
openwebui:
|
||||
enabled: false
|
||||
shared: false
|
||||
hermes:
|
||||
enabled: false
|
||||
shared: false
|
||||
openclaw:
|
||||
enabled: false
|
||||
shared: false
|
||||
flowise:
|
||||
enabled: false
|
||||
shared: false
|
||||
mcp:
|
||||
enabled: false
|
||||
shared: false
|
||||
@@ -28,9 +28,13 @@ flowchart LR
|
||||
dep_svc_db_redis["svc-db-redis 🐳🐝"]
|
||||
dep_svc_net_tor["svc-net-tor 🐳🐝"]
|
||||
dep_web_app_dashboard["web-app-dashboard 🐳🐝"]
|
||||
dep_web_app_flowise["web-app-flowise 🐳🐝"]
|
||||
dep_web_app_hermes["web-app-hermes 🐳🐝"]
|
||||
dep_web_app_keycloak["web-app-keycloak 🐳🐝"]
|
||||
dep_web_app_mailu["web-app-mailu 🐳🐝"]
|
||||
dep_web_app_matomo["web-app-matomo 🐳🐝"]
|
||||
dep_web_app_openclaw["web-app-openclaw 🐳🐝"]
|
||||
dep_web_app_openwebui["web-app-openwebui 🐳🐝"]
|
||||
dep_web_app_prometheus["web-app-prometheus 🐳🐝"]
|
||||
dep_web_app_seaweedfs["web-app-seaweedfs 🐳🐝"]
|
||||
dep_web_svc_css["web-svc-css 💻"]
|
||||
@@ -51,14 +55,22 @@ flowchart LR
|
||||
svc_seaweedfs["seaweedfs"]
|
||||
svc_fidermcp["fidermcp"]
|
||||
svc_tor["tor"]
|
||||
svc_openwebui["openwebui"]
|
||||
svc_hermes["hermes"]
|
||||
svc_openclaw["openclaw"]
|
||||
svc_flowise["flowise"]
|
||||
end
|
||||
dep_svc_db_postgres -. "0..1" .-> svc_postgres
|
||||
dep_svc_db_redis -. "0..1" .-> svc_redis
|
||||
dep_svc_net_tor -. "0..1" .-> svc_tor
|
||||
dep_web_app_dashboard -. "0..1" .-> svc_dashboard
|
||||
dep_web_app_flowise -. "0..1" .-> svc_flowise
|
||||
dep_web_app_hermes -. "0..1" .-> svc_hermes
|
||||
dep_web_app_keycloak -. "0..1" .-> svc_sso
|
||||
dep_web_app_mailu -. "0..1" .-> svc_email
|
||||
dep_web_app_matomo -. "0..1" .-> svc_matomo
|
||||
dep_web_app_openclaw -. "0..1" .-> svc_openclaw
|
||||
dep_web_app_openwebui -. "0..1" .-> svc_openwebui
|
||||
dep_web_app_prometheus -. "0..1" .-> svc_prometheus
|
||||
dep_web_app_seaweedfs -. "0..1" .-> svc_seaweedfs
|
||||
dep_web_svc_css -. "0..1" .-> svc_css
|
||||
|
||||
@@ -14,10 +14,6 @@ credential:
|
||||
owner: mcp-web-app-fider
|
||||
source: credentials
|
||||
key: mcp_bearer
|
||||
allowed_consumers:
|
||||
- web-app-openwebui
|
||||
- web-app-hermes
|
||||
- web-app-openclaw
|
||||
endpoint:
|
||||
service_key: fidermcp
|
||||
path: /mcp
|
||||
|
||||
@@ -100,3 +100,24 @@ tor:
|
||||
bond: 0.5
|
||||
enabled: "{{ 'svc-net-tor' in group_names }}"
|
||||
shared: true # nocheck: dynamic-flag
|
||||
# nocheck: playwright-service-flag MCP pairing is proven by the role's own MCP spec, not by a per-consumer gate
|
||||
openwebui:
|
||||
bond: 0.5
|
||||
enabled: "{{ 'web-app-openwebui' in group_names }}"
|
||||
shared: "{{ 'web-app-openwebui' in group_names }}"
|
||||
# nocheck: playwright-service-flag MCP pairing is proven by the role's own MCP spec, not by a per-consumer gate
|
||||
hermes:
|
||||
bond: 0.5
|
||||
enabled: "{{ 'web-app-hermes' in group_names }}"
|
||||
shared: "{{ 'web-app-hermes' in group_names }}"
|
||||
# nocheck: playwright-service-flag MCP pairing is proven by the role's own MCP spec, not by a per-consumer gate
|
||||
openclaw:
|
||||
bond: 0.5
|
||||
enabled: "{{ 'web-app-openclaw' in group_names }}"
|
||||
shared: "{{ 'web-app-openclaw' in group_names }}"
|
||||
# nocheck: playwright-service-flag MCP pairing is proven by the role's own MCP spec, not by a per-consumer gate
|
||||
flowise:
|
||||
bond: 0.5
|
||||
enabled: "{{ 'web-app-flowise' in group_names }}"
|
||||
shared: "{{ 'web-app-flowise' in group_names }}"
|
||||
mcp_consumer: false
|
||||
@@ -35,6 +35,18 @@
|
||||
shared: true
|
||||
tor:
|
||||
enabled: true
|
||||
openwebui:
|
||||
enabled: false
|
||||
shared: false
|
||||
hermes:
|
||||
enabled: false
|
||||
shared: false
|
||||
openclaw:
|
||||
enabled: false
|
||||
shared: false
|
||||
flowise:
|
||||
enabled: false
|
||||
shared: false
|
||||
mcp:
|
||||
enabled: true
|
||||
shared: true
|
||||
@@ -69,6 +81,18 @@
|
||||
shared: false
|
||||
tor:
|
||||
enabled: true
|
||||
openwebui:
|
||||
enabled: true
|
||||
shared: true
|
||||
hermes:
|
||||
enabled: true
|
||||
shared: true
|
||||
openclaw:
|
||||
enabled: true
|
||||
shared: true
|
||||
flowise:
|
||||
enabled: true
|
||||
shared: true
|
||||
mcp:
|
||||
enabled: false
|
||||
shared: false
|
||||
@@ -54,6 +54,21 @@ flowchart LR
|
||||
svc_homeassistant["homeassistant"]
|
||||
svc_baserow["baserow"]
|
||||
end
|
||||
subgraph dependents [Dependents]
|
||||
dpt_svc_db_qdrant["svc-db-qdrant 🐳🐝"]
|
||||
dpt_web_app_baserow["web-app-baserow 🐳🐝"]
|
||||
dpt_web_app_checkmk["web-app-checkmk 🐳🐝"]
|
||||
dpt_web_app_fider["web-app-fider 🐳🐝"]
|
||||
dpt_web_app_gitea["web-app-gitea 🐳🐝"]
|
||||
dpt_web_app_gitlab["web-app-gitlab 🐳🐝"]
|
||||
dpt_web_app_homeassistant["web-app-homeassistant 🐳🐝"]
|
||||
dpt_web_app_jellyfin["web-app-jellyfin 🐳🐝"]
|
||||
dpt_web_app_jenkins["web-app-jenkins 🐳🐝"]
|
||||
dpt_web_app_listmonk["web-app-listmonk 🐳🐝"]
|
||||
dpt_web_app_mattermost["web-app-mattermost 🐳🐝"]
|
||||
dpt_web_app_moodle["web-app-moodle 🐳🐝"]
|
||||
dpt_more["..."]
|
||||
end
|
||||
dep_svc_ai_litellm -. "0..1" .-> svc_litellm
|
||||
dep_svc_ai_ollama -. "0..1" .-> svc_ollama
|
||||
dep_svc_bkp_volume_2_local -. "0..1" .-> svc_container_backup
|
||||
@@ -71,6 +86,19 @@ flowchart LR
|
||||
dep_web_app_prometheus -. "0..1" .-> svc_prometheus
|
||||
dep_web_svc_css -. "0..1" .-> svc_css
|
||||
dep_web_svc_logout -. "0..1" .-> svc_logout
|
||||
svc_logout -- "1:1" --> dpt_more
|
||||
svc_logout -. "0..1" .-> dpt_svc_db_qdrant
|
||||
svc_logout -. "0..1" .-> dpt_web_app_baserow
|
||||
svc_logout -. "0..1" .-> dpt_web_app_checkmk
|
||||
svc_logout -. "0..1" .-> dpt_web_app_fider
|
||||
svc_logout -. "0..1" .-> dpt_web_app_gitea
|
||||
svc_logout -. "0..1" .-> dpt_web_app_gitlab
|
||||
svc_logout -. "0..1" .-> dpt_web_app_homeassistant
|
||||
svc_logout -. "0..1" .-> dpt_web_app_jellyfin
|
||||
svc_logout -. "0..1" .-> dpt_web_app_jenkins
|
||||
svc_logout -. "0..1" .-> dpt_web_app_listmonk
|
||||
svc_logout -. "0..1" .-> dpt_web_app_mattermost
|
||||
svc_logout -. "0..1" .-> dpt_web_app_moodle
|
||||
linkStyle 3 stroke:red;
|
||||
```
|
||||
|
||||
|
||||
@@ -45,6 +45,7 @@ postgres:
|
||||
shared: "{{ 'svc-db-postgres' in group_names }}"
|
||||
# nocheck: playwright-service-flag: shared provider entity; the app itself is covered by this role's own Playwright spec
|
||||
flowise:
|
||||
mcp_consumer: true
|
||||
healthcheck:
|
||||
flavor: curl
|
||||
modes:
|
||||
|
||||
@@ -21,9 +21,13 @@ flowchart LR
|
||||
dep_svc_db_redis["svc-db-redis 🐳🐝"]
|
||||
dep_svc_net_tor["svc-net-tor 🐳🐝"]
|
||||
dep_web_app_dashboard["web-app-dashboard 🐳🐝"]
|
||||
dep_web_app_flowise["web-app-flowise 🐳🐝"]
|
||||
dep_web_app_hermes["web-app-hermes 🐳🐝"]
|
||||
dep_web_app_keycloak["web-app-keycloak 🐳🐝"]
|
||||
dep_web_app_mailu["web-app-mailu 🐳🐝"]
|
||||
dep_web_app_matomo["web-app-matomo 🐳🐝"]
|
||||
dep_web_app_openclaw["web-app-openclaw 🐳🐝"]
|
||||
dep_web_app_openwebui["web-app-openwebui 🐳🐝"]
|
||||
dep_web_app_prometheus["web-app-prometheus 🐳🐝"]
|
||||
dep_web_app_seaweedfs["web-app-seaweedfs 🐳🐝"]
|
||||
dep_web_svc_css["web-svc-css 💻"]
|
||||
@@ -47,6 +51,10 @@ flowchart LR
|
||||
svc_prometheus["prometheus"]
|
||||
svc_tor["tor"]
|
||||
svc_container_backup["container_backup"]
|
||||
svc_openwebui["openwebui"]
|
||||
svc_hermes["hermes"]
|
||||
svc_openclaw["openclaw"]
|
||||
svc_flowise["flowise"]
|
||||
end
|
||||
dep_svc_bkp_volume_2_local -. "0..1" .-> svc_container_backup
|
||||
dep_svc_db_mariadb -. "0..1" .-> svc_mariadb
|
||||
@@ -54,9 +62,13 @@ flowchart LR
|
||||
dep_svc_db_redis -. "0..1" .-> svc_redis
|
||||
dep_svc_net_tor -. "0..1" .-> svc_tor
|
||||
dep_web_app_dashboard -. "0..1" .-> svc_dashboard
|
||||
dep_web_app_flowise -. "0..1" .-> svc_flowise
|
||||
dep_web_app_hermes -. "0..1" .-> svc_hermes
|
||||
dep_web_app_keycloak -. "0..1" .-> svc_sso
|
||||
dep_web_app_mailu -. "0..1" .-> svc_email
|
||||
dep_web_app_matomo -. "0..1" .-> svc_matomo
|
||||
dep_web_app_openclaw -. "0..1" .-> svc_openclaw
|
||||
dep_web_app_openwebui -. "0..1" .-> svc_openwebui
|
||||
dep_web_app_prometheus -. "0..1" .-> svc_prometheus
|
||||
dep_web_app_seaweedfs -. "0..1" .-> svc_seaweedfs
|
||||
dep_web_svc_css -. "0..1" .-> svc_css
|
||||
|
||||
@@ -14,10 +14,6 @@ credential:
|
||||
owner: mcp-web-app-gitea
|
||||
source: credentials
|
||||
key: mcp_bearer
|
||||
allowed_consumers:
|
||||
- web-app-openwebui
|
||||
- web-app-hermes
|
||||
- web-app-openclaw
|
||||
adapter:
|
||||
type: mcp_passthrough
|
||||
upstream_network: giteamcpupstream_net
|
||||
|
||||
@@ -157,3 +157,24 @@ container_backup: # nocheck: bond-baseline backup host joins outside the variant
|
||||
bond: 1
|
||||
enabled: "{{ 'svc-bkp-volume-2-local' in group_names }}"
|
||||
shared: true
|
||||
# nocheck: playwright-service-flag MCP pairing is proven by the role's own MCP spec, not by a per-consumer gate
|
||||
openwebui:
|
||||
bond: 0.5
|
||||
enabled: "{{ 'web-app-openwebui' in group_names }}"
|
||||
shared: "{{ 'web-app-openwebui' in group_names }}"
|
||||
# nocheck: playwright-service-flag MCP pairing is proven by the role's own MCP spec, not by a per-consumer gate
|
||||
hermes:
|
||||
bond: 0.5
|
||||
enabled: "{{ 'web-app-hermes' in group_names }}"
|
||||
shared: "{{ 'web-app-hermes' in group_names }}"
|
||||
# nocheck: playwright-service-flag MCP pairing is proven by the role's own MCP spec, not by a per-consumer gate
|
||||
openclaw:
|
||||
bond: 0.5
|
||||
enabled: "{{ 'web-app-openclaw' in group_names }}"
|
||||
shared: "{{ 'web-app-openclaw' in group_names }}"
|
||||
# nocheck: playwright-service-flag MCP pairing is proven by the role's own MCP spec, not by a per-consumer gate
|
||||
flowise:
|
||||
bond: 0.5
|
||||
enabled: "{{ 'web-app-flowise' in group_names }}"
|
||||
shared: "{{ 'web-app-flowise' in group_names }}"
|
||||
mcp_consumer: false
|
||||
@@ -40,6 +40,18 @@
|
||||
shared: true
|
||||
tor:
|
||||
enabled: true
|
||||
openwebui:
|
||||
enabled: false
|
||||
shared: false
|
||||
hermes:
|
||||
enabled: false
|
||||
shared: false
|
||||
openclaw:
|
||||
enabled: false
|
||||
shared: false
|
||||
flowise:
|
||||
enabled: false
|
||||
shared: false
|
||||
mcp:
|
||||
enabled: true
|
||||
shared: true
|
||||
@@ -80,6 +92,18 @@
|
||||
shared: false # nocheck: variants-static-override backup shared stays literally true
|
||||
tor:
|
||||
enabled: true
|
||||
openwebui:
|
||||
enabled: true
|
||||
shared: true
|
||||
hermes:
|
||||
enabled: true
|
||||
shared: true
|
||||
openclaw:
|
||||
enabled: true
|
||||
shared: true
|
||||
flowise:
|
||||
enabled: true
|
||||
shared: true
|
||||
mcp:
|
||||
enabled: false
|
||||
shared: false
|
||||
@@ -116,6 +140,18 @@
|
||||
shared: false # nocheck: variants-static-override backup shared stays literally true
|
||||
tor:
|
||||
enabled: true
|
||||
openwebui:
|
||||
enabled: false
|
||||
shared: false
|
||||
hermes:
|
||||
enabled: false
|
||||
shared: false
|
||||
openclaw:
|
||||
enabled: false
|
||||
shared: false
|
||||
flowise:
|
||||
enabled: false
|
||||
shared: false
|
||||
mcp:
|
||||
enabled: false
|
||||
shared: false
|
||||
@@ -20,9 +20,13 @@ flowchart LR
|
||||
dep_svc_db_redis["svc-db-redis 🐳🐝"]
|
||||
dep_svc_net_tor["svc-net-tor 🐳🐝"]
|
||||
dep_web_app_dashboard["web-app-dashboard 🐳🐝"]
|
||||
dep_web_app_flowise["web-app-flowise 🐳🐝"]
|
||||
dep_web_app_hermes["web-app-hermes 🐳🐝"]
|
||||
dep_web_app_keycloak["web-app-keycloak 🐳🐝"]
|
||||
dep_web_app_mailu["web-app-mailu 🐳🐝"]
|
||||
dep_web_app_matomo["web-app-matomo 🐳🐝"]
|
||||
dep_web_app_openclaw["web-app-openclaw 🐳🐝"]
|
||||
dep_web_app_openwebui["web-app-openwebui 🐳🐝"]
|
||||
dep_web_app_prometheus["web-app-prometheus 🐳🐝"]
|
||||
dep_web_app_seaweedfs["web-app-seaweedfs 🐳🐝"]
|
||||
dep_web_svc_css["web-svc-css 💻"]
|
||||
@@ -49,6 +53,10 @@ flowchart LR
|
||||
svc_tor["tor"]
|
||||
svc_container_backup["container_backup"]
|
||||
svc_gitlabmcp["gitlabmcp"]
|
||||
svc_openwebui["openwebui"]
|
||||
svc_hermes["hermes"]
|
||||
svc_openclaw["openclaw"]
|
||||
svc_flowise["flowise"]
|
||||
end
|
||||
subgraph dependents [Dependents]
|
||||
dpt_web_app_nextcloud["web-app-nextcloud 🐳🐝"]
|
||||
@@ -58,9 +66,13 @@ flowchart LR
|
||||
dep_svc_db_redis -. "0..1" .-> svc_redis
|
||||
dep_svc_net_tor -. "0..1" .-> svc_tor
|
||||
dep_web_app_dashboard -. "0..1" .-> svc_dashboard
|
||||
dep_web_app_flowise -. "0..1" .-> svc_flowise
|
||||
dep_web_app_hermes -. "0..1" .-> svc_hermes
|
||||
dep_web_app_keycloak -. "0..1" .-> svc_sso
|
||||
dep_web_app_mailu -. "0..1" .-> svc_email
|
||||
dep_web_app_matomo -. "0..1" .-> svc_matomo
|
||||
dep_web_app_openclaw -. "0..1" .-> svc_openclaw
|
||||
dep_web_app_openwebui -. "0..1" .-> svc_openwebui
|
||||
dep_web_app_prometheus -. "0..1" .-> svc_prometheus
|
||||
dep_web_app_seaweedfs -. "0..1" .-> svc_seaweedfs
|
||||
dep_web_svc_css -. "0..1" .-> svc_css
|
||||
|
||||
@@ -15,10 +15,6 @@ credential:
|
||||
owner: mcp-web-app-gitlab
|
||||
source: credentials
|
||||
key: mcp_bearer
|
||||
allowed_consumers:
|
||||
- web-app-openwebui
|
||||
- web-app-hermes
|
||||
- web-app-openclaw
|
||||
adapter:
|
||||
type: mcp_passthrough
|
||||
specification_path: roles/web-app-gitlab/files/mcp/tools.json
|
||||
|
||||
@@ -179,3 +179,24 @@ gitlabmcp:
|
||||
ports:
|
||||
internal:
|
||||
http: 8080
|
||||
# nocheck: playwright-service-flag MCP pairing is proven by the role's own MCP spec, not by a per-consumer gate
|
||||
openwebui:
|
||||
bond: 0.5
|
||||
enabled: "{{ 'web-app-openwebui' in group_names }}"
|
||||
shared: "{{ 'web-app-openwebui' in group_names }}"
|
||||
# nocheck: playwright-service-flag MCP pairing is proven by the role's own MCP spec, not by a per-consumer gate
|
||||
hermes:
|
||||
bond: 0.5
|
||||
enabled: "{{ 'web-app-hermes' in group_names }}"
|
||||
shared: "{{ 'web-app-hermes' in group_names }}"
|
||||
# nocheck: playwright-service-flag MCP pairing is proven by the role's own MCP spec, not by a per-consumer gate
|
||||
openclaw:
|
||||
bond: 0.5
|
||||
enabled: "{{ 'web-app-openclaw' in group_names }}"
|
||||
shared: "{{ 'web-app-openclaw' in group_names }}"
|
||||
# nocheck: playwright-service-flag MCP pairing is proven by the role's own MCP spec, not by a per-consumer gate
|
||||
flowise:
|
||||
bond: 0.5
|
||||
enabled: "{{ 'web-app-flowise' in group_names }}"
|
||||
shared: "{{ 'web-app-flowise' in group_names }}"
|
||||
mcp_consumer: false
|
||||
@@ -37,6 +37,18 @@
|
||||
shared: true
|
||||
tor:
|
||||
enabled: true
|
||||
openwebui:
|
||||
enabled: false
|
||||
shared: false
|
||||
hermes:
|
||||
enabled: false
|
||||
shared: false
|
||||
openclaw:
|
||||
enabled: false
|
||||
shared: false
|
||||
flowise:
|
||||
enabled: false
|
||||
shared: false
|
||||
mcp:
|
||||
enabled: true
|
||||
shared: true
|
||||
@@ -74,6 +86,18 @@
|
||||
shared: false # nocheck: variants-static-override backup shared stays literally true
|
||||
tor:
|
||||
enabled: true
|
||||
openwebui:
|
||||
enabled: true
|
||||
shared: true
|
||||
hermes:
|
||||
enabled: true
|
||||
shared: true
|
||||
openclaw:
|
||||
enabled: true
|
||||
shared: true
|
||||
flowise:
|
||||
enabled: true
|
||||
shared: true
|
||||
mcp:
|
||||
enabled: false
|
||||
shared: false
|
||||
@@ -42,7 +42,18 @@ flowchart LR
|
||||
end
|
||||
subgraph dependents [Dependents]
|
||||
dpt_svc_ai_robot["svc-ai-robot 💻"]
|
||||
dpt_web_app_nextcloud["web-app-nextcloud 🐳🐝"]
|
||||
dpt_svc_db_qdrant["svc-db-qdrant 🐳🐝"]
|
||||
dpt_web_app_baserow["web-app-baserow 🐳🐝"]
|
||||
dpt_web_app_checkmk["web-app-checkmk 🐳🐝"]
|
||||
dpt_web_app_fider["web-app-fider 🐳🐝"]
|
||||
dpt_web_app_gitea["web-app-gitea 🐳🐝"]
|
||||
dpt_web_app_gitlab["web-app-gitlab 🐳🐝"]
|
||||
dpt_web_app_homeassistant["web-app-homeassistant 🐳🐝"]
|
||||
dpt_web_app_jellyfin["web-app-jellyfin 🐳🐝"]
|
||||
dpt_web_app_jenkins["web-app-jenkins 🐳🐝"]
|
||||
dpt_web_app_listmonk["web-app-listmonk 🐳🐝"]
|
||||
dpt_web_app_mattermost["web-app-mattermost 🐳🐝"]
|
||||
dpt_more["..."]
|
||||
end
|
||||
dep_svc_ai_litellm -. "0..1" .-> svc_litellm
|
||||
dep_svc_bkp_volume_2_local -. "0..1" .-> svc_container_backup
|
||||
@@ -54,8 +65,19 @@ flowchart LR
|
||||
dep_web_app_matomo -. "0..1" .-> svc_matomo
|
||||
dep_web_app_prometheus -. "0..1" .-> svc_prometheus
|
||||
dep_web_svc_css -. "0..1" .-> svc_css
|
||||
svc_hermes -- "1:1" --> dpt_more
|
||||
svc_hermes -. "0..1" .-> dpt_svc_ai_robot
|
||||
svc_hermes -. "0..1" .-> dpt_web_app_nextcloud
|
||||
svc_hermes -. "0..1" .-> dpt_svc_db_qdrant
|
||||
svc_hermes -. "0..1" .-> dpt_web_app_baserow
|
||||
svc_hermes -. "0..1" .-> dpt_web_app_checkmk
|
||||
svc_hermes -. "0..1" .-> dpt_web_app_fider
|
||||
svc_hermes -. "0..1" .-> dpt_web_app_gitea
|
||||
svc_hermes -. "0..1" .-> dpt_web_app_gitlab
|
||||
svc_hermes -. "0..1" .-> dpt_web_app_homeassistant
|
||||
svc_hermes -. "0..1" .-> dpt_web_app_jellyfin
|
||||
svc_hermes -. "0..1" .-> dpt_web_app_jenkins
|
||||
svc_hermes -. "0..1" .-> dpt_web_app_listmonk
|
||||
svc_hermes -. "0..1" .-> dpt_web_app_mattermost
|
||||
```
|
||||
|
||||
Solid `1:1` edges are fixed relationships; dashed `0..1` edges are conditional (enabled only in matching deployments); red `0..0` edges are turned off in this role. Node markers show the role's deploy modes (💻 host, 🐳 compose, 🐝 swarm); ❌ marks a service that is explicitly turned off, and ⚙️ an Ansible role dependency declared in `meta/main.yml`.
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
---
|
||||
# nocheck: playwright-service-flag
|
||||
hermes:
|
||||
mcp_consumer: true
|
||||
modes:
|
||||
compose:
|
||||
enabled: true
|
||||
|
||||
@@ -18,7 +18,11 @@ flowchart LR
|
||||
dep_svc_bkp_volume_2_local["svc-bkp-volume-2-local 💻"]
|
||||
dep_svc_net_tor["svc-net-tor 🐳🐝"]
|
||||
dep_web_app_dashboard["web-app-dashboard 🐳🐝"]
|
||||
dep_web_app_flowise["web-app-flowise 🐳🐝"]
|
||||
dep_web_app_hermes["web-app-hermes 🐳🐝"]
|
||||
dep_web_app_keycloak["web-app-keycloak 🐳🐝"]
|
||||
dep_web_app_openclaw["web-app-openclaw 🐳🐝"]
|
||||
dep_web_app_openwebui["web-app-openwebui 🐳🐝"]
|
||||
dep_web_app_prometheus["web-app-prometheus 🐳🐝"]
|
||||
end
|
||||
subgraph role [web-app-homeassistant 🐳🐝]
|
||||
@@ -29,6 +33,10 @@ flowchart LR
|
||||
svc_prometheus["prometheus"]
|
||||
svc_tor["tor"]
|
||||
svc_container_backup["container_backup"]
|
||||
svc_openwebui["openwebui"]
|
||||
svc_hermes["hermes"]
|
||||
svc_openclaw["openclaw"]
|
||||
svc_flowise["flowise"]
|
||||
end
|
||||
subgraph dependents [Dependents]
|
||||
dpt_web_app_flowise["web-app-flowise 🐳🐝"]
|
||||
@@ -39,13 +47,17 @@ flowchart LR
|
||||
dep_svc_bkp_volume_2_local -. "0..1" .-> svc_container_backup
|
||||
dep_svc_net_tor -. "0..1" .-> svc_tor
|
||||
dep_web_app_dashboard -. "0..1" .-> svc_dashboard
|
||||
dep_web_app_flowise -. "0..1" .-> svc_flowise
|
||||
dep_web_app_hermes -. "0..1" .-> svc_hermes
|
||||
dep_web_app_keycloak -- "0..0" --> svc_sso
|
||||
dep_web_app_openclaw -. "0..1" .-> svc_openclaw
|
||||
dep_web_app_openwebui -. "0..1" .-> svc_openwebui
|
||||
dep_web_app_prometheus -. "0..1" .-> svc_prometheus
|
||||
svc_homeassistant -. "0..1" .-> dpt_web_app_flowise
|
||||
svc_homeassistant -. "0..1" .-> dpt_web_app_hermes
|
||||
svc_homeassistant -. "0..1" .-> dpt_web_app_openclaw
|
||||
svc_homeassistant -. "0..1" .-> dpt_web_app_openwebui
|
||||
linkStyle 3 stroke:red;
|
||||
linkStyle 5 stroke:red;
|
||||
```
|
||||
|
||||
Solid `1:1` edges are fixed relationships; dashed `0..1` edges are conditional (enabled only in matching deployments); red `0..0` edges are turned off in this role. Node markers show the role's deploy modes (💻 host, 🐳 compose, 🐝 swarm); ❌ marks a service that is explicitly turned off, and ⚙️ an Ansible role dependency declared in `meta/main.yml`.
|
||||
|
||||
@@ -14,11 +14,6 @@ credential:
|
||||
owner: mcp-web-app-homeassistant
|
||||
source: token_store
|
||||
key: web-app-homeassistant
|
||||
allowed_consumers:
|
||||
- web-app-openwebui
|
||||
- web-app-hermes
|
||||
- web-app-openclaw
|
||||
- web-app-flowise
|
||||
endpoint:
|
||||
service_key: homeassistant
|
||||
path: /api/mcp
|
||||
|
||||
@@ -64,3 +64,23 @@ container_backup: # nocheck: bond-baseline
|
||||
bond: 1
|
||||
enabled: "{{ 'svc-bkp-volume-2-local' in group_names }}"
|
||||
shared: true
|
||||
# nocheck: playwright-service-flag MCP pairing is proven by the role's own MCP spec, not by a per-consumer gate
|
||||
openwebui:
|
||||
bond: 0.5
|
||||
enabled: "{{ 'web-app-openwebui' in group_names }}"
|
||||
shared: "{{ 'web-app-openwebui' in group_names }}"
|
||||
# nocheck: playwright-service-flag MCP pairing is proven by the role's own MCP spec, not by a per-consumer gate
|
||||
hermes:
|
||||
bond: 0.5
|
||||
enabled: "{{ 'web-app-hermes' in group_names }}"
|
||||
shared: "{{ 'web-app-hermes' in group_names }}"
|
||||
# nocheck: playwright-service-flag MCP pairing is proven by the role's own MCP spec, not by a per-consumer gate
|
||||
openclaw:
|
||||
bond: 0.5
|
||||
enabled: "{{ 'web-app-openclaw' in group_names }}"
|
||||
shared: "{{ 'web-app-openclaw' in group_names }}"
|
||||
# nocheck: playwright-service-flag MCP pairing is proven by the role's own MCP spec, not by a per-consumer gate
|
||||
flowise:
|
||||
bond: 0.5
|
||||
enabled: "{{ 'web-app-flowise' in group_names }}"
|
||||
shared: "{{ 'web-app-flowise' in group_names }}"
|
||||
@@ -14,6 +14,18 @@
|
||||
tor:
|
||||
enabled: true
|
||||
|
||||
openwebui:
|
||||
enabled: false
|
||||
shared: false
|
||||
hermes:
|
||||
enabled: false
|
||||
shared: false
|
||||
openclaw:
|
||||
enabled: false
|
||||
shared: false
|
||||
flowise:
|
||||
enabled: false
|
||||
shared: false
|
||||
mcp:
|
||||
enabled: true
|
||||
shared: true
|
||||
@@ -29,6 +41,18 @@
|
||||
shared: false # nocheck: variants-static-override backup shared stays literally true
|
||||
tor:
|
||||
enabled: true
|
||||
openwebui:
|
||||
enabled: true
|
||||
shared: true
|
||||
hermes:
|
||||
enabled: true
|
||||
shared: true
|
||||
openclaw:
|
||||
enabled: true
|
||||
shared: true
|
||||
flowise:
|
||||
enabled: true
|
||||
shared: true
|
||||
mcp:
|
||||
enabled: false
|
||||
shared: false
|
||||
@@ -19,8 +19,12 @@ flowchart LR
|
||||
dep_svc_db_openldap["svc-db-openldap 🐳🐝"]
|
||||
dep_svc_net_tor["svc-net-tor 🐳🐝"]
|
||||
dep_web_app_dashboard["web-app-dashboard 🐳🐝"]
|
||||
dep_web_app_flowise["web-app-flowise 🐳🐝"]
|
||||
dep_web_app_hermes["web-app-hermes 🐳🐝"]
|
||||
dep_web_app_keycloak["web-app-keycloak 🐳🐝"]
|
||||
dep_web_app_matomo["web-app-matomo 🐳🐝"]
|
||||
dep_web_app_openclaw["web-app-openclaw 🐳🐝"]
|
||||
dep_web_app_openwebui["web-app-openwebui 🐳🐝"]
|
||||
dep_web_app_prometheus["web-app-prometheus 🐳🐝"]
|
||||
dep_web_svc_css["web-svc-css 💻"]
|
||||
dep_web_svc_logout["web-svc-logout 🐳🐝"]
|
||||
@@ -37,13 +41,21 @@ flowchart LR
|
||||
svc_tor["tor"]
|
||||
svc_container_backup["container_backup"]
|
||||
svc_jellyfinmcp["jellyfinmcp"]
|
||||
svc_openwebui["openwebui"]
|
||||
svc_hermes["hermes"]
|
||||
svc_openclaw["openclaw"]
|
||||
svc_flowise["flowise"]
|
||||
end
|
||||
dep_svc_bkp_volume_2_local -. "0..1" .-> svc_container_backup
|
||||
dep_svc_db_openldap -. "0..1" .-> svc_ldap
|
||||
dep_svc_net_tor -. "0..1" .-> svc_tor
|
||||
dep_web_app_dashboard -. "0..1" .-> svc_dashboard
|
||||
dep_web_app_flowise -. "0..1" .-> svc_flowise
|
||||
dep_web_app_hermes -. "0..1" .-> svc_hermes
|
||||
dep_web_app_keycloak -. "0..1" .-> svc_sso
|
||||
dep_web_app_matomo -. "0..1" .-> svc_matomo
|
||||
dep_web_app_openclaw -. "0..1" .-> svc_openclaw
|
||||
dep_web_app_openwebui -. "0..1" .-> svc_openwebui
|
||||
dep_web_app_prometheus -. "0..1" .-> svc_prometheus
|
||||
dep_web_svc_css -. "0..1" .-> svc_css
|
||||
dep_web_svc_logout -. "0..1" .-> svc_logout
|
||||
|
||||
@@ -14,10 +14,6 @@ credential:
|
||||
owner: mcp-web-app-jellyfin
|
||||
source: credentials
|
||||
key: mcp_bearer
|
||||
allowed_consumers:
|
||||
- web-app-openwebui
|
||||
- web-app-hermes
|
||||
- web-app-openclaw
|
||||
endpoint:
|
||||
service_key: jellyfinmcp
|
||||
path: /mcp
|
||||
|
||||
@@ -91,3 +91,24 @@ jellyfinmcp:
|
||||
ports:
|
||||
internal:
|
||||
http: 8080
|
||||
# nocheck: playwright-service-flag MCP pairing is proven by the role's own MCP spec, not by a per-consumer gate
|
||||
openwebui:
|
||||
bond: 0.5
|
||||
enabled: "{{ 'web-app-openwebui' in group_names }}"
|
||||
shared: "{{ 'web-app-openwebui' in group_names }}"
|
||||
# nocheck: playwright-service-flag MCP pairing is proven by the role's own MCP spec, not by a per-consumer gate
|
||||
hermes:
|
||||
bond: 0.5
|
||||
enabled: "{{ 'web-app-hermes' in group_names }}"
|
||||
shared: "{{ 'web-app-hermes' in group_names }}"
|
||||
# nocheck: playwright-service-flag MCP pairing is proven by the role's own MCP spec, not by a per-consumer gate
|
||||
openclaw:
|
||||
bond: 0.5
|
||||
enabled: "{{ 'web-app-openclaw' in group_names }}"
|
||||
shared: "{{ 'web-app-openclaw' in group_names }}"
|
||||
# nocheck: playwright-service-flag MCP pairing is proven by the role's own MCP spec, not by a per-consumer gate
|
||||
flowise:
|
||||
bond: 0.5
|
||||
enabled: "{{ 'web-app-flowise' in group_names }}"
|
||||
shared: "{{ 'web-app-flowise' in group_names }}"
|
||||
mcp_consumer: false
|
||||
@@ -26,6 +26,18 @@
|
||||
tor:
|
||||
enabled: true
|
||||
|
||||
openwebui:
|
||||
enabled: false
|
||||
shared: false
|
||||
hermes:
|
||||
enabled: false
|
||||
shared: false
|
||||
openclaw:
|
||||
enabled: false
|
||||
shared: false
|
||||
flowise:
|
||||
enabled: false
|
||||
shared: false
|
||||
mcp:
|
||||
enabled: true
|
||||
shared: true
|
||||
@@ -57,6 +69,18 @@
|
||||
tor:
|
||||
enabled: true
|
||||
|
||||
openwebui:
|
||||
enabled: true
|
||||
shared: true
|
||||
hermes:
|
||||
enabled: true
|
||||
shared: true
|
||||
openclaw:
|
||||
enabled: true
|
||||
shared: true
|
||||
flowise:
|
||||
enabled: true
|
||||
shared: true
|
||||
mcp:
|
||||
enabled: false
|
||||
shared: false
|
||||
@@ -88,6 +112,18 @@
|
||||
tor:
|
||||
enabled: true
|
||||
|
||||
openwebui:
|
||||
enabled: false
|
||||
shared: false
|
||||
hermes:
|
||||
enabled: false
|
||||
shared: false
|
||||
openclaw:
|
||||
enabled: false
|
||||
shared: false
|
||||
flowise:
|
||||
enabled: false
|
||||
shared: false
|
||||
mcp:
|
||||
enabled: false
|
||||
shared: false
|
||||
@@ -19,8 +19,12 @@ flowchart LR
|
||||
dep_svc_db_openldap["svc-db-openldap 🐳🐝"]
|
||||
dep_svc_net_tor["svc-net-tor 🐳🐝"]
|
||||
dep_web_app_dashboard["web-app-dashboard 🐳🐝"]
|
||||
dep_web_app_flowise["web-app-flowise 🐳🐝"]
|
||||
dep_web_app_hermes["web-app-hermes 🐳🐝"]
|
||||
dep_web_app_keycloak["web-app-keycloak 🐳🐝"]
|
||||
dep_web_app_matomo["web-app-matomo 🐳🐝"]
|
||||
dep_web_app_openclaw["web-app-openclaw 🐳🐝"]
|
||||
dep_web_app_openwebui["web-app-openwebui 🐳🐝"]
|
||||
dep_web_app_prometheus["web-app-prometheus 🐳🐝"]
|
||||
dep_web_svc_css["web-svc-css 💻"]
|
||||
dep_web_svc_logout["web-svc-logout 🐳🐝"]
|
||||
@@ -37,13 +41,21 @@ flowchart LR
|
||||
svc_jenkinsmcp["jenkinsmcp"]
|
||||
svc_css["css"]
|
||||
svc_container_backup["container_backup"]
|
||||
svc_openwebui["openwebui"]
|
||||
svc_hermes["hermes"]
|
||||
svc_openclaw["openclaw"]
|
||||
svc_flowise["flowise"]
|
||||
end
|
||||
dep_svc_bkp_volume_2_local -. "0..1" .-> svc_container_backup
|
||||
dep_svc_db_openldap -. "0..1" .-> svc_ldap
|
||||
dep_svc_net_tor -. "0..1" .-> svc_tor
|
||||
dep_web_app_dashboard -. "0..1" .-> svc_dashboard
|
||||
dep_web_app_flowise -. "0..1" .-> svc_flowise
|
||||
dep_web_app_hermes -. "0..1" .-> svc_hermes
|
||||
dep_web_app_keycloak -. "0..1" .-> svc_sso
|
||||
dep_web_app_matomo -. "0..1" .-> svc_matomo
|
||||
dep_web_app_openclaw -. "0..1" .-> svc_openclaw
|
||||
dep_web_app_openwebui -. "0..1" .-> svc_openwebui
|
||||
dep_web_app_prometheus -. "0..1" .-> svc_prometheus
|
||||
dep_web_svc_css -. "0..1" .-> svc_css
|
||||
dep_web_svc_logout -. "0..1" .-> svc_logout
|
||||
|
||||
@@ -14,9 +14,6 @@ credential:
|
||||
owner: mcp-web-app-jenkins
|
||||
source: credentials
|
||||
key: mcp_bearer
|
||||
allowed_consumers:
|
||||
- web-app-hermes
|
||||
- web-app-openclaw
|
||||
adapter:
|
||||
type: mcp_passthrough
|
||||
specification_path: roles/web-app-jenkins/files/mcp/tools.json
|
||||
|
||||
@@ -92,3 +92,25 @@ container_backup: # nocheck: bond-baseline backup host joins outside the variant
|
||||
bond: 1
|
||||
enabled: "{{ 'svc-bkp-volume-2-local' in group_names }}"
|
||||
shared: true
|
||||
# nocheck: playwright-service-flag MCP pairing is proven by the role's own MCP spec, not by a per-consumer gate
|
||||
openwebui:
|
||||
bond: 0.5
|
||||
enabled: "{{ 'web-app-openwebui' in group_names }}"
|
||||
shared: "{{ 'web-app-openwebui' in group_names }}"
|
||||
mcp_consumer: false
|
||||
# nocheck: playwright-service-flag MCP pairing is proven by the role's own MCP spec, not by a per-consumer gate
|
||||
hermes:
|
||||
bond: 0.5
|
||||
enabled: "{{ 'web-app-hermes' in group_names }}"
|
||||
shared: "{{ 'web-app-hermes' in group_names }}"
|
||||
# nocheck: playwright-service-flag MCP pairing is proven by the role's own MCP spec, not by a per-consumer gate
|
||||
openclaw:
|
||||
bond: 0.5
|
||||
enabled: "{{ 'web-app-openclaw' in group_names }}"
|
||||
shared: "{{ 'web-app-openclaw' in group_names }}"
|
||||
# nocheck: playwright-service-flag MCP pairing is proven by the role's own MCP spec, not by a per-consumer gate
|
||||
flowise:
|
||||
bond: 0.5
|
||||
enabled: "{{ 'web-app-flowise' in group_names }}"
|
||||
shared: "{{ 'web-app-flowise' in group_names }}"
|
||||
mcp_consumer: false
|
||||
@@ -32,6 +32,18 @@
|
||||
shared: true
|
||||
tor:
|
||||
enabled: true
|
||||
openwebui:
|
||||
enabled: false
|
||||
shared: false
|
||||
hermes:
|
||||
enabled: false
|
||||
shared: false
|
||||
openclaw:
|
||||
enabled: false
|
||||
shared: false
|
||||
flowise:
|
||||
enabled: false
|
||||
shared: false
|
||||
mcp:
|
||||
enabled: true
|
||||
shared: true
|
||||
@@ -62,6 +74,18 @@
|
||||
shared: false # nocheck: variants-static-override backup shared stays literally true
|
||||
tor:
|
||||
enabled: true
|
||||
openwebui:
|
||||
enabled: true
|
||||
shared: true
|
||||
hermes:
|
||||
enabled: true
|
||||
shared: true
|
||||
openclaw:
|
||||
enabled: true
|
||||
shared: true
|
||||
flowise:
|
||||
enabled: true
|
||||
shared: true
|
||||
mcp:
|
||||
enabled: false
|
||||
shared: false
|
||||
@@ -92,6 +116,18 @@
|
||||
shared: false # nocheck: variants-static-override backup shared stays literally true
|
||||
tor:
|
||||
enabled: true
|
||||
openwebui:
|
||||
enabled: false
|
||||
shared: false
|
||||
hermes:
|
||||
enabled: false
|
||||
shared: false
|
||||
openclaw:
|
||||
enabled: false
|
||||
shared: false
|
||||
flowise:
|
||||
enabled: false
|
||||
shared: false
|
||||
mcp:
|
||||
enabled: false
|
||||
shared: false
|
||||
@@ -21,9 +21,13 @@ flowchart LR
|
||||
dep_svc_db_postgres["svc-db-postgres 🐳🐝"]
|
||||
dep_svc_net_tor["svc-net-tor 🐳🐝"]
|
||||
dep_web_app_dashboard["web-app-dashboard 🐳🐝"]
|
||||
dep_web_app_flowise["web-app-flowise 🐳🐝"]
|
||||
dep_web_app_hermes["web-app-hermes 🐳🐝"]
|
||||
dep_web_app_keycloak["web-app-keycloak 🐳🐝"]
|
||||
dep_web_app_mailu["web-app-mailu 🐳🐝"]
|
||||
dep_web_app_matomo["web-app-matomo 🐳🐝"]
|
||||
dep_web_app_openclaw["web-app-openclaw 🐳🐝"]
|
||||
dep_web_app_openwebui["web-app-openwebui 🐳🐝"]
|
||||
dep_web_app_prometheus["web-app-prometheus 🐳🐝"]
|
||||
dep_web_app_seaweedfs["web-app-seaweedfs 🐳🐝"]
|
||||
dep_web_svc_asset["web-svc-asset 💻"]
|
||||
@@ -46,13 +50,21 @@ flowchart LR
|
||||
svc_prometheus["prometheus"]
|
||||
svc_listmonkmcp["listmonkmcp"]
|
||||
svc_tor["tor"]
|
||||
svc_openwebui["openwebui"]
|
||||
svc_hermes["hermes"]
|
||||
svc_openclaw["openclaw"]
|
||||
svc_flowise["flowise"]
|
||||
end
|
||||
dep_svc_db_postgres -. "0..1" .-> svc_postgres
|
||||
dep_svc_net_tor -. "0..1" .-> svc_tor
|
||||
dep_web_app_dashboard -. "0..1" .-> svc_dashboard
|
||||
dep_web_app_flowise -. "0..1" .-> svc_flowise
|
||||
dep_web_app_hermes -. "0..1" .-> svc_hermes
|
||||
dep_web_app_keycloak -. "0..1" .-> svc_sso
|
||||
dep_web_app_mailu -. "0..1" .-> svc_email
|
||||
dep_web_app_matomo -. "0..1" .-> svc_matomo
|
||||
dep_web_app_openclaw -. "0..1" .-> svc_openclaw
|
||||
dep_web_app_openwebui -. "0..1" .-> svc_openwebui
|
||||
dep_web_app_prometheus -. "0..1" .-> svc_prometheus
|
||||
dep_web_app_seaweedfs -. "0..1" .-> svc_seaweedfs
|
||||
dep_web_svc_asset -. "0..1" .-> svc_asset
|
||||
|
||||
@@ -14,10 +14,6 @@ credential:
|
||||
owner: mcp-web-app-listmonk
|
||||
source: credentials
|
||||
key: mcp_bearer
|
||||
allowed_consumers:
|
||||
- web-app-openwebui
|
||||
- web-app-hermes
|
||||
- web-app-openclaw
|
||||
endpoint:
|
||||
service_key: listmonkmcp
|
||||
path: /mcp
|
||||
|
||||
@@ -109,3 +109,24 @@ tor:
|
||||
bond: 0.5
|
||||
enabled: "{{ 'svc-net-tor' in group_names }}"
|
||||
shared: true # nocheck: dynamic-flag
|
||||
# nocheck: playwright-service-flag MCP pairing is proven by the role's own MCP spec, not by a per-consumer gate
|
||||
openwebui:
|
||||
bond: 0.5
|
||||
enabled: "{{ 'web-app-openwebui' in group_names }}"
|
||||
shared: "{{ 'web-app-openwebui' in group_names }}"
|
||||
# nocheck: playwright-service-flag MCP pairing is proven by the role's own MCP spec, not by a per-consumer gate
|
||||
hermes:
|
||||
bond: 0.5
|
||||
enabled: "{{ 'web-app-hermes' in group_names }}"
|
||||
shared: "{{ 'web-app-hermes' in group_names }}"
|
||||
# nocheck: playwright-service-flag MCP pairing is proven by the role's own MCP spec, not by a per-consumer gate
|
||||
openclaw:
|
||||
bond: 0.5
|
||||
enabled: "{{ 'web-app-openclaw' in group_names }}"
|
||||
shared: "{{ 'web-app-openclaw' in group_names }}"
|
||||
# nocheck: playwright-service-flag MCP pairing is proven by the role's own MCP spec, not by a per-consumer gate
|
||||
flowise:
|
||||
bond: 0.5
|
||||
enabled: "{{ 'web-app-flowise' in group_names }}"
|
||||
shared: "{{ 'web-app-flowise' in group_names }}"
|
||||
mcp_consumer: false
|
||||
@@ -36,6 +36,18 @@
|
||||
shared: true
|
||||
tor:
|
||||
enabled: true
|
||||
openwebui:
|
||||
enabled: false
|
||||
shared: false
|
||||
hermes:
|
||||
enabled: false
|
||||
shared: false
|
||||
openclaw:
|
||||
enabled: false
|
||||
shared: false
|
||||
flowise:
|
||||
enabled: false
|
||||
shared: false
|
||||
mcp:
|
||||
enabled: true
|
||||
shared: true
|
||||
@@ -71,6 +83,18 @@
|
||||
shared: false
|
||||
tor:
|
||||
enabled: true
|
||||
openwebui:
|
||||
enabled: true
|
||||
shared: true
|
||||
hermes:
|
||||
enabled: true
|
||||
shared: true
|
||||
openclaw:
|
||||
enabled: true
|
||||
shared: true
|
||||
flowise:
|
||||
enabled: true
|
||||
shared: true
|
||||
mcp:
|
||||
enabled: false
|
||||
shared: false
|
||||
@@ -22,9 +22,13 @@ flowchart LR
|
||||
dep_svc_db_redis["svc-db-redis 🐳🐝"]
|
||||
dep_svc_net_tor["svc-net-tor 🐳🐝"]
|
||||
dep_web_app_dashboard["web-app-dashboard 🐳🐝"]
|
||||
dep_web_app_flowise["web-app-flowise 🐳🐝"]
|
||||
dep_web_app_hermes["web-app-hermes 🐳🐝"]
|
||||
dep_web_app_keycloak["web-app-keycloak 🐳🐝"]
|
||||
dep_web_app_mailu["web-app-mailu 🐳🐝"]
|
||||
dep_web_app_matomo["web-app-matomo 🐳🐝"]
|
||||
dep_web_app_openclaw["web-app-openclaw 🐳🐝"]
|
||||
dep_web_app_openwebui["web-app-openwebui 🐳🐝"]
|
||||
dep_web_app_prometheus["web-app-prometheus 🐳🐝"]
|
||||
dep_web_app_seaweedfs["web-app-seaweedfs 🐳🐝"]
|
||||
dep_web_svc_css["web-svc-css 💻"]
|
||||
@@ -49,6 +53,10 @@ flowchart LR
|
||||
svc_container_backup["container_backup"]
|
||||
svc_litellm["litellm"]
|
||||
svc_mattermostmcp["mattermostmcp"]
|
||||
svc_openwebui["openwebui"]
|
||||
svc_hermes["hermes"]
|
||||
svc_openclaw["openclaw"]
|
||||
svc_flowise["flowise"]
|
||||
end
|
||||
subgraph dependents [Dependents]
|
||||
dpt_web_app_nextcloud["web-app-nextcloud 🐳🐝"]
|
||||
@@ -60,9 +68,13 @@ flowchart LR
|
||||
dep_svc_db_redis -. "0..1" .-> svc_redis
|
||||
dep_svc_net_tor -. "0..1" .-> svc_tor
|
||||
dep_web_app_dashboard -. "0..1" .-> svc_dashboard
|
||||
dep_web_app_flowise -. "0..1" .-> svc_flowise
|
||||
dep_web_app_hermes -. "0..1" .-> svc_hermes
|
||||
dep_web_app_keycloak -. "0..1" .-> svc_sso
|
||||
dep_web_app_mailu -. "0..1" .-> svc_email
|
||||
dep_web_app_matomo -. "0..1" .-> svc_matomo
|
||||
dep_web_app_openclaw -. "0..1" .-> svc_openclaw
|
||||
dep_web_app_openwebui -. "0..1" .-> svc_openwebui
|
||||
dep_web_app_prometheus -. "0..1" .-> svc_prometheus
|
||||
dep_web_app_seaweedfs -. "0..1" .-> svc_seaweedfs
|
||||
dep_web_svc_css -. "0..1" .-> svc_css
|
||||
|
||||
@@ -14,10 +14,6 @@ credential:
|
||||
owner: mcp-web-app-mattermost
|
||||
source: credentials
|
||||
key: mcp_bearer
|
||||
allowed_consumers:
|
||||
- web-app-openwebui
|
||||
- web-app-hermes
|
||||
- web-app-openclaw
|
||||
adapter:
|
||||
type: mcp_passthrough
|
||||
specification_path: roles/web-app-mattermost/files/mcp/tools.json
|
||||
|
||||
@@ -128,3 +128,24 @@ mattermostmcp:
|
||||
ports:
|
||||
internal:
|
||||
http: 8080
|
||||
# nocheck: playwright-service-flag MCP pairing is proven by the role's own MCP spec, not by a per-consumer gate
|
||||
openwebui:
|
||||
bond: 0.5
|
||||
enabled: "{{ 'web-app-openwebui' in group_names }}"
|
||||
shared: "{{ 'web-app-openwebui' in group_names }}"
|
||||
# nocheck: playwright-service-flag MCP pairing is proven by the role's own MCP spec, not by a per-consumer gate
|
||||
hermes:
|
||||
bond: 0.5
|
||||
enabled: "{{ 'web-app-hermes' in group_names }}"
|
||||
shared: "{{ 'web-app-hermes' in group_names }}"
|
||||
# nocheck: playwright-service-flag MCP pairing is proven by the role's own MCP spec, not by a per-consumer gate
|
||||
openclaw:
|
||||
bond: 0.5
|
||||
enabled: "{{ 'web-app-openclaw' in group_names }}"
|
||||
shared: "{{ 'web-app-openclaw' in group_names }}"
|
||||
# nocheck: playwright-service-flag MCP pairing is proven by the role's own MCP spec, not by a per-consumer gate
|
||||
flowise:
|
||||
bond: 0.5
|
||||
enabled: "{{ 'web-app-flowise' in group_names }}"
|
||||
shared: "{{ 'web-app-flowise' in group_names }}"
|
||||
mcp_consumer: false
|
||||
@@ -40,6 +40,18 @@
|
||||
shared: false
|
||||
tor:
|
||||
enabled: true
|
||||
openwebui:
|
||||
enabled: false
|
||||
shared: false
|
||||
hermes:
|
||||
enabled: false
|
||||
shared: false
|
||||
openclaw:
|
||||
enabled: false
|
||||
shared: false
|
||||
flowise:
|
||||
enabled: false
|
||||
shared: false
|
||||
mcp:
|
||||
enabled: true
|
||||
shared: true
|
||||
@@ -80,6 +92,18 @@
|
||||
shared: false
|
||||
tor:
|
||||
enabled: true
|
||||
openwebui:
|
||||
enabled: true
|
||||
shared: true
|
||||
hermes:
|
||||
enabled: true
|
||||
shared: true
|
||||
openclaw:
|
||||
enabled: true
|
||||
shared: true
|
||||
flowise:
|
||||
enabled: true
|
||||
shared: true
|
||||
mcp:
|
||||
enabled: false
|
||||
shared: false
|
||||
@@ -121,6 +145,18 @@
|
||||
shared: true
|
||||
tor:
|
||||
enabled: true
|
||||
openwebui:
|
||||
enabled: false
|
||||
shared: false
|
||||
hermes:
|
||||
enabled: false
|
||||
shared: false
|
||||
openclaw:
|
||||
enabled: false
|
||||
shared: false
|
||||
flowise:
|
||||
enabled: false
|
||||
shared: false
|
||||
mcp:
|
||||
enabled: false
|
||||
shared: false
|
||||
@@ -21,9 +21,13 @@ flowchart LR
|
||||
dep_svc_db_openldap["svc-db-openldap 🐳🐝"]
|
||||
dep_svc_net_tor["svc-net-tor 🐳🐝"]
|
||||
dep_web_app_dashboard["web-app-dashboard 🐳🐝"]
|
||||
dep_web_app_flowise["web-app-flowise 🐳🐝"]
|
||||
dep_web_app_hermes["web-app-hermes 🐳🐝"]
|
||||
dep_web_app_keycloak["web-app-keycloak 🐳🐝"]
|
||||
dep_web_app_mailu["web-app-mailu 🐳🐝"]
|
||||
dep_web_app_matomo["web-app-matomo 🐳🐝"]
|
||||
dep_web_app_openclaw["web-app-openclaw 🐳🐝"]
|
||||
dep_web_app_openwebui["web-app-openwebui 🐳🐝"]
|
||||
dep_web_app_prometheus["web-app-prometheus 🐳🐝"]
|
||||
dep_web_svc_css["web-svc-css 💻"]
|
||||
dep_web_svc_logout["web-svc-logout 🐳🐝"]
|
||||
@@ -44,6 +48,10 @@ flowchart LR
|
||||
svc_prometheus["prometheus"]
|
||||
svc_tor["tor"]
|
||||
svc_container_backup["container_backup"]
|
||||
svc_openwebui["openwebui"]
|
||||
svc_hermes["hermes"]
|
||||
svc_openclaw["openclaw"]
|
||||
svc_flowise["flowise"]
|
||||
end
|
||||
dep_svc_ai_litellm -. "0..1" .-> svc_litellm
|
||||
dep_svc_bkp_volume_2_local -. "0..1" .-> svc_container_backup
|
||||
@@ -51,9 +59,13 @@ flowchart LR
|
||||
dep_svc_db_openldap -. "0..1" .-> svc_ldap
|
||||
dep_svc_net_tor -. "0..1" .-> svc_tor
|
||||
dep_web_app_dashboard -. "0..1" .-> svc_dashboard
|
||||
dep_web_app_flowise -. "0..1" .-> svc_flowise
|
||||
dep_web_app_hermes -. "0..1" .-> svc_hermes
|
||||
dep_web_app_keycloak -. "0..1" .-> svc_sso
|
||||
dep_web_app_mailu -. "0..1" .-> svc_email
|
||||
dep_web_app_matomo -. "0..1" .-> svc_matomo
|
||||
dep_web_app_openclaw -. "0..1" .-> svc_openclaw
|
||||
dep_web_app_openwebui -. "0..1" .-> svc_openwebui
|
||||
dep_web_app_prometheus -. "0..1" .-> svc_prometheus
|
||||
dep_web_svc_css -. "0..1" .-> svc_css
|
||||
dep_web_svc_logout -. "0..1" .-> svc_logout
|
||||
|
||||
@@ -14,10 +14,6 @@ credential:
|
||||
owner: mcp-web-app-moodle
|
||||
source: token_store
|
||||
key: web-app-moodle
|
||||
allowed_consumers:
|
||||
- web-app-openwebui
|
||||
- web-app-hermes
|
||||
- web-app-openclaw
|
||||
endpoint:
|
||||
service_key: nginx
|
||||
path: /webservice/mcp/server.php
|
||||
|
||||
@@ -121,3 +121,24 @@ container_backup: # nocheck: bond-baseline backup host joins outside the variant
|
||||
bond: 1
|
||||
enabled: "{{ 'svc-bkp-volume-2-local' in group_names }}"
|
||||
shared: true
|
||||
# nocheck: playwright-service-flag MCP pairing is proven by the role's own MCP spec, not by a per-consumer gate
|
||||
openwebui:
|
||||
bond: 0.5
|
||||
enabled: "{{ 'web-app-openwebui' in group_names }}"
|
||||
shared: "{{ 'web-app-openwebui' in group_names }}"
|
||||
# nocheck: playwright-service-flag MCP pairing is proven by the role's own MCP spec, not by a per-consumer gate
|
||||
hermes:
|
||||
bond: 0.5
|
||||
enabled: "{{ 'web-app-hermes' in group_names }}"
|
||||
shared: "{{ 'web-app-hermes' in group_names }}"
|
||||
# nocheck: playwright-service-flag MCP pairing is proven by the role's own MCP spec, not by a per-consumer gate
|
||||
openclaw:
|
||||
bond: 0.5
|
||||
enabled: "{{ 'web-app-openclaw' in group_names }}"
|
||||
shared: "{{ 'web-app-openclaw' in group_names }}"
|
||||
# nocheck: playwright-service-flag MCP pairing is proven by the role's own MCP spec, not by a per-consumer gate
|
||||
flowise:
|
||||
bond: 0.5
|
||||
enabled: "{{ 'web-app-flowise' in group_names }}"
|
||||
shared: "{{ 'web-app-flowise' in group_names }}"
|
||||
mcp_consumer: false
|
||||
@@ -42,6 +42,18 @@
|
||||
tor:
|
||||
enabled: true
|
||||
|
||||
openwebui:
|
||||
enabled: false
|
||||
shared: false
|
||||
hermes:
|
||||
enabled: false
|
||||
shared: false
|
||||
openclaw:
|
||||
enabled: false
|
||||
shared: false
|
||||
flowise:
|
||||
enabled: false
|
||||
shared: false
|
||||
mcp:
|
||||
enabled: true
|
||||
shared: true
|
||||
@@ -81,6 +93,18 @@
|
||||
shared: false
|
||||
tor:
|
||||
enabled: true
|
||||
openwebui:
|
||||
enabled: true
|
||||
shared: true
|
||||
hermes:
|
||||
enabled: true
|
||||
shared: true
|
||||
openclaw:
|
||||
enabled: true
|
||||
shared: true
|
||||
flowise:
|
||||
enabled: true
|
||||
shared: true
|
||||
mcp:
|
||||
enabled: false
|
||||
shared: false
|
||||
@@ -119,6 +143,18 @@
|
||||
shared: true
|
||||
tor:
|
||||
enabled: true
|
||||
openwebui:
|
||||
enabled: false
|
||||
shared: false
|
||||
hermes:
|
||||
enabled: false
|
||||
shared: false
|
||||
openclaw:
|
||||
enabled: false
|
||||
shared: false
|
||||
flowise:
|
||||
enabled: false
|
||||
shared: false
|
||||
mcp:
|
||||
enabled: false
|
||||
shared: false
|
||||
@@ -20,9 +20,13 @@ flowchart LR
|
||||
dep_svc_db_postgres["svc-db-postgres 🐳🐝"]
|
||||
dep_svc_net_tor["svc-net-tor 🐳🐝"]
|
||||
dep_web_app_dashboard["web-app-dashboard 🐳🐝"]
|
||||
dep_web_app_flowise["web-app-flowise 🐳🐝"]
|
||||
dep_web_app_hermes["web-app-hermes 🐳🐝"]
|
||||
dep_web_app_keycloak["web-app-keycloak 🐳🐝"]
|
||||
dep_web_app_mailu["web-app-mailu 🐳🐝"]
|
||||
dep_web_app_matomo["web-app-matomo 🐳🐝"]
|
||||
dep_web_app_openclaw["web-app-openclaw 🐳🐝"]
|
||||
dep_web_app_openwebui["web-app-openwebui 🐳🐝"]
|
||||
dep_web_app_prometheus["web-app-prometheus 🐳🐝"]
|
||||
dep_web_svc_css["web-svc-css 💻"]
|
||||
dep_web_svc_logout["web-svc-logout 🐳🐝"]
|
||||
@@ -40,15 +44,23 @@ flowchart LR
|
||||
svc_n8n["n8n"]
|
||||
svc_container_backup["container_backup"]
|
||||
svc_litellm["litellm"]
|
||||
svc_openwebui["openwebui"]
|
||||
svc_hermes["hermes"]
|
||||
svc_openclaw["openclaw"]
|
||||
svc_flowise["flowise"]
|
||||
end
|
||||
dep_svc_ai_litellm -. "0..1" .-> svc_litellm
|
||||
dep_svc_bkp_volume_2_local -. "0..1" .-> svc_container_backup
|
||||
dep_svc_db_postgres -. "0..1" .-> svc_postgres
|
||||
dep_svc_net_tor -. "0..1" .-> svc_tor
|
||||
dep_web_app_dashboard -. "0..1" .-> svc_dashboard
|
||||
dep_web_app_flowise -. "0..1" .-> svc_flowise
|
||||
dep_web_app_hermes -. "0..1" .-> svc_hermes
|
||||
dep_web_app_keycloak -. "0..1" .-> svc_sso
|
||||
dep_web_app_mailu -. "0..1" .-> svc_email
|
||||
dep_web_app_matomo -. "0..1" .-> svc_matomo
|
||||
dep_web_app_openclaw -. "0..1" .-> svc_openclaw
|
||||
dep_web_app_openwebui -. "0..1" .-> svc_openwebui
|
||||
dep_web_app_prometheus -. "0..1" .-> svc_prometheus
|
||||
dep_web_svc_css -. "0..1" .-> svc_css
|
||||
dep_web_svc_logout -. "0..1" .-> svc_logout
|
||||
|
||||
@@ -15,10 +15,6 @@ credential:
|
||||
owner: mcp-web-app-n8n
|
||||
source: token_store
|
||||
key: web-app-n8n
|
||||
allowed_consumers:
|
||||
- web-app-hermes
|
||||
- web-app-openclaw
|
||||
- web-app-openwebui
|
||||
supported_transports:
|
||||
- sse
|
||||
supported_auths:
|
||||
|
||||
@@ -97,3 +97,24 @@ litellm:
|
||||
bond: 0.5
|
||||
enabled: "{{ 'svc-ai-litellm' in group_names }}"
|
||||
shared: "{{ 'svc-ai-litellm' in group_names }}"
|
||||
# nocheck: playwright-service-flag MCP pairing is proven by the role's own MCP spec, not by a per-consumer gate
|
||||
openwebui:
|
||||
bond: 0.5
|
||||
enabled: "{{ 'web-app-openwebui' in group_names }}"
|
||||
shared: "{{ 'web-app-openwebui' in group_names }}"
|
||||
# nocheck: playwright-service-flag MCP pairing is proven by the role's own MCP spec, not by a per-consumer gate
|
||||
hermes:
|
||||
bond: 0.5
|
||||
enabled: "{{ 'web-app-hermes' in group_names }}"
|
||||
shared: "{{ 'web-app-hermes' in group_names }}"
|
||||
# nocheck: playwright-service-flag MCP pairing is proven by the role's own MCP spec, not by a per-consumer gate
|
||||
openclaw:
|
||||
bond: 0.5
|
||||
enabled: "{{ 'web-app-openclaw' in group_names }}"
|
||||
shared: "{{ 'web-app-openclaw' in group_names }}"
|
||||
# nocheck: playwright-service-flag MCP pairing is proven by the role's own MCP spec, not by a per-consumer gate
|
||||
flowise:
|
||||
bond: 0.5
|
||||
enabled: "{{ 'web-app-flowise' in group_names }}"
|
||||
shared: "{{ 'web-app-flowise' in group_names }}"
|
||||
mcp_consumer: false
|
||||
@@ -31,6 +31,18 @@
|
||||
tor:
|
||||
enabled: true
|
||||
|
||||
openwebui:
|
||||
enabled: false
|
||||
shared: false
|
||||
hermes:
|
||||
enabled: false
|
||||
shared: false
|
||||
openclaw:
|
||||
enabled: false
|
||||
shared: false
|
||||
flowise:
|
||||
enabled: false
|
||||
shared: false
|
||||
mcp:
|
||||
enabled: true
|
||||
shared: true
|
||||
@@ -66,6 +78,18 @@
|
||||
shared: false
|
||||
tor:
|
||||
enabled: true
|
||||
openwebui:
|
||||
enabled: true
|
||||
shared: true
|
||||
hermes:
|
||||
enabled: true
|
||||
shared: true
|
||||
openclaw:
|
||||
enabled: true
|
||||
shared: true
|
||||
flowise:
|
||||
enabled: true
|
||||
shared: true
|
||||
mcp:
|
||||
enabled: false
|
||||
shared: false
|
||||
@@ -24,6 +24,7 @@ flowchart LR
|
||||
dep_web_app_bigbluebutton["web-app-bigbluebutton 🐳🐝"]
|
||||
dep_web_app_dashboard["web-app-dashboard 🐳🐝"]
|
||||
dep_web_app_discourse["web-app-discourse 🐳🐝"]
|
||||
dep_web_app_flowise["web-app-flowise 🐳🐝"]
|
||||
dep_web_app_gitlab["web-app-gitlab 🐳🐝"]
|
||||
dep_web_app_hermes["web-app-hermes 🐳🐝"]
|
||||
dep_web_app_keycloak["web-app-keycloak 🐳🐝"]
|
||||
@@ -86,6 +87,9 @@ flowchart LR
|
||||
svc_moodle["moodle ❌"]
|
||||
svc_suitecrm["suitecrm ❌"]
|
||||
svc_container_backup["container_backup"]
|
||||
svc_hermes["hermes"]
|
||||
svc_openclaw["openclaw"]
|
||||
svc_flowise["flowise"]
|
||||
end
|
||||
dep_svc_ai_litellm -. "0..1" .-> svc_litellm
|
||||
dep_svc_bkp_volume_2_local -. "0..1" .-> svc_container_backup
|
||||
@@ -96,8 +100,10 @@ flowchart LR
|
||||
dep_web_app_bigbluebutton -. "0..1" .-> svc_bigbluebutton
|
||||
dep_web_app_dashboard -. "0..1" .-> svc_dashboard
|
||||
dep_web_app_discourse -. "0..1" .-> svc_discourse
|
||||
dep_web_app_flowise -. "0..1" .-> svc_flowise
|
||||
dep_web_app_gitlab -. "0..1" .-> svc_gitlab
|
||||
dep_web_app_hermes -. "0..1" .-> svc_context_agent
|
||||
dep_web_app_hermes -. "0..1" .-> svc_hermes
|
||||
dep_web_app_keycloak -. "0..1" .-> svc_sso
|
||||
dep_web_app_mailu -. "0..1" .-> svc_email
|
||||
dep_web_app_mastodon -. "0..1" .-> svc_mastodon
|
||||
@@ -105,6 +111,7 @@ flowchart LR
|
||||
dep_web_app_matrix -. "0..1" .-> svc_matrix
|
||||
dep_web_app_mattermost -. "0..1" .-> svc_mattermost
|
||||
dep_web_app_openclaw -. "0..1" .-> svc_context_agent
|
||||
dep_web_app_openclaw -. "0..1" .-> svc_openclaw
|
||||
dep_web_app_openproject -. "0..1" .-> svc_openproject
|
||||
dep_web_app_openwebui -. "0..1" .-> svc_openwebui
|
||||
dep_web_app_peertube -. "0..1" .-> svc_peertube
|
||||
|
||||
@@ -14,10 +14,6 @@ credential:
|
||||
owner: mcp-web-app-nextcloud
|
||||
source: token_store
|
||||
key: web-app-nextcloud
|
||||
allowed_consumers:
|
||||
- web-app-openwebui
|
||||
- web-app-hermes
|
||||
- web-app-openclaw
|
||||
endpoint:
|
||||
service_key: proxy
|
||||
path: /index.php/apps/app_api/proxy/context_agent/mcp/
|
||||
|
||||
@@ -341,3 +341,19 @@ container_backup: # nocheck: bond-baseline backup host joins outside the variant
|
||||
bond: 1
|
||||
enabled: "{{ 'svc-bkp-volume-2-local' in group_names }}"
|
||||
shared: true
|
||||
# nocheck: playwright-service-flag: MCP pairing is proven by the role's own MCP spec, not by a per-consumer gate
|
||||
hermes:
|
||||
bond: 0.5
|
||||
enabled: "{{ 'web-app-hermes' in group_names }}"
|
||||
shared: "{{ 'web-app-hermes' in group_names }}"
|
||||
# nocheck: playwright-service-flag: MCP pairing is proven by the role's own MCP spec, not by a per-consumer gate
|
||||
openclaw:
|
||||
bond: 0.5
|
||||
enabled: "{{ 'web-app-openclaw' in group_names }}"
|
||||
shared: "{{ 'web-app-openclaw' in group_names }}"
|
||||
# nocheck: playwright-service-flag: MCP pairing is proven by the role's own MCP spec, not by a per-consumer gate
|
||||
flowise:
|
||||
bond: 0.5
|
||||
enabled: "{{ 'web-app-flowise' in group_names }}"
|
||||
shared: "{{ 'web-app-flowise' in group_names }}"
|
||||
mcp_consumer: false
|
||||
@@ -105,6 +105,15 @@
|
||||
shared: false # nocheck: variants-static-override backup shared stays literally true
|
||||
tor:
|
||||
enabled: true
|
||||
hermes:
|
||||
enabled: false
|
||||
shared: false
|
||||
openclaw:
|
||||
enabled: false
|
||||
shared: false
|
||||
flowise:
|
||||
enabled: false
|
||||
shared: false
|
||||
mcp:
|
||||
enabled: true
|
||||
shared: true
|
||||
@@ -199,6 +208,15 @@
|
||||
shared: false # nocheck: variants-static-override backup shared stays literally true
|
||||
tor:
|
||||
enabled: true
|
||||
hermes:
|
||||
enabled: true
|
||||
shared: true
|
||||
openclaw:
|
||||
enabled: true
|
||||
shared: true
|
||||
flowise:
|
||||
enabled: true
|
||||
shared: true
|
||||
addons: &addons_static_off
|
||||
appointments:
|
||||
enabled: false
|
||||
@@ -338,6 +356,15 @@
|
||||
shared: false # nocheck: variants-static-override backup shared stays literally true
|
||||
tor:
|
||||
enabled: true
|
||||
hermes:
|
||||
enabled: false
|
||||
shared: false
|
||||
openclaw:
|
||||
enabled: false
|
||||
shared: false
|
||||
flowise:
|
||||
enabled: false
|
||||
shared: false
|
||||
addons: *addons_static_off
|
||||
mcp:
|
||||
enabled: false
|
||||
@@ -433,6 +460,15 @@
|
||||
shared: false # nocheck: variants-static-override backup shared stays literally true
|
||||
tor:
|
||||
enabled: true
|
||||
hermes:
|
||||
enabled: false
|
||||
shared: false
|
||||
openclaw:
|
||||
enabled: false
|
||||
shared: false
|
||||
flowise:
|
||||
enabled: false
|
||||
shared: false
|
||||
addons: *addons_static_off
|
||||
mcp:
|
||||
enabled: false
|
||||
@@ -528,6 +564,15 @@
|
||||
shared: false # nocheck: variants-static-override backup shared stays literally true
|
||||
tor:
|
||||
enabled: true
|
||||
hermes:
|
||||
enabled: false
|
||||
shared: false
|
||||
openclaw:
|
||||
enabled: false
|
||||
shared: false
|
||||
flowise:
|
||||
enabled: false
|
||||
shared: false
|
||||
addons: *addons_static_off
|
||||
mcp:
|
||||
enabled: false
|
||||
@@ -623,6 +668,15 @@
|
||||
shared: false # nocheck: variants-static-override backup shared stays literally true
|
||||
tor:
|
||||
enabled: true
|
||||
hermes:
|
||||
enabled: false
|
||||
shared: false
|
||||
openclaw:
|
||||
enabled: false
|
||||
shared: false
|
||||
flowise:
|
||||
enabled: false
|
||||
shared: false
|
||||
addons: *addons_static_off
|
||||
mcp:
|
||||
enabled: false
|
||||
@@ -718,6 +772,15 @@
|
||||
shared: false # nocheck: variants-static-override backup shared stays literally true
|
||||
tor:
|
||||
enabled: true
|
||||
hermes:
|
||||
enabled: false
|
||||
shared: false
|
||||
openclaw:
|
||||
enabled: false
|
||||
shared: false
|
||||
flowise:
|
||||
enabled: false
|
||||
shared: false
|
||||
addons: *addons_static_off
|
||||
mcp:
|
||||
enabled: false
|
||||
@@ -813,6 +876,15 @@
|
||||
shared: false # nocheck: variants-static-override backup shared stays literally true
|
||||
tor:
|
||||
enabled: true
|
||||
hermes:
|
||||
enabled: false
|
||||
shared: false
|
||||
openclaw:
|
||||
enabled: false
|
||||
shared: false
|
||||
flowise:
|
||||
enabled: false
|
||||
shared: false
|
||||
addons: *addons_static_off
|
||||
mcp:
|
||||
enabled: false
|
||||
@@ -908,6 +980,15 @@
|
||||
shared: true
|
||||
tor:
|
||||
enabled: false
|
||||
hermes:
|
||||
enabled: false
|
||||
shared: false
|
||||
openclaw:
|
||||
enabled: false
|
||||
shared: false
|
||||
flowise:
|
||||
enabled: false
|
||||
shared: false
|
||||
addons: *addons_static_off
|
||||
mcp:
|
||||
enabled: false
|
||||
@@ -1003,6 +1084,15 @@
|
||||
shared: false # nocheck: variants-static-override backup shared stays literally true
|
||||
tor:
|
||||
enabled: true
|
||||
hermes:
|
||||
enabled: false
|
||||
shared: false
|
||||
openclaw:
|
||||
enabled: false
|
||||
shared: false
|
||||
flowise:
|
||||
enabled: false
|
||||
shared: false
|
||||
addons: *addons_static_off
|
||||
mcp:
|
||||
enabled: false
|
||||
@@ -1098,6 +1188,15 @@
|
||||
shared: false # nocheck: variants-static-override backup shared stays literally true
|
||||
tor:
|
||||
enabled: true
|
||||
hermes:
|
||||
enabled: false
|
||||
shared: false
|
||||
openclaw:
|
||||
enabled: false
|
||||
shared: false
|
||||
flowise:
|
||||
enabled: false
|
||||
shared: false
|
||||
addons: *addons_static_off
|
||||
mcp:
|
||||
enabled: false
|
||||
@@ -1193,6 +1292,15 @@
|
||||
shared: false # nocheck: variants-static-override backup shared stays literally true
|
||||
tor:
|
||||
enabled: true
|
||||
hermes:
|
||||
enabled: false
|
||||
shared: false
|
||||
openclaw:
|
||||
enabled: false
|
||||
shared: false
|
||||
flowise:
|
||||
enabled: false
|
||||
shared: false
|
||||
addons: *addons_static_off
|
||||
mcp:
|
||||
enabled: false
|
||||
@@ -1288,6 +1396,15 @@
|
||||
shared: false # nocheck: variants-static-override backup shared stays literally true
|
||||
tor:
|
||||
enabled: true
|
||||
hermes:
|
||||
enabled: false
|
||||
shared: false
|
||||
openclaw:
|
||||
enabled: false
|
||||
shared: false
|
||||
flowise:
|
||||
enabled: false
|
||||
shared: false
|
||||
addons: *addons_static_off
|
||||
mcp:
|
||||
enabled: false
|
||||
@@ -1383,6 +1500,15 @@
|
||||
shared: false # nocheck: variants-static-override backup shared stays literally true
|
||||
tor:
|
||||
enabled: true
|
||||
hermes:
|
||||
enabled: false
|
||||
shared: false
|
||||
openclaw:
|
||||
enabled: false
|
||||
shared: false
|
||||
flowise:
|
||||
enabled: false
|
||||
shared: false
|
||||
addons: *addons_static_off
|
||||
mcp:
|
||||
enabled: false
|
||||
|
||||
@@ -43,7 +43,18 @@ flowchart LR
|
||||
end
|
||||
subgraph dependents [Dependents]
|
||||
dpt_svc_ai_robot["svc-ai-robot 💻"]
|
||||
dpt_web_app_nextcloud["web-app-nextcloud 🐳🐝"]
|
||||
dpt_svc_db_qdrant["svc-db-qdrant 🐳🐝"]
|
||||
dpt_web_app_baserow["web-app-baserow 🐳🐝"]
|
||||
dpt_web_app_checkmk["web-app-checkmk 🐳🐝"]
|
||||
dpt_web_app_fider["web-app-fider 🐳🐝"]
|
||||
dpt_web_app_gitea["web-app-gitea 🐳🐝"]
|
||||
dpt_web_app_gitlab["web-app-gitlab 🐳🐝"]
|
||||
dpt_web_app_homeassistant["web-app-homeassistant 🐳🐝"]
|
||||
dpt_web_app_jellyfin["web-app-jellyfin 🐳🐝"]
|
||||
dpt_web_app_jenkins["web-app-jenkins 🐳🐝"]
|
||||
dpt_web_app_listmonk["web-app-listmonk 🐳🐝"]
|
||||
dpt_web_app_mattermost["web-app-mattermost 🐳🐝"]
|
||||
dpt_more["..."]
|
||||
end
|
||||
dep_svc_ai_litellm -. "0..1" .-> svc_litellm
|
||||
dep_svc_bkp_volume_2_local -. "0..1" .-> svc_container_backup
|
||||
@@ -56,8 +67,19 @@ flowchart LR
|
||||
dep_web_app_prometheus -. "0..1" .-> svc_prometheus
|
||||
dep_web_svc_css -. "0..1" .-> svc_css
|
||||
dep_web_svc_logout -. "0..1" .-> svc_logout
|
||||
svc_openclaw -- "1:1" --> dpt_more
|
||||
svc_openclaw -. "0..1" .-> dpt_svc_ai_robot
|
||||
svc_openclaw -. "0..1" .-> dpt_web_app_nextcloud
|
||||
svc_openclaw -. "0..1" .-> dpt_svc_db_qdrant
|
||||
svc_openclaw -. "0..1" .-> dpt_web_app_baserow
|
||||
svc_openclaw -. "0..1" .-> dpt_web_app_checkmk
|
||||
svc_openclaw -. "0..1" .-> dpt_web_app_fider
|
||||
svc_openclaw -. "0..1" .-> dpt_web_app_gitea
|
||||
svc_openclaw -. "0..1" .-> dpt_web_app_gitlab
|
||||
svc_openclaw -. "0..1" .-> dpt_web_app_homeassistant
|
||||
svc_openclaw -. "0..1" .-> dpt_web_app_jellyfin
|
||||
svc_openclaw -. "0..1" .-> dpt_web_app_jenkins
|
||||
svc_openclaw -. "0..1" .-> dpt_web_app_listmonk
|
||||
svc_openclaw -. "0..1" .-> dpt_web_app_mattermost
|
||||
```
|
||||
|
||||
Solid `1:1` edges are fixed relationships; dashed `0..1` edges are conditional (enabled only in matching deployments); red `0..0` edges are turned off in this role. Node markers show the role's deploy modes (💻 host, 🐳 compose, 🐝 swarm); ❌ marks a service that is explicitly turned off, and ⚙️ an Ansible role dependency declared in `meta/main.yml`.
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
---
|
||||
# nocheck: playwright-service-flag
|
||||
openclaw:
|
||||
mcp_consumer: true
|
||||
modes:
|
||||
compose:
|
||||
enabled: true
|
||||
|
||||
@@ -51,7 +51,19 @@ flowchart LR
|
||||
svc_baserow["baserow"]
|
||||
end
|
||||
subgraph dependents [Dependents]
|
||||
dpt_web_app_nextcloud["web-app-nextcloud 🐳🐝"]
|
||||
dpt_svc_db_qdrant["svc-db-qdrant 🐳🐝"]
|
||||
dpt_web_app_baserow["web-app-baserow 🐳🐝"]
|
||||
dpt_web_app_checkmk["web-app-checkmk 🐳🐝"]
|
||||
dpt_web_app_fider["web-app-fider 🐳🐝"]
|
||||
dpt_web_app_gitea["web-app-gitea 🐳🐝"]
|
||||
dpt_web_app_gitlab["web-app-gitlab 🐳🐝"]
|
||||
dpt_web_app_homeassistant["web-app-homeassistant 🐳🐝"]
|
||||
dpt_web_app_jellyfin["web-app-jellyfin 🐳🐝"]
|
||||
dpt_web_app_jenkins["web-app-jenkins 🐳🐝"]
|
||||
dpt_web_app_listmonk["web-app-listmonk 🐳🐝"]
|
||||
dpt_web_app_mattermost["web-app-mattermost 🐳🐝"]
|
||||
dpt_web_app_moodle["web-app-moodle 🐳🐝"]
|
||||
dpt_more["..."]
|
||||
end
|
||||
dep_svc_ai_litellm -. "0..1" .-> svc_litellm
|
||||
dep_svc_bkp_volume_2_local -. "0..1" .-> svc_container_backup
|
||||
@@ -67,7 +79,19 @@ flowchart LR
|
||||
dep_web_app_seaweedfs -. "0..1" .-> svc_seaweedfs
|
||||
dep_web_svc_css -. "0..1" .-> svc_css
|
||||
dep_web_svc_logout -. "0..1" .-> svc_logout
|
||||
svc_sso -. "0..1" .-> dpt_web_app_nextcloud
|
||||
svc_sso -- "1:1" --> dpt_more
|
||||
svc_sso -. "0..1" .-> dpt_svc_db_qdrant
|
||||
svc_sso -. "0..1" .-> dpt_web_app_baserow
|
||||
svc_sso -. "0..1" .-> dpt_web_app_checkmk
|
||||
svc_sso -. "0..1" .-> dpt_web_app_fider
|
||||
svc_sso -. "0..1" .-> dpt_web_app_gitea
|
||||
svc_sso -. "0..1" .-> dpt_web_app_gitlab
|
||||
svc_sso -. "0..1" .-> dpt_web_app_homeassistant
|
||||
svc_sso -. "0..1" .-> dpt_web_app_jellyfin
|
||||
svc_sso -. "0..1" .-> dpt_web_app_jenkins
|
||||
svc_sso -. "0..1" .-> dpt_web_app_listmonk
|
||||
svc_sso -. "0..1" .-> dpt_web_app_mattermost
|
||||
svc_sso -. "0..1" .-> dpt_web_app_moodle
|
||||
```
|
||||
|
||||
Solid `1:1` edges are fixed relationships; dashed `0..1` edges are conditional (enabled only in matching deployments); red `0..0` edges are turned off in this role. Node markers show the role's deploy modes (💻 host, 🐳 compose, 🐝 swarm); ❌ marks a service that is explicitly turned off, and ⚙️ an Ansible role dependency declared in `meta/main.yml`.
|
||||
|
||||
@@ -22,6 +22,7 @@ matomo:
|
||||
shared: "{{ 'web-app-matomo' in group_names }}"
|
||||
# nocheck: playwright-service-flag: shared provider entity; the app itself is covered by this role's own Playwright spec
|
||||
openwebui:
|
||||
mcp_consumer: true
|
||||
modes:
|
||||
compose:
|
||||
enabled: true
|
||||
|
||||
@@ -20,9 +20,13 @@ flowchart LR
|
||||
dep_svc_db_redis["svc-db-redis 🐳🐝"]
|
||||
dep_svc_net_tor["svc-net-tor 🐳🐝"]
|
||||
dep_web_app_dashboard["web-app-dashboard 🐳🐝"]
|
||||
dep_web_app_flowise["web-app-flowise 🐳🐝"]
|
||||
dep_web_app_hermes["web-app-hermes 🐳🐝"]
|
||||
dep_web_app_keycloak["web-app-keycloak 🐳🐝"]
|
||||
dep_web_app_mailu["web-app-mailu 🐳🐝"]
|
||||
dep_web_app_matomo["web-app-matomo 🐳🐝"]
|
||||
dep_web_app_openclaw["web-app-openclaw 🐳🐝"]
|
||||
dep_web_app_openwebui["web-app-openwebui 🐳🐝"]
|
||||
dep_web_app_prometheus["web-app-prometheus 🐳🐝"]
|
||||
dep_web_svc_css["web-svc-css 💻"]
|
||||
dep_web_svc_logout["web-svc-logout 🐳🐝"]
|
||||
@@ -41,15 +45,23 @@ flowchart LR
|
||||
svc_tor["tor"]
|
||||
svc_container_backup["container_backup"]
|
||||
svc_pretixmcp["pretixmcp"]
|
||||
svc_openwebui["openwebui"]
|
||||
svc_hermes["hermes"]
|
||||
svc_openclaw["openclaw"]
|
||||
svc_flowise["flowise"]
|
||||
end
|
||||
dep_svc_bkp_volume_2_local -. "0..1" .-> svc_container_backup
|
||||
dep_svc_db_postgres -. "0..1" .-> svc_postgres
|
||||
dep_svc_db_redis -. "0..1" .-> svc_redis
|
||||
dep_svc_net_tor -. "0..1" .-> svc_tor
|
||||
dep_web_app_dashboard -. "0..1" .-> svc_dashboard
|
||||
dep_web_app_flowise -. "0..1" .-> svc_flowise
|
||||
dep_web_app_hermes -. "0..1" .-> svc_hermes
|
||||
dep_web_app_keycloak -. "0..1" .-> svc_sso
|
||||
dep_web_app_mailu -. "0..1" .-> svc_email
|
||||
dep_web_app_matomo -. "0..1" .-> svc_matomo
|
||||
dep_web_app_openclaw -. "0..1" .-> svc_openclaw
|
||||
dep_web_app_openwebui -. "0..1" .-> svc_openwebui
|
||||
dep_web_app_prometheus -. "0..1" .-> svc_prometheus
|
||||
dep_web_svc_css -. "0..1" .-> svc_css
|
||||
dep_web_svc_logout -. "0..1" .-> svc_logout
|
||||
|
||||
@@ -14,10 +14,6 @@ credential:
|
||||
owner: mcp-web-app-pretix
|
||||
source: credentials
|
||||
key: mcp_bearer
|
||||
allowed_consumers:
|
||||
- web-app-openwebui
|
||||
- web-app-hermes
|
||||
- web-app-openclaw
|
||||
endpoint:
|
||||
service_key: pretixmcp
|
||||
path: /mcp
|
||||
|
||||
@@ -110,3 +110,24 @@ pretixmcp:
|
||||
ports:
|
||||
internal:
|
||||
http: 8080
|
||||
# nocheck: playwright-service-flag MCP pairing is proven by the role's own MCP spec, not by a per-consumer gate
|
||||
openwebui:
|
||||
bond: 0.5
|
||||
enabled: "{{ 'web-app-openwebui' in group_names }}"
|
||||
shared: "{{ 'web-app-openwebui' in group_names }}"
|
||||
# nocheck: playwright-service-flag MCP pairing is proven by the role's own MCP spec, not by a per-consumer gate
|
||||
hermes:
|
||||
bond: 0.5
|
||||
enabled: "{{ 'web-app-hermes' in group_names }}"
|
||||
shared: "{{ 'web-app-hermes' in group_names }}"
|
||||
# nocheck: playwright-service-flag MCP pairing is proven by the role's own MCP spec, not by a per-consumer gate
|
||||
openclaw:
|
||||
bond: 0.5
|
||||
enabled: "{{ 'web-app-openclaw' in group_names }}"
|
||||
shared: "{{ 'web-app-openclaw' in group_names }}"
|
||||
# nocheck: playwright-service-flag MCP pairing is proven by the role's own MCP spec, not by a per-consumer gate
|
||||
flowise:
|
||||
bond: 0.5
|
||||
enabled: "{{ 'web-app-flowise' in group_names }}"
|
||||
shared: "{{ 'web-app-flowise' in group_names }}"
|
||||
mcp_consumer: false
|
||||
@@ -34,6 +34,18 @@
|
||||
shared: true
|
||||
tor:
|
||||
enabled: true
|
||||
openwebui:
|
||||
enabled: false
|
||||
shared: false
|
||||
hermes:
|
||||
enabled: false
|
||||
shared: false
|
||||
openclaw:
|
||||
enabled: false
|
||||
shared: false
|
||||
flowise:
|
||||
enabled: false
|
||||
shared: false
|
||||
mcp:
|
||||
enabled: true
|
||||
shared: true
|
||||
@@ -68,6 +80,18 @@
|
||||
shared: false # nocheck: variants-static-override backup shared stays literally true
|
||||
tor:
|
||||
enabled: true
|
||||
openwebui:
|
||||
enabled: true
|
||||
shared: true
|
||||
hermes:
|
||||
enabled: true
|
||||
shared: true
|
||||
openclaw:
|
||||
enabled: true
|
||||
shared: true
|
||||
flowise:
|
||||
enabled: true
|
||||
shared: true
|
||||
mcp:
|
||||
enabled: false
|
||||
shared: false
|
||||
@@ -18,9 +18,13 @@ flowchart LR
|
||||
dep_svc_bkp_volume_2_local["svc-bkp-volume-2-local 💻"]
|
||||
dep_svc_net_tor["svc-net-tor 🐳🐝"]
|
||||
dep_web_app_dashboard["web-app-dashboard 🐳🐝"]
|
||||
dep_web_app_flowise["web-app-flowise 🐳🐝"]
|
||||
dep_web_app_hermes["web-app-hermes 🐳🐝"]
|
||||
dep_web_app_keycloak["web-app-keycloak 🐳🐝"]
|
||||
dep_web_app_mailu["web-app-mailu 🐳🐝"]
|
||||
dep_web_app_matomo["web-app-matomo 🐳🐝"]
|
||||
dep_web_app_openclaw["web-app-openclaw 🐳🐝"]
|
||||
dep_web_app_openwebui["web-app-openwebui 🐳🐝"]
|
||||
dep_web_svc_css["web-svc-css 💻"]
|
||||
dep_web_svc_logout["web-svc-logout 🐳🐝"]
|
||||
end
|
||||
@@ -40,6 +44,10 @@ flowchart LR
|
||||
svc_tor["tor"]
|
||||
svc_container_backup["container_backup"]
|
||||
svc_prometheusmcp["prometheusmcp"]
|
||||
svc_openwebui["openwebui"]
|
||||
svc_hermes["hermes"]
|
||||
svc_openclaw["openclaw"]
|
||||
svc_flowise["flowise"]
|
||||
end
|
||||
subgraph dependents [Dependents]
|
||||
dpt_web_app_akaunting["web-app-akaunting 🐳🐝"]
|
||||
@@ -59,9 +67,13 @@ flowchart LR
|
||||
dep_svc_bkp_volume_2_local -. "0..1" .-> svc_container_backup
|
||||
dep_svc_net_tor -. "0..1" .-> svc_tor
|
||||
dep_web_app_dashboard -. "0..1" .-> svc_dashboard
|
||||
dep_web_app_flowise -. "0..1" .-> svc_flowise
|
||||
dep_web_app_hermes -. "0..1" .-> svc_hermes
|
||||
dep_web_app_keycloak -. "0..1" .-> svc_sso
|
||||
dep_web_app_mailu -. "0..1" .-> svc_email
|
||||
dep_web_app_matomo -. "0..1" .-> svc_matomo
|
||||
dep_web_app_openclaw -. "0..1" .-> svc_openclaw
|
||||
dep_web_app_openwebui -. "0..1" .-> svc_openwebui
|
||||
dep_web_svc_css -. "0..1" .-> svc_css
|
||||
dep_web_svc_logout -. "0..1" .-> svc_logout
|
||||
svc_sso -- "1:1" --> dpt_more
|
||||
|
||||
@@ -14,11 +14,6 @@ credential:
|
||||
owner: mcp-web-app-prometheus
|
||||
source: credentials
|
||||
key: mcp_bearer
|
||||
allowed_consumers:
|
||||
- web-app-openwebui
|
||||
- web-app-hermes
|
||||
- web-app-openclaw
|
||||
- web-app-flowise
|
||||
endpoint:
|
||||
service_key: prometheusmcp
|
||||
path: /mcp
|
||||
|
||||
@@ -162,3 +162,23 @@ prometheusmcp:
|
||||
ports:
|
||||
internal:
|
||||
http: 8080
|
||||
# nocheck: playwright-service-flag MCP pairing is proven by the role's own MCP spec, not by a per-consumer gate
|
||||
openwebui:
|
||||
bond: 0.5
|
||||
enabled: "{{ 'web-app-openwebui' in group_names }}"
|
||||
shared: "{{ 'web-app-openwebui' in group_names }}"
|
||||
# nocheck: playwright-service-flag MCP pairing is proven by the role's own MCP spec, not by a per-consumer gate
|
||||
hermes:
|
||||
bond: 0.5
|
||||
enabled: "{{ 'web-app-hermes' in group_names }}"
|
||||
shared: "{{ 'web-app-hermes' in group_names }}"
|
||||
# nocheck: playwright-service-flag MCP pairing is proven by the role's own MCP spec, not by a per-consumer gate
|
||||
openclaw:
|
||||
bond: 0.5
|
||||
enabled: "{{ 'web-app-openclaw' in group_names }}"
|
||||
shared: "{{ 'web-app-openclaw' in group_names }}"
|
||||
# nocheck: playwright-service-flag MCP pairing is proven by the role's own MCP spec, not by a per-consumer gate
|
||||
flowise:
|
||||
bond: 0.5
|
||||
enabled: "{{ 'web-app-flowise' in group_names }}"
|
||||
shared: "{{ 'web-app-flowise' in group_names }}"
|
||||
@@ -28,6 +28,18 @@
|
||||
shared: true
|
||||
tor:
|
||||
enabled: true
|
||||
openwebui:
|
||||
enabled: false
|
||||
shared: false
|
||||
hermes:
|
||||
enabled: false
|
||||
shared: false
|
||||
openclaw:
|
||||
enabled: false
|
||||
shared: false
|
||||
flowise:
|
||||
enabled: false
|
||||
shared: false
|
||||
mcp:
|
||||
enabled: true
|
||||
shared: true
|
||||
@@ -55,6 +67,18 @@
|
||||
shared: false # nocheck: variants-static-override backup shared stays literally true
|
||||
tor:
|
||||
enabled: true
|
||||
openwebui:
|
||||
enabled: true
|
||||
shared: true
|
||||
hermes:
|
||||
enabled: true
|
||||
shared: true
|
||||
openclaw:
|
||||
enabled: true
|
||||
shared: true
|
||||
flowise:
|
||||
enabled: true
|
||||
shared: true
|
||||
mcp:
|
||||
enabled: false
|
||||
shared: false
|
||||
@@ -21,9 +21,13 @@ flowchart LR
|
||||
dep_svc_db_redis["svc-db-redis 🐳🐝"]
|
||||
dep_svc_net_tor["svc-net-tor 🐳🐝"]
|
||||
dep_web_app_dashboard["web-app-dashboard 🐳🐝"]
|
||||
dep_web_app_flowise["web-app-flowise 🐳🐝"]
|
||||
dep_web_app_hermes["web-app-hermes 🐳🐝"]
|
||||
dep_web_app_keycloak["web-app-keycloak 🐳🐝"]
|
||||
dep_web_app_mailu["web-app-mailu 🐳🐝"]
|
||||
dep_web_app_matomo["web-app-matomo 🐳🐝"]
|
||||
dep_web_app_openclaw["web-app-openclaw 🐳🐝"]
|
||||
dep_web_app_openwebui["web-app-openwebui 🐳🐝"]
|
||||
dep_web_app_prometheus["web-app-prometheus 🐳🐝"]
|
||||
dep_web_app_seaweedfs["web-app-seaweedfs 🐳🐝"]
|
||||
dep_web_svc_css["web-svc-css 💻"]
|
||||
@@ -45,6 +49,10 @@ flowchart LR
|
||||
svc_tor["tor"]
|
||||
svc_container_backup["container_backup"]
|
||||
svc_snipeitmcp["snipeitmcp"]
|
||||
svc_openwebui["openwebui"]
|
||||
svc_hermes["hermes"]
|
||||
svc_openclaw["openclaw"]
|
||||
svc_flowise["flowise"]
|
||||
end
|
||||
dep_svc_bkp_volume_2_local -. "0..1" .-> svc_container_backup
|
||||
dep_svc_db_mariadb -. "0..1" .-> svc_mariadb
|
||||
@@ -52,9 +60,13 @@ flowchart LR
|
||||
dep_svc_db_redis -. "0..1" .-> svc_redis
|
||||
dep_svc_net_tor -. "0..1" .-> svc_tor
|
||||
dep_web_app_dashboard -. "0..1" .-> svc_dashboard
|
||||
dep_web_app_flowise -. "0..1" .-> svc_flowise
|
||||
dep_web_app_hermes -. "0..1" .-> svc_hermes
|
||||
dep_web_app_keycloak -. "0..1" .-> svc_sso
|
||||
dep_web_app_mailu -. "0..1" .-> svc_email
|
||||
dep_web_app_matomo -. "0..1" .-> svc_matomo
|
||||
dep_web_app_openclaw -. "0..1" .-> svc_openclaw
|
||||
dep_web_app_openwebui -. "0..1" .-> svc_openwebui
|
||||
dep_web_app_prometheus -. "0..1" .-> svc_prometheus
|
||||
dep_web_app_seaweedfs -. "0..1" .-> svc_seaweedfs
|
||||
dep_web_svc_css -. "0..1" .-> svc_css
|
||||
|
||||
@@ -14,10 +14,6 @@ credential:
|
||||
owner: mcp-web-app-snipe-it
|
||||
source: credentials
|
||||
key: mcp_bearer
|
||||
allowed_consumers:
|
||||
- web-app-openwebui
|
||||
- web-app-hermes
|
||||
- web-app-openclaw
|
||||
endpoint:
|
||||
service_key: snipeitmcp
|
||||
path: /mcp
|
||||
|
||||
@@ -126,3 +126,24 @@ snipeitmcp:
|
||||
ports:
|
||||
internal:
|
||||
http: 8080
|
||||
# nocheck: playwright-service-flag MCP pairing is proven by the role's own MCP spec, not by a per-consumer gate
|
||||
openwebui:
|
||||
bond: 0.5
|
||||
enabled: "{{ 'web-app-openwebui' in group_names }}"
|
||||
shared: "{{ 'web-app-openwebui' in group_names }}"
|
||||
# nocheck: playwright-service-flag MCP pairing is proven by the role's own MCP spec, not by a per-consumer gate
|
||||
hermes:
|
||||
bond: 0.5
|
||||
enabled: "{{ 'web-app-hermes' in group_names }}"
|
||||
shared: "{{ 'web-app-hermes' in group_names }}"
|
||||
# nocheck: playwright-service-flag MCP pairing is proven by the role's own MCP spec, not by a per-consumer gate
|
||||
openclaw:
|
||||
bond: 0.5
|
||||
enabled: "{{ 'web-app-openclaw' in group_names }}"
|
||||
shared: "{{ 'web-app-openclaw' in group_names }}"
|
||||
# nocheck: playwright-service-flag MCP pairing is proven by the role's own MCP spec, not by a per-consumer gate
|
||||
flowise:
|
||||
bond: 0.5
|
||||
enabled: "{{ 'web-app-flowise' in group_names }}"
|
||||
shared: "{{ 'web-app-flowise' in group_names }}"
|
||||
mcp_consumer: false
|
||||
@@ -40,6 +40,18 @@
|
||||
shared: true
|
||||
tor:
|
||||
enabled: true
|
||||
openwebui:
|
||||
enabled: false
|
||||
shared: false
|
||||
hermes:
|
||||
enabled: false
|
||||
shared: false
|
||||
openclaw:
|
||||
enabled: false
|
||||
shared: false
|
||||
flowise:
|
||||
enabled: false
|
||||
shared: false
|
||||
mcp:
|
||||
enabled: true
|
||||
shared: true
|
||||
@@ -80,6 +92,18 @@
|
||||
shared: false # nocheck: variants-static-override backup shared stays literally true
|
||||
tor:
|
||||
enabled: true
|
||||
openwebui:
|
||||
enabled: true
|
||||
shared: true
|
||||
hermes:
|
||||
enabled: true
|
||||
shared: true
|
||||
openclaw:
|
||||
enabled: true
|
||||
shared: true
|
||||
flowise:
|
||||
enabled: true
|
||||
shared: true
|
||||
mcp:
|
||||
enabled: false
|
||||
shared: false
|
||||
@@ -118,6 +142,18 @@
|
||||
shared: false # nocheck: variants-static-override backup shared stays literally true
|
||||
tor:
|
||||
enabled: true
|
||||
openwebui:
|
||||
enabled: false
|
||||
shared: false
|
||||
hermes:
|
||||
enabled: false
|
||||
shared: false
|
||||
openclaw:
|
||||
enabled: false
|
||||
shared: false
|
||||
flowise:
|
||||
enabled: false
|
||||
shared: false
|
||||
mcp:
|
||||
enabled: false
|
||||
shared: false
|
||||
@@ -44,9 +44,13 @@ flowchart LR
|
||||
dep_svc_net_tor["svc-net-tor 🐳🐝"]
|
||||
dep_web_app_dashboard["web-app-dashboard 🐳🐝"]
|
||||
dep_web_app_discourse["web-app-discourse 🐳🐝"]
|
||||
dep_web_app_flowise["web-app-flowise 🐳🐝"]
|
||||
dep_web_app_hermes["web-app-hermes 🐳🐝"]
|
||||
dep_web_app_keycloak["web-app-keycloak 🐳🐝"]
|
||||
dep_web_app_mailu["web-app-mailu 🐳🐝"]
|
||||
dep_web_app_matomo["web-app-matomo 🐳🐝"]
|
||||
dep_web_app_openclaw["web-app-openclaw 🐳🐝"]
|
||||
dep_web_app_openwebui["web-app-openwebui 🐳🐝"]
|
||||
dep_web_app_prometheus["web-app-prometheus 🐳🐝"]
|
||||
dep_web_svc_css["web-svc-css 💻"]
|
||||
dep_web_svc_logout["web-svc-logout 🐳🐝"]
|
||||
@@ -65,6 +69,10 @@ flowchart LR
|
||||
svc_prometheus["prometheus"]
|
||||
svc_tor["tor"]
|
||||
svc_container_backup["container_backup"]
|
||||
svc_openwebui["openwebui"]
|
||||
svc_hermes["hermes"]
|
||||
svc_openclaw["openclaw"]
|
||||
svc_flowise["flowise"]
|
||||
end
|
||||
dep_svc_ai_litellm -. "0..1" .-> svc_litellm
|
||||
dep_svc_bkp_volume_2_local -. "0..1" .-> svc_container_backup
|
||||
@@ -72,9 +80,13 @@ flowchart LR
|
||||
dep_svc_net_tor -. "0..1" .-> svc_tor
|
||||
dep_web_app_dashboard -. "0..1" .-> svc_dashboard
|
||||
dep_web_app_discourse -. "0..1" .-> svc_discourse
|
||||
dep_web_app_flowise -. "0..1" .-> svc_flowise
|
||||
dep_web_app_hermes -. "0..1" .-> svc_hermes
|
||||
dep_web_app_keycloak -. "0..1" .-> svc_sso
|
||||
dep_web_app_mailu -. "0..1" .-> svc_email
|
||||
dep_web_app_matomo -. "0..1" .-> svc_matomo
|
||||
dep_web_app_openclaw -. "0..1" .-> svc_openclaw
|
||||
dep_web_app_openwebui -. "0..1" .-> svc_openwebui
|
||||
dep_web_app_prometheus -. "0..1" .-> svc_prometheus
|
||||
dep_web_svc_css -. "0..1" .-> svc_css
|
||||
dep_web_svc_logout -. "0..1" .-> svc_logout
|
||||
|
||||
@@ -15,9 +15,6 @@ credential:
|
||||
owner: mcp-web-app-wordpress
|
||||
source: token_store
|
||||
key: web-app-wordpress
|
||||
allowed_consumers:
|
||||
- web-app-hermes
|
||||
- web-app-openclaw
|
||||
endpoint:
|
||||
service_key: wordpress
|
||||
path: /wp-json/mcp/mcp-adapter-default-server
|
||||
|
||||
@@ -91,3 +91,25 @@ container_backup: # nocheck: bond-baseline backup host joins outside the variant
|
||||
bond: 1
|
||||
enabled: "{{ 'svc-bkp-volume-2-local' in group_names }}"
|
||||
shared: true
|
||||
# nocheck: playwright-service-flag MCP pairing is proven by the role's own MCP spec, not by a per-consumer gate
|
||||
openwebui:
|
||||
bond: 0.5
|
||||
enabled: "{{ 'web-app-openwebui' in group_names }}"
|
||||
shared: "{{ 'web-app-openwebui' in group_names }}"
|
||||
mcp_consumer: false
|
||||
# nocheck: playwright-service-flag MCP pairing is proven by the role's own MCP spec, not by a per-consumer gate
|
||||
hermes:
|
||||
bond: 0.5
|
||||
enabled: "{{ 'web-app-hermes' in group_names }}"
|
||||
shared: "{{ 'web-app-hermes' in group_names }}"
|
||||
# nocheck: playwright-service-flag MCP pairing is proven by the role's own MCP spec, not by a per-consumer gate
|
||||
openclaw:
|
||||
bond: 0.5
|
||||
enabled: "{{ 'web-app-openclaw' in group_names }}"
|
||||
shared: "{{ 'web-app-openclaw' in group_names }}"
|
||||
# nocheck: playwright-service-flag MCP pairing is proven by the role's own MCP spec, not by a per-consumer gate
|
||||
flowise:
|
||||
bond: 0.5
|
||||
enabled: "{{ 'web-app-flowise' in group_names }}"
|
||||
shared: "{{ 'web-app-flowise' in group_names }}"
|
||||
mcp_consumer: false
|
||||
@@ -44,6 +44,18 @@
|
||||
shared: true
|
||||
tor:
|
||||
enabled: true
|
||||
openwebui:
|
||||
enabled: false
|
||||
shared: false
|
||||
hermes:
|
||||
enabled: false
|
||||
shared: false
|
||||
openclaw:
|
||||
enabled: false
|
||||
shared: false
|
||||
flowise:
|
||||
enabled: false
|
||||
shared: false
|
||||
mcp:
|
||||
enabled: true
|
||||
shared: true
|
||||
@@ -85,6 +97,18 @@
|
||||
shared: false # nocheck: variants-static-override backup shared stays literally true
|
||||
tor:
|
||||
enabled: true
|
||||
openwebui:
|
||||
enabled: true
|
||||
shared: true
|
||||
hermes:
|
||||
enabled: true
|
||||
shared: true
|
||||
openclaw:
|
||||
enabled: true
|
||||
shared: true
|
||||
flowise:
|
||||
enabled: true
|
||||
shared: true
|
||||
addons:
|
||||
activitypub:
|
||||
enabled: false
|
||||
|
||||
@@ -23,9 +23,13 @@ flowchart LR
|
||||
dep_svc_db_redis["svc-db-redis 🐳🐝"]
|
||||
dep_svc_net_tor["svc-net-tor 🐳🐝"]
|
||||
dep_web_app_dashboard["web-app-dashboard 🐳🐝"]
|
||||
dep_web_app_flowise["web-app-flowise 🐳🐝"]
|
||||
dep_web_app_hermes["web-app-hermes 🐳🐝"]
|
||||
dep_web_app_keycloak["web-app-keycloak 🐳🐝"]
|
||||
dep_web_app_mailu["web-app-mailu 🐳🐝"]
|
||||
dep_web_app_matomo["web-app-matomo 🐳🐝"]
|
||||
dep_web_app_openclaw["web-app-openclaw 🐳🐝"]
|
||||
dep_web_app_openwebui["web-app-openwebui 🐳🐝"]
|
||||
dep_web_app_prometheus["web-app-prometheus 🐳🐝"]
|
||||
dep_web_svc_css["web-svc-css 💻"]
|
||||
dep_web_svc_logout["web-svc-logout 🐳🐝"]
|
||||
@@ -54,6 +58,10 @@ flowchart LR
|
||||
svc_tor["tor"]
|
||||
svc_container_backup["container_backup"]
|
||||
svc_zammadmcp["zammadmcp"]
|
||||
svc_openwebui["openwebui"]
|
||||
svc_hermes["hermes"]
|
||||
svc_openclaw["openclaw"]
|
||||
svc_flowise["flowise"]
|
||||
end
|
||||
subgraph dependents [Dependents]
|
||||
dpt_web_app_nextcloud["web-app-nextcloud 🐳🐝"]
|
||||
@@ -66,9 +74,13 @@ flowchart LR
|
||||
dep_svc_db_redis -. "0..1" .-> svc_redis
|
||||
dep_svc_net_tor -. "0..1" .-> svc_tor
|
||||
dep_web_app_dashboard -. "0..1" .-> svc_dashboard
|
||||
dep_web_app_flowise -. "0..1" .-> svc_flowise
|
||||
dep_web_app_hermes -. "0..1" .-> svc_hermes
|
||||
dep_web_app_keycloak -. "0..1" .-> svc_sso
|
||||
dep_web_app_mailu -. "0..1" .-> svc_email
|
||||
dep_web_app_matomo -. "0..1" .-> svc_matomo
|
||||
dep_web_app_openclaw -. "0..1" .-> svc_openclaw
|
||||
dep_web_app_openwebui -. "0..1" .-> svc_openwebui
|
||||
dep_web_app_prometheus -. "0..1" .-> svc_prometheus
|
||||
dep_web_svc_css -. "0..1" .-> svc_css
|
||||
dep_web_svc_logout -. "0..1" .-> svc_logout
|
||||
|
||||
@@ -14,10 +14,6 @@ credential:
|
||||
owner: mcp-web-app-zammad
|
||||
source: credentials
|
||||
key: mcp_bearer
|
||||
allowed_consumers:
|
||||
- web-app-openwebui
|
||||
- web-app-hermes
|
||||
- web-app-openclaw
|
||||
endpoint:
|
||||
service_key: zammadmcp
|
||||
path: /mcp
|
||||
|
||||
@@ -176,3 +176,24 @@ zammadmcp:
|
||||
ports:
|
||||
internal:
|
||||
http: 8080
|
||||
# nocheck: playwright-service-flag MCP pairing is proven by the role's own MCP spec, not by a per-consumer gate
|
||||
openwebui:
|
||||
bond: 0.5
|
||||
enabled: "{{ 'web-app-openwebui' in group_names }}"
|
||||
shared: "{{ 'web-app-openwebui' in group_names }}"
|
||||
# nocheck: playwright-service-flag MCP pairing is proven by the role's own MCP spec, not by a per-consumer gate
|
||||
hermes:
|
||||
bond: 0.5
|
||||
enabled: "{{ 'web-app-hermes' in group_names }}"
|
||||
shared: "{{ 'web-app-hermes' in group_names }}"
|
||||
# nocheck: playwright-service-flag MCP pairing is proven by the role's own MCP spec, not by a per-consumer gate
|
||||
openclaw:
|
||||
bond: 0.5
|
||||
enabled: "{{ 'web-app-openclaw' in group_names }}"
|
||||
shared: "{{ 'web-app-openclaw' in group_names }}"
|
||||
# nocheck: playwright-service-flag MCP pairing is proven by the role's own MCP spec, not by a per-consumer gate
|
||||
flowise:
|
||||
bond: 0.5
|
||||
enabled: "{{ 'web-app-flowise' in group_names }}"
|
||||
shared: "{{ 'web-app-flowise' in group_names }}"
|
||||
mcp_consumer: false
|
||||
@@ -42,6 +42,18 @@
|
||||
tor:
|
||||
enabled: true
|
||||
|
||||
openwebui:
|
||||
enabled: false
|
||||
shared: false
|
||||
hermes:
|
||||
enabled: false
|
||||
shared: false
|
||||
openclaw:
|
||||
enabled: false
|
||||
shared: false
|
||||
flowise:
|
||||
enabled: false
|
||||
shared: false
|
||||
mcp:
|
||||
enabled: true
|
||||
shared: true
|
||||
@@ -85,6 +97,18 @@
|
||||
tor:
|
||||
enabled: true
|
||||
|
||||
openwebui:
|
||||
enabled: true
|
||||
shared: true
|
||||
hermes:
|
||||
enabled: true
|
||||
shared: true
|
||||
openclaw:
|
||||
enabled: true
|
||||
shared: true
|
||||
flowise:
|
||||
enabled: true
|
||||
shared: true
|
||||
mcp:
|
||||
enabled: false
|
||||
shared: false
|
||||
@@ -127,6 +151,18 @@
|
||||
shared: true
|
||||
tor:
|
||||
enabled: true
|
||||
openwebui:
|
||||
enabled: false
|
||||
shared: false
|
||||
hermes:
|
||||
enabled: false
|
||||
shared: false
|
||||
openclaw:
|
||||
enabled: false
|
||||
shared: false
|
||||
flowise:
|
||||
enabled: false
|
||||
shared: false
|
||||
mcp:
|
||||
enabled: false
|
||||
shared: false
|
||||
@@ -32,8 +32,12 @@ flowchart LR
|
||||
subgraph deps [Dependencies]
|
||||
dep_svc_db_redis["svc-db-redis 🐳🐝"]
|
||||
dep_svc_net_tor["svc-net-tor 🐳🐝"]
|
||||
dep_web_app_flowise["web-app-flowise 🐳🐝"]
|
||||
dep_web_app_hermes["web-app-hermes 🐳🐝"]
|
||||
dep_web_app_keycloak["web-app-keycloak 🐳🐝"]
|
||||
dep_web_app_matomo["web-app-matomo 🐳🐝"]
|
||||
dep_web_app_openclaw["web-app-openclaw 🐳🐝"]
|
||||
dep_web_app_openwebui["web-app-openwebui 🐳🐝"]
|
||||
dep_web_app_prometheus["web-app-prometheus 🐳🐝"]
|
||||
dep_web_svc_css["web-svc-css 💻"]
|
||||
end
|
||||
@@ -49,11 +53,19 @@ flowchart LR
|
||||
svc_prometheus["prometheus"]
|
||||
svc_libretranslatemcp["libretranslatemcp"]
|
||||
svc_tor["tor"]
|
||||
svc_openwebui["openwebui"]
|
||||
svc_hermes["hermes"]
|
||||
svc_openclaw["openclaw"]
|
||||
svc_flowise["flowise"]
|
||||
end
|
||||
dep_svc_db_redis -. "0..1" .-> svc_redis
|
||||
dep_svc_net_tor -. "0..1" .-> svc_tor
|
||||
dep_web_app_flowise -. "0..1" .-> svc_flowise
|
||||
dep_web_app_hermes -. "0..1" .-> svc_hermes
|
||||
dep_web_app_keycloak -. "0..1" .-> svc_sso
|
||||
dep_web_app_matomo -. "0..1" .-> svc_matomo
|
||||
dep_web_app_openclaw -. "0..1" .-> svc_openclaw
|
||||
dep_web_app_openwebui -. "0..1" .-> svc_openwebui
|
||||
dep_web_app_prometheus -. "0..1" .-> svc_prometheus
|
||||
dep_web_svc_css -. "0..1" .-> svc_css
|
||||
```
|
||||
|
||||
@@ -14,10 +14,6 @@ credential:
|
||||
owner: mcp-web-svc-libretranslate
|
||||
source: credentials
|
||||
key: mcp_bearer
|
||||
allowed_consumers:
|
||||
- web-app-openwebui
|
||||
- web-app-hermes
|
||||
- web-app-openclaw
|
||||
endpoint:
|
||||
service_key: libretranslatemcp
|
||||
path: /mcp
|
||||
|
||||
@@ -107,3 +107,24 @@ tor:
|
||||
bond: 0.5
|
||||
enabled: "{{ 'svc-net-tor' in group_names }}"
|
||||
shared: true # nocheck: dynamic-flag
|
||||
# nocheck: playwright-service-flag MCP pairing is proven by the role's own MCP spec, not by a per-consumer gate
|
||||
openwebui:
|
||||
bond: 0.5
|
||||
enabled: "{{ 'web-app-openwebui' in group_names }}"
|
||||
shared: "{{ 'web-app-openwebui' in group_names }}"
|
||||
# nocheck: playwright-service-flag MCP pairing is proven by the role's own MCP spec, not by a per-consumer gate
|
||||
hermes:
|
||||
bond: 0.5
|
||||
enabled: "{{ 'web-app-hermes' in group_names }}"
|
||||
shared: "{{ 'web-app-hermes' in group_names }}"
|
||||
# nocheck: playwright-service-flag MCP pairing is proven by the role's own MCP spec, not by a per-consumer gate
|
||||
openclaw:
|
||||
bond: 0.5
|
||||
enabled: "{{ 'web-app-openclaw' in group_names }}"
|
||||
shared: "{{ 'web-app-openclaw' in group_names }}"
|
||||
# nocheck: playwright-service-flag MCP pairing is proven by the role's own MCP spec, not by a per-consumer gate
|
||||
flowise:
|
||||
bond: 0.5
|
||||
enabled: "{{ 'web-app-flowise' in group_names }}"
|
||||
shared: "{{ 'web-app-flowise' in group_names }}"
|
||||
mcp_consumer: false
|
||||
@@ -22,6 +22,18 @@
|
||||
shared: true
|
||||
tor:
|
||||
enabled: true
|
||||
openwebui:
|
||||
enabled: false
|
||||
shared: false
|
||||
hermes:
|
||||
enabled: false
|
||||
shared: false
|
||||
openclaw:
|
||||
enabled: false
|
||||
shared: false
|
||||
flowise:
|
||||
enabled: false
|
||||
shared: false
|
||||
mcp:
|
||||
enabled: true
|
||||
shared: true
|
||||
@@ -42,6 +54,18 @@
|
||||
shared: false
|
||||
tor:
|
||||
enabled: true
|
||||
openwebui:
|
||||
enabled: true
|
||||
shared: true
|
||||
hermes:
|
||||
enabled: true
|
||||
shared: true
|
||||
openclaw:
|
||||
enabled: true
|
||||
shared: true
|
||||
flowise:
|
||||
enabled: true
|
||||
shared: true
|
||||
mcp:
|
||||
enabled: false
|
||||
shared: false
|
||||
@@ -0,0 +1,125 @@
|
||||
"""Lint: an MCP provider carries a services entry for every declared client.
|
||||
|
||||
A client declares itself once, in its own ``meta/services.yml`` self-entry,
|
||||
as ``mcp_consumer: true``. Every server-capable ``meta/mcp.yml`` MUST then
|
||||
carry a matching ``services.<client-entity>`` entry whose ``enabled`` and
|
||||
``shared`` resolve through the ``"{{ '<role>' in group_names }}"`` form.
|
||||
|
||||
Two things depend on that entry. The inventory resolver builds a round's
|
||||
co-deploy closure from services edges alone, so without it a provider is
|
||||
never planned together with a client and its MCP surface is never exercised
|
||||
end to end. The network layer admits a client to the provider's overlay
|
||||
through the same entry.
|
||||
|
||||
Admission itself is NOT what the entry decides: a provider that must refuse
|
||||
a client adds ``mcp_consumer: false`` to that entry. Keeping the entry and
|
||||
spelling the refusal out is what makes a deliberate exclusion
|
||||
distinguishable from a forgotten one.
|
||||
|
||||
Add ``# nocheck: mcp-consumer-services-entry`` to the head of the provider's
|
||||
``meta/mcp.yml`` for one that legitimately owns no such edge.
|
||||
"""
|
||||
|
||||
from __future__ import annotations
|
||||
|
||||
import unittest
|
||||
from collections.abc import Mapping
|
||||
|
||||
from utils.annotations.suppress import is_suppressed_in_head
|
||||
from utils.cache.files import read_text
|
||||
from utils.cache.yaml import load_yaml_any
|
||||
from utils.roles.applications.mcp import (
|
||||
MCP_CONSUMER_FLAG,
|
||||
declares_mcp_consumer,
|
||||
)
|
||||
from utils.roles.entity.name import get_entity_name
|
||||
from utils.roles.mapping import ROLE_FILE_META_MCP, ROLE_FILE_META_SERVICES
|
||||
|
||||
from . import PROJECT_ROOT
|
||||
|
||||
_RULE = "mcp-consumer-services-entry"
|
||||
_SERVER_DIRECTIONS = frozenset({"server", "both"})
|
||||
|
||||
|
||||
def _services_by_role() -> dict[str, Mapping]:
|
||||
services = {}
|
||||
for path in sorted((PROJECT_ROOT / "roles").glob(f"*/{ROLE_FILE_META_SERVICES}")):
|
||||
loaded = load_yaml_any(str(path), default_if_missing={})
|
||||
if isinstance(loaded, Mapping):
|
||||
services[path.parent.parent.name] = loaded
|
||||
return services
|
||||
|
||||
|
||||
def _gates_on(value: object, role_id: str) -> bool:
|
||||
return isinstance(value, str) and f"'{role_id}' in group_names" in value
|
||||
|
||||
|
||||
def missing_entries() -> list[str]:
|
||||
"""Return one finding per provider missing a declared client's entry."""
|
||||
services_by_role = _services_by_role()
|
||||
consumers = [
|
||||
role_id
|
||||
for role_id, services in services_by_role.items()
|
||||
if declares_mcp_consumer(role_id, services)
|
||||
]
|
||||
|
||||
findings: list[str] = []
|
||||
for meta in sorted((PROJECT_ROOT / "roles").glob(f"*/{ROLE_FILE_META_MCP}")):
|
||||
role = meta.parent.parent.name
|
||||
block = load_yaml_any(str(meta), default_if_missing={})
|
||||
if not isinstance(block, Mapping):
|
||||
continue
|
||||
if str(block.get("direction") or "").strip().lower() not in _SERVER_DIRECTIONS:
|
||||
continue
|
||||
if is_suppressed_in_head(read_text(str(meta)).splitlines(), _RULE):
|
||||
continue
|
||||
|
||||
services = services_by_role.get(role) or {}
|
||||
for consumer in consumers:
|
||||
if consumer == role:
|
||||
continue
|
||||
key = get_entity_name(consumer)
|
||||
entry = services.get(key)
|
||||
if not isinstance(entry, Mapping):
|
||||
findings.append(
|
||||
f"{role}: no 'services.{key}' entry for the declared MCP "
|
||||
f"client {consumer!r}; add one gated on "
|
||||
f"\"{{{{ '{consumer}' in group_names }}}}\", with "
|
||||
f"'{MCP_CONSUMER_FLAG}: false' if it must not be admitted"
|
||||
)
|
||||
continue
|
||||
findings.extend(
|
||||
f"{role}: services.{key}.{flag} must gate on "
|
||||
f"\"{{{{ '{consumer}' in group_names }}}}\" so the "
|
||||
f"round plans provider and client together"
|
||||
for flag in ("enabled", "shared")
|
||||
if not _gates_on(entry.get(flag), consumer)
|
||||
)
|
||||
return findings
|
||||
|
||||
|
||||
class TestMcpConsumerServicesEntry(unittest.TestCase):
|
||||
def test_every_provider_declares_every_client(self) -> None:
|
||||
findings = missing_entries()
|
||||
self.assertEqual(
|
||||
[],
|
||||
findings,
|
||||
f"MCP provider(s) missing a client services entry ({len(findings)}):\n"
|
||||
+ "\n".join(f" - {f}" for f in findings),
|
||||
)
|
||||
|
||||
def test_the_scan_finds_declared_clients(self) -> None:
|
||||
services_by_role = _services_by_role()
|
||||
declared = [
|
||||
role_id
|
||||
for role_id, services in services_by_role.items()
|
||||
if declares_mcp_consumer(role_id, services)
|
||||
]
|
||||
self.assertTrue(
|
||||
declared,
|
||||
"no role declares mcp_consumer, so the rule would pass vacuously",
|
||||
)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
unittest.main()
|
||||
@@ -1,6 +1,6 @@
|
||||
"""Lint: a provider only admits consumers that can speak its transport.
|
||||
|
||||
``allowed_consumers`` and ``supported_transports`` are declared in different
|
||||
Admission and ``supported_transports`` are declared in different
|
||||
files by different people, and nothing made them agree. Admitting a client that
|
||||
cannot speak the provider's transport is not a narrowing decision: discovery
|
||||
classifies it ``transport_unsupported``, which is fatal, so the pair aborts
|
||||
@@ -26,8 +26,11 @@ from pathlib import Path
|
||||
from utils.annotations.suppress import is_suppressed_in_head
|
||||
from utils.cache.files import read_text
|
||||
from utils.cache.yaml import load_yaml_any
|
||||
from utils.roles.applications.mcp import DEFAULT_MCP_TRANSPORT
|
||||
from utils.roles.mapping import ROLE_FILE_META_MCP
|
||||
from utils.roles.applications.mcp import (
|
||||
DEFAULT_MCP_TRANSPORT,
|
||||
derive_allowed_consumers,
|
||||
)
|
||||
from utils.roles.mapping import ROLE_FILE_META_MCP, ROLE_FILE_META_SERVICES
|
||||
|
||||
from . import PROJECT_ROOT
|
||||
|
||||
@@ -45,9 +48,20 @@ def _blocks() -> dict[str, Mapping]:
|
||||
return blocks
|
||||
|
||||
|
||||
def _services_by_role() -> dict[str, object]:
|
||||
"""Return every role's services mapping, keyed by role name."""
|
||||
return {
|
||||
path.parent.parent.name: load_yaml_any(str(path), default_if_missing={})
|
||||
for path in sorted(
|
||||
Path(PROJECT_ROOT, "roles").glob(f"*/{ROLE_FILE_META_SERVICES}")
|
||||
)
|
||||
}
|
||||
|
||||
|
||||
def mismatched_pairs() -> list[str]:
|
||||
"""Return one finding per provider admitting a transport-incompatible client."""
|
||||
blocks = _blocks()
|
||||
services_by_role = _services_by_role()
|
||||
findings = []
|
||||
for role, block in blocks.items():
|
||||
if str(block.get("direction") or "").strip().lower() not in _SERVER_DIRECTIONS:
|
||||
@@ -57,7 +71,7 @@ def mismatched_pairs() -> list[str]:
|
||||
continue
|
||||
|
||||
transport = str(block.get("transport") or DEFAULT_MCP_TRANSPORT)
|
||||
for consumer in block.get("allowed_consumers") or []:
|
||||
for consumer in derive_allowed_consumers(role, services_by_role):
|
||||
spoken = (blocks.get(str(consumer)) or {}).get("supported_transports")
|
||||
if not spoken:
|
||||
continue
|
||||
@@ -81,8 +95,11 @@ class TestMcpConsumerSpeaksTransport(unittest.TestCase):
|
||||
)
|
||||
|
||||
def test_the_scan_finds_admitted_consumers(self) -> None:
|
||||
services_by_role = _services_by_role()
|
||||
admitted = [
|
||||
role for role, block in _blocks().items() if block.get("allowed_consumers")
|
||||
role
|
||||
for role in _blocks()
|
||||
if derive_allowed_consumers(role, services_by_role)
|
||||
]
|
||||
self.assertTrue(
|
||||
admitted,
|
||||
|
||||
@@ -4,8 +4,8 @@
|
||||
``http://<endpoint.service_key>:<port><path>``. That name only resolves when the
|
||||
client shares a network with the provider, which is what
|
||||
``meta/networks.yml.overlay`` arranges: a ``topology`` creates the network and
|
||||
``consumer.kind: mcp_client`` attaches every role the provider named in
|
||||
``mcp.allowed_consumers``. A beacon-only overlay carries neither, so
|
||||
``consumer.kind: mcp_client`` attaches every role the provider admits through
|
||||
the ``mcp_consumer`` flag. A beacon-only overlay carries neither, so
|
||||
``utils.networks.attachments._compute_attachments`` produces no attachment at
|
||||
all.
|
||||
|
||||
|
||||
@@ -17,8 +17,8 @@ It is a hard lint. It rejects:
|
||||
* an invalid ``direction`` / ``transport`` / ``exposure`` / ``auth`` /
|
||||
``auth_subject`` / ``implementation``,
|
||||
* a ``direction`` that contradicts the ``classification``,
|
||||
* a server-capable block missing ``auth``, ``credential``,
|
||||
``allowed_consumers`` or a complete ``endpoint``,
|
||||
* a server-capable block missing ``auth``, ``credential``, a complete
|
||||
``endpoint``, or any admitted client,
|
||||
* a credential owned by ``administrator``, or read from an unknown source,
|
||||
* ``auth: none`` combined with an ``exposure`` other than ``internal``,
|
||||
* ``auth_subject: service_account|administrator`` combined with
|
||||
@@ -86,6 +86,7 @@ from utils.roles.applications.mcp import (
|
||||
MCP_UPSTREAM_MCP_ADAPTER_TYPES,
|
||||
declares_delegation,
|
||||
delegation_is_proven,
|
||||
derive_allowed_consumers,
|
||||
value_is_templated,
|
||||
)
|
||||
from utils.roles.mapping import ROLE_FILE_META_MCP, ROLE_FILE_META_SERVICES
|
||||
@@ -170,6 +171,16 @@ def _is_exact_names(value: object) -> bool:
|
||||
)
|
||||
|
||||
|
||||
def _services_by_role() -> dict[str, object]:
|
||||
"""Return every role's services mapping, keyed by role name."""
|
||||
return {
|
||||
path.parent.parent.name: load_yaml_any(str(path), default_if_missing={})
|
||||
for path in sorted(
|
||||
(PROJECT_ROOT / "roles").glob(f"*/{ROLE_FILE_META_SERVICES}")
|
||||
)
|
||||
}
|
||||
|
||||
|
||||
class TestMcpSchema(unittest.TestCase):
|
||||
"""Hard lint: every deployable ``mcp`` block obeys the contract."""
|
||||
|
||||
@@ -273,7 +284,7 @@ class TestMcpSchema(unittest.TestCase):
|
||||
self._check_client(mcp, prefix, flag, server_capable)
|
||||
if server_capable:
|
||||
self._check_credential(mcp, prefix, flag)
|
||||
self._check_consumers(mcp, prefix, flag)
|
||||
self._check_consumers(role, prefix, flag)
|
||||
self._check_endpoint(mcp, services, prefix, flag)
|
||||
if "auth" not in mcp:
|
||||
flag("auth", f"{prefix} server-capable block is missing 'auth'")
|
||||
@@ -421,13 +432,14 @@ class TestMcpSchema(unittest.TestCase):
|
||||
f"{sorted(MCP_CREDENTIAL_SOURCES)}",
|
||||
)
|
||||
|
||||
def _check_consumers(self, mcp, prefix, flag) -> None:
|
||||
consumers = mcp.get("allowed_consumers")
|
||||
if not _is_exact_names(consumers):
|
||||
def _check_consumers(self, role, prefix, flag) -> None:
|
||||
if not derive_allowed_consumers(role, _services_by_role()):
|
||||
flag(
|
||||
"allowed_consumers",
|
||||
f"{prefix} server-capable block needs a non-empty "
|
||||
f"'allowed_consumers' list of client application ids",
|
||||
"mcp_consumer",
|
||||
f"{prefix} server-capable block admits no client; a client "
|
||||
f"declares 'services.<entity>.mcp_consumer: true' in its own "
|
||||
f"role and this provider must not override it to false for "
|
||||
f"every one of them",
|
||||
)
|
||||
|
||||
def _check_endpoint(self, mcp, services, prefix, flag) -> None:
|
||||
@@ -766,13 +778,14 @@ class TestMcpConsumerCompatibility(unittest.TestCase):
|
||||
if isinstance(mcp, Mapping):
|
||||
blocks[role_dir.name] = mcp
|
||||
|
||||
services_by_role = _services_by_role()
|
||||
errors: list[str] = []
|
||||
for role, mcp in blocks.items():
|
||||
if mcp.get("direction") not in MCP_SERVER_DIRECTIONS:
|
||||
continue
|
||||
transport = mcp.get("transport")
|
||||
auth = mcp.get("auth")
|
||||
for consumer in mcp.get("allowed_consumers") or []:
|
||||
for consumer in derive_allowed_consumers(role, services_by_role):
|
||||
client = blocks.get(consumer)
|
||||
if client is None:
|
||||
continue
|
||||
|
||||
@@ -37,6 +37,23 @@ def _const_lookup_config(**values):
|
||||
return _lookup
|
||||
|
||||
|
||||
def _role_lookup_config(per_role, **values):
|
||||
"""Answer per (role, path) so a provider override is expressible.
|
||||
|
||||
Args:
|
||||
per_role: ``{role: {path: value}}`` consulted before the shared map.
|
||||
values: paths every role answers identically.
|
||||
"""
|
||||
|
||||
def _lookup(app, path, default):
|
||||
scoped = per_role.get(app) or {}
|
||||
if path in scoped:
|
||||
return scoped[path]
|
||||
return values.get(path, default)
|
||||
|
||||
return _lookup
|
||||
|
||||
|
||||
def _const_lookup_database(**values):
|
||||
def _lookup(_app, key):
|
||||
return values.get(key, "")
|
||||
@@ -70,7 +87,7 @@ class TestCoerceBool(unittest.TestCase):
|
||||
class TestMcpClientConsumer(unittest.TestCase):
|
||||
"""Only a client the provider admitted joins its network."""
|
||||
|
||||
ADMITTED: ClassVar[dict] = {"mcp.allowed_consumers": ["svc-db-qdrant"]}
|
||||
ADMITTED: ClassVar[dict] = {"services.qdrant.mcp_consumer": True}
|
||||
|
||||
def _consumer(self, **flags):
|
||||
entry = {
|
||||
@@ -123,28 +140,37 @@ class TestMcpClientConsumer(unittest.TestCase):
|
||||
def test_disabled_stays_out(self):
|
||||
self.assertFalse(self._consumer(**{"mcp.direction": "client"}))
|
||||
|
||||
def test_an_unadmitted_client_stays_out(self):
|
||||
def test_a_client_that_never_declared_itself_stays_out(self):
|
||||
self.assertFalse(
|
||||
self._consumer(
|
||||
**{
|
||||
"mcp.enabled": True,
|
||||
"mcp.shared": True,
|
||||
"mcp.direction": "client",
|
||||
"mcp.allowed_consumers": ["web-app-openwebui"],
|
||||
}
|
||||
),
|
||||
"being a client is not an admission; allowed_consumers decides",
|
||||
"being a client is not an admission; the self-declaration decides",
|
||||
)
|
||||
|
||||
def test_a_provider_naming_nobody_admits_nobody(self):
|
||||
def test_a_provider_override_refuses_a_declared_client(self):
|
||||
entry = {
|
||||
"role": "web-app-homeassistant",
|
||||
"overlay": {"consumer": {"kind": "mcp_client"}},
|
||||
}
|
||||
self.assertFalse(
|
||||
self._consumer(
|
||||
**{
|
||||
"mcp.enabled": True,
|
||||
"mcp.shared": True,
|
||||
"mcp.direction": "client",
|
||||
"mcp.allowed_consumers": [],
|
||||
}
|
||||
_is_consumer(
|
||||
entry,
|
||||
"svc-db-qdrant",
|
||||
_role_lookup_config(
|
||||
{"web-app-homeassistant": {"services.qdrant.mcp_consumer": False}},
|
||||
**{
|
||||
"mcp.enabled": True,
|
||||
"mcp.shared": True,
|
||||
"mcp.direction": "client",
|
||||
"services.qdrant.mcp_consumer": True,
|
||||
},
|
||||
),
|
||||
_const_lookup_database(),
|
||||
)
|
||||
)
|
||||
|
||||
@@ -190,7 +216,7 @@ class TestConsumerKindList(unittest.TestCase):
|
||||
"mcp.enabled": True,
|
||||
"mcp.shared": True,
|
||||
"mcp.direction": "client",
|
||||
"mcp.allowed_consumers": ["web-app-hermes"],
|
||||
"services.hermes.mcp_consumer": True,
|
||||
},
|
||||
)
|
||||
)
|
||||
|
||||
@@ -10,6 +10,8 @@ from __future__ import annotations
|
||||
|
||||
from typing import TYPE_CHECKING, Any
|
||||
|
||||
from utils.roles.entity.name import get_entity_name
|
||||
|
||||
if TYPE_CHECKING:
|
||||
from collections.abc import Callable
|
||||
|
||||
@@ -65,8 +67,16 @@ def _matches_kind(
|
||||
).strip()
|
||||
if direction not in ("client", "both"):
|
||||
return False
|
||||
admitted = lookup_config(entry.get("role") or "", "mcp.allowed_consumers", [])
|
||||
return application_id in (admitted or [])
|
||||
consumer_key = get_entity_name(application_id)
|
||||
if (
|
||||
lookup_config(application_id, f"services.{consumer_key}.mcp_consumer", None)
|
||||
is not True
|
||||
):
|
||||
return False
|
||||
override = lookup_config(
|
||||
entry.get("role") or "", f"services.{consumer_key}.mcp_consumer", None
|
||||
)
|
||||
return override is not False
|
||||
if kind == "onion_sso":
|
||||
provider = consumer.get("provider")
|
||||
if not provider:
|
||||
|
||||
Loaded 100 of 102 files, more files were not shown because too many files have changed in this diff.
Show more
Reference in new issue
Block a user