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!
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.
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
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.
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!