Skip to content

Production Checklist

This checklist covers the essentials for running Synclet in production. Work through each section before going live.

Generate cryptographically secure secrets. Never use default or weak values.

Terminal window
# JWT signing key
export AUTH_JWT_SECRET="$(openssl rand -base64 32)"
# AES-256 encryption key for stored credentials (must be 32 bytes, base64-encoded)
export SECRET_ENCRYPTION_KEY="$(openssl rand -base64 32)"

Store secrets in a secret manager (HashiCorp Vault, AWS Secrets Manager, Kubernetes Secrets) rather than plain text files.

Always terminate TLS in front of Synclet. Options:

  • Reverse proxy — Nginx, Caddy, or Traefik with a Let’s Encrypt certificate.
  • Kubernetes Ingress or Gateway API — Enable server.ingress.tls, or route through a TLS-terminating Gateway with server.gateway.*, in the Helm chart.
  • Cloud load balancer — AWS ALB, GCP HTTPS LB, etc.

After creating your admin account, disable public registration:

Terminal window
export AUTH_REGISTRATION_ENABLED="false"

For teams, configure an OIDC provider (Google, Okta, etc.) instead of local passwords. See Environment Variables for the AUTH_OIDC_* settings.

Run Synclet and connector containers on an isolated Docker network. Connectors should only reach the data sources they need — not internal services or the host network.

RequirementDetail
EnginePostgreSQL 16 or later
Managed serviceRecommended (RDS, Cloud SQL, Azure Database) for automated backups and failover
Connection poolingUse PgBouncer or your cloud provider’s connection pooler for high-concurrency workloads
BackupsEnable automated daily backups with at least 7-day retention
Terminal window
export DB_DSN="postgres://synclet:password@db.example.com:5432/synclet?sslmode=require"

Always use sslmode=require or sslmode=verify-full in production.

/live and /ready are served on the internal port (8081 by default), which is not meant to be public. Probe them from inside your network:

Terminal window
curl -f http://synclet-internal.example:8081/ready
# HTTP 200 = healthy

For an external uptime check, request the UI at https://synclet.example.com/.

Wire this into your uptime monitor (Pingdom, UptimeRobot, etc.).

Synclet exposes metrics at /metrics. Scrape it with Prometheus:

scrape_configs:
- job_name: synclet
static_configs:
- targets: ["synclet:8080"]

On Kubernetes, enable the ServiceMonitor in the Helm chart.

Import the bundled Grafana dashboards or build your own from the exposed metrics. Key panels to track:

  • Active syncs and queue depth
  • Sync duration (p50, p95, p99)
  • Error rate by pipeline
  • Database connection pool usage

Recommended alerts:

  • Health endpoint returns non-200 for more than 2 minutes.
  • Sync failure rate exceeds threshold.
  • Sync duration approaches DOCKER_EXECUTOR_MAX_SYNC_DURATION.
WhatHowFrequency
PostgreSQLpg_dump or managed-service snapshotsDaily (minimum)
Restore testRestore into a staging instanceMonthly

Automate all of the above and test restores regularly. A backup you have never restored is not a backup.

VariableDescriptionDefaultGuidance
DOCKER_EXECUTOR_JOB_WORKER_INTERVALHow often the Docker executor polls for new jobs1sLower = faster pickup, higher CPU. 1-5 s is typical.
PIPELINE_JOB_SCHEDULER_INTERVALHow often the scheduler evaluates cron triggers30s15-60 s depending on schedule granularity.
DOCKER_EXECUTOR_MAX_SYNC_DURATIONHard timeout for a single sync (Docker executor)24hSet based on your largest dataset.
PIPELINE_IDLE_TIMEOUTKill a sync if no data flows for this long10mIncrease for slow sources.
PIPELINE_MAX_CONCURRENT_JOBSMaximum number of sync jobs the scheduler will start in parallel10Increase for larger hosts; the executor independently caps in-flight work.

For Docker deployments, set memory and CPU limits on the Synclet container:

Terminal window
docker run -d \
--memory=2g \
--cpus=1 \
...
synclet

For Kubernetes, configure limits in the Helm values:

server:
resources:
requests:
memory: "512Mi"
cpu: "250m"
limits:
memory: "2Gi"
cpu: "1000m"

For zero-downtime deployments, use distributed mode:

mode: distributed
server:
replicaCount: 2 # stateless API — scale horizontally

Key considerations:

  • Persistent volumes — Use a PVC for any log or state directories if you want data to survive pod restarts. Alternatively, ship logs to an external store.
  • Database — Use a managed PostgreSQL with multi-AZ or a replicated cluster. Synclet does not manage database HA.
  • Connection pooling — With multiple replicas, a connection pooler (PgBouncer) prevents exhausting the database connection limit.

See Kubernetes deployment for the full Helm reference.

  1. Read the release notes for breaking changes.
  2. Back up the database and configuration before major upgrades.
  3. Pull the new image or download the new binary.
  4. Run migrations and restart Synclet — run synclet migrate up before starting the new version. The Helm chart runs it in an init container of the server pod.
  5. Verify — Check /ready on the internal port, review the dashboard, and confirm a test sync completes.

For Kubernetes, use rolling updates (the default Helm strategy). The readiness probe ensures traffic only routes to healthy pods.

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.