Synclet is configured entirely through environment variables. Set them in your shell, a .env file, Docker Compose, or Kubernetes Secrets. Every command also accepts --dotenv <file> (repeatable) to load environment files first.
Base64-encoded 32-byte AES key for stored connector credentials. Back it up: stored secrets cannot be decrypted without it.
required outside local development
Synclet generates the two secrets only for local development: ENVIRONMENT unset or development, outside a container. There it creates an ephemeral AUTH_JWT_SECRET (sessions end on every restart) and persists an encryption key to <UserConfigDir>/synclet/encryption.key, logging a warning for each. Anywhere else, including a container or a Kubernetes pod, the process refuses to start until both are set.
Synclet listens on two ports: the public server (UI and API) and the internal server (executor API and the /live, /ready probes). Each takes the same set of variables with the prefix PUBLIC_HTTP_SERVER_ or INTERNAL_HTTP_SERVER_.
Variable
Description
Default
PUBLIC_HTTP_SERVER_ADDR
Public UI and API listen address.
0.0.0.0:8080
INTERNAL_HTTP_SERVER_ADDR
Executor API and probe listen address. Must differ from the public one.
0.0.0.0:8081
*_READ_TIMEOUT
Maximum time to read a request; 0s means no limit.
0s
*_READ_HEADER_TIMEOUT
Maximum time to read request headers.
10s
*_WRITE_TIMEOUT
Maximum time to write a response; 0s means no limit.
0s
*_IDLE_TIMEOUT
Keep-alive idle timeout.
120s
*_TLS_ENABLED
Serve TLS on this port.
false
*_TLS_CERT_PATH, *_TLS_KEY_PATH
Certificate and key files.
empty
*_TLS_CLIENT_AUTH, *_TLS_CLIENT_CA_PATH
Client certificate verification mode and CA bundle.
empty
*_TLS_APPEND_SYSTEM_CAS_TO_CLIENT
Trust the system CAs in addition to the client CA bundle.
false
RATE_LIMIT_TRUSTED_PROXIES
Comma-separated IPs or CIDR ranges of reverse proxies whose X-Forwarded-For and X-Real-IP headers identify the client for the auth rate limits and the login lockout. Empty: limits key on the TCP peer, so behind a proxy every client shares one limit.
empty
RATE_LIMIT_DISABLED
Turns off the per-IP auth rate limits on the public API and the MCP OAuth client registration; the login lockout stays on. For test environments only, never in production.
Configure one or more OIDC providers for single sign-on. Set AUTH_OIDC_PROVIDERS to a comma-separated list of provider slugs, then configure each provider with AUTH_OIDC_<SLUG>_* variables.
Variable
Description
AUTH_OIDC_PROVIDERS
Comma-separated list of provider slugs (e.g., google,okta). Required to enable OIDC.
AUTH_OIDC_CALLBACK_BASE_URL
Base URL for OIDC callback redirects. Required when AUTH_OIDC_PROVIDERS is set.
Human-readable name shown in the UI. Defaults to the slug.
AUTH_OIDC_<SLUG>_SCOPES
Comma-separated list of OIDC scopes. Default: openid,profile,email.
AUTH_OIDC_<SLUG>_DEFAULT_ROLE
Role in the default workspace when the role claim matches no mapping: admin, editor or viewer. Single-workspace mode only. Default: viewer.
AUTH_OIDC_<SLUG>_AUTO_CREATE_USER
Auto-create users on first login. Default: true.
AUTH_OIDC_<SLUG>_ALLOWED_DOMAINS
Comma-separated list of allowed email domains.
AUTH_OIDC_<SLUG>_ROLE_CLAIM
OIDC claim to use for role mapping (e.g., groups).
AUTH_OIDC_<SLUG>_ROLE_MAP_ADMIN
Claim value that maps to the Admin role.
AUTH_OIDC_<SLUG>_ROLE_MAP_EDITOR
Claim value that maps to the Editor role.
AUTH_OIDC_<SLUG>_ROLE_MAP_VIEWER
Claim value that maps to the Viewer role.
AUTH_OIDC_<SLUG>_ROLE_SYNC
When the role claim is applied to an existing member of the default workspace: login (every login, overwriting roles changed in the UI) or first_login (only when the user joins). Default: login.
AUTH_OIDC_<SLUG>_BOUND_CLAIM_<NAME>
Require a specific claim value for authentication (e.g., AUTH_OIDC_OKTA_BOUND_CLAIM_DEPARTMENT=engineering).
You can configure multiple providers by adding slugs to AUTH_OIDC_PROVIDERS (e.g., google,okta) and setting the corresponding AUTH_OIDC_<SLUG>_* variables for each.
The role variables (ROLE_CLAIM, ROLE_MAP_*, DEFAULT_ROLE, ROLE_SYNC) set the user’s role in the default workspace and apply in single-workspace mode only; in multi-workspace mode the server ignores them and logs a warning. See Role mapping for an authentik groups example.
Scratch directory for connector config, catalog and state. Leave empty when running the binary natively (the OS temp dir is used). When Synclet runs in a container that talks to the host docker.sock, set it to a host-bind-mounted path that is identical inside and outside the container.
empty
DOCKER_EXECUTOR_OWNER_ID
Executor ID, stamped as the synclet.io/owner label on every connector container; orphan cleanup removes only containers carrying it. Required by a process that runs the Docker executor, which does not start without it. Set it unique per executor sharing one Docker daemon and stable across restarts (see owner IDs).
none, required
DOCKER_EXECUTOR_LOCAL_ROOT
Host directory mounted at /local in every connector container, where file-writing destinations leave their files. Shared by all jobs and never cleaned. Empty gives each job its own /local, removed with the job. Like DOCKER_EXECUTOR_TEMP_DIR_ROOT, a containerised Synclet needs it mounted at the same path from the host.
Used by synclet k8s-executor, and by synclet server --standalone inside a pod.
Variable
Description
Default
K8S_EXECUTOR_NAMESPACE
Namespace for connector pods.
empty
K8S_EXECUTOR_KUBECONFIG
Kubeconfig path; empty uses the in-cluster config.
empty
K8S_EXECUTOR_IMAGE_PULL_SECRET
Image pull secret for private registries.
empty
K8S_EXECUTOR_LOCAL_VOLUME_CLAIM
Existing PersistentVolumeClaim mounted at /local in the connector containers, where file-writing destinations leave their files (Helm: k8s.localVolume). Empty mounts a per-pod emptyDir.
empty
K8S_EXECUTOR_SYNCLET_IMAGE
Synclet image of the orchestrator container in sync pods.
empty
K8S_EXECUTOR_SERVER_ADDR
Internal server address the orchestrator containers call.
empty
K8S_EXECUTOR_DEFAULT_MEMORY
Default memory of sync pods.
2Gi
K8S_EXECUTOR_DEFAULT_CPU
Default CPU of sync pods.
1
K8S_EXECUTOR_JOB_WORKER_INTERVAL
How often the executor polls for pending work.
5s
K8S_EXECUTOR_JOB_RESOURCE_CLEANUP_INTERVAL
How often orphaned pods are removed.
5m
K8S_EXECUTOR_OWNER_ID
Executor ID, stamped as the synclet.io/owner label on every Job and Secret the executor creates; it reconciles only those carrying it. The executor does not start without it or K8S_EXECUTOR_OWNER_ID_PREFIX. Set it unique per executor sharing one namespace and stable across restarts (see owner IDs).
none, required
K8S_EXECUTOR_OWNER_ID_PREFIX
Gives the owner ID <prefix>-<n>, n being the digits after the last - of the hostname: a StatefulSet replica’s ordinal. Startup fails when the hostname does not end in -<digits> or K8S_EXECUTOR_OWNER_ID is set too (Helm: k8s.ownerId in distributed mode).
Previous encryption key, kept during key rotation. Synclet decrypts credentials encrypted with it and re-encrypts them with the current key.
empty
Security notes:
Never commit secrets to version control.
Use a secret manager (HashiCorp Vault, AWS Secrets Manager, Kubernetes Secrets, Doppler) in production.
After rotating AUTH_JWT_SECRET, all users sign in again. After rotating SECRET_ENCRYPTION_KEY, set the old key as SECRET_ENCRYPTION_KEY_PREVIOUS so existing credentials are re-encrypted.
Airbyte is a trademark of Airbyte, Inc. Synclet is not affiliated with, endorsed by or sponsored by Airbyte, Inc.
Connector images keep their own licenses: see Connector licenses.