The PowerSync Service is configured using key/value pairs in a config file, and supports the following configuration methods:
Inject config as an environment variable (which contains the Base64 encoding of a config file)
Use a config file mounted on a volume
Specify the config as a command line parameter (again Base64 encoded)
Both YAML and JSON config files are supported. You can see examples of the above configuration methods in the docker-compose file of our self-host-demo app.
Below is a skeleton config file you can copy and paste to edit locally:
config.yaml
Copy
# Settings for source database replicationreplication: # Specify database connection details # Note only 1 connection is currently supported # Multiple connection support is on the roadmap connections: - type: postgresql # The PowerSync server container can access the Postgres DB via the DB's service name. # In this case the hostname is pg-db # The connection URI or individual parameters can be specified. uri: postgresql://postgres:mypassword@pg-db:5432/postgres # SSL settings sslmode: disable # 'verify-full' (default) or 'verify-ca' or 'disable' # Note: 'disable' is only suitable for local/private networks, not for public networks# Connection settings for bucket storage (MongoDB and Postgres are supported)storage: # Option 1: MongoDB Storage type: mongodb uri: mongodb://mongo:27017/powersync_demo # Use these if authentication is required. The user should have `readWrite` and `dbAdmin` roles # username: myuser # password: mypassword # Option 2: Postgres Storage # type: postgresql # This accepts the same parameters as a Postgres replication source connection # uri: postgresql://powersync_storage_user:secure_password@storage-db:5432/postgres # sslmode: disable# The port which the PowerSync API server will listen onport: 80# Specify sync rulessync_rules: content: | bucket_definitions: global: data: - SELECT * FROM lists - SELECT * FROM todos# Settings for client authenticationclient_auth: # Enable this if using Supabase Auth # supabase: true # supabase_jwt_secret: your-secret # JWKS URIs can be specified here. jwks_uri: http://demo-backend:6060/api/auth/keys # JWKS audience audience: ['powersync-dev', 'powersync'] # Settings for telemetry reporting # See https://docs.powersync.com/self-hosting/telemetry telemetry: # Opt out of reporting anonymized usage metrics to PowerSync telemetry service disable_telemetry_sharing: false
Specify the connection to your source database in the replication section of the config file:
config.yaml
Copy
# Settings for source database replicationreplication: # Specify database connection details # Note only 1 connection is currently supported # Multiple connection support is on the roadmap connections: - type: postgresql # The PowerSync server container can access the Postgres DB via the DB's service name. # In this case the hostname is pg-db # The connection URI or individual parameters can be specified. uri: postgresql://postgres:mypassword@pg-db:5432/postgres # SSL settings sslmode: disable # 'verify-full' (default) or 'verify-ca' or 'disable' # Note: 'disable' is only suitable for local/private networks, not for public networks
If you are using hosted Supabase, you will need to enable IPv6 for Docker as per the Docker docsIf your host OS does not support Docker IPv6 e.g. macOS, you will need to run Supabase locally.This is because Supabase only allows direct database connections over IPv6 — PowerSync cannot connect using the connection pooler.
The PowerSync Service requires a storage database to store the data and metadata for buckets. You can use either MongoDB or Postgres for this purpose. The bucket storage database should be specified in the storage section of the config file:
config.yaml
Copy
# Connection settings for bucket storage (MongoDB and Postgres are supported)storage: # Option 1: MongoDB Storage type: mongodb uri: mongodb://mongo:27017/powersync_demo # Use these if authentication is required. The user should have `readWrite` and `dbAdmin` roles # username: myuser # password: mypassword # Option 2: Postgres Storage # type: postgresql # This accepts the same parameters as a Postgres replication source connection # uri: postgresql://powersync_storage_user:secure_password@storage-db:5432/postgres # sslmode: disable
The bucket storage database is separate from your source database.
MongoDB requires at least one replica set node. A single node is fine for development/staging environments, but a 3-node replica set is recommended for production deployments.MongoDB Atlas enables replica sets by default for new clusters.However, if you’re using your own environment you can enable this manually by running:
If you are rolling your own Docker environment, you can include this init script in your docker-compose file to configure a replica set as once-off operation:
Copy
# Initializes the MongoDB replica set. This service will not usually be actively running mongo-rs-init: image: mongo:7.0 depends_on: - mongo restart: "no" entrypoint: - bash - -c - 'sleep 10 && mongosh --host mongo:27017 --eval ''try{rs.status().ok && quit(0)} catch {} rs.initiate({_id: "rs0", version: 1, members: [{ _id: 0, host : "mongo:27017" }]})'''
You’ll need to create a dedicated user and schema for PowerSync bucket storage. You can either:
Let PowerSync create the schema (recommended):
Copy
CREATE USER powersync_storage_user WITH PASSWORD 'secure_password';-- The user should only have access to the schema it createdGRANT CREATE ON DATABASE postgres TO powersync_storage_user;
Or manually create the schema:
Copy
CREATE USER powersync_storage_user WITH PASSWORD 'secure_password';CREATE SCHEMA IF NOT EXISTS powersync AUTHORIZATION powersync_storage_user;GRANT CONNECT ON DATABASE postgres TO powersync_storage_user;GRANT USAGE ON SCHEMA powersync TO powersync_storage_user;GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA powersync TO powersync_storage_user;
Separate Postgres servers are required for replication connections (i.e. source database) and bucket storage if using Postgres versions below 14.
Postgres Version
Server configuration
Below 14
Separate servers are required for the source and bucket storage. Replication will be blocked if the same server is detected.
14 and above
The source database and bucket storage database can be on the same server. Using the same database (with separate schemas) is supported but may lead to higher CPU usage. Using separate servers remains an option.
The config file uses custom tags for environment variable substitution.Using !env [variable name] will substitute the value of the environment variable named [variable name].Only environment variables with names starting with PS_ can be substituted.See examples here: