Skip to content

Spindle configuration

Spindle is configured by environment variables only. Durations use Go syntax (5m, 720h) and lists are comma-separated.

VariableDefaultDescription
SPINDLE_ROLEstandalonestandalone ingests events and runs jobs, mill ingests events and places jobs on executors, executor dials a mill and runs jobs.
SPINDLE_LOG_FORMATtextFormat of logs on stderr: text or json.
VariableDefaultDescription
SPINDLE_SERVER_HOSTNAMErequiredPublic hostname. The spindle DID is did:web:<hostname>.
SPINDLE_SERVER_OWNERrequired in standalone and millDID of the spindle owner, always an admin.
SPINDLE_SERVER_ADMINSunsetDIDs of additional admins. Each entry must be a valid DID.
SPINDLE_SERVER_ADMISSIONclosedclosed serves admins and the allow-list, open serves anyone who is not banned.
SPINDLE_SERVER_KEY_PATHrequired in standalone and millPEM file with the EC P-256 private key behind /.well-known/did.json.
SPINDLE_SERVER_LISTEN_ADDR0.0.0.0:6555HTTP listen address.
SPINDLE_SERVER_METRICS_LISTEN_ADDR127.0.0.1:9091Prometheus metrics listen address.
SPINDLE_SERVER_DB_PATHspindle.dbSQLite database path. Also the default --db of the admin subcommands.
SPINDLE_SERVER_REPO_DIRreposDirectory of per-repo checkouts.
SPINDLE_SERVER_JETSTREAM_ENDPOINTwss://jetstream1.us-west.bsky.network/subscribeJetstream endpoint for live events.
SPINDLE_SERVER_PLC_URLhttps://plc.directoryPLC directory for DID resolution.
SPINDLE_SERVER_DEVfalseDevelopment mode: allows plain HTTP and private-network addresses for knots, webhooks, clones and backfill.
SPINDLE_SERVER_DEV_EXTRA_HOSTSunsetHostnames mapped to host-gateway in nixery workflow containers.
SPINDLE_SERVER_LOG_DIR/var/log/spindleDirectory of workflow log files. In standalone, the disk artifact store when SPINDLE_ARTIFACT_STORES_DISK_DIR is unset.
SPINDLE_SERVER_LOG_MAX_BYTES33554432Maximum size of one workflow’s stored log, in bytes. Output past it is dropped. 0 means no cap.
SPINDLE_SERVER_MAX_JOB_COUNT2Pipelines that run at once.
SPINDLE_SERVER_REPO_JOB_WORKERS256Repos refreshed at once, shared between knots. Must be greater than zero.
SPINDLE_SERVER_NOTIFY_SLOTS64Knot notify events processed at once, shared between knots. Must be greater than zero.
SPINDLE_SERVER_PRIORITY_KNOTSunsetKnot hosts or did:web DIDs that get reserved repo job workers and notify slots.
SPINDLE_SERVER_PRIORITY_REPO_JOB_WORKERS0Repo job workers reserved for priority knots. 0 means a quarter of SPINDLE_SERVER_REPO_JOB_WORKERS.
SPINDLE_SERVER_PRIORITY_NOTIFY_SLOTS0Notify slots reserved for priority knots. 0 means a quarter of SPINDLE_SERVER_NOTIFY_SLOTS.
SPINDLE_SERVER_DOCKER_SOCKETunsetDocker socket mounted into nixery workflow containers and set as their DOCKER_HOST.
SPINDLE_SERVER_CORS_ORIGINSunsetOrigins allowed to call XRPC from a browser, or * for any. Unset disables CORS.
SPINDLE_SERVER_LOGS_ADDRunsethost:port of a cilogs SSH server, returned to a knot whose push scheduled a pipeline.

Served by org.tangled.spindle.describeSpindle.

