Containerized build of Syncovery, usable for a new deployment or to migrate an existing one.
This project provides Linux container tooling and is not affiliated with Syncovery, which is proprietary software licensed separately by Super Flexible Software GmbH.
- Syncovery
- rsyslog
- tini
- Supervisor
- Debian
The image is published to ghcr.io/xenago/syncovery-container:latest and is built for amd64 & arm64.
Supervisor is used as a basic service manager. It starts init.py,
which performs startup tasks (timezone, machine-id, etc.) before starting Syncovery.
The container runs as root since Syncovery generally needs to read arbitrary source paths and preserve file ownership.
8999- Web UI8943- HTTPS Web UI (when enabled in Syncovery)8889- Cloud authentication8949- Remote
By default the compose stack publishes only the Web UI port (8999), bound to 127.0.0.1.
The HTTPS, Cloud, and Remote ports are listed but commented out in docker-compose.yml.
Override the host binding with SC_WEB_PORT in .env
(for example SC_WEB_PORT=192.168.1.50:8999 to expose on a specific LAN interface);
SC_HTTPS_PORT / SC_CLOUD_PORT / SC_REMOTE_PORT take effect if their compose lines are uncommented.
See Configuration and Proxy for details.
Syncovery's Guardian watchdog is a separate program intended for other deployment methods, and is not included.
Nothing listens on its port 8900 in this image.
These steps pull the prebuilt image and run Syncovery with persistent storage. Docker Compose is required to follow these specific steps, but other methods are possible.
-
Download or clone the repository:
git clone https://github.com/xenago/syncovery-container.git cd syncovery-container -
Copy the environment template and modify if desired. Pay attention to the permanent data storage path! Locating it outside the cloned repo is a good idea to avoid accidental overwrites.
cp .env.example .env -
Create a persistent
machine-idfile. Syncovery requires it in some configurations, such as to encrypt stored credentials, so the container is configured to refuse to start without it:mkdir -p ./data && touch ./data/machine-idIf
SC_DATA_DIRis set, create the file under that path instead. See Machine ID. -
Start the stack, by default pulling the prebuilt image from GHCR:
docker compose up -dTo build the image locally instead of pulling, add
--build:docker compose up -d --buildOpen the Syncovery web UI once the container reports healthy in
docker compose ps. Syncovery's login page can misbehave over a loopback address (localhost/127.0.0.1), so reach it by a non-loopback address. Prefer binding the port to the host's specific LAN IP (e.g.SC_WEB_PORT=192.168.1.50:8999) and browsing to that address, or put a reverse proxy in front (see Proxy). Binding a specific interface limits exposure; only use0.0.0.0:8999(all interfaces) if that exposure is acceptable, and change the default credentials first (next step). If the page doesn't load, monitordocker compose logs -f. -
Log in with the Syncovery default credentials (username
default, passwordpass) and change them immediately underSettings > Misc, License > Change Login and Password....
Persistent data is stored under ./data by default:
Syncovery's configuration and jobs in ./data/config, and the machine-id in ./data/machine-id.
Implement a backup strategy for both (see Machine ID).
./data/tmp is also mounted as Syncovery's temp scratch space (/tmp).
The compose stack reads variables from .env (see .env.example):
SYNCOVERY_IMAGE: optional, override the image reference, for example to pin a specific version tag or to build locallySC_DATA_DIR: optional, absolute path for persistent data (default./databeside the compose file)TZ: optional, timezone applied to the container and logs (defaultEtc/UTC)SC_WEB_PORT/SC_HTTPS_PORT/SC_CLOUD_PORT/SC_REMOTE_PORT: optional, host binding for each port (default127.0.0.1:<port>, localhost only). Only the web port is published by default; the other three take effect only once their lines are uncommented indocker-compose.yml. To reach a port from elsewhere, prefer a specific host interface (e.g.192.168.1.50:<port>).0.0.0.0:<port>or just<port>exposes on all interfaces and should be used only behind a proxy and after changing the default credentials.
By default the stack pulls the prebuilt image from ghcr.io/xenago/syncovery-container.
To refresh it later, run docker compose pull followed by docker compose up -d.
To pin a tag or SHA, set SYNCOVERY_IMAGE in .env (for example ghcr.io/xenago/syncovery-container:11.16.4).
To make local builds the persistent default so Compose never pulls, set
SYNCOVERY_IMAGE=syncovery-container:local in .env and use --build.
The container serves plain HTTP on port 8999, so put a reverse proxy in front of it and enable HTTPS.
The sample nginx-proxy.conf is a starting point; it also shows an IP allowlist,
since a backup admin UI should not be exposed to the public internet.
Customize it as needed for the individual setup.
The image ships the SyncoveryCL binary, which also accepts commands directly.
One-shot commands that don't need the scheduler can run in a throwaway container with the same volumes mounted.
For example, to list the configured jobs:
docker compose run --rm syncovery-container /syncovery/SyncoveryCL /LISTCommands that talk to the running scheduler should execute in the already-running container:
docker compose exec syncovery-container /syncovery/SyncoveryCL /STATUSSyncovery may use the host /etc/machine-id to encrypt stored credentials.
If the value changes, such stored credentials can no longer be decrypted.
The machine-id is supplied as a persistent file bind-mounted onto /etc/machine-id.
Create it before the first start with touch ./data/machine-id.
The container writes a fresh id into the empty file on first start, reuses it thereafter, and sets
it read-only (mode 0444) to match a normal system's /etc/machine-id.
If the file is missing, unreadable, or malformed, the container refuses to start rather than
silently using a throwaway id.
Keep this file alongside /config and include both in your backups.
When migrating from an existing deployment, reuse that machine's id instead of letting a new one be generated. See the migration steps for details.
Whether the machine-id matters depends on Syncovery's credential encryption setting. Two modes work for a headless container:
-
Automatic Key Tied to This Computer: The key is derived from the machine-id, so with the persistent
/etc/machine-idabove and the fixedhostnameit works with no prompt. -
Password Phrase: The key comes from a separate passphrase then encrypted with the machine-id. To avoid typing it on every start, mount an empty file and point Syncovery at it in the settings - uncomment the mount in
docker-compose.yml:- ${SC_DATA_DIR:-./data}/syncovery-password:/syncovery-passwordthen set the passphrase and specify the file as
/syncovery-passwordin the Syncovery UI.
Do not select "Password Phrase" without the mounted file. It will prompt on every start, which a headless container cannot answer. Syncovery would start up unable to decrypt the stored profile credentials.
Using the default prebuilt image, pull the newer release and redeploy:
docker compose pull
docker compose up -d
The published latest tag tracks the newest Syncovery release; pin a specific version with SYNCOVERY_IMAGE in .env.
To build a specific version locally instead:
-
Confirm no special upgrade steps are required for the jump:
-
Update
SYNCOVERY_VERSIONin theDockerfileto the target release: -
Rebuild the image and redeploy:
docker compose up -d --build
To use the container with an existing Syncovery install, see the migration section in the docs.
The tooling in this repository is licensed under the MIT License. This project is not affiliated with Syncovery. Syncovery itself is downloaded at build time and has its own proprietary license.
There is no official Syncovery Docker image. However, the Syncovery developer has publicly welcomed community images; see the References below and the full archived forum thread for context.
ruepp-jenkins/docker-syncoveryby Stefan Ruepp- MIT-licensed community project packaging Syncovery as a Docker container
- Most successful and comprehensive project of this kind, and the recommended option
Docker (unofficial) - Syncovery Support Forum- Thread started by Ruepp where the Syncovery developer Tobias welcomes community Docker images in the replies
- The Syncovery forum is not captured by the Internet Archive's Wayback Machine,
so a copy of the webpage HTML is archived here at
docs/references/syncovery-forum-docker-thread.html