Skip to content

Environment Variables

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.

VariableDescriptionDefault
DB_DSNPostgreSQL connection string. Example: postgres://user:pass@host:5432/synclet?sslmode=requirerequired
AUTH_JWT_SECRETToken-signing secret, at least 32 characters.required outside local development
SECRET_ENCRYPTION_KEYBase64-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.

Generate them with:

Terminal window
openssl rand -base64 32 # AUTH_JWT_SECRET
openssl rand -base64 32 # SECRET_ENCRYPTION_KEY
VariableDescriptionDefault
ENVIRONMENTRuntime environment: development, production or test. development allows generated secrets and migrate down without --yes.development
LOG_LEVELLog level.info

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_.

VariableDescriptionDefault
PUBLIC_HTTP_SERVER_ADDRPublic UI and API listen address.0.0.0.0:8080
INTERNAL_HTTP_SERVER_ADDRExecutor API and probe listen address. Must differ from the public one.0.0.0.0:8081
*_READ_TIMEOUTMaximum time to read a request; 0s means no limit.0s
*_READ_HEADER_TIMEOUTMaximum time to read request headers.10s
*_WRITE_TIMEOUTMaximum time to write a response; 0s means no limit.0s
*_IDLE_TIMEOUTKeep-alive idle timeout.120s
*_TLS_ENABLEDServe TLS on this port.false
*_TLS_CERT_PATH, *_TLS_KEY_PATHCertificate and key files.empty
*_TLS_CLIENT_AUTH, *_TLS_CLIENT_CA_PATHClient certificate verification mode and CA bundle.empty
*_TLS_APPEND_SYSTEM_CAS_TO_CLIENTTrust the system CAs in addition to the client CA bundle.false
RATE_LIMIT_TRUSTED_PROXIESComma-separated IPs or CIDR ranges of reverse proxies whose X-Forwarded-For and X-Real-IP headers identify the client for the login and register rate limits.empty
VariableDescriptionDefault
PUBLIC_HTTP_SERVER_CORS_ALLOWED_ORIGINSComma-separated hostnames whose browser origins may call the API.empty
PUBLIC_HTTP_SERVER_CORS_ALLOWED_ORIGIN_GLOBSOrigin patterns, for example *.example.com.empty
PUBLIC_HTTP_SERVER_CORS_ALLOW_ALL_ORIGINSAllow any origin.false
PUBLIC_HTTP_SERVER_CORS_ALLOWED_METHODSAllowed methods.empty
PUBLIC_HTTP_SERVER_CORS_ALLOWED_HEADERSAllowed request headers.*
PUBLIC_HTTP_SERVER_CORS_EXPOSED_HEADERSResponse headers exposed to the browser.empty
PUBLIC_HTTP_SERVER_CORS_ALLOW_CREDENTIALSAllow cookies and credentials.false
PUBLIC_HTTP_SERVER_CORS_ALLOW_PRIVATE_NETWORKAnswer private network access preflights.false
PUBLIC_HTTP_SERVER_CORS_MAX_AGEPreflight cache lifetime in seconds.0
VariableDescriptionDefault
AUTH_REGISTRATION_ENABLEDAllow email/password sign-up. Set to false after creating your admin account.true
AUTH_SECURE_COOKIESMark authentication cookies HTTPS-only. Set to true behind HTTPS.false
AUTH_ACCESS_TOKEN_TTLLifetime of access tokens.15m
AUTH_REFRESH_TOKEN_TTLLifetime of refresh tokens.168h
AUTH_MIN_PASSWORD_LENGTHMinimum length for new passwords.8
AUTH_PASSWORD_RESET_COOLDOWNMinimum time between two password reset emails for one user.2m
AUTH_TOKEN_CLEANUP_INTERVALHow often expired tokens are deleted.1h
AUTH_OIDC_STATE_TTLHow long an OIDC login may take between redirect and callback.10m
AUTH_OIDC_PROVIDERSComma-separated OIDC provider slugs; see OIDC Providers.empty
AUTH_OIDC_CALLBACK_BASE_URLBase URL for OIDC callbacks.empty
VariableDescriptionDefault
WORKSPACE_MODEsingle creates one default workspace and auto-joins every user to it. multi allows multiple workspaces with explicit membership.single
WORKSPACE_INVITE_TTLHow long workspace invitation links remain valid.168h
WORKSPACE_FRONTEND_URLPublic URL of the UI, used in invite and password reset links.http://localhost:5173
VariableDescriptionDefault
AUDIT_RETENTION_DAYSDefault number of days audit events are kept. At least 1.90
AUDIT_RETENTION_MAX_DAYSUpper bound a workspace may set for its own retention. Not lower than AUDIT_RETENTION_DAYS.365
AUDIT_RETENTION_CLEANUP_INTERVALHow often expired audit events are deleted.1h

