Skip to content

Knot configuration

knot-server reads TOML from the file given with --config (or KNOT_CONFIG), then from /etc/knot/config.toml. Each key also has a KNOT_* environment variable, and environment variables take precedence over both files. Sizes are in bytes; durations are in the unit named by the key suffix (_ms, _secs).

KeyEnv varDefaultDescription
hostnameKNOT_HOSTNAMErequiredPublic hostname. The knot’s identity is did:web:<hostname>.
adminsKNOT_ADMINSrequiredAdmin DIDs. The first entry is the knot’s service owner. Comma-separated as an env var.
listen_addrKNOT_LISTEN_ADDR[::]:5555HTTP listen address for XRPC, smart HTTP git, LFS and the homepage.
listen_header_timeout_msKNOT_LISTEN_HEADER_TIMEOUT_MS10000Time allowed to receive request headers.
listen_idle_timeout_msKNOT_LISTEN_IDLE_TIMEOUT_MS60000Idle connection timeout. Must be at least listen_header_timeout_ms.
listen_max_connectionsKNOT_LISTEN_MAX_CONNECTIONS1024Maximum concurrent HTTP connections.
listen_rate_limit_per_secondKNOT_LISTEN_RATE_LIMIT_PER_SECOND50HTTP request rate limit per client IP.
listen_rate_limit_burstKNOT_LISTEN_RATE_LIMIT_BURST200Burst size for the per-client-IP request rate limit.
listen_max_inflight_requestsKNOT_LISTEN_MAX_INFLIGHT_REQUESTS1024Maximum HTTP requests in flight. Excess requests get 503.
listen_request_timeout_msKNOT_LISTEN_REQUEST_TIMEOUT_MS60000Timeout for an HTTP request, except streaming writes.
listen_body_timeout_msKNOT_LISTEN_BODY_TIMEOUT_MS30000Inactivity timeout while reading a request body.
listen_write_request_timeout_msKNOT_LISTEN_WRITE_REQUEST_TIMEOUT_MS1800000Timeout for streaming writes: git-receive-pack POSTs and LFS object PUTs.
internal_listen_addrKNOT_INTERNAL_LISTEN_ADDR[::1]:5444Listen address of the mTLS admin listener. Used only when tls.mtls_enabled is set.
ssh_listen_addrKNOT_SSH_LISTEN_ADDR[::]:2222Listen address of the built-in SSH server for git and LFS.
ssh_host_key_fileKNOT_SSH_HOST_KEY_FILErequiredSSH host key path. Absolute. Generated on start if absent.
ssh_max_pack_bytesKNOT_SSH_MAX_PACK_BYTES8589934592Largest pack accepted in one SSH push.
ssh_proxy_protocol_fromKNOT_SSH_PROXY_PROTOCOL_FROM[]IPs or CIDR blocks allowed to send a PROXY protocol v1 header on SSH connections. SSH rate limits then key on the header’s source address. Comma-separated as an env var.
appview_endpointKNOT_APPVIEW_ENDPOINThttps://tangled.orgBase URL of the appview, used to build links in push messages.
KeyEnv varDefaultDescription
cert_pathKNOT_TLS_CERT_PATHunsetPEM certificate chain for TLS on the knot. Absolute. Set together with key_path.
key_pathKNOT_TLS_KEY_PATHunsetPEM private key for cert_path. Absolute.
http3KNOT_TLS_HTTP3trueServe HTTP/3 over QUIC when the knot has a certificate.
acme_enabledKNOT_TLS_ACME_ENABLEDfalseObtain the certificate over ACME (TLS-ALPN-01). Can’t combine with cert_path/key_path.
acme_cache_dirKNOT_TLS_ACME_CACHE_DIRunsetACME account and certificate cache directory. Absolute. Required with acme_enabled.
acme_contactKNOT_TLS_ACME_CONTACTunsetContact email for the ACME account. Required with acme_enabled.
acme_stagingKNOT_TLS_ACME_STAGINGfalseUse the Let’s Encrypt staging directory.
mtls_enabledKNOT_TLS_MTLS_ENABLEDfalseServe the mTLS admin listener on server.internal_listen_addr. Requires a server certificate.
mtls_client_ca_pathKNOT_TLS_MTLS_CLIENT_CA_PATHunsetCA bundle that admin client certificates must chain to. Absolute. Required with mtls_enabled.
mtls_admin_spki_pinKNOT_TLS_MTLS_ADMIN_SPKI_PINunsetBase64 SHA-256 SPKI pin of the admin client certificate. Required with mtls_enabled.
KeyEnv varDefaultDescription
admissionKNOT_ADMISSIONclosedRepo creation policy. closed: only knot members. open: any account that isn’t blocked.
legacy_admin_secret_envKNOT_LEGACY_ADMIN_SECRET_ENVunsetName of an env var holding a shared admin secret. When set and non-empty, the knot accepts Basic Auth as the first DID in server.admins on createRecord/deleteRecord for org.tangled.knot.member and org.tangled.knot.block, and serves the invite code admin method. Used by knot-server admin.
KeyEnv varDefaultDescription
scan_pathKNOT_SCAN_PATHrequiredRoot directory of all repositories and the knot’s meta-repo. Absolute. Must exist and be writable.
default_branchKNOT_DEFAULT_BRANCHmainDefault branch of new repositories.
contribution_policyKNOT_CONTRIBUTION_POLICYcollaboratorsContribution policy: anyone, members or collaborators.
write_burstKNOT_REPO_WRITE_BURST30Per-account burst for authenticated writes.
write_refill_msKNOT_REPO_WRITE_REFILL_MS500Refill interval of the per-account write bucket. 1 to 60000.
KeyEnv varDefaultDescription
object_formatKNOT_GIT_OBJECT_FORMATsha256Object format of new repositories: sha256 or sha1.
KeyEnv varDefaultDescription
sealed_key_fileKNOT_SEALED_KEY_FILErequiredSealed key store holding the knot and per-repo signing keys. Absolute. Created if absent.
master_key_envKNOT_MASTER_KEY_ENVrequiredName of the env var holding the master key that unseals sealed_key_file: base64, at least 32 bytes.
KeyEnv varDefaultDescription
connect_timeout_msKNOT_HTTP_CONNECT_TIMEOUT_MS5000Connect timeout for outbound HTTP requests.
read_timeout_msKNOT_HTTP_READ_TIMEOUT_MS30000Read timeout for outbound HTTP requests.
request_timeout_msKNOT_HTTP_REQUEST_TIMEOUT_MS60000Overall timeout for outbound HTTP requests.
max_response_bytesKNOT_HTTP_MAX_RESPONSE_BYTES16777216Largest outbound HTTP response body read.
block_private_addressesKNOT_HTTP_BLOCK_PRIVATE_ADDRESSEStrueRefuse outbound requests to loopback, private and other non-public addresses.
KeyEnv varDefaultDescription
plc_directoryKNOT_PLC_DIRECTORYrequiredPLC directory URL. Must be https.
plc_sweep_widthKNOT_PLC_SWEEP_WIDTH1Num of concurrent PLC reconciliations the directory sweep runs, must be between 1 and 64.
repo_signing_keysKNOT_REPO_SIGNING_KEYSunsetPath to a per-repo signing key archive from knot-migrate. Its keys are sealed into the key store on start.
KeyEnv varDefaultDescription
max_body_bytesKNOT_XRPC_MAX_BODY_BYTES65536XRPC request body limit.
max_response_bytesKNOT_XRPC_MAX_RESPONSE_BYTES5242880XRPC response size limit.
max_archive_bytesKNOT_XRPC_MAX_ARCHIVE_BYTES1073741824Upper bound on one archive across org.tangled.git.getArchive, git archive --remote over SSH and the smart HTTP archive route.
tree_last_commit_budget_msKNOT_XRPC_TREE_LAST_COMMIT_BUDGET_MS300Time budget for last-commit lookup in tree listings.
blob_last_commit_budget_msKNOT_XRPC_BLOB_LAST_COMMIT_BUDGET_MS2000Time budget for last-commit lookup for a blob.
languages_budget_msKNOT_XRPC_LANGUAGES_BUDGET_MS1000Time budget for language statistics.
max_patch_bytesKNOT_XRPC_MAX_PATCH_BYTES16777216Body limit for the seedRepo procedure.
max_patch_decompressed_bytesKNOT_XRPC_MAX_PATCH_DECOMPRESSED_BYTES134217728Limit on the total decompressed size of a patch the merge procedures parse.
preauth_burstKNOT_XRPC_PREAUTH_BURST20Per-peer burst for unauthenticated requests.
preauth_refill_msKNOT_XRPC_PREAUTH_REFILL_MS100Refill interval of the per-peer pre-auth bucket.
per_peer_inflightKNOT_XRPC_PER_PEER_INFLIGHT8Concurrent pre-auth requests per peer.
global_inflightKNOT_XRPC_GLOBAL_INFLIGHT64Concurrent pre-auth requests across all peers. Must be at least per_peer_inflight.
max_pending_reservationsKNOT_XRPC_MAX_PENDING_RESERVATIONS256Knot-wide limit on reserved repository keys awaiting creation.
per_actor_reservationsKNOT_XRPC_PER_ACTOR_RESERVATIONS32Per-account limit on reserved repository keys awaiting creation.
reservation_ttl_secsKNOT_XRPC_RESERVATION_TTL_SECS3600Time a reserved repository key is held before it lapses and its sealed key is reclaimed.
fork_max_pack_bytesKNOT_XRPC_FORK_MAX_PACK_BYTES1073741824Largest pack fetched when creating a fork.
import_max_pack_bytesKNOT_XRPC_IMPORT_MAX_PACK_BYTES268435456Largest pack fetched when importing a repository.
fork_fetch_timeout_msKNOT_XRPC_FORK_FETCH_TIMEOUT_MS600000Request timeout for the fork fetch.
trusted_proxy_headerKNOT_XRPC_TRUSTED_PROXY_HEADERunsetHeader a reverse proxy appends the client address to, such as x-forwarded-for. Read right to left; the first entry not covered by trusted_proxies is the client. Unset uses the socket peer address.
trusted_proxiesKNOT_XRPC_TRUSTED_PROXIES[]IPs or CIDR blocks whose trusted_proxy_header is honored. At most 32 hops are read. Empty honors the header from every peer and takes its rightmost entry. Requires trusted_proxy_header. Comma-separated as an env var.
events_replay_bufferKNOT_XRPC_EVENTS_REPLAY_BUFFER4096Events kept for subscribeRepos cursor replay.
events_replay_bytesKNOT_XRPC_EVENTS_REPLAY_BYTES67108864Byte cap on the replay buffer.
events_max_subscribersKNOT_XRPC_EVENTS_MAX_SUBSCRIBERS256Maximum concurrent subscribeRepos subscribers.
events_max_per_peerKNOT_XRPC_EVENTS_MAX_PER_PEER8Maximum subscribeRepos subscriptions per peer.
KeyEnv varDefaultDescription
enabledKNOT_MAINTENANCE_ENABLEDtrueRun background git maintenance.
commit_graphKNOT_MAINTENANCE_COMMIT_GRAPHtrueWrite commit-graph files.
multi_pack_indexKNOT_MAINTENANCE_MULTI_PACK_INDEXtrueWrite multi-pack indexes.
bitmapKNOT_MAINTENANCE_BITMAPtrueWrite reachability bitmaps.
interval_secsKNOT_MAINTENANCE_INTERVAL_SECS21600Interval between maintenance passes.
repack_max_objectsKNOT_MAINTENANCE_REPACK_MAX_OBJECTS16000000A full repack is skipped for a repository with more reachable objects than this.
repack_geometric_factorKNOT_MAINTENANCE_REPACK_GEOMETRIC_FACTOR2Geometric factor for pack roll-up. At least 2.
repack_loose_thresholdKNOT_MAINTENANCE_REPACK_LOOSE_THRESHOLD6700A repack is due when a repository has more loose objects than this.
prune_grace_secsKNOT_MAINTENANCE_PRUNE_GRACE_SECS1209600Unreachable objects younger than this are kept.
full_repack_interval_secsKNOT_MAINTENANCE_FULL_REPACK_INTERVAL_SECS432000Minimum interval between full repacks and reflog expiry of a repository.
reflog_expire_secsKNOT_MAINTENANCE_REFLOG_EXPIRE_SECS7776000Reflog retention.
large_push_bytesKNOT_MAINTENANCE_LARGE_PUSH_BYTES52428800A push pack of at least this size triggers maintenance of that repository.
KeyEnv varDefaultDescription
enabledKNOT_PACK_CACHE_ENABLEDtrueCache generated packs for repeated identical fetches.
ttl_secsKNOT_PACK_CACHE_TTL_SECS60Lifetime of a cached pack.
max_entry_bytesKNOT_PACK_CACHE_MAX_ENTRY_BYTES67108864Largest single cached pack.
max_total_bytesKNOT_PACK_CACHE_MAX_TOTAL_BYTES2147483648Total pack cache size, clamped to a share of the memory budget.
KeyEnv varDefaultDescription
max_objectsKNOT_PACK_MAX_OBJECTS16000000Most objects in one generated pack.
max_total_bytesKNOT_PACK_MAX_TOTAL_BYTES68719476736Largest generated pack.
selection_max_objectsKNOT_PACK_SELECTION_MAX_OBJECTS16000000Most objects walked when selecting objects to send.
selection_time_budget_secsKNOT_PACK_SELECTION_TIME_BUDGET_SECS600Time budget for object selection.
KeyEnv varDefaultDescription
store_pathKNOT_LFS_STORE_PATHrequiredLFS objects and atproto record attachments; must be absolute path, must exist + be writable, must be outside the repo.scan_path.
max_object_bytesKNOT_LFS_MAX_OBJECT_BYTES5368709120Largest LFS object.
free_space_floor_bytesKNOT_LFS_FREE_SPACE_FLOOR_BYTES1073741824Uploads are refused when free disk space is below this.
gc_grace_secsKNOT_LFS_GC_GRACE_SECS1209600Unreferenced LFS objects younger than this are kept.
gc_interval_secsKNOT_LFS_GC_INTERVAL_SECS21600Interval between LFS garbage collection passes.
max_ssh_transfersKNOT_LFS_MAX_SSH_TRANSFERS16Concurrent LFS transfers over SSH.
max_http_downloadsKNOT_LFS_MAX_HTTP_DOWNLOADS64Concurrent LFS downloads over HTTP.
KeyEnv varDefaultDescription
repo_budget_bytesKNOT_SOCIAL_REPO_BUDGET_BYTES1073741824Byte budget over the live record versions of one repository, across all collections. A write past the budget gets 429.
foster_urlKNOT_SOCIAL_FOSTER_URLhttps://knot2.mock.tangled.orgFoster knot the knot pulls shadowed social records from at boot, for the one-time 2026-10-28 upgrade. Empty disables the pull.
foster_boot_widthKNOT_SOCIAL_FOSTER_BOOT_WIDTH4Num of concurrent handovers the boot-time foster pull will do, must be between 1 and 256.
KeyEnv varDefaultDescription
key_budget_mibKNOT_KEYFILL_KEY_BUDGET_MIB64Memory budget for cached SSH keys, in MiB. 1 to 1048576.
ttl_secsKNOT_KEYFILL_TTL_SECS3600Time a fetched SSH key set stays valid.
reprieve_retry_secsKNOT_KEYFILL_REPRIEVE_RETRY_SECS300Retry interval while a key refresh fails.
reprieve_budget_secsKNOT_KEYFILL_REPRIEVE_BUDGET_SECS21600Time cached keys stay usable while refresh fails. Must be at least reprieve_retry_secs.
KeyEnv varDefaultDescription
max_threadsKNOT_MAX_THREADS0Worker thread cap. 0 uses the available parallelism.
max_memory_bytesKNOT_MAX_MEMORY_BYTES0Memory budget. 0 derives it from the cgroup limit or available memory.
KeyEnv varDefaultDescription
enabledKNOT_HOMEPAGE_ENABLEDtrueServe an HTML homepage at /.
pathKNOT_HOMEPAGE_PATHunsetHTML file served as the homepage. Absolute. Unset serves the built-in page.
KeyEnv varDefaultDescription
privacy_policyKNOT_LINKS_PRIVACY_POLICYunsetPrivacy policy URL, served by org.tangled.knot.describeKnot.
terms_of_serviceKNOT_LINKS_TERMS_OF_SERVICEunsetTerms of service URL, served by org.tangled.knot.describeKnot.
KeyEnv varDefaultDescription
emailKNOT_CONTACT_EMAILrequiredOperator contact email, served by org.tangled.knot.describeKnot.

