Run an instance of Syncthing in Docker with traffic via Cloudflare WARP
using a docker-compose.yml similar to the one provided below.
services:
syncthing:
image: threatpatrols/cfwarp-syncthing:latest
hostname: example01
container_name: syncthing-example01
privileged: true # required for Cloudflare WARP
ports:
# Make >>VERY<< sure this binding is via 127.0.0.1 as shown else you will expose the Syncthing GUI interface
- 127.0.0.1:8384:8384
volumes:
# Required: Mount /var/syncthing to some local path that suits
- /some/local/path:/var/syncthing
# Optional: Mount /var/lib/cloudflare-warp so allowing Cloudflare WARP to maintain device-account between restarts
- var-lib-cloudflare-warp:/var/lib/cloudflare-warp
volumes:
var-lib-cloudflare-warp:
Bring it up with a standard docker-compose up command.
docker run --rm -it --privileged -p 127.0.0.1:8384:8384 threatpatrols/cfwarp-syncthing:latest- Recent cloudflare warp versions (2024.11.309.0) now requires the use of the
--privilegedflag to handle thetuninterface, would much prefer an explicit approach. - This sample
docker-compose.ymlshould be modified to suit your situation, in particular the/some/local/pathmount. - The container requires root privileges to enable the creation of a tunnel-interface (
/dev/net/tun) required for Cloudflare WARP to bind to. - The container does not confirm to the do-one-thing doctrine since it starts both a Cloudflare WARP daemon and a Syncthing process, this is managed using a HEALTHCHECK to test for health of the Cloudflare WARP tunnel with an
exit 1if down; together with loop that checks for the existence ofsyncthingthat terminates when missing. - The Syncthing process is started as a regular unprivileged user, adjust the
STUIDandSTGIDto adjust the apparent user. - The container enforces the Syncthing option
local-ann-enabled=falsethat prevents local network discovery, all connections therefore occur via external relay server(s) via the Cloudflare WARP tunnel. - DNS is also tunneled to prevent local DNS query traffic leaks.
The following environment variables are available for configuration:
-
STUID: user-id to run the Syncthing process (default: 1000); legacy variable-namePUIDis still supported. -
STGID: group-id to run the Syncthing process (default: 1000); legacy variable-namePGIDis still supported. -
STBASEDIR: Base directory for the Syncthing directory paths, by default/var/syncthing; this is the path you should volume-mount; this is not a standard Syncthing variable. -
STDATADIR: Path for Syncthing data files, by default${STBASEDIR}/data; this is a standard Syncthing variable. -
STSHARESDIR: Path for Syncthing shares, by default${STSHARESDIR}/shares; this is not a standard Syncthing variable. -
STCONFDIR: Path for Syncthing config files, by default${STSHARESDIR}/config; this is a standard Syncthing variable. -
STGUIADDRESS: IP-address and port for Syncthing to listen, by default0.0.0.0:8384; this is a standard Syncthing variable; Pay special attention to ensure any port-binding to expose this is via127.0.0.1else you will expose the Syncthing GUI interface which will have very negative security outcomes. -
WARP_START_DELAY: the delay time between starting the cloudflare-service and calling the cloudflare-cli to cause a connection (default: 5) seconds. -
WARP_CONNECT_RETRY_MAX: the number of attempts that will be made to create a cloudflare-warp connection before aborting (default: 20). -
WARP_CONNECT_RETRY_SLEEP: The delay time in-between connection retry attempts (default: 30) seconds.