Email is disabled while NOTIFY_SMTP_HOST is empty; the “Forgot password?” link is hidden then too.

VariableDescriptionDefault
NOTIFY_SMTP_HOSTSMTP server hostname.empty
NOTIFY_SMTP_PORTSMTP server port.587
NOTIFY_SMTP_TLSimplicit (TLS from the first byte), starttls, or none (plain text, for local catchers such as Mailpit).implicit
NOTIFY_SMTP_USERSMTP username.empty
NOTIFY_SMTP_PASSWORDSMTP password.empty
NOTIFY_SMTP_FROMSender address.noreply@synclet.io
NOTIFY_WEBHOOK_HTTP_TIMEOUTTimeout of one webhook delivery.10s
NOTIFY_WEBHOOK_MAX_RETRIESRetries of a failed webhook delivery.3
VariableDescriptionDefault
PIPELINE_MAX_CONCURRENT_JOBSSync jobs the scheduler runs at once.10
PIPELINE_IDLE_TIMEOUTCancel a sync that receives no records for this long.10m
PIPELINE_DEFAULT_MAX_ATTEMPTSAttempts per sync job before it fails.3
PIPELINE_HEARTBEAT_TIMEOUTA running job without a heartbeat for this long is treated as lost.30s
PIPELINE_CONNECTION_CHECK_TIMEOUTTimeout of a connection check.2m
PIPELINE_REGISTRY_FETCH_TIMEOUTTimeout for fetching a connector registry.60s
PIPELINE_EVENT_EMIT_TIMEOUTTimeout for publishing a pipeline event.30s
PIPELINE_EXECUTOR_API_TOKENToken the internal server requires from executors. Executors present it as EXECUTOR_API_TOKEN.empty
PIPELINE_CONNECTOR_TASK_RETENTIONHow long finished check, spec and discover results are kept.24h
PIPELINE_CONNECTOR_TASK_RUNNING_TIMEOUTTimeout of a running connector task (check, spec, discover).5m
PIPELINE_CONNECTOR_TASK_PENDING_TIMEOUTTimeout of a connector task that has not started.1m
PIPELINE_CONNECTOR_TASK_POLL_INTERVALHow often a waiting request polls its connector task.500ms
PIPELINE_STATS_ROLLUP_HOURLY_LOOKBACKWindow the hourly statistics rollup recomputes.2h
PIPELINE_STATS_ROLLUP_DAILY_LOOKBACKWindow the daily statistics rollup recomputes.48h
VariableDescriptionDefault
PIPELINE_JOB_SCHEDULER_INTERVALHow often due connections are scheduled.30s
PIPELINE_JOB_WATCHDOG_INTERVALHow often jobs without a heartbeat are looked for.10s
PIPELINE_JOB_RETENTION_INTERVALHow often old jobs are deleted.10m
PIPELINE_JOB_STATS_ROLLUP_INTERVALHow often statistics are rolled up.5m
PIPELINE_JOB_REPOSITORY_SYNC_INTERVALHow often connector repositories are refreshed.1h
PIPELINE_JOB_CONNECTOR_TASK_RETENTION_INTERVALHow often old connector tasks are deleted.5m
PIPELINE_JOB_STALE_CONNECTOR_TASK_WATCHDOG_INTERVALHow often stuck connector tasks are failed.5m

