Using Prosody with Docker

Docker is a tool that allows easy download of software images, which it can run in isolated "containers" on any system that has Docker installed.

Prosody has official images published in the main Docker registry. This makes Docker very useful for installing Prosody on systems without official Prosody packages, or for testing or developing Prosody without disturbing your main system.

Note: Docker builds are not currently being updated since the move to our new build system. We plan to get them working again before the next major release, but if you need up-to-date or nightly versions before then, you’ll need to build them yourself or use a different base image.

The rest of this page assumes that you have Docker already installed on your system and working. If you do not currently have Docker, see the Docker installation guide.

Getting started

To launch the latest stable release of Prosody in a new container, run:

docker run -d --name prosody -p 5222:5222 prosody/prosody

The first time you run this, it may take some time to download the required Docker images.

The default configuration will serve "localhost", but you will want to override this. One way to do this is by mounting your configuration files inside the container. Let's say your configuration is at /opt/prosody/config on your machine. When starting the container, use the '-v' option to add this as a mounted volume inside the container at /etc/prosody:

docker run -d --name prosody -p 5222:5222 -v /opt/prosody/config:/etc/prosody:ro prosody/prosody

The ':ro' at the end of the volume configuration tells Docker that it should be read-only. Prosody never needs to write to its config file, so this is just some additional safety. See Volumes for other possible mounts you might want to configure.

Official docker images

Our build server that handles all our releases and nightly builds, also builds Docker images and publishes them to the registry at prosody/prosody.

When telling Docker which image to use when pulling or starting a container, use `prosody/prosody`. You can optionally add a specific tag to use, such as `prosody/prosody:trunk`. By default Docker uses the tag called 'latest', which will always be our latest stable release.

We have individual tags for stable releases, such as `0.11.8`, `0.11.9`. We also have tags for our active release branches (including stable and in-development) like `0.11` and `trunk`. Our per-branch tags are rebuilt nightly whenever a change is committed, just like our regular nightly builds.


Our build server uses the scripts and Dockerfile from the prosody-docker project. It uses the latest stable release of prosody-docker to build new images.


Docker lets you override paths in the default container image, as described earlier when discussing how to provide configuration files to the container. Volumes are important, as they are the primary way to feed data into your container, as well as making sure that data stored by Prosody is preserved when the container is stopped or destroyed.

This table lists some mount points (inside the container) that you may want to put volumes at.

Mount point Description
/etc/prosody Configuration files and certificates
/var/lib/prosody Prosody’s data directory (can be used even if using a database for storage)
/var/log/prosody Prosody’s logs (may be overridden/unnecessary depending on your logging configuration

Environment variables

Note: This section only applies to new images built from December 2022 onwards.

If you do not provide your own config file, the default configuration supports some environment variables to control the default behaviour.


A comma-separated list of JIDs that should be admins of the Prosody instance.
The minimum log level output. May be one of debug, info, warn or error. Defaults to info.


Comma-separated list of virtual host names for Prosody to serve. If unset, it auto-detects the container hostname.
Comma-separated list of internal components. Each listed component should be of the form ADDRESS:MODULE - e.g. a MUC component might be
Comma-separated list of external components. Each listed component should be of the form ADDRESS:SECRET - e.g.
Specifies the network address (not XMPP address) of the Prosody server. If set, this is used as the default HTTP host and proxy65 address. If a single virtual host is configured, the network hostname defaults to that.


A comma-separated list of paths to search for plugins (modules). Defaults to /etc/prosody/modules.
A comma-separated list of modules to enable, in addition to those that are enabled by default.
A comma-separated list of modules to disable.

Data retention

The number of days to store data (messages, uploads, etc.) for. Setting this enables mod_mam.
The number of days to store messages for (e.g. for synchronization). Defaults to the value of PROSODY_RETENTION_DAYS, or 7 if that is not set either. Setting this enables mod_mam.
The number of days to store file uploads for (so they can be fetched by recipients). Defaults to the value of PROSODY_RETENTION_DAYS, or 7 if that is not set.


The path to the certificates directory, relative to the config directory. Defaults to certs (i.e. ‘/etc/prosody/certs’).
Whether to require valid certificates from other servers, or fall back to other methods such as dialback. Defaults to 1, set to 0 to enable dialback.
The default rate limit for client connections. Defaults to 10kb/s.
The default rate limit for server connections. Defaults to 30kb/s.


These settings are applied to any muc components. If none are defined, these settings will be ignored.

A comma-separated list of modules to load on the MUC host, e.g. muc_mam.


These settings are applied to any http_file_share components. If none are defined, these settings will be ignored.

The maximum file size in megabytes that Prosody will allow in a single share.
The total maximum storage that Prosody will use for uploads, for all users.


The name of the storage driver to use. Defaults to internal unless PROSODY_SQL_DRIVER is set, in which case it defaults to sql.
The name of the SQL driver to use. Must be one of sqlite, postgres or mysql.
The name of the database to connect to (the filename if using SQLite).
The username to authenticate to the database server with.
The password to authenticate to the database server with.
The hostname of the database server.


The secret token shared with the TURN server to authenticate clients. TURN won’t be advertised if this is not set.
The network address of the TURN service. Defaults to Prosody’s hostname if not set.
The network port of the TURN service.
The network port for TURN over TLS (if any).


Enable Prosody’s statistics/metrics gathering. Disabled by default, but you may want to set it to internal.
An path/pattern to include after the main config (included files can add or override options). Defaults to /etc/prosody/conf.d/*.cfg.lua.