Added
- n8n-MCP - New optional service (
n8n-mcpprofile): a Model Context Protocol server that exposes n8n's full node catalogue, property schemas and workflow templates to AI coding assistants, plus workflow-management tools once an n8n API key is configured. Served atn8n-mcp.<domain>behind a generatedN8N_MCP_AUTH_TOKENBearer token. Caddy gates on the same token the service itself validates, because HTTP carries a singleAuthorizationheader and MCP clients send only a Bearer token - basic auth would make the endpoint unusable for every client. Ships in documentation-only mode; create an API key in n8n under Settings > n8n API, setN8N_API_KEYin.envand runmake restartto unlock workflow management. Connect withnpx -y mcp-remote https://n8n-mcp.<domain>/mcp --header "Authorization: Bearer <token>". Note that outside n8n Enterprise an API key grants full account access (#104). - Ollama - Optional multiple instances for multi-GPU hosts. Set
OLLAMA_INSTANCE_COUNTin.env(1-8) to runollama2,ollama3, ... alongside the existingollamacontainer, each pinnable to its own GPU so a large model stays resident instead of being swapped out. The runtime tuning variables (KEEP_ALIVE,NUM_PARALLEL,MAX_LOADED_MODELS,CONTEXT_LENGTH,KV_CACHE_TYPE,GPU_OVERHEAD,SCHED_SPREAD) can be set per instance with anOLLAMA<N>_prefix (e.g.OLLAMA2_KEEP_ALIVE=-1) and fall back to the global value when unset, taking effect on the nextmake restart.OLLAMA<N>_GPU_DEVICESis the exception: it selects that instance's GPU, defaults to GPU N-1, and does not read the globalOLLAMA_GPU_DEVICES. All instances share one model store, so each model is downloaded once. Extra instances are internal only (http://ollama2:11434) with no published ports, matching the rest of the stack; usecaddy-addon/site-*.confto expose one externally. The default of1generates nothing, so existing installs are unchanged. SetOLLAMA_GPU_DEVICESas well when running several instances, otherwise the first one is unpinned and may collide withollama2-make doctorwarns about this (#107).
Changed
- Open WebUI - New installations now store chats, users and settings in the stack's shared PostgreSQL instead of SQLite, removing the
sqlalchemy.exc.OperationalError: (sqlite3.OperationalError) database is lockedfailures that appear with several tabs or devices open, and placing the data in the same backup as the rest of the stack. Existing installations are deliberately left on SQLite: Open WebUI does not migrate data between backends, so switching would present an empty interface while the old chats stayed inwebui.db. To opt in, setOPEN_WEBUI_DATABASE=postgresin.envand runmake restart; see the README for the required volume backup and the migration tooling. Uploaded files and the vector store stay in theopen-webuivolume in both modes (#105).
Fixed
- NocoDB - Fix "Connection to internal hosts is not allowed" (older builds: "Forbidden host name or IP address") when adding the stack's own PostgreSQL, or any container, as an external data source. NocoDB 2026.05.2 added SSRF protection that rejects any data-source host resolving to a private IP range, which covers every hostname on the Docker network, so this broke silently for anyone who updated after that release.
NC_ALLOW_LOCAL_EXTERNAL_DBS=trueis now set for the nocodb service; its webhook and data-import SSRF protections are deliberately left enabled. Connect with hostpostgres, port5432, userpostgresand thePOSTGRES_PASSWORDfrom.env(#106).
Security
- Supabase - The API gateway host port is now bound to loopback by default (
API_GW_HTTP_PORT=127.0.0.1:8000) instead of0.0.0.0:8000, where it attracted continuous internet-wide scanning for no functional benefit. External access already went through Caddy, which reaches the gateway over the Docker network via thekongalias upstream kept after switching from Kong to Envoy, and host-local tooling onhttp://localhost:8000is unaffected. Existing installs are migrated automatically on the nextmake updateormake restart: the new key is force-synced intosupabase/docker/.env, which is the file Compose actually interpolates from, and the legacyKONG_HTTP_PORT/KONG_HTTPS_PORTkeys are rewritten only when still on their insecure defaults. SetAPI_GW_HTTP_PORTto a plain port or a LAN address to expose it deliberately.make doctorgains an Exposed Ports section that warns when the gateway binds to all interfaces. Note that Supabase's upstream compose still publishes0.0.0.0:5432and0.0.0.0:6543for Postgres and the Supavisor pooler, and that Docker's published ports bypassufwentirely - restrict those at your cloud provider's firewall; see the new Security Notes section in the README (#108).
Upgrade
make updateExisting installations are unchanged unless you opt in. Specifically:
- Open WebUI stays on SQLite. Only fresh installs get PostgreSQL, because Open WebUI does not migrate data between backends — switching would show an empty interface while your chats stayed in
webui.db. See "Open WebUI: SQLite or PostgreSQL" in the README for the backup and migration steps. - Ollama still runs one instance.
OLLAMA_INSTANCE_COUNTdefaults to1, which generates nothing. - n8n-MCP is off until you select it in the wizard.
Two changes do apply automatically:
- NocoDB gains
NC_ALLOW_LOCAL_EXTERNAL_DBS=true, so internal data sources work again. Its webhook and data-import SSRF protections stay on. - The Supabase API gateway moves to
127.0.0.1:8000if you run thesupabaseprofile. Caddy is unaffected. To keep it on all interfaces, setAPI_GW_HTTP_PORT=0.0.0.0:8000in.envbefore updating — an address you set yourself is preserved.
Afterwards, make doctor gains checks for the Open WebUI backend, exposed Supabase ports, the n8n-MCP token and per-instance Ollama containers.
Still exposed after this release
The Supabase profile's supavisor service publishes 0.0.0.0:5432 and 0.0.0.0:6543 from upstream's own compose file, and Docker's published ports bypass ufw entirely. Restrict these at your cloud provider's firewall. The pooler port can be closed by setting POOLER_PROXY_PORT_TRANSACTION=127.0.0.1:6543 in supabase/docker/.env; 5432 cannot, because POSTGRES_PORT is reused as a bare numeric port in Supabase's own connection strings. See the new Security Notes section in the README.