19 KiB
Configuration reference
Generated from the typed settings by scripts/generate_configuration_docs.py for ITWorx ModelForge 1.2.1. Every setting the control plane reads appears here; a setting added without documentation fails the build.
All settings are environment variables with the MODELFORGE_ prefix, read from the process environment or from .env.
Required in production
MODELFORGE_ENV=production turns on fail-closed startup validation. With it set, the control plane refuses to start unless each of these is present and sound:
MODELFORGE_DATABASE_URL— SQLAlchemy URL for the API's non-owner modelforge_runtime role. It may read the audit trail and execute the canonical append function, but cannot mutate audit tables directly.MODELFORGE_REDIS_URL— Redis URL for transient request payloads and queues.MODELFORGE_OPERATOR_API_KEY— Operator API key guarding every admin route. Generate at least 32 random characters; ModelForge never mints one for you.MODELFORGE_BACKUP_ENCRYPTION_KEY— Base64 AES-256 key for backup encryption. Without it no backup can be produced, and without the same key no backup can be restored — store it outside this deployment.
Production additionally refuses: a well-known development database password, a wildcard CORS origin, remote model code execution, an unwritable storage root, an unsupported schema revision, a PostgreSQL major below 16, and three policy combinations that cannot all hold at once.
Generating secrets
ModelForge never mints its own credentials — a platform that generates its own admin secret has no way to tell you it did. Generate them yourself and store them outside the deployment:
# Operator API key (at least 32 characters)
python -c "import secrets; print(secrets.token_urlsafe(48))"
# Backup encryption key (base64 AES-256)
python -c "import base64, os; print(base64.b64encode(os.urandom(32)).decode())"
# Database password
python -c "import secrets; print(secrets.token_urlsafe(32))"
Losing the backup encryption key makes every existing backup unrecoverable. It is the one value that must be stored somewhere the deployment cannot take down with it.
Sensitivity
5 settings are credentials. They are never logged, never written to a release artefact and never echoed in an error response:
MODELFORGE_DATABASE_URLMODELFORGE_MIGRATION_DATABASE_URLMODELFORGE_OPERATOR_API_KEYMODELFORGE_HF_TOKENMODELFORGE_BACKUP_ENCRYPTION_KEY
Every setting
| Variable | Type | Default | Required | Sensitivity | Description |
|---|---|---|---|---|---|
MODELFORGE_ENV |
development, test, production |
development |
no | public | Deployment profile. 'production' turns on every fail-closed startup rule; 'development' and 'test' report the same problems without refusing to start. |
MODELFORGE_API_HOST |
string | 0.0.0.0 |
no | public | Interface the API binds inside its container. Leave at 0.0.0.0. |
MODELFORGE_API_PORT |
integer | 8000 |
no | public | Port the API listens on inside its container. |
MODELFORGE_CONTROL_PLANE_MAX_PAYLOAD_BYTES |
integer | 1048576 |
no | public | Pre-parser request-body limit for public and operator control-plane routes. |
MODELFORGE_SERVICE_NAME |
string | modelforge-api |
no | public | Name this process reports in logs and audit events. |
MODELFORGE_LOG_LEVEL |
string | INFO |
no | public | Structured log level: DEBUG, INFO, WARNING or ERROR. |
MODELFORGE_DATABASE_URL |
string | — | yes | secret | SQLAlchemy URL for the API's non-owner modelforge_runtime role. It may read the audit trail and execute the canonical append function, but cannot mutate audit tables directly. |
MODELFORGE_MIGRATION_DATABASE_URL |
secret, optional | — | no | secret | SQLAlchemy URL for the non-superuser modelforge schema-owner role. Set only in the one-shot migration process; production API startup refuses when this secret is present. |
MODELFORGE_REDIS_URL |
string | redis://localhost:6379/0 |
yes | internal | Redis URL for transient request payloads and queues. |
MODELFORGE_CORS_ORIGINS |
string | http://localhost:3000 |
no | public | Comma-separated exact origins allowed to call the API from a browser. A wildcard is refused in production because requests are credentialed. |
MODELFORGE_OPERATOR_API_KEY |
secret, optional | — | yes | secret | Operator API key guarding every admin route. Generate at least 32 random characters; ModelForge never mints one for you. |
MODELFORGE_HF_TOKEN |
secret, optional | — | no | secret | Optional Hugging Face token, used only for acquiring gated repositories. It is never passed to a runtime and never leaves the control plane. |
MODELFORGE_BACKUP_ENCRYPTION_KEY |
secret, optional | — | yes | secret | Base64 AES-256 key for backup encryption. Without it no backup can be produced, and without the same key no backup can be restored — store it outside this deployment. |
MODELFORGE_BACKUP_ENCRYPTION_KEY_ID |
string | modelforge-backup-key-1 |
no | public | Identifier recorded in each backup manifest so a restore can name the key it needs. |
MODELFORGE_HF_HOME |
string | /data/hf-cache |
no | public | Hugging Face cache root inside the container. |
MODELFORGE_ARTIFACT_ROOT |
string | /data/artifacts |
no | public | Verified model artifact root. Must exist and be writable. |
MODELFORGE_QUARANTINE_ROOT |
string | /data/quarantine |
no | public | Where acquired artifacts are held until their checks pass. |
MODELFORGE_RUNTIME_ARTIFACT_ROOT |
string | /models/model-registry |
no | public | Artifact root as a runtime worker sees it on a compute node. |
MODELFORGE_CONFIG_ROOT |
path | PydanticUndefined |
no | public | Directory holding the capability, project and policy manifests. |
MODELFORGE_BACKUP_ROOT |
path | /data/backups |
no | public | Backup destination. Must exist and be writable, or backups fail closed. |
MODELFORGE_BACKUP_RESTORE_ROOT |
path | /data/restore |
no | public | Working directory a restore stages into before it commits. |
MODELFORGE_ALEMBIC_DIRECTORY |
path, optional | — | no | public | Override for the migration directory. Leave empty in a container. |
MODELFORGE_HF_TIMEOUT_SECONDS |
number | 30 |
no | public | Per-request timeout for Hugging Face metadata calls. |
MODELFORGE_HF_SNAPSHOT_TTL_SECONDS |
integer | 3600 |
no | public | How long a resolved upstream snapshot stays cached. |
MODELFORGE_ALLOW_REMOTE_CODE |
boolean | false |
no | public | Whether model repositories may execute their own Python. Always false in production; startup refuses any other value there. |
MODELFORGE_ENABLE_GPU_TELEMETRY |
boolean | true |
no | public | Collect GPU telemetry on this host. |
MODELFORGE_HARDWARE_REFRESH_ON_STARTUP |
boolean | false |
no | public | Run a hardware inventory pass when the process starts. |
MODELFORGE_HARDWARE_POLL_INTERVAL_SECONDS |
integer | 30 |
no | public | Interval between hardware inventory passes. |
MODELFORGE_NODE_IDENTITY |
string, optional | — | no | internal | Explicit node identity. Leave empty to use the persisted file. |
MODELFORGE_NODE_IDENTITY_MODE |
auto, persisted |
auto |
no | public | 'persisted' keeps a node's identity across restarts; 'auto' derives it. |
MODELFORGE_NODE_IDENTITY_FILE |
path | /data/state/node-id |
no | public | Where a persisted node identity is stored. |
MODELFORGE_NODE_STALE_AFTER_SECONDS |
integer | 30 |
no | public | Silence after which a node is considered stale. |
MODELFORGE_NODE_OFFLINE_AFTER_SECONDS |
integer | 90 |
no | public | Silence after which a node is considered offline. Must exceed the stale threshold. |
MODELFORGE_LIVENESS_POLL_INTERVAL_SECONDS |
integer | 5 |
no | public | How often node liveness is re-evaluated. |
MODELFORGE_AGENT_MAX_CLOCK_SKEW_SECONDS |
integer | 300 |
no | public | Clock skew tolerated on an agent report before refusal. |
MODELFORGE_NODE_AGENT_MAX_PAYLOAD_BYTES |
integer | 4194304 |
no | public | Pre-parser request-body limit for enrollment and authenticated Node Agent reports. |
MODELFORGE_NODE_LIVENESS_MONITOR_ENABLED |
boolean | false |
no | public | Run the node liveness monitor in this process. |
MODELFORGE_AGENT_PROTOCOL_VERSION |
integer | 1 |
no | public | Agent protocol version this control plane speaks. |
MODELFORGE_GATEWAY_MAX_BATCH_SIZE |
integer | 8 |
no | public | Maximum inputs accepted in a single capability invocation. |
MODELFORGE_GATEWAY_MAX_INPUT_CHARACTERS |
integer | 8192 |
no | public | Maximum characters per input item. |
MODELFORGE_GATEWAY_MAX_PAYLOAD_BYTES |
integer | 65536 |
no | public | Maximum accepted request body size. |
MODELFORGE_GATEWAY_REQUEST_TIMEOUT_SECONDS |
integer | 45 |
no | public | Total time a capability invocation may take. Must exceed the queue timeout. |
MODELFORGE_GATEWAY_QUEUE_TIMEOUT_SECONDS |
integer | 30 |
no | public | How long a request may wait for capacity before rejection. |
MODELFORGE_SERVING_JOB_LEASE_SECONDS |
integer | 120 |
no | public | Lease held by a serving job before it is reclaimed. |
MODELFORGE_SERVING_PAYLOAD_TTL_SECONDS |
integer | 120 |
no | public | How long a request payload survives in Redis. |
MODELFORGE_SCHEDULER_SAFETY_RESERVE_BYTES |
integer | 1073741824 |
no | public | VRAM never offered to a placement, as an absolute floor. |
MODELFORGE_SCHEDULER_SAFETY_RESERVE_PERCENTAGE |
number | 0.05 |
no | public | VRAM never offered to a placement, as a fraction. Half a device leaves nothing schedulable. |
MODELFORGE_SCHEDULER_RUNTIME_MARGIN_BYTES |
integer | 268435456 |
no | public | Headroom reserved for runtime overhead per node. |
MODELFORGE_SCHEDULER_DEPLOYMENT_MARGIN_BYTES |
integer | 134217728 |
no | public | Absolute headroom added to each deployment estimate. |
MODELFORGE_SCHEDULER_DEPLOYMENT_MARGIN_PERCENTAGE |
number | 0.1 |
no | public | Proportional headroom added to each estimate. |
MODELFORGE_SCHEDULER_GLOBAL_QUEUE_LIMIT |
integer | 128 |
no | public | Queued requests accepted before capacity rejection begins. |
MODELFORGE_SCHEDULER_TELEMETRY_STALE_SECONDS |
integer | 90 |
no | public | Telemetry age past which admission is blocked rather than extrapolated. |
MODELFORGE_SCHEDULER_PRESSURE_STABLE_SECONDS |
integer | 30 |
no | public | How long pressure must hold before the state changes. |
MODELFORGE_SCHEDULER_EVICTION_COOLDOWN_SECONDS |
integer | 60 |
no | public | Minimum interval between evictions on a node. |
MODELFORGE_SCHEDULER_PLACEMENT_HISTORY_LIMIT |
integer | 500 |
no | public | Placement decisions retained for inspection. |
MODELFORGE_REGISTRY_SEED_ON_STARTUP |
boolean | false |
no | public | Seed the candidate and project registries from manifests. |
MODELFORGE_SERVING_RECONCILIATION_ENABLED |
boolean | false |
no | public | Reconcile abandoned serving work in this process. |
MODELFORGE_SERVING_RECONCILIATION_INTERVAL_SECONDS |
integer | 5 |
no | public | Interval between serving reconciliation passes. |
MODELFORGE_LIFECYCLE_RECONCILIATION_ENABLED |
boolean | false |
no | public | Roll back incomplete lifecycle operations at startup. |
MODELFORGE_MIGRATION_RECONCILIATION_ENABLED |
boolean | false |
no | public | Report interrupted migration cutovers at startup. They are never auto-resolved: external alias truth cannot be inferred after a crash. |
MODELFORGE_OBSERVABILITY_MONITOR_ENABLED |
boolean | false |
no | public | Run SLO and alert evaluation in this process. |
MODELFORGE_OBSERVABILITY_POLL_INTERVAL_SECONDS |
integer | 60 |
no | public | Interval between observability evaluation passes. |
MODELFORGE_RECOVERY_RECONCILIATION_ENABLED |
boolean | false |
no | public | Reconcile interrupted backups and restores at startup. |
MODELFORGE_BACKUP_PG_DUMP_PATH |
string | pg_dump |
no | public | pg_dump executable. Must match the server major version. |
MODELFORGE_BACKUP_PG_RESTORE_PATH |
string | pg_restore |
no | public | pg_restore executable. |
MODELFORGE_BACKUP_PSQL_PATH |
string | psql |
no | public | psql executable. |
MODELFORGE_BACKUP_COMMAND_TIMEOUT_SECONDS |
integer | 1800 |
no | public | Timeout for a dump or restore command. |
MODELFORGE_BACKUP_STALE_AFTER_SECONDS |
integer | 93600 |
no | public | Age past which the newest verified backup raises BACKUP_STALE. |
MODELFORGE_BACKUP_MINIMUM_FREE_BYTES |
integer | 1073741824 |
no | public | Free space below which a backup refuses to start. |
MODELFORGE_BACKUP_CAPACITY_HEADROOM_RATIO |
number | 3.0 |
no | public | Required free space as a multiple of the estimated size. |
MODELFORGE_RESTORE_ALLOW_PRODUCTION_TARGET |
boolean | false |
no | public | Whether a restore may overwrite the live database. Keep false outside a rehearsal. |
MODELFORGE_BUILD_COMMIT |
string, optional | — | no | public | Source commit stamped into the image at build time. Never set by hand. |
MODELFORGE_BUILD_TIMESTAMP |
string, optional | — | no | public | Build time stamped into the image. Never set by hand. |
MODELFORGE_BUILD_IMAGE_DIGEST |
string, optional | — | no | public | Image digest recorded at deployment. Never set by hand. |
Deployment variables
Read by Compose, the Node Agent and the Runtime Worker rather than by the control-plane process. An operator still has to set them, so they are documented here too.
| Variable | Required | Sensitivity | Description |
|---|---|---|---|
MODELFORGE_POSTGRES_BIND |
no | public | Host address the control-plane database is published on. Defaults to 127.0.0.1; publishing it more widely exposes provenance, credential hashes and the audit trail. |
MODELFORGE_REDIS_BIND |
no | public | Host address Redis is published on. Defaults to 127.0.0.1. |
MODELFORGE_API_BIND |
no | public | Host address the API is published on. Defaults to 0.0.0.0 deliberately: the console and compute nodes need it, and every admin route is operator-authenticated. |
MODELFORGE_WEB_BIND |
no | public | Host address the console is published on. Defaults to 127.0.0.1. |
MODELFORGE_POSTGRES_PORT |
no | public | Host port the database is published on. Defaults to 5432. |
MODELFORGE_REDIS_PORT |
no | public | Host port Redis is published on. Defaults to 6379. |
MODELFORGE_API_PUBLISHED_PORT |
no | public | Host port the API is published on. Defaults to 8000. |
MODELFORGE_WEB_PORT |
no | public | Host port the console is published on. Defaults to 3000. |
MODELFORGE_DR_POSTGRES_BIND |
no | public | Host address for the DR rehearsal database. Loopback only. |
MODELFORGE_DR_API_BIND |
no | public | Host address for the DR rehearsal API. Loopback only. |
VITE_API_BASE_URL |
no | public | API base URL compiled into the console. Vite inlines it at build time, so changing it requires rebuilding the console image, not restarting it. |
MODELFORGE_POSTGRES_DB |
no | public | Production database name. Required by the production overlay. |
MODELFORGE_POSTGRES_ADMIN_USER |
no | internal | Bootstrap/admin role used only by PostgreSQL provisioning; defaults to postgres. |
MODELFORGE_POSTGRES_ADMIN_PASSWORD |
yes | secret | Bootstrap/admin password; never passed to the migration or API container. |
MODELFORGE_MIGRATION_DB_PASSWORD |
yes | secret | Raw password supplied to provisioning for the non-superuser modelforge owner role. |
MODELFORGE_RUNTIME_DB_PASSWORD |
yes | secret | Raw password supplied to provisioning for the non-owner modelforge_runtime role. |
MODELFORGE_RUNTIME_DATABASE_URL |
yes | secret | Non-owner runtime-role URL passed only to the API container. |
MODELFORGE_VERSION |
no | public | Exact version tag applied to built images and required when the production overlay is not given explicit API and web image references. |
MODELFORGE_COMMIT |
no | public | Source commit stamped into images at build time. |
MODELFORGE_BUILT_AT |
no | public | Build timestamp stamped into images. |
MODELFORGE_API_IMAGE |
no | public | Exact tag or digest the production overlay runs for the API; never use latest. |
MODELFORGE_WEB_IMAGE |
no | public | Exact tag or digest the production overlay runs for the console; never use latest. |
MODELFORGE_NODE_AGENT_IMAGE |
no | public | Exact release tag or digest for the standalone Node Agent. The local-build fallback is named local and never resolves to latest. |
MODELFORGE_API_IMAGE_DIGEST |
no | public | Digest recorded as the running API build identity. |
MODELFORGE_BACKUP_VOLUME |
no | public | Volume or bind path backing the backup root. |
MODELFORGE_RESTORE_VOLUME |
no | public | Volume or bind path backing the restore staging root. |
MODELFORGE_AGENT_STATE_VOLUME |
no | public | Volume or bind path holding the agent's persisted identity. |
MODELFORGE_AGENT_HF_CACHE_VOLUME |
no | public | Volume or bind path for the agent's Hugging Face cache. |
MODELFORGE_AGENT_ARTIFACT_VOLUME |
no | public | Volume or bind path for verified artifacts on a node. |
MODELFORGE_AGENT_QUARANTINE_VOLUME |
no | public | Volume or bind path for the node's quarantine area. |
MODELFORGE_AGENT_CONTROL_PLANE_URL |
no | public | URL the agent reports to. Outbound only; the control plane never dials a node. |
MODELFORGE_AGENT_ENROLLMENT_TOKEN |
no | secret | Single-use enrolment token. Consumed atomically: a storm against one token produces exactly one identity. |
MODELFORGE_AGENT_HOSTNAME |
no | public | Hostname the agent enrols under. |
MODELFORGE_AGENT_ACCELERATOR_MODE |
no | public | Accelerator contract: nvidia fails closed unless NVML inventory and telemetry are valid; cpu permits a legitimate CPU-only node; auto requires NVIDIA when injected devices are observed. Canonical GPU Compose deployments set nvidia explicitly. |
MODELFORGE_AGENT_TLS_VERIFY |
no | public | Whether the agent verifies the control plane's certificate. True wherever TLS is real. |
MODELFORGE_AGENT_CONTROL_PLANE_HOST_ADDRESS |
no | internal | Host address mapped for a private-CA deployment. |
MODELFORGE_AGENT_CA_CERT_PATH |
no | public | Path to the private CA certificate the agent trusts. |
MODELFORGE_RUNTIME_WORKER_ARTIFACT_ROOT |
no | public | Artifact root as the runtime worker sees it. |
MODELFORGE_RUNTIME_WORKER_POLL_INTERVAL_SECONDS |
no | public | Worker poll interval, in seconds. |
MODELFORGE_SOURCE_COMMIT |
no | public | Source commit reported by the deployment. |
MODELFORGE_SOURCE_REFERENCE |
no | public | Git reference reported by the deployment. |
MODELFORGE_SOURCE_REPOSITORY |
no | public | Repository URL reported by the deployment. |
Restarts
Every setting is read at process start. Changing any of them requires restarting the control plane; none is re-read from the environment while the process is running.