VariableDefaultDescription
SPINDLE_CONTACT_EMAILrequired in standalone and millOperator contact email.
SPINDLE_LINKS_PRIVACY_POLICYunsetPrivacy policy URL. Absolute.
SPINDLE_LINKS_TERMS_OF_SERVICEunsetTerms of service URL. Absolute.
VariableDefaultDescription
SPINDLE_SERVER_HYDRANT_DIRhydrantDirectory of the embedded hydrant database, its API socket and the spindle cursor.
VariableDefaultDescription
SPINDLE_SERVER_SECRETS_PROVIDERsqlitesqlite stores secrets in the spindle database, openbao uses an OpenBao Proxy.
SPINDLE_SERVER_SECRETS_OPENBAO_PROXY_ADDRhttp://127.0.0.1:8200OpenBao Proxy address.
SPINDLE_SERVER_SECRETS_OPENBAO_MOUNTspindleKV v2 mount.
VariableDefaultDescription
SPINDLE_NIXERY_PIPELINES_NIXERYnixery.tangled.shNixery host that builds workflow images.
SPINDLE_NIXERY_PIPELINES_WORKFLOW_TIMEOUT5mDefault workflow timeout.
SPINDLE_NIXERY_PIPELINES_MAX_JOB_MEMORY_MB6144Memory limit per workflow container, in MiB.
SPINDLE_NIXERY_PIPELINES_MAX_CONCURRENT_WORKFLOWS8Workflow containers running at once.
VariableDefaultDescription
SPINDLE_MICROVM_PIPELINES_IMAGE_DIRunsetDirectory of microVM images. Required by microVM workflows.
SPINDLE_MICROVM_PIPELINES_OVERLAY_DIRsystem temp dirDirectory of per-workflow temporary disks.
SPINDLE_MICROVM_PIPELINES_DEFAULT_IMAGEnixos-x86_64Image used when a workflow sets no image.
SPINDLE_MICROVM_PIPELINES_AGENT_PORT10240vsock port of the guest agent.
SPINDLE_MICROVM_PIPELINES_ENABLE_KVMtrueUse KVM acceleration.
SPINDLE_MICROVM_PIPELINES_WORKFLOW_TIMEOUT5mDefault workflow timeout.
SPINDLE_MICROVM_PIPELINES_AGING_THRESHOLD30sQueue time after which smaller requests can no longer go ahead of a workflow.
SPINDLE_MICROVM_PIPELINES_MAX_TOTAL_MEMORY_MIB0Memory across all running microVMs, in MiB. 0 means unlimited.
SPINDLE_MICROVM_PIPELINES_MAX_TOTAL_VCPUS0vCPUs across all running microVMs. 0 means unlimited.
SPINDLE_MICROVM_PIPELINES_MAX_TOTAL_DISK_MIB0Disk across all running microVMs, in MiB. 0 means unlimited.
SPINDLE_MICROVM_PIPELINES_MAX_WORKFLOW_MEMORY_MIB0Memory one workflow may request, in MiB. 0 means unlimited.
SPINDLE_MICROVM_PIPELINES_MAX_WORKFLOW_VCPUS0vCPUs one workflow may request. 0 means unlimited.
SPINDLE_MICROVM_PIPELINES_MAX_WORKFLOW_DISK_MIB0Disk one workflow may request, in MiB. 0 means unlimited.
VariableDefaultDescription
SPINDLE_MICROVM_PIPELINES_ENABLE_CGROUPSfalseRun each workflow’s processes in a per-workflow cgroup.
SPINDLE_MICROVM_PIPELINES_CGROUP_PARENTselfParent cgroup. self is the spindle process’s own cgroup.
SPINDLE_MICROVM_PIPELINES_CGROUP_PIDS_MAX4096Process limit per workflow cgroup.
SPINDLE_MICROVM_PIPELINES_CGROUP_SWAP_MAX_MIBunsetSwap limit per workflow cgroup, in MiB.
SPINDLE_MICROVM_PIPELINES_CGROUP_CPU_MAX_PERCENT0CPU quota as a percentage of one core. 0 caps each VM at its vCPU count, negative disables the limit.
SPINDLE_MICROVM_PIPELINES_CGROUP_IO_WEIGHT0IO weight, 1 to 10000. 0 leaves IO unlimited.
SPINDLE_MICROVM_PIPELINES_CGROUP_SUPERVISOR_MEMORY_MIN_MIB512memory.min of the spindle supervisor cgroup, in MiB.
VariableDefaultDescription
SPINDLE_MICROVM_PIPELINES_DEBUG_SSH_ENABLEDfalseAllow SSH into the VM of a failed workflow.
SPINDLE_MICROVM_PIPELINES_DEBUG_SSH_LISTEN_ADDR0.0.0.0:2222Debug SSH listen address.
SPINDLE_MICROVM_PIPELINES_DEBUG_SSH_HOSTunsetHost in the printed SSH command.
SPINDLE_MICROVM_PIPELINES_DEBUG_SSH_JUMP_HOSTunsetJump host in the printed SSH command.
SPINDLE_MICROVM_PIPELINES_DEBUG_SSH_HOST_KEY_PATHunsetHost private key. Unset generates one next to the database.
SPINDLE_MICROVM_PIPELINES_DEBUG_SSH_GRACE_PERIOD5mTime a failed workflow’s VM stays up after failure.
VariableDefaultDescription
SPINDLE_NIX_CACHE_READ_URLSunsetBinary caches microVM guests read from.
SPINDLE_NIX_CACHE_TRUSTED_PUBLIC_KEYSunsetTrusted public keys for those caches.
SPINDLE_NIX_CACHE_UPLOAD_URLunsetBinary cache that paths built in the guest are uploaded to.
SPINDLE_NIX_CACHE_REQUIRE_SIGNED_UPLOADSfalseRequire uploaded narinfos to be signed by a trusted key.
SPINDLE_NIX_CACHE_MAX_STAGED_MIB5120Upload staging limit, in MiB. Must be greater than zero.
SPINDLE_NIX_CACHE_MAX_STAGED_OBJECTS1024Upload staging object limit. Must be greater than zero.
VariableDefaultDescription
SPINDLE_CACHE_BACKENDunsetdisk or s3. Unset disables the cache.
SPINDLE_CACHE_DISK_DIRcache next to the databaseDirectory of the disk backend.
SPINDLE_CACHE_S3_BUCKETunsetUnversioned bucket of the s3 backend.
SPINDLE_CACHE_S3_PREFIXspindle/cacheKey prefix in the bucket.
SPINDLE_CACHE_STORE_IDunsetIdentity of a shared cache store. A mill places cached workflows only on executors with the same value; unset on a mill disables the cache.
SPINDLE_CACHE_RETENTION720hTime since last use after which an entry is deleted. 0 keeps entries forever.
SPINDLE_CACHE_PRUNE_INTERVAL1hInterval between prunes of expired entries.
SPINDLE_CACHE_MAX_BYTES_PER_OWNER10737418240Bytes stored across all repos of one owner. 0 means unlimited.
SPINDLE_CACHE_MAX_ENTRIES_PER_OWNER1000Entries across all repos of one owner. 0 means unlimited.
VariableDefaultDescription
SPINDLE_ARTIFACT_STORES_DISK_DIRunsetDirectory of the disk store.
SPINDLE_ARTIFACT_STORES_S3_BUCKETunsetBucket of the S3 store.
SPINDLE_ARTIFACT_STORES_S3_REGIONus-east-1Region of the S3 store.
SPINDLE_S3_LOG_BUCKETunsetDeprecated alias of SPINDLE_ARTIFACT_STORES_S3_BUCKET.
VariableDefaultDescription
SPINDLE_QUOTA_{USER,REPO}_WORKFLOWS0Concurrent workflows. 0 means unlimited, negative is rejected.
SPINDLE_QUOTA_{USER,REPO}_VCPUS0Concurrent vCPUs. 0 means unlimited, negative is rejected.
SPINDLE_QUOTA_{USER,REPO}_MEMORY_MIB0Concurrent memory, in MiB. 0 means unlimited, negative is rejected.
SPINDLE_QUOTA_{USER,REPO}_DISK_MIB0Concurrent disk, in MiB. 0 means unlimited, negative is rejected.
SPINDLE_QUOTA_{USER,REPO}_CACHE_STORAGE_MIB0CI cache storage, in MiB. 0 means unlimited, negative is rejected.
SPINDLE_QUOTA_{USER,REPO}_WEBHOOKS0Webhooks. 0 means unlimited, negative is rejected.
SPINDLE_QUOTA_{USER,REPO}_CI_MINUTES_MONTHLY0CI minutes per calendar month. 0 means unlimited, negative is rejected.
VariableDefaultDescription
SPINDLE_OIDC_ISSUERunsetiss claim of workflow ID tokens. Must be set with SPINDLE_OIDC_KEY_PATH.
SPINDLE_OIDC_KEY_PATHunsetPEM file with an EC P-256 private key. Must be set with SPINDLE_OIDC_ISSUER.
SPINDLE_OIDC_KEY_IDkey thumbprintkid header. Defaults to the RFC 7638 thumbprint of the key.
VariableDefaultRoleDescription
SPINDLE_MILL_URLunsetexecutorMill websocket endpoint. Required in executor, rejected in other roles.
SPINDLE_MILL_SHARED_SECRETunsetexecutorExecutor token for the mill. Required in executor.
SPINDLE_MILL_SEATS4executorSeats advertised to the mill.
SPINDLE_MILL_LABELSunsetexecutorCapability labels advertised to the mill.
SPINDLE_MILL_ARTIFACT_STOREunsetmill, executorName of the artifact store shared by the mill and its executors. Optional when exactly one store is configured.
SPINDLE_MILL_MAX_PENDING100millPending job queue limit.
SPINDLE_MILL_RECONNECT_GRACE45smillReconnect window of an executor before its leases fail.
SPINDLE_MILL_CANCEL_ACK_TIMEOUT10smillWait for an executor to acknowledge a cancel.
SPINDLE_MILL_CANCEL_TEARDOWN_TIMEOUT10mmillWait for a cancelled job to tear down.
SPINDLE_MILL_DRAIN_TIMEOUT20mallDrain time on shutdown. Must be greater than zero.
SPINDLE_MILL_JUMP_LISTEN_ADDRunsetmillSSH jump listen address for debug sessions on executors. Requires SPINDLE_MILL_JUMP_HOST_KEY_PATH.
SPINDLE_MILL_JUMP_HOST_KEY_PATHunsetmillHost key of the jump listener.
SPINDLE_MILL_DEBUG_EXECUTOR_PORT2223millExecutor debug SSH port that the jump host forwards to.
SPINDLE_MILL_MAX_JUMP_CONNECTIONS128millConcurrent jump connections. Must be greater than zero when the jump listener is set.
VariableDefaultDescription
SPINDLE_SCHEDULE_MINIMUM_INTERVAL5mShortest schedule interval. Must be a positive whole number of minutes.
SPINDLE_SCHEDULE_CONCURRENCY4Scheduled runs started at once. Must be greater than zero.
VariableDefaultDescription
CILOGS_LISTEN_ADDR0.0.0.0:3333SSH listen address.
CILOGS_HOST_KEY_PATHunsetHost key path, created when missing. Unset uses ./id_ed25519.
CILOGS_PLC_URLhttps://plc.directoryPLC directory for DID resolution.
CILOGS_DEVunsettrue allows plain HTTP and private-network addresses.
VariableDefaultDescription
SPINDLE_TRACING_ENDPOINTunsetOTLP/HTTP endpoint for traces. Unset disables tracing.
SPINDLE_TRACING_SERVICE_NAMEspindleService name on traces.
SPINDLE_TRACING_SAMPLE_RATIO1Sampling ratio, 0 to 1.
SPINDLE_TRACING_INSECUREfalseUse plain HTTP to the collector.
SPINDLE_LOGGING_ENDPOINTunsetOTLP/HTTP endpoint for logs. Unset keeps logs on stderr.
SPINDLE_LOGGING_SERVICE_NAMEspindleService name on logs.
SPINDLE_LOGGING_INSECUREfalseUse plain HTTP to the collector.