· Updated · Floris Van den Abeele · Linux · 4 min read

Upgrading your mastodon instance

A Mastodon server upgraded to a newer version

As mastodon v3.3.0 has been released for over two months now, I figured it was time to upgrade my family instance from v3.2.1 to v3.3.0 (thereby skipping v3.2.2).

I wrote about hosting your own instance, via docker-compose, in a previous post. The past week I’ve been tinkering with mastodon development. Considering what a pain it has been to setup a local development environment, I remain convinced that a containerized setup is the way to go for hosting mastodon. Let’s get started!

Documentation

Before starting the upgrade, I would suggest going through the documentation on ‘Upgrading to a new release‘ and through the v3.3.0 release notes. Together with the notes here, you should be all set for a successful upgrade.

Database backup

Prior to attempting an upgrade, you should ensure you have a recent backup of the mastodon database. I used pg_dumpall inside the running postgres container (whose docker-compose service is named db) as follows:

docker-compose exec db /bin/bash
pg_dumpall -U mastodon -f mastodon_db_pg_dumpall_output_20210309.sql
tail mastodon_db_pg_dumpall_output_20210309.sql

If the backup was successful, tail should output:

--
-- PostgreSQL database dump complete
--
-- PostgreSQL database cluster dump complete

Make sure you store the resulting sql file in a location that is persisted on the host system, so that the file isn’t lost when the container is shutdown and removed. In the container, I moved the backup file to /var/lib/postgresql/data, which is mounted on the host at /home/mastodon/mastodon/postgres. On the host I moved the file to /home/mastodon.

Backup public/system folder

While not necessary, you might want to backup the files under mastodon/public/system, e.g. excluding the cache folder via

tar --exclude=public/system/cache -zcf mastodon_system_backup_20210309.tar.gz public/system/

Upgrading to new release

After completing the database backup, the steps necessary to upgrade to a new version are roughly as follows:

  • Update your local copy of mastodon to the latest release
  • Rebuild the container images
  • Apply pre-install migrations of the mastodon database
  • Shutdown containers running old release of mastodon
  • Clear mastodon cache and finish DB migration
  • Start newly built containers
  • Prune old containers

In shell commands, make sure you point your working directory to the root folder of the mastodon repo:

git fetch --tags  # fetch all tags from the remote, leaving the working directory intact
git stash # stash any changes made to the working directory (typically only docker-compose.yml file)
git checkout v3.3.0  # checkout working directory to the v3.3.0 release
git stash pop # restore any changes you made to the working directory (i.e. passwords in docker-compose.yml files, verify via git diff)
docker-compose build  # build the web, streaming and sidekiq services, they all share the same container image. This may take a while.
docker images  # you should see the freshly build image at the top, something like: tootsuite/mastodon   latest              aa82ba57a3f4        About a minute ago   1.98GB
docker-compose run --rm -e SKIP_POST_DEPLOYMENT_MIGRATIONS=true web rails db:migrate  # Run the pre-deployment database migrations
# You can check the return code via echo $?, if the rc is zero than the migration was successful
docker-compose down # shutdown all docker-compose services
docker-compose run --rm web bin/tootctl cache clear # clear cache
docker-compose run --rm web rails db:migrate # Run post-deployment database migrations, again verify that it succeeded via echo $?. 0 means success
docker-compose up -d  # create and start containers, detaching from their stdout
docker system prune -a # remove unused docker data (images, containers, volumes)

Verify that the containers are up and running via docker-compose ps and docker ps. You should see something like:

[mastodon@sarch mastodon]$ docker-compose ps
        Name                      Command                  State                     Ports
---------------------------------------------------------------------------------------------------------
mastodon_db_1          docker-entrypoint.sh postgres    Up (healthy)
mastodon_redis_1       docker-entrypoint.sh redis ...   Up (healthy)
mastodon_sidekiq_1     /tini -- bundle exec sidekiq     Up             3000/tcp, 4000/tcp
mastodon_streaming_1   /tini -- node ./streaming        Up (healthy)   3000/tcp, 127.0.0.1:4000->4000/tcp
mastodon_web_1         /tini -- bash -c rm -f /ma ...   Up (healthy)   127.0.0.1:3000->3000/tcp, 4000/tcp

[mastodon@sarch mastodon]$ docker ps
CONTAINER ID        IMAGE                 COMMAND                  CREATED             STATUS                   PORTS                                NAMES
3f7ea048f4f7        tootsuite/mastodon    "/tini -- bash -c 'r…"   4 minutes ago       Up 4 minutes (healthy)   127.0.0.1:3000->3000/tcp, 4000/tcp   mastodon_web_1
c673502e6afa        tootsuite/mastodon    "/tini -- node ./str…"   4 minutes ago       Up 4 minutes (healthy)   3000/tcp, 127.0.0.1:4000->4000/tcp   mastodon_streaming_1
1bba8a9e1934        tootsuite/mastodon    "/tini -- bundle exe…"   4 minutes ago       Up 4 minutes             3000/tcp, 4000/tcp                   mastodon_sidekiq_1
6c623213428d        redis:6.0-alpine      "docker-entrypoint.s…"   7 minutes ago       Up 7 minutes (healthy)                                        mastodon_redis_1
f65c1f822600        postgres:9.6-alpine   "docker-entrypoint.s…"   7 minutes ago       Up 7 minutes (healthy)                                        mastodon_db_1

In case a container fails to start, you can troubleshoot using its logs via docker-compose logs -ft <service-name>.

Finally, point your browser to your mastodon instance and rejoice! It should be listing 3.3.0 in the footer.

Running version 3.3.0
Great success!

As for new features in the 3.3.0 release, I hope to be exploring these in the coming weeks. Many thanks to everyone that contributed to the release!

Share:
Back to Blog

Related Posts

View All Posts »
Home backups with borg

Home backups with borg

Now that my backup solution has been up and running for six months, I thought I’d share a short write-up. I would only recommend running your own backup method, if you are aware of the risks involved. If you’re in the market for backup software, there exist many off-the-shelf products that likely offer what you…

Hosting your own mastodon instance via docker-compose

Hosting your own mastodon instance via docker-compose

Recently I’ve setup an invite-only mastodon instance as a private space for friends and family. While I am still evaluating whether mastodon is the right tool for such a private space, I’d like to share a number of issues I encountered during setup.

Migrating nextcloud to a new server

Nextcloud? I’ve been using a self-hosted file sharing service for the past three years in order to move away from large commercial parties in this space. I started using owncloud in the summer of 2016, but switched to nextcloud later that year as Frank Karlitschek, the founder, left owncloud. The open source, large community and…

Moving from Instagram to Mastodon

Moving from Instagram to Mastodon

For some time I’ve wanted to move the Instagram account of floriscycles.com to my Mastodon instance and delete the instagram account. Earlier this year I did just that and I’d like to share my method in case someone would want to move their account(s). Note: while PixelFed is better suited to hosting media centered content,…