fix: update FreeCAD MCP URL and ports for consistency and add new backend configurations in Titania
This commit is contained in:
@@ -55,7 +55,7 @@ neo4j_mcp_url: http://circe.helu.ca:22034/mcp
|
|||||||
nike_mcp_url: http://puck.incus:22031/mcp
|
nike_mcp_url: http://puck.incus:22031/mcp
|
||||||
korax_mcp_url: http://korax.helu.ca:22021/mcp
|
korax_mcp_url: http://korax.helu.ca:22021/mcp
|
||||||
rommie_mcp_url: https://rommie.ouranos.helu.ca/mcp
|
rommie_mcp_url: https://rommie.ouranos.helu.ca/mcp
|
||||||
freecad_mcp_url: http://caliban.incus:22032/mcp
|
freecad_mcp_url: https://freecad-mcp.ouranos.helu.ca/mcp
|
||||||
|
|
||||||
# Monitoring and Logging (internal endpoints on Prospero)
|
# Monitoring and Logging (internal endpoints on Prospero)
|
||||||
loki_url: http://prospero.incus:3100/loki/api/v1/push
|
loki_url: http://prospero.incus:3100/loki/api/v1/push
|
||||||
|
|||||||
@@ -19,7 +19,7 @@ principal_uid: 1000
|
|||||||
alloy_log_level: "warn"
|
alloy_log_level: "warn"
|
||||||
|
|
||||||
# Rommie MCP Server Configuration (Agent S GUI Automation)
|
# Rommie MCP Server Configuration (Agent S GUI Automation)
|
||||||
rommie_port: 22031
|
rommie_port: 22061
|
||||||
rommie_host: "0.0.0.0"
|
rommie_host: "0.0.0.0"
|
||||||
rommie_display: ":10"
|
rommie_display: ":10"
|
||||||
rommie_allowed_hosts: "caliban.incus,rommie.ouranos.helu.ca"
|
rommie_allowed_hosts: "caliban.incus,rommie.ouranos.helu.ca"
|
||||||
@@ -42,7 +42,7 @@ freecad_mcp_port: 22032
|
|||||||
kernos_user: harper
|
kernos_user: harper
|
||||||
kernos_group: harper
|
kernos_group: harper
|
||||||
kernos_directory: /srv/kernos
|
kernos_directory: /srv/kernos
|
||||||
kernos_port: 22021
|
kernos_port: 20201
|
||||||
kernos_host: "0.0.0.0"
|
kernos_host: "0.0.0.0"
|
||||||
kernos_log_level: INFO
|
kernos_log_level: INFO
|
||||||
kernos_log_format: json
|
kernos_log_format: json
|
||||||
|
|||||||
@@ -166,6 +166,16 @@ haproxy_backends:
|
|||||||
backend_port: 22781
|
backend_port: 22781
|
||||||
health_path: "/ready/"
|
health_path: "/ready/"
|
||||||
|
|
||||||
|
- subdomain: "nike"
|
||||||
|
backend_host: "puck.incus"
|
||||||
|
backend_port: 20681
|
||||||
|
health_path: "/ready/"
|
||||||
|
|
||||||
|
- subdomain: "periplus"
|
||||||
|
backend_host: "puck.incus"
|
||||||
|
backend_port: 20581
|
||||||
|
health_path: "/ready/"
|
||||||
|
|
||||||
- subdomain: "spelunker"
|
- subdomain: "spelunker"
|
||||||
backend_host: "puck.incus"
|
backend_host: "puck.incus"
|
||||||
backend_port: 22881
|
backend_port: 22881
|
||||||
@@ -188,6 +198,12 @@ haproxy_backends:
|
|||||||
health_path: "/api/"
|
health_path: "/api/"
|
||||||
timeout_server: 300s # WebSocket support for HA frontend
|
timeout_server: 300s # WebSocket support for HA frontend
|
||||||
|
|
||||||
|
- subdomain: "freecad-mcp"
|
||||||
|
backend_host: "caliban.incus"
|
||||||
|
backend_port: 22032
|
||||||
|
health_path: "/mcp"
|
||||||
|
timeout_server: 300s # SSE streaming support for MCP
|
||||||
|
|
||||||
- subdomain: "rommie"
|
- subdomain: "rommie"
|
||||||
backend_host: "caliban.incus"
|
backend_host: "caliban.incus"
|
||||||
backend_port: 22031
|
backend_port: 22031
|
||||||
|
|||||||
@@ -690,6 +690,40 @@ See [docs/COMPARISON.md](docs/COMPARISON.md) for a detailed analysis of these im
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
## Ouranos Deployment
|
||||||
|
|
||||||
|
The FreeCAD Robust MCP Server runs on `caliban.incus` and is exposed via Titania's HAProxy with TLS termination.
|
||||||
|
|
||||||
|
### Architecture
|
||||||
|
|
||||||
|
```
|
||||||
|
External Agent (e.g., Claude Desktop / MCP Switchboard)
|
||||||
|
│ MCP Protocol (Streamable HTTP, TLS)
|
||||||
|
│ https://freecad-mcp.ouranos.helu.ca/mcp
|
||||||
|
▼
|
||||||
|
Titania HAProxy (TLS termination, wildcard cert)
|
||||||
|
│ http://caliban.incus:22032/mcp
|
||||||
|
▼
|
||||||
|
FreeCAD Robust MCP Server (HTTP transport mode)
|
||||||
|
│ XML-RPC (localhost:9875)
|
||||||
|
▼
|
||||||
|
FreeCAD (GUI or headless)
|
||||||
|
```
|
||||||
|
|
||||||
|
### Integration
|
||||||
|
|
||||||
|
The MCP URL is registered in `group_vars/all/vars.yml`:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
freecad_mcp_url: https://freecad-mcp.ouranos.helu.ca/mcp
|
||||||
|
```
|
||||||
|
|
||||||
|
The route is served via Titania's HAProxy using the existing `*.ouranos.helu.ca` Let's Encrypt wildcard certificate.
|
||||||
|
|
||||||
|
**To deploy:** `ansible-playbook ansible/haproxy/configure.yml`
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
## License
|
## License
|
||||||
|
|
||||||
MIT License - see [LICENSE](LICENSE) for details.
|
MIT License - see [LICENSE](LICENSE) for details.
|
||||||
|
|||||||
@@ -2,15 +2,6 @@
|
|||||||
|
|
||||||
HTTP-enabled MCP shell server using FastMCP. Wraps the existing `mcp-shell-server` execution logic with FastMCP's HTTP transport for remote AI agent access.
|
HTTP-enabled MCP shell server using FastMCP. Wraps the existing `mcp-shell-server` execution logic with FastMCP's HTTP transport for remote AI agent access.
|
||||||
|
|
||||||
## Overview
|
|
||||||
|
|
||||||
| Property | Value |
|
|
||||||
|----------|-------|
|
|
||||||
| **Host** | caliban.incus |
|
|
||||||
| **Port** | 22021 |
|
|
||||||
| **Service Type** | Systemd service (non-Docker) |
|
|
||||||
| **Repository** | `ssh://robert@clio.helu.ca:18677/mnt/dev/kernos` |
|
|
||||||
|
|
||||||
## Features
|
## Features
|
||||||
|
|
||||||
- **HTTP Transport**: Accessible via URL instead of stdio
|
- **HTTP Transport**: Accessible via URL instead of stdio
|
||||||
@@ -60,17 +51,17 @@ Deploys Kernos to caliban.incus:
|
|||||||
|
|
||||||
### Host Variables (`ansible/inventory/host_vars/caliban.incus.yml`)
|
### Host Variables (`ansible/inventory/host_vars/caliban.incus.yml`)
|
||||||
|
|
||||||
| Variable | Default | Description |
|
| Variable | Description |
|
||||||
|----------|---------|-------------|
|
|----------|-------------|
|
||||||
| `kernos_user` | `kernos` | System user for the service |
|
| `kernos_user`| System user for the service |
|
||||||
| `kernos_group` | `kernos` | System group for the service |
|
| `kernos_group` | System group for the service |
|
||||||
| `kernos_directory` | `/srv/kernos` | Installation directory |
|
| `kernos_directory` | Installation directory |
|
||||||
| `kernos_port` | `22021` | HTTP server port |
|
| `kernos_port` | HTTP server port |
|
||||||
| `kernos_host` | `0.0.0.0` | Server bind address |
|
| `kernos_host` | Server bind address |
|
||||||
| `kernos_log_level` | `INFO` | Python log level |
|
| `kernos_log_level` | Python log level |
|
||||||
| `kernos_log_format` | `json` | Log format (`json` or `text`) |
|
| `kernos_log_format` | Log format (`json` or `text`) |
|
||||||
| `kernos_environment` | `production` | Environment name for logging |
|
| `kernos_environment` | Environment name for logging |
|
||||||
| `kernos_allow_commands` | (see below) | Comma-separated command whitelist |
|
| `kernos_allow_commands` |Comma-separated command whitelist |
|
||||||
|
|
||||||
### Global Variables (`ansible/inventory/group_vars/all/vars.yml`)
|
### Global Variables (`ansible/inventory/group_vars/all/vars.yml`)
|
||||||
|
|
||||||
@@ -110,12 +101,11 @@ The systemd service includes additional hardening:
|
|||||||
|
|
||||||
### Testing Health Endpoints
|
### Testing Health Endpoints
|
||||||
|
|
||||||
```bash
|
/health
|
||||||
curl http://caliban.incus:22021/health
|
/ready
|
||||||
curl http://caliban.incus:22021/ready
|
/live
|
||||||
curl http://caliban.incus:22021/live
|
/metrics
|
||||||
curl -H "Accept: text/plain" http://caliban.incus:22021/metrics
|
|
||||||
```
|
|
||||||
|
|
||||||
### MCP Client Connection
|
### MCP Client Connection
|
||||||
|
|
||||||
@@ -174,10 +164,10 @@ The `/metrics` endpoint exposes Prometheus-compatible metrics. Add to your Prome
|
|||||||
|
|
||||||
```bash
|
```bash
|
||||||
# Check service status
|
# Check service status
|
||||||
ssh caliban.incus sudo systemctl status kernos
|
sudo systemctl status kernos
|
||||||
|
|
||||||
# View logs
|
# View logs
|
||||||
ssh caliban.incus sudo journalctl -u kernos -f
|
sudo journalctl -u kernos -f
|
||||||
```
|
```
|
||||||
|
|
||||||
## Troubleshooting
|
## Troubleshooting
|
||||||
@@ -192,7 +182,7 @@ ssh caliban.incus sudo journalctl -u kernos -f
|
|||||||
### Health Check Failures
|
### Health Check Failures
|
||||||
|
|
||||||
1. Verify the service is running: `systemctl status kernos`
|
1. Verify the service is running: `systemctl status kernos`
|
||||||
2. Check if port 22021 is accessible
|
2. Check if port is accessible
|
||||||
3. Review logs for startup errors
|
3. Review logs for startup errors
|
||||||
|
|
||||||
### Command Execution Denied
|
### Command Execution Denied
|
||||||
|
|||||||
104
docs/ouranos.md
104
docs/ouranos.md
@@ -32,15 +32,39 @@ All containers are named after moons of Uranus and resolved via the `.incus` DNS
|
|||||||
| **sycorax** | language_models | Arke LLM Proxy | ✔ |
|
| **sycorax** | language_models | Arke LLM Proxy | ✔ |
|
||||||
| **titania** | proxy_sso | HAProxy TLS termination + Casdoor SSO | ✔ |
|
| **titania** | proxy_sso | HAProxy TLS termination + Casdoor SSO | ✔ |
|
||||||
|
|
||||||
### oberon — Container Orchestration
|
### puck — Project Application Runtime
|
||||||
|
|
||||||
|
Shape-shifting trickster embodying Python's versatility.
|
||||||
|
This is the host that runs Python projects in the Ouranos sandbox.
|
||||||
|
It has an RDP server and is generally where application development happens.
|
||||||
|
Each project has a number that is used to determine port numbers.
|
||||||
|
|
||||||
|
- Docker engine
|
||||||
|
- JupyterLab (port 22071 via OAuth2-Proxy)
|
||||||
|
- Gitea Runner (CI/CD agent)
|
||||||
|
- Django Projects: Zelus (221), Angelia (222), Athena (224), Kairos (225), Icarlos (226), MCP Switchboard (227), Spelunker (228), Peitho (229), Mnemosyne (230)
|
||||||
|
- FastAgent Projects: Pallas (240)
|
||||||
|
- FastAPI Projects: Daedalus (200), Arke (201) Kernos (202), Stentor (203), Orpheus (204), Periplus (205), Nike (206)
|
||||||
|
|
||||||
|
### caliban — Agent Automation
|
||||||
|
|
||||||
|
Autonomous computer agent learning through environmental interaction.
|
||||||
|
|
||||||
|
- Docker engine
|
||||||
|
- Agent S MCP Server (MATE desktop, AT-SPI automation)
|
||||||
|
- Kernos MCP Shell Server (port 22062)
|
||||||
|
- Rommie MCP Server (port 22061) — agent-to-agent GUI automation via Agent S
|
||||||
|
- FreeCAD Robust MCP Server (port 22063) — CAD automation via FreeCAD XML-RPC
|
||||||
|
- GPU passthrough
|
||||||
|
- RDP access (port 25521)
|
||||||
|
|
||||||
|
### oberon — Container Orchestration & Dockerized Shared Services
|
||||||
|
|
||||||
King of the Fairies orchestrating containers and managing MCP infrastructure.
|
King of the Fairies orchestrating containers and managing MCP infrastructure.
|
||||||
|
|
||||||
- Docker engine
|
- Docker engine
|
||||||
- MCP Switchboard (port 22785) — Django app routing MCP tool calls
|
- MCP Switchboard (port 22781) — Django app routing MCP tool calls
|
||||||
- RabbitMQ message queue
|
- RabbitMQ message queue
|
||||||
- Open WebUI LLM interface (port 22088, PostgreSQL backend on Portia)
|
|
||||||
- SearXNG privacy search (port 22083, behind OAuth2-Proxy)
|
|
||||||
- smtp4dev SMTP test server (port 22025)
|
- smtp4dev SMTP test server (port 22025)
|
||||||
|
|
||||||
### portia — Relational Database
|
### portia — Relational Database
|
||||||
@@ -58,15 +82,16 @@ Air spirit — ethereal, interconnected nature mirroring graph relationships.
|
|||||||
- HTTP API: port 25584
|
- HTTP API: port 25584
|
||||||
- Bolt: port 25554
|
- Bolt: port 25554
|
||||||
|
|
||||||
### puck — Application Runtime
|
### miranda — MCP Docker Host
|
||||||
|
|
||||||
Shape-shifting trickster embodying Python's versatility.
|
Curious bridge between worlds — hosting MCP server containers.
|
||||||
|
|
||||||
- Docker engine
|
- Docker engine (API exposed on port 2375 for MCP Switchboard)
|
||||||
- JupyterLab (port 22071 via OAuth2-Proxy)
|
- MCPO OpenAI-compatible MCP proxy 22071
|
||||||
- Gitea Runner (CI/CD agent)
|
- Argos MCP Server — web search via SearXNG (port 22062)
|
||||||
- Home Assistant (port 8123)
|
- Grafana MCP Server (port 22063)
|
||||||
- Django applications: Angelia (22281), Athena (22481), Kairos (22581), Icarlos (22681), Spelunker (22881), Peitho (22981)
|
- Neo4j MCP Server (port 22064)
|
||||||
|
- Gitea MCP Server (port 22065)
|
||||||
|
|
||||||
### prospero — Observability Stack
|
### prospero — Observability Stack
|
||||||
|
|
||||||
@@ -79,16 +104,18 @@ Master magician observing all events.
|
|||||||
- Loki log aggregation via Alloy (all hosts)
|
- Loki log aggregation via Alloy (all hosts)
|
||||||
- Grafana dashboard suite with Casdoor SSO integration
|
- Grafana dashboard suite with Casdoor SSO integration
|
||||||
|
|
||||||
### miranda — MCP Docker Host
|
### rosalind — Third Party Applications for testing and evaluation
|
||||||
|
|
||||||
Curious bridge between worlds — hosting MCP server containers.
|
Witty and resourceful moon for PHP, Go, and Node.js runtimes.
|
||||||
|
|
||||||
- Docker engine (API exposed on port 2375 for MCP Switchboard)
|
- SearXNG privacy search (port 22083, behind OAuth2-Proxy)
|
||||||
- MCPO OpenAI-compatible MCP proxy
|
- Gitea self-hosted Git (port 22082, SSH on 22022)
|
||||||
- Grafana MCP Server (port 25533)
|
- LobeChat AI chat interface (port 22081)
|
||||||
- Gitea MCP Server (port 25535)
|
- Nextcloud file sharing and collaboration (port 22083)
|
||||||
- Neo4j MCP Server
|
- AnythingLLM document AI workspace (port 22084)
|
||||||
- Argos MCP Server — web search via SearXNG (port 25534)
|
- Nextcloud data on dedicated Incus storage volume
|
||||||
|
- Open WebUI LLM interface (port 22088, PostgreSQL backend on Portia
|
||||||
|
- Home Assistant (port 8123)
|
||||||
|
|
||||||
### sycorax — Language Models
|
### sycorax — Language Models
|
||||||
|
|
||||||
@@ -99,28 +126,6 @@ Original magical power wielding language magic.
|
|||||||
- Session management with Memcached
|
- Session management with Memcached
|
||||||
- Database backend on Portia
|
- Database backend on Portia
|
||||||
|
|
||||||
### caliban — Agent Automation
|
|
||||||
|
|
||||||
Autonomous computer agent learning through environmental interaction.
|
|
||||||
|
|
||||||
- Docker engine
|
|
||||||
- Agent S MCP Server (MATE desktop, AT-SPI automation)
|
|
||||||
- Kernos MCP Shell Server (port 22021)
|
|
||||||
- Rommie MCP Server (port 22031) — agent-to-agent GUI automation via Agent S
|
|
||||||
- FreeCAD Robust MCP Server (port 22032) — CAD automation via FreeCAD XML-RPC
|
|
||||||
- GPU passthrough for vision tasks
|
|
||||||
- RDP access (port 25521)
|
|
||||||
|
|
||||||
### rosalind — Collaboration Services
|
|
||||||
|
|
||||||
Witty and resourceful moon for PHP, Go, and Node.js runtimes.
|
|
||||||
|
|
||||||
- Gitea self-hosted Git (port 22082, SSH on 22022)
|
|
||||||
- LobeChat AI chat interface (port 22081)
|
|
||||||
- Nextcloud file sharing and collaboration (port 22083)
|
|
||||||
- AnythingLLM document AI workspace (port 22084)
|
|
||||||
- Nextcloud data on dedicated Incus storage volume
|
|
||||||
|
|
||||||
### titania — Proxy & SSO Services
|
### titania — Proxy & SSO Services
|
||||||
|
|
||||||
Queen of the Fairies managing access control and authentication.
|
Queen of the Fairies managing access control and authentication.
|
||||||
@@ -134,6 +139,21 @@ Queen of the Fairies managing access control and authentication.
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
## Port Numbering
|
||||||
|
|
||||||
|
Well-known ports running as a service may be used: Postgresql 5432, Prometheus Metrics 9100.
|
||||||
|
|
||||||
|
However inside a docker project, the number plan needs to be followed to avoid port conflicts and confusion:
|
||||||
|
XXXYZ
|
||||||
|
XXX Project Number or 220 for external project
|
||||||
|
Y Service: 0 reserved, 1-4 flexible, 5 database, 6 MCP, 7 API, 8 Web App, 9 Prometheus metrics
|
||||||
|
Z Instance: The running instance of this app on the same host, starting at 1. May also be used to handle exceptions.
|
||||||
|
|
||||||
|
255 Incus port forwarding: Ports in ths range are forwarded from the Incus host to Incus containers (defined in Terraform)
|
||||||
|
|
||||||
|
514ZZ is the syslog port. Docker containers send their syslog to an Alloy syslog collector port. ZZ is the application instance, they just need to be different on the same host and increment from 01.
|
||||||
|
|
||||||
|
|
||||||
## External Access via HAProxy
|
## External Access via HAProxy
|
||||||
|
|
||||||
Titania provides TLS termination and reverse proxy for all services.
|
Titania provides TLS termination and reverse proxy for all services.
|
||||||
@@ -162,7 +182,7 @@ Titania provides TLS termination and reverse proxy for all services.
|
|||||||
| `kairos.ouranos.helu.ca` | puck.incus:22581 | Kairos (Django) |
|
| `kairos.ouranos.helu.ca` | puck.incus:22581 | Kairos (Django) |
|
||||||
| `lobechat.ouranos.helu.ca` | rosalind.incus:22081 | LobeChat |
|
| `lobechat.ouranos.helu.ca` | rosalind.incus:22081 | LobeChat |
|
||||||
| `loki.ouranos.helu.ca` | prospero.incus:443 (SSL) | Loki |
|
| `loki.ouranos.helu.ca` | prospero.incus:443 (SSL) | Loki |
|
||||||
| `mcp-switchboard.ouranos.helu.ca` | oberon.incus:22785 | MCP Switchboard |
|
| `mcp-switchboard.ouranos.helu.ca` | oberon.incus:22781 | MCP Switchboard |
|
||||||
| `nextcloud.ouranos.helu.ca` | rosalind.incus:22083 | Nextcloud |
|
| `nextcloud.ouranos.helu.ca` | rosalind.incus:22083 | Nextcloud |
|
||||||
| `openwebui.ouranos.helu.ca` | oberon.incus:22088 | Open WebUI |
|
| `openwebui.ouranos.helu.ca` | oberon.incus:22088 | Open WebUI |
|
||||||
| `peitho.ouranos.helu.ca` | puck.incus:22981 | Peitho (Django) |
|
| `peitho.ouranos.helu.ca` | puck.incus:22981 | Peitho (Django) |
|
||||||
|
|||||||
Reference in New Issue
Block a user