Defaults for connector containers and pods. A source or destination overrides them in its runtime config.

VariableDescriptionDefault
PIPELINE_RUNTIME_CPU_REQUESTCPU request.empty
PIPELINE_RUNTIME_CPU_LIMITCPU limit.empty
PIPELINE_RUNTIME_MEMORY_REQUESTMemory request.empty
PIPELINE_RUNTIME_MEMORY_LIMITMemory limit.empty
PIPELINE_RUNTIME_SERVICE_ACCOUNT_NAMEKubernetes service account of connector pods; empty uses the namespace’s default account. A source or destination overrides it with service_account_name. See Kubernetes: service accounts.empty

See Monitoring: log storage for how archiving works.

VariableDescriptionDefault
PIPELINE_LOG_MAX_LINES_PER_ATTEMPTLog lines stored per job attempt; later lines are dropped and counted. 0 disables the cap.100000
PIPELINE_LOG_ARCHIVE_BACKENDWhere logs of finished jobs go: none (stay in PostgreSQL), filesystem, s3 or gcs.none
PIPELINE_LOG_ARCHIVE_DIRBase directory for filesystem. Every server replica must see the same directory.empty
PIPELINE_LOG_ARCHIVE_S3_ENDPOINTS3 endpoint; set it for anything but AWS (MinIO, R2, GCS interoperability, Garage).empty
PIPELINE_LOG_ARCHIVE_S3_REGIONBucket region.empty
PIPELINE_LOG_ARCHIVE_S3_BUCKETBucket name.empty
PIPELINE_LOG_ARCHIVE_S3_PREFIXKey prefix inside the bucket.empty
PIPELINE_LOG_ARCHIVE_S3_ACCESS_KEY_ID, PIPELINE_LOG_ARCHIVE_S3_SECRET_ACCESS_KEYStatic keys; without them the default AWS credential chain is used (environment, IRSA, instance profile).empty
PIPELINE_LOG_ARCHIVE_S3_USE_PATH_STYLEPath-style addressing, needed for MinIO and Garage.false
PIPELINE_LOG_ARCHIVE_GCS_BUCKETBucket name.empty
PIPELINE_LOG_ARCHIVE_GCS_PREFIXObject prefix inside the bucket.empty
PIPELINE_LOG_ARCHIVE_GCS_CREDENTIALS_FILEService account key file; without it, Application Default Credentials (GKE Workload Identity, GOOGLE_APPLICATION_CREDENTIALS, gcloud auth application-default login).empty

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.

