mirror of
https://github.com/anand34577/ferrum.git
synced 2026-09-12 05:48:58 +00:00
22c1dd382c
- 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.
65 lines
3.6 KiB
YAML
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
|