Skip to content


Switch branches/tags

Name already in use

A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch?


Failed to load latest commit information.

Latest Version Build Status Docker Stars Docker Pulls
Become a sponsor Donate Paypal


Firefox Sync Server Docker image.


Want to be notified of new releases? Check out 🔔 Diun (Docker Image Update Notifier) project!


  • Run as non-root user
  • Multi-platform image
  • Traefik as reverse proxy and creation/renewal of Let's Encrypt certificates (see this template)

Build locally

git clone
cd docker-firefox-syncserver

# Build image and output to docker (default)
docker buildx bake

# Build multi-platform image
docker buildx bake image-all


Registry Image
Docker Hub crazymax/firefox-syncserver
GitHub Container Registry

Following platforms for this image are available:

$ docker run --rm mplatform/mquery crazymax/firefox-syncserver:latest
Image: crazymax/firefox-syncserver:latest
 * Manifest List: Yes
 * Supported platforms:
   - linux/amd64
   - linux/arm/v6
   - linux/arm/v7
   - linux/arm64
   - linux/386
   - linux/ppc64le
   - linux/s390x

Environment variables

  • TZ: The timezone assigned to the container (default UTC)
  • PUID: Process UID (default 1000)
  • PGID: Process GID (default 1000)
  • FF_SYNCSERVER_ACCESSLOG: Display access log (default false)
  • FF_SYNCSERVER_LOGLEVEL: Log level output (default info)
  • FF_SYNCSERVER_PUBLIC_URL: Must be edited to point to the public URL of your server (default http://localhost:5000).
  • FF_SYNCSERVER_SECRET: This is a secret key used for signing authentication tokens. It should be long and randomly-generated.
  • FF_SYNCSERVER_ALLOW_NEW_USERS: Set this to false to disable new-user signups on the server. Only request by existing accounts will be honoured (default true).
  • FF_SYNCSERVER_FORCE_WSGI_ENVIRON: Set this to true to work around a mismatch between public_url and the application URL as seen by python, which can happen in certain reverse-proxy hosting setups (default false).
  • FF_SYNCSERVER_SQLURI: Defines the database in which to store all server data (default sqlite:///data/syncserver.db).
  • FF_SYNCSERVER_FORWARDED_ALLOW_IPS: Set this to * or an IP range if you use an Nginx reverse proxy (optional).

💡 FF_SYNCSERVER_SECRET_FILE can be used to fill in the value from a file, especially for Docker's secrets feature.


  • /data: Contains SQLite database if FF_SYNCSERVER_SQLURI is untouched

⚠️ Note that the volumes should be owned by the user/group with the specified PUID and PGID. If you don't give the volume correct permissions, the container may not start.


  • 5000: Gunicorn port


Docker Compose

Docker compose is the recommended way to run this image. You can use the following docker compose template, then run the container:

docker-compose up -d
docker-compose logs -f

Command line

You can also use the following minimal command:

$ docker run -d -p 5000:5000 --name firefox_syncserver \
  -e TZ="Europe/Paris" \
  -e FF_SYNCSERVER_SECRET="5up3rS3kr1t" \
  -v $(pwd)/data:/data \


Use with MySQL database

Set FF_SYNCSERVER_SQLURI=pymysql://user:password@mysql_server_ip/db_name

Use with PostgreSQL database

Set FF_SYNCSERVER_SQLURI=postgresql://user:password@postgresql_server_ip/db_name


Recreate the container whenever I push an update:

docker-compose pull
docker-compose up -d


Want to contribute? Awesome! The most basic way to show your support is to star the project, or to raise issues. You can also support this project by becoming a sponsor on GitHub or by making a Paypal donation to ensure this journey continues indefinitely!

Thanks again for your support, it is much appreciated! 🙏


MIT. See LICENSE for more details.