Algumas coisas caso outra pessoa fique presa dessa forma.
Primeiro, não execute um ./launcher cleanup, em vez disso, execute um ./launcher start app para reiniciar seu contêiner existente. Então você poderá fazer algo como
./launcher enter app
su - postgres
psql discourse
drop table ...
Sem o contêiner para entrar e falar diretamente com o postgres, você tem que fazer isso durante a construção do contêiner adicionando algo como isto ao seu app.yml:
hooks:
after_postgres:
- exec: /bin/bash -c 'sudo -u postgres psql discourse <<EOF
drop table summary_sections;
EOF'
- exec: /bin/bash -c 'sudo -u postgres psql discourse <<EOF
drop table theme_settings_migrations;
EOF'
Não sei como essas duas tabelas foram criadas de forma que as migrações estivessem fora de sincronia, mas esta foi uma solução. E foi mais estranho do que isso, porque o banco de dados de alguma forma havia sido apagado e, assim que corrigi isso, era um banco de dados totalmente novo, então ele deve ter sido interrompido no meio de uma migração em algum momento.