Operations
Run modes
Section titled “Run modes”jobs.svc # orchestrator — triggers + HTTP APIjobs.svc agent # worker agentjobs.svc versionAn orchestrator runs an embedded agent when the boot config has a localagent: block. Flags: -f/--config (default .jobs.yaml), -p/--port, --sid, --datacenter, --cluster, --config_url, --config_apikey, --servicediscovery_url, --servicediscovery_apikey, --svccert, --svckey, --rootcacert, --jwt_public_key, --zerotrust.
There is no config list / config generate subcommand — write .jobs.yaml directly.
Boot configuration
Section titled “Boot configuration”port: 8080grpc: 9090 # orchestrator gRPC port (required)serviceid: jobs-01loadtenants: [] # tenants to warm at startdefaultjobsaccess: false # allow jobs that declare no access rule
orchestrator: queue: maxdepth: 10000 # submission queue cap (FIFO, drop-oldest)
minio: # object storage for large job-run logs url: minio.internal:9000 accesskey: vault:minio-access secretkey: vault:minio-secret bucket: jobrunlogs secure: true
jobsuser: jobs # OS user the sandboxed process runs as (Linux)applycgroups: true # Linux only; forced false elsewhere
localagent: # optional embedded agent id: agent-01 serverurl: https://jobs.internal:9090 heartbeatduration: 15sAgent-mode config (jobs.svc agent): sid, grpc, serverurl (required), heartbeatduration, infrahost, grpcaddress, httpaddress, tenants, exclusive, max_concurrent_tasks.
Sandboxing
Section titled “Sandboxing”On Linux with applycgroups: true, each run executes as a child process under a dedicated cgroup:
- runs as the
jobsuserOS user; - memory and CPU bounded by the job’s
constraints; - network and filesystem denied unless the job declares the matching
capabilities.
On macOS/Windows the script runs in-process without cgroup isolation — use those platforms for development only.
Concurrency and queueing
Section titled “Concurrency and queueing”- The executor caps concurrent job runs (semaphore, default 100).
- The submission queue is bounded (default 10000), FIFO.
- Git-poll triggers skip a tick if the previous run for that trigger is still in flight.
Inspecting runs
Section titled “Inspecting runs”GET /jobs— the active definitions the tenant loaded.GET /runs?id=<ulid>or?filter=<expr>&page=&pagesize=— run records with status, payload, and logs.- Logs: inline for small output; larger output is uploaded to the configured object store and linked from the run record. The return value is always in
logs.result.
Storage
Section titled “Storage”Schema is embedded and applied per tenant through the data plane. Job-run logs over ~16 KB offload to object storage (MinIO/S3); configure minio.* or they stay inline.
Health and metrics
Section titled “Health and metrics”GET /health, GET /ready. Metrics are emitted under the kis.jobs.* namespace (submit/exec/trigger counts and durations), though trigger metrics are recorded only for webhook and scheduled triggers today.
Dependencies
Section titled “Dependencies”config (boot + tenant config), meta (definition delivery), IAM (JWT verification), Vault (DB-pool and provider secrets), PostgreSQL (tenant data), an object store (large-log offload), and at least one worker (embedded or standalone agent).