Files
ferrum/config.example.yaml
Anand 22c1dd382c Add API keys, MCP server, admin AI providers, and a built-in local LLM option
- User-scoped API keys (Profile > API Keys) for 3rd-party REST API access
  and MCP clients, each locked to one scope at creation, with expiry,
  revocation, and last-used tracking.
- A hand-rolled MCP (Model Context Protocol) server exposing the fleet
  (connections, nodes, guests, storage, pools, alerts, cluster status) as
  read tools plus one admin-gated power-action tool, so Claude Code/Desktop
  or any other MCP client can query and operate the fleet directly.
- Both the REST API and MCP are off by default and toggleable instance-wide
  from Settings > API & MCP, enforced live on every request.
- Admin-managed AI providers (any OpenAI-chat-completions-compatible
  endpoint) backing the AI Assistant's tool-calling loop, replacing the
  single hardcoded provider.
- A built-in, zero-config, no-API-key local provider backed by Needle 2
  (internal/needle) for fully offline tool-calling, wired in as a one-click
  preset. Requires the operator to separately download the Needle 2 binary
  and point FERRUM_NEEDLE_BIN at it -- Ferrum never fetches executable
  content from the network itself; see README "Built-in LLM (Needle 2)".
- System settings (CORS allow-list, instance-wide toggles) moved to the
  admin Settings UI; environment variables are now scoped to true
  bootstrap-level config only (listen address, TLS, DB connection, secret,
  optional Needle binary path).
- Fixed: node Journal tab 502'ing with "unexpected end of JSON input" on an
  empty response, and separately with a decode error on PVE versions that
  return a bare-string journal line instead of the documented {n,t} object.
- Fixed: bottom content padding disappearing on every page except the AI
  Assistant (an unconditional h-full on the content wrapper let overflowing
  content bleed through where the padding should render).
- Fixed: Profile page felt cramped despite a wide viewport (stray max-w-2xl
  cap not present on the equivalent Settings page).
- Test coverage added for the previously-untested MCP package and the new
  Needle adapter (20 new Go tests), plus a regression test for the journal
  decode fix.
2026-09-06 13:26:30 +05:30

65 lines
3.6 KiB
YAML

# Copy to config.yaml and adjust as needed. Every value can also be set via
# the FERRUM_* environment variables shown below, which take precedence.
server:
addr: ":8080" # FERRUM_ADDR
# secureCookies: mark the session cookie Secure so browsers only send it
# over HTTPS. Enable this whenever Ferrum is served over TLS (directly or
# behind a reverse proxy). FERRUM_SECURE_COOKIES
secureCookies: false
# behindProxy: set when Ferrum runs behind a reverse proxy — client IPs
# are read from X-Forwarded-For and the session cookie is additionally
# marked Secure for requests the proxy reports as https.
# FERRUM_BEHIND_PROXY
behindProxy: false
# tlsCertFile/tlsKeyFile: set both to have Ferrum terminate TLS itself
# (standalone deployments with no reverse proxy in front of it). Leave
# both blank (the default) for plain HTTP — the common case, since most
# deployments put a TLS-terminating reverse proxy in front of Ferrum.
# FERRUM_TLS_CERT_FILE / FERRUM_TLS_KEY_FILE
tlsCertFile: ""
tlsKeyFile: ""
db:
driver: sqlite # FERRUM_DB_DRIVER — "sqlite" (default) or "postgres"
path: ./data/ferrum.db # FERRUM_DB_PATH — used when driver is sqlite
# dsn: postgres://user:pass@localhost:5432/ferrum?sslmode=disable # FERRUM_DB_DSN — required when driver is postgres
# secret: set explicitly to pin the encryption key used for stored connection
# credentials (recommended for Postgres/shared-DB deployments so all
# instances share one key; minimum 16 characters). If left blank, a random
# secret is generated and persisted next to the SQLite file on first run —
# fine for a single-node SQLite install. FERRUM_SECRET
# needleBinPath: path to a Needle 2 (https://huggingface.co/Cactus-Compute/needle2)
# CLI binary, downloaded separately by you — Ferrum does not fetch it — to
# back an optional zero-config, no-API-key, fully local AI provider. Left
# blank (the default), that provider is simply unavailable; every other
# provider configured from Settings > AI Providers is unaffected. See
# README "Built-in LLM (Needle 2)". FERRUM_NEEDLE_BIN
needleBinPath: ""
# oidc: optional single sign-on via any standard OpenID Connect provider
# (Keycloak, Authentik, Entra ID, Okta, ...). Local username/password login
# keeps working regardless — this adds a "Continue with ..." button next to
# it. The first SSO login for a *provider-verified* email that already has a
# local account links the two; otherwise a new (non-admin) account is created
# automatically. Unverified IdP email addresses never link into existing
# accounts. The first login requires promoting the user to admin from the
# Users page.
#
# NOTE: this section (and its FERRUM_OIDC_* env equivalents) is a first-boot
# SEED ONLY — it's copied into the database once, the first time Ferrum ever
# starts against a fresh database. Every boot after that, and any save from
# Settings > SSO in the UI, reads and writes the database exclusively; editing
# this file (or the env vars) later has no effect. Manage OIDC from the
# Settings UI once the instance is running — this file only exists to
# pre-seed it for automated/scripted first-time deployment.
oidc:
enabled: false # FERRUM_OIDC_ENABLED
displayName: Keycloak # FERRUM_OIDC_DISPLAY_NAME — shown on the login button
issuerUrl: https://keycloak.example.com/realms/myrealm # FERRUM_OIDC_ISSUER_URL
clientId: ferrum # FERRUM_OIDC_CLIENT_ID
clientSecret: "" # FERRUM_OIDC_CLIENT_SECRET — from a confidential client in Keycloak
redirectUrl: https://ferrum.example.com/api/v1/auth/oidc/callback # FERRUM_OIDC_REDIRECT_URL — register this exact URL in Keycloak