Last updated: 2026-05-16
This guide describes how to deploy SPUC with the repository-provided Docker assets:
Dockerfiledocker-compose.yml.env.example
It focuses on the built-in web interface, persistent local state, optional OAuth bootstrap, and optional remote Sigma JSON-RPC connectivity.
Tagged releases publish a multi-arch image to GitHub Container Registry.
docker pull ghcr.io/febrezo/spuc:latest
docker run --rm -p 8090:8090 \
-e SPUC_CONFIG_DIR=/data \
-v spuc_data:/data \
ghcr.io/febrezo/spuc:latest \
web --host 0.0.0.0 --port 8090 --admin-user admin --admin-password '<strong-password>' --no-openThe published image:
- runs as non-root user
spuc - exposes
GET /healthzthrough image-level health checks - ships
spuc,spuc-agent, and local Sigma backends used by SPUC
- Copy the environment template:
cp .env.example .env-
Edit
.envwith the values you want for your environment. -
Start SPUC:
docker compose up --build- Open the published address, by default:
http://127.0.0.1:8090/
The root docker-compose.yml starts one SPUC container that runs:
spuc web --host 0.0.0.0 --port 8090 --admin-user <user> --admin-password <password> --no-openThis deployment:
- publishes the container web service on the host
- persists SPUC file-backed state under
/data - keeps catalog, user, runtime and intrusion-set files across restarts through the
spuc_datavolume - includes local
sigmaplus several backend plugins inside the image
By default, docker-compose.yml uses this image reference:
ghcr.io/febrezo/spuc:latest
-
SPUC_BIND_ADDRESSPurpose: host interface used by Docker when publishing port8090. Typical value:127.0.0.1for local-only access,0.0.0.0to expose on all host interfaces. -
SPUC_IMAGEPurpose: image reference used bydocker-compose.yml. Typical value:ghcr.io/febrezo/spuc:latest. -
SPUC_HOST_PORTPurpose: host port mapped to container port8090. Typical value:8090.
-
SPUC_ADMIN_USERPurpose: username created or synchronized at SPUC startup for local login mode. Typical value:admin. -
SPUC_ADMIN_PASSWORDPurpose: password created or synchronized forSPUC_ADMIN_USER. Required: yes in the provided compose file. Recommendation: use a long random value.
-
SPUC_ADMIN_API_TOKENPurpose: optional fixed personal API token for the bootstrap administrator, intended for containerized connectors and automation. Behavior when empty: no API token is created automatically; any previously environment-managed bootstrap token is revoked, while manually created tokens remain unchanged. Behavior when set: SPUC stores only the token hash in/data/web_user_api_tokens.jsonand grants the token the same principal asSPUC_ADMIN_USER. Recommendation: use a long random value with the normalspuc_pat_prefix for clarity, store it as an orchestrator secret, and do not expose it in logs. -
SPUC_ADMIN_API_TOKEN_NAMEPurpose: display name for the environment-provisioned token. Typical value:Container bootstrap admin token. -
SPUC_ADMIN_API_TOKEN_EXPIRES_ATPurpose: optional RFC3339 expiration timestamp for the environment-provisioned token. Example:2026-12-31T23:59:59Z.
-
SPUC_WEB_GOOGLE_CLIENT_IDPurpose: Google OAuth client ID shown to the SPUC web login flow. -
SPUC_WEB_GOOGLE_CLIENT_SECRETPurpose: Google OAuth client secret paired with the client ID. -
SPUC_WEB_GOOGLE_REDIRECT_URIPurpose: callback URI registered in Google and used by SPUC. Typical local example:http://127.0.0.1:8090/api/login/oauth/google/callback
-
SPUC_WEB_GITHUB_CLIENT_IDPurpose: GitHub OAuth app client ID shown to the SPUC web login flow. -
SPUC_WEB_GITHUB_CLIENT_SECRETPurpose: GitHub OAuth app client secret paired with the client ID. -
SPUC_WEB_GITHUB_REDIRECT_URIPurpose: callback URI registered in GitHub and used by SPUC. Typical local example:http://127.0.0.1:8090/api/login/oauth/github/callback
-
SIGMA_RPC_URLPurpose: optional remote Sigma JSON-RPC endpoint used by SPUC for backend discovery and delegated Sigma conversions. Typical value:http://sigma-jsonrpc:8080/jsonrpcin multi-container setups. Behavior when empty: SPUC falls back to localsigmainside the image. -
SPUC_SIGMA_RPC_TOKENPurpose: optional bearer token sent to the remote Sigma JSON-RPC service. Behavior when empty: no auth token is sent.
The compose deployment sets:
SPUC_CONFIG_DIR=/data
That means the container persists the same file-backed SPUC state described in configuration docs, including:
web_users.jsonweb_user_api_tokens.jsonweb_oauth_policy.jsonabilities/*.jsoncatalog/translation_activities.jsonlintrusion_sets/*.yamlstix-objects.jsonsigma/runtime.json
- The SPUC process inside the container binds to
0.0.0.0, but host exposure is still controlled bySPUC_BIND_ADDRESS. - OAuth providers can still remain disabled in the UI until an administrator authorizes them in
Settings. - If
SIGMA_RPC_URLis not configured, the image still supports local Sigma discovery because the Docker image installssigma-cliand several backend plugins.