Before upgrade

Backup database! we're going from PostgreSQL 12 direcly to 15:

cd /path/to/misskey
docker-compose stop web # we won't want to get unsaved tooths
docker-compose exec db pg_dumpall -U misskey  > ../mk-dump.sql

Upgrade!

git stash
git checkout master
git pull --no-rebase
git submodule update --init
git stash pop
docker-compose build
docker-compose stop && docker-compose up -d

Post upgrade

Nothing works, you need to reconstruct db from scratch:

docker-compose stop web
docker-compose stop db
sudo rm -rf db
docker-compose start db
mv ../mk-dump.sql db/
docker-compose exec db bash
psql -U misskey -d misskey < /var/lib/postgresql/data/mk-dump.sql
exit

You also need to upgrade to new password encryption:

docker-compose stop db
sudo nano db/postgresql.conf # uncomment password_encryption = scram-sha-256

now you need to upgrade password. get your old password:

cat .config/docker.env
docker-compose start db
docker-compose exec db bash
psql -U misskey -d misskey

you can check before and after if password has been upgraded for new version with this command:

SELECT rolname, rolpassword ~ '^SCRAM-SHA-256\$' AS has_upgraded FROM pg_authid WHERE rolcanlogin;

now upgrade the password (you can reuse old password or change it to a new one)

\password
{enter password}
{enter password again}
quit;
exit

lastly, we start web, and let the upgrade finish itself

docker-compose start web

ET... VOILÀ!