VariableDescription
AUTH_OIDC_PROVIDERSComma-separated list of provider slugs (e.g., google,okta). Required to enable OIDC.
AUTH_OIDC_CALLBACK_BASE_URLBase URL for OIDC callback redirects. Required when AUTH_OIDC_PROVIDERS is set.
AUTH_OIDC_<SLUG>_ISSUEROIDC issuer URL (e.g., https://accounts.google.com).
AUTH_OIDC_<SLUG>_CLIENT_IDOAuth client ID from your identity provider.
AUTH_OIDC_<SLUG>_CLIENT_SECRETOAuth client secret.
AUTH_OIDC_<SLUG>_DISPLAY_NAMEHuman-readable name shown in the UI. Defaults to the slug.
AUTH_OIDC_<SLUG>_SCOPESComma-separated list of OIDC scopes. Default: openid,profile,email.
AUTH_OIDC_<SLUG>_DEFAULT_ROLEDefault role for auto-created users. Default: viewer.
AUTH_OIDC_<SLUG>_AUTO_CREATE_USERAuto-create users on first login. Default: true.
AUTH_OIDC_<SLUG>_ALLOWED_DOMAINSComma-separated list of allowed email domains.
AUTH_OIDC_<SLUG>_ROLE_CLAIMOIDC claim to use for role mapping (e.g., groups).
AUTH_OIDC_<SLUG>_ROLE_MAP_ADMINClaim value that maps to the Admin role.
AUTH_OIDC_<SLUG>_ROLE_MAP_EDITORClaim value that maps to the Editor role.
AUTH_OIDC_<SLUG>_ROLE_MAP_VIEWERClaim value that maps to the Viewer role.
AUTH_OIDC_<SLUG>_BOUND_CLAIM_<NAME>Require a specific claim value for authentication (e.g., AUTH_OIDC_OKTA_BOUND_CLAIM_DEPARTMENT=engineering).
Terminal window
export AUTH_OIDC_PROVIDERS="google"
export AUTH_OIDC_CALLBACK_BASE_URL="https://synclet.example.com"
export AUTH_OIDC_GOOGLE_CLIENT_ID="123456.apps.googleusercontent.com"
export AUTH_OIDC_GOOGLE_CLIENT_SECRET="GOCSPX-abc123"
export AUTH_OIDC_GOOGLE_ISSUER="https://accounts.google.com"

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.

VariableDescriptionDefault
DOCKER_EXECUTOR_MAX_CONCURRENT_JOBSSync jobs one Docker executor runs at once.5
DOCKER_EXECUTOR_MAX_SYNC_DURATIONMaximum run time of one sync.24h
DOCKER_EXECUTOR_JOB_WORKER_INTERVALHow often the executor polls for pending work.1s
DOCKER_EXECUTOR_HEARTBEAT_INTERVALHow often a running sync sends a heartbeat.5s
DOCKER_EXECUTOR_JOB_RESOURCE_CLEANUP_INTERVALHow often orphaned containers are removed.5m
DOCKER_EXECUTOR_TEMP_DIR_ROOTScratch 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_LOCAL_ROOTHost 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.empty

Used by synclet k8s-executor, and by synclet server --standalone inside a pod.

VariableDescriptionDefault
K8S_EXECUTOR_NAMESPACENamespace for connector pods.empty
K8S_EXECUTOR_KUBECONFIGKubeconfig path; empty uses the in-cluster config.empty
K8S_EXECUTOR_IMAGE_PULL_SECRETImage pull secret for private registries.empty
K8S_EXECUTOR_LOCAL_VOLUME_CLAIMExisting 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_IMAGESynclet image of the orchestrator container in sync pods.empty
K8S_EXECUTOR_SERVER_ADDRInternal server address the orchestrator containers call.empty
K8S_EXECUTOR_DEFAULT_MEMORYDefault memory of sync pods.2Gi
K8S_EXECUTOR_DEFAULT_CPUDefault CPU of sync pods.1
K8S_EXECUTOR_JOB_WORKER_INTERVALHow often the executor polls for pending work.5s
K8S_EXECUTOR_JOB_RESOURCE_CLEANUP_INTERVALHow often orphaned pods are removed.5m

Executors started without --standalone reach the server over the internal API instead of the database.

VariableDescriptionDefault
EXECUTOR_API_URLInternal server URL.empty
EXECUTOR_API_TOKENToken the executor presents; must match the server’s PIPELINE_EXECUTOR_API_TOKEN.empty
VariableDescriptionDefault
WATERMILL_TRANSPORTTransport of the transactional outbox. sql reuses PostgreSQL via DB_DSN.sql
WATERMILL_SQL_DRIVERSQL driver for the sql transport.postgres
WATERMILL_SQL_CONSUMER_GROUPConsumer group of the sql transport.synclet
WATERMILL_TOPICS_PREFIXPrefix added to every topic name.empty
WATERMILL_REDIS_CONSUMER_GROUPConsumer group of the redis transport.empty
WATERMILL_GCLOUD_PUB_SUB_PROJECT_ID, WATERMILL_GCLOUD_PUB_SUB_SUBSCRIPTION_NAME_PREFIXProject and subscription prefix of the Google Cloud Pub/Sub transport.empty
EVENTS_RETRY_MAX_RETRIESRetries of a failed event handler.5
EVENTS_RETRY_INITIAL_INTERVALFirst retry delay.1s
EVENTS_RETRY_MAX_INTERVALLongest retry delay.1m
VariableDescriptionDefault
SECRET_ENCRYPTION_KEY_PREVIOUSPrevious 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.