Files
LocalAI/core/http/middleware/backend_install.go
T
Plamen K. Kosseff 7b9ef6a0f8 feat(backends): --disable-backend-install disables backend downloads. (#12754)
feat(backends): --disable-backend-install refuses every backend acquisition

A hardening switch for deployments that must run exactly the backend set they
were tested with (production, air-gapped, immutable images, package-managed
hosts). With LOCALAI_DISABLE_BACKEND_INSTALL=1 every install and upgrade path
refuses — gallery, OCI/URL/path, node-scoped, auto-upgrade, boot-time external
backends — HTTP routes answer 403 up front, and a model whose backend is
missing is refused before any download: 409 on the API, an error on preload
and import. Whether a backend is present is asked of the execution target:
the local backend directory on a single node, the workers' listings on a
distributed frontend, which installs nothing itself. Backends already
present, including system-path ones, keep working.

Assisted-by: Claude Code:claude-fable-5

Signed-off-by: Plamen K. Kosseff <p.kosseff@gmail.com>
2026-10-22 17:58:53 +02:00

28 lines
991 B
Go

package middleware
import (
"net/http"
"github.com/labstack/echo/v4"
"github.com/mudler/LocalAI/core/config"
)
// RequireBackendInstallEnabled rejects backend install and upgrade requests
// up front when the server runs with --disable-backend-install. The install
// path refuses them too (gallery.ErrBackendInstallDisabled), but that only
// surfaces as a failed background job; refusing at admission gives the
// client an immediate, explicit answer.
func RequireBackendInstallEnabled(appConfig *config.ApplicationConfig) echo.MiddlewareFunc {
return func(next echo.HandlerFunc) echo.HandlerFunc {
return func(c echo.Context) error {
if appConfig.DisableBackendInstall {
return c.JSON(http.StatusForbidden, map[string]any{
"error": "Backend installation is disabled on this server (--disable-backend-install). Backends are provided by the system; install the backend outside LocalAI.",
"code": "backend_install_disabled",
})
}
return next(c)
}
}
}