The project now includes a Dockerfile and a docker-compose.yml file (which requires at least docker-compose version 1.10.0).
- Working basic (Linux) server with Nginx (or Apache2; not officially supported).
- Recent stable version of Docker.
- Recent stable version of Docker-compose.
Clone Mastodon's repository.
git clone git@github.com:tootsuite/mastodon.git
cd mastodon
Review the settings in docker-compose.yml. Note that it is not default to store the postgresql database and redis databases in a persistent storage location. If you plan on running your instance in production, you must uncomment the volumes directive in docker-compose.yml.
Then, you need to fill in the .env.production file:
cp .env.production.sample .env.production
nano .env.production
Do NOT change the REDIS_* or DB_* settings when running with the default docker configurations.
You will need to fill in, at least: LOCAL_DOMAIN, LOCAL_HTTPS, and the SMTP_* settings.
If you want to build your own image, run the command below:
docker-compose build
If you want to use prebuilt images on Docker Hub, just comment out all build keys in docker-compose.yml and continue.
Now the image can be used to generate secrets. Run the command below for each of PAPERCLIP_SECRET, SECRET_KEY_BASE, and OTP_SECRET then copy the results into the .env.production file:
docker-compose run --rm web rake secret
Then you should run the db:migrate command to create the database, or migrate it from an older release:
docker-compose run --rm web rake db:migrate
Then, you will also need to precompile the assets:
docker-compose run --rm web rake assets:precompile
before you can launch the docker image with:
docker-compose up
If you wish to run this as a daemon process instead of monitoring it on console, use instead:
docker-compose up -d
Then you may login to your new Mastodon instance by browsing to http://localhost:3000/
Following that, make sure that you read the production guide. You are probably going to want to understand how to configure Nginx to make your Mastodon instance available to the rest of the world.
The container has two volumes, for the assets and for user uploads, and optionally two more, for the postgresql and redis databases.
The default docker-compose.yml maps them to the repository's public/assets and public/system directories, you may wish to put them somewhere else. Likewise, the PostgreSQL and Redis images have data containers that you may wish to map somewhere where you know how to find them and back them up.
Note: The --rm option for docker-compose will remove the container that is created to run a one-off command after it completes. As data is stored in volumes it is not affected by that container clean-up.
Running any of these tasks via docker-compose would look like this:
docker-compose run --rm web rake mastodon:media:clear
This approach makes updating to the latest version a real breeze.
git fetchto download updates from the repository.- Now you need to tell git to use those updates. You have probably changed your
docker-compose.ymlfile. Check withgit status.
- If the
docker-compose.ymlfile is modified, rungit stashto stash your changes.
git checkout TAG_NAMEto use the tag code. (If you have committed changes, usegit merge TAG_NAMEinstead, though this isn't likely.)- Only if you ran
git stash, now rungit stash popto redo your changes todocker-compose.yml. Double check the contents of this file. docker-compose buildto compile the Docker image out of the changed source files.- (optional)
docker-compose run --rm web rake db:migrateto perform database migrations. Does nothing if your database is up to date. - (optional)
docker-compose run --rm web rake assets:precompileto compile new JS and CSS assets. docker-compose up -dto re-create (restart) containers and pick up the changes.