Text the knot sends to git clients. Placeholders in braces are filled in at runtime. Multi-line keys take a list of lines or one newline-separated string.

KeyEnv varDefaultDescription
ackKNOT_MESSAGES_PUSH_ACK["{knot} received {refs}."]Multi-line. Placeholders: {knot}, {refs}.
pull_requestKNOT_MESSAGES_PUSH_PULL_REQUEST["", "-> Open pull request for this branch:", " {url}", ""]Multi-line. Placeholders: {url}.
pipeline_cleanKNOT_MESSAGES_PUSH_PIPELINE_CLEAN["pipeline compiled with no diagnostics"]Multi-line. Placeholders: none.
pipeline_noneKNOT_MESSAGES_PUSH_PIPELINE_NONE["no pipelines to compile"]Multi-line. Placeholders: none.
KeyEnv varDefaultDescription
motdKNOT_MESSAGES_FETCH_MOTD["Thanks for using {knot}!"]Multi-line. Placeholders: {knot}.
enumeratingKNOT_MESSAGES_FETCH_ENUMERATING["Enumerating objects: {count}, done."]Multi-line. Placeholders: {count}.
totalKNOT_MESSAGES_FETCH_TOTAL["Total {count}, done."]Multi-line. Placeholders: {count}.
fatalKNOT_MESSAGES_FETCH_FATALknot: {error}Placeholders: {error}.
KeyEnv varDefaultDescription
reserved_refsKNOT_MESSAGES_REJECT_RESERVED_REFSrefs/cobs/*, refs/cob-checkpoints/*, refs/hidden/*, refs/atproto/* and refs/tngl/* are reserved and can't be pushedPlaceholders: none.
cob_create_onlyKNOT_MESSAGES_REJECT_COB_CREATE_ONLYexisting refs/cobs/* object cannot be modified or deleted over the wirePlaceholders: none.
cob_deleteKNOT_MESSAGES_REJECT_COB_DELETErefs/cobs/* stores append-only collaborative objects and cannot be deletedPlaceholders: none.
hidden_reservedKNOT_MESSAGES_REJECT_HIDDEN_RESERVEDrefs/hidden/* is reserved and can't be pushedPlaceholders: none.
atproto_reservedKNOT_MESSAGES_REJECT_ATPROTO_RESERVEDrefs/atproto/* is reserved for the knot's atproto commit chain and can't be pushedPlaceholders: none.
tngl_reservedKNOT_MESSAGES_REJECT_TNGL_RESERVEDrefs/tngl/* is reserved for knot-written keep refs and can't be pushedPlaceholders: none.
checkpoint_reservedKNOT_MESSAGES_REJECT_CHECKPOINT_RESERVEDrefs/cob-checkpoints/* is reserved for knot-written collaborative-object snapshots and can't be pushedPlaceholders: none.
cob_verificationKNOT_MESSAGES_REJECT_COB_VERIFICATIONcollaborative-object verification failed: {error}Placeholders: {error}.
ref_existsKNOT_MESSAGES_REJECT_REF_EXISTSreference already existsPlaceholders: none.
stale_old_valueKNOT_MESSAGES_REJECT_STALE_OLD_VALUEstale info: old value doesn't matchPlaceholders: none.
missing_objectsKNOT_MESSAGES_REJECT_MISSING_OBJECTSmissing necessary objectsPlaceholders: none.
missing_objects_forKNOT_MESSAGES_REJECT_MISSING_OBJECTS_FORmissing necessary objects for {ref}Placeholders: {ref}.
atomic_failedKNOT_MESSAGES_REJECT_ATOMIC_FAILEDatomic transaction failedPlaceholders: none.
atomic_abortedKNOT_MESSAGES_REJECT_ATOMIC_ABORTEDatomic push abortedPlaceholders: none.
authorization_unavailableKNOT_MESSAGES_REJECT_AUTHORIZATION_UNAVAILABLEauthorization unavailablePlaceholders: none.
unpacker_errorKNOT_MESSAGES_REJECT_UNPACKER_ERRORunpacker errorPlaceholders: none.
ref_snapshot_unavailableKNOT_MESSAGES_REJECT_REF_SNAPSHOT_UNAVAILABLEref snapshot unavailablePlaceholders: none.
object_migration_failedKNOT_MESSAGES_REJECT_OBJECT_MIGRATION_FAILEDobject migration failedPlaceholders: none.
KeyEnv varDefaultDescription
greetingKNOT_MESSAGES_SSH_GREETING["Hi {user}! You're authenticated to {knot} knot.", "This knot serves git over ssh, so there's no shell here. :P", "Clone repo with: git clone {knot}:<repoDID>"]Multi-line. Placeholders: {user}, {knot}.
greeting_unknownKNOT_MESSAGES_SSH_GREETING_UNKNOWN["Hi there! This is the {knot} knot.", "This knot serves git over ssh, so there's no shell here. :P", "Clone repo with: git clone {knot}:<repoDID>", "Publish your ssh key to your atproto account so this knot can identify your pushes.", "Put your handle in the url, as in yourhandle@{knot}:<repoDID>, so your ssh client can find your registered key on its own."]Multi-line. Placeholders: {knot}.
unsupported_commandKNOT_MESSAGES_SSH_UNSUPPORTED_COMMANDknot: unsupported commandPlaceholders: none.
too_many_operationsKNOT_MESSAGES_SSH_TOO_MANY_OPERATIONSknot: too many concurrent operations from your address, try again shortlyPlaceholders: none.
repo_not_foundKNOT_MESSAGES_SSH_REPO_NOT_FOUNDknot: repository not foundPlaceholders: none.
index_warmingKNOT_MESSAGES_SSH_INDEX_WARMINGknot: repository index is warming, retry shortlyPlaceholders: none.
key_not_registeredKNOT_MESSAGES_SSH_KEY_NOT_REGISTEREDknot: this ssh key doesn't match any key published by the accounts that may push here. Authorized: {authorized}. If your agent offers several keys, add -o IdentitiesOnly=yes so it offers your registered key.Placeholders: {authorized}.
identity_unavailableKNOT_MESSAGES_SSH_IDENTITY_UNAVAILABLEknot: couldn't read the account records needed to check your ssh key, retry shortlyPlaceholders: none.
push_deniedKNOT_MESSAGES_SSH_PUSH_DENIEDknot: you aren't authorized to push to this repository.Placeholders: none.
shutting_downKNOT_MESSAGES_SSH_SHUTTING_DOWNknot: server is shutting downPlaceholders: none.
archive_malformedKNOT_MESSAGES_SSH_ARCHIVE_MALFORMEDknot: malformed upload-archive requestPlaceholders: none.
archive_timeoutKNOT_MESSAGES_SSH_ARCHIVE_TIMEOUTknot: upload-archive request timed outPlaceholders: none.
archive_failedKNOT_MESSAGES_SSH_ARCHIVE_FAILEDknot: upload-archive failedPlaceholders: none.
advertise_failedKNOT_MESSAGES_SSH_ADVERTISE_FAILEDknot: cannot advertise refsPlaceholders: none.
push_too_largeKNOT_MESSAGES_SSH_PUSH_TOO_LARGEknot: push exceeds configured size limitPlaceholders: none.
receive_deadlineKNOT_MESSAGES_SSH_RECEIVE_DEADLINEknot: receive exceeded its time budgetPlaceholders: none.
malformed_packKNOT_MESSAGES_SSH_MALFORMED_PACKknot: malformed pack streamPlaceholders: none.
receive_read_errorKNOT_MESSAGES_SSH_RECEIVE_READ_ERRORknot: receive read errorPlaceholders: none.
receive_ended_earlyKNOT_MESSAGES_SSH_RECEIVE_ENDED_EARLYknot: receive stream ended earlyPlaceholders: none.
receive_failedKNOT_MESSAGES_SSH_RECEIVE_FAILEDknot: receive-pack failedPlaceholders: none.
KeyEnv varDefaultDescription
push_deniedKNOT_MESSAGES_HTTP_PUSH_DENIEDyou aren't authorized to push to this repositoryPlaceholders: none.
repo_not_foundKNOT_MESSAGES_HTTP_REPO_NOT_FOUNDrepository not foundPlaceholders: none.
push_too_largeKNOT_MESSAGES_HTTP_PUSH_TOO_LARGEpush exceeds the configured size limitPlaceholders: none.
malformed_packKNOT_MESSAGES_HTTP_MALFORMED_PACKmalformed pack stream: {error}Placeholders: {error}.
receive_ended_earlyKNOT_MESSAGES_HTTP_RECEIVE_ENDED_EARLYreceive stream ended earlyPlaceholders: none.
KeyEnv varDefaultDescription
invalid_oidKNOT_MESSAGES_LFS_INVALID_OIDinvalid LFS oid {value}Placeholders: {value}.
hash_mismatchKNOT_MESSAGES_LFS_HASH_MISMATCHoid mismatch, declared {declared}, computed {computed}Placeholders: {declared}, {computed}.
size_mismatchKNOT_MESSAGES_LFS_SIZE_MISMATCHsize mismatch, declared {declared}, received {received}Placeholders: {declared}, {received}.
size_limit_exceededKNOT_MESSAGES_LFS_SIZE_LIMIT_EXCEEDEDobject size {declared} exceeds limit {limit}Placeholders: {declared}, {limit}.
free_space_deniedKNOT_MESSAGES_LFS_FREE_SPACE_DENIEDfree space {free} below floor {floor}Placeholders: {free}, {floor}.
not_foundKNOT_MESSAGES_LFS_NOT_FOUNDobject {oid} not foundPlaceholders: {oid}.
framingKNOT_MESSAGES_LFS_FRAMINGprotocol framing fault: {detail}Placeholders: {detail}.
too_manyKNOT_MESSAGES_LFS_TOO_MANYtoo many {what} in one message, limit {limit}Placeholders: {what}, {limit}.
unknown_commandKNOT_MESSAGES_LFS_UNKNOWN_COMMANDunknown command {command}Placeholders: {command}.
unsupported_versionKNOT_MESSAGES_LFS_UNSUPPORTED_VERSIONunsupported version {version}Placeholders: {version}.
unsupported_hashKNOT_MESSAGES_LFS_UNSUPPORTED_HASHunsupported hash algorithm {algorithm}Placeholders: {algorithm}.
put_on_downloadKNOT_MESSAGES_LFS_PUT_ON_DOWNLOADput-object isn't allowed on a download channelPlaceholders: none.
verify_on_downloadKNOT_MESSAGES_LFS_VERIFY_ON_DOWNLOADverify-object isn't allowed on a download channelPlaceholders: none.
get_on_uploadKNOT_MESSAGES_LFS_GET_ON_UPLOADget-object isn't allowed on an upload channelPlaceholders: none.
put_no_bodyKNOT_MESSAGES_LFS_PUT_NO_BODYput-object is missing its object bodyPlaceholders: none.

services.tangled.knot-rs renders settings to /etc/knot/config.toml, checks it with knot-server validate --config-only at build time when the build platform can run the binary, and runs knot-server --config /etc/knot/config.toml. Keys under settings not listed below pass through unchanged.

OptionDefaultDescription
enablefalseEnable the knot service.
packagenonePackage providing knot-server.
user"knot"User the knot runs as and owner of the repositories.
groupvalue of userGroup the knot runs as.
stateDir"/var/lib/knot"State directory; base for the path defaults below.
openFirewalltrueOpen the TCP port of each non-loopback listen address, and the UDP port for HTTP/3 when TLS is on.
environmentFilenullsystemd EnvironmentFile. Must be set; holds the master key. Its KNOT_* variables override settings.
settings.server.hostnamenoneserver.hostname.
settings.server.adminsnoneserver.admins. Non-empty list.
settings.server.listen_addr"127.0.0.1:5555"server.listen_addr.
settings.server.internal_listen_addr"[::1]:5444"server.internal_listen_addr.
settings.server.ssh_listen_addr"[::]:2222"server.ssh_listen_addr. Must not be a port services.openssh listens on.
settings.server.ssh_host_key_file"${stateDir}/ssh_host_key"server.ssh_host_key_file.
settings.acl.admission"closed"acl.admission: closed or open.
settings.repo.scan_path"${stateDir}/repos"repo.scan_path.
settings.git.object_format"sha256"git.object_format: sha1 or sha256.
settings.secrets.sealed_key_file"${stateDir}/sealed-keys"secrets.sealed_key_file.
settings.secrets.master_key_env"KNOT_MASTER_KEY"secrets.master_key_env.
settings.atproto.plc_directorynoneatproto.plc_directory.
settings.contact.emailnonecontact.email.
settings.xrpc.trusted_proxy_headernullxrpc.trusted_proxy_header.
settings.lfs.store_pathnonelfs.store_path.
settings.tls.cert_pathnulltls.cert_path.
settings.tls.key_pathnulltls.key_path.
settings.tls.http3truetls.http3.
settings.tls.acme_enabledfalsetls.acme_enabled. Requires a non-loopback listen_addr.
settings.tls.acme_cache_dir"${stateDir}/acme"tls.acme_cache_dir.
settings.tls.acme_contactnulltls.acme_contact.
settings.tls.acme_stagingfalsetls.acme_staging.
settings.tls.mtls_enabledfalsetls.mtls_enabled.
settings.tls.mtls_client_ca_pathnulltls.mtls_client_ca_path.
settings.tls.mtls_admin_spki_pinnulltls.mtls_admin_spki_pin.