Como restaurar um backup do Heroku em seu container docker do Postgres?

Fala, gente! Hoje vamos aprender como restaurar um backup do Postgres a partir do Heroku a adicioná-la em um container Docker.

A ideia por trás desse post é apenas compartilhar o conhecimento visto que passei um bom tempo até reunir todas as informações para fazer esse procedimento, sendo assim, vamos lá!

Mostre todos os backups que você possui no Heroku:

$> heroku pg:backups --app <heroku-app-name>

Isso deve retornar algo assim:

=== Backups
ID    Created at                 Status                               Size      Database
────  ─────────────────────────  ───────────────────────────────────  ────────  ────────
b113  2020-06-16 20:30:50 +0000  Completed 2020-06-16 20:30:51 +0000  155.43KB  DATABASE
a112  2020-06-16 07:13:12 +0000  Completed 2020-06-16 07:13:44 +0000  156.21KB  DATABASE
a111  2020-06-15 07:12:38 +0000  Completed 2020-06-15 07:12:59 +0000  155.94KB  DATABASE
a110  2020-06-14 07:14:18 +0000  Completed 2020-06-14 07:14:48 +0000  155.94KB  DATABASE
a109  2020-06-13 07:13:24 +0000  Completed 2020-06-13 07:13:55 +0000  155.94KB  DATABASE
a108  2020-06-12 07:10:20 +0000  Completed 2020-06-12 07:11:27 +0000  155.94KB  DATABASE
a107  2020-06-11 07:13:03 +0000  Completed 2020-06-11 07:13:31 +0000  155.94KB  DATABASE
a106  2020-06-10 07:12:27 +0000  Completed 2020-06-10 07:12:53 +0000  155.94KB  DATABASE
a105  2020-06-09 07:13:43 +0000  Completed 2020-06-09 07:14:17 +0000  136.70KB  DATABASE

Agora copie o ID do backup que você quer baixar e rode o seguinte comando:

$> heroku pg:backups:url <ID> --remote production --app <heroku-app-name>, example: $> heroku pg:backups:url b113 --remote production --app my-app.

Isso vai retornar a URL que você precisa para salvar o backup. A URL deve ser algo como isso:

https://xfrtu.s3.amazonaws.com/a0d7744f-43tf-4f09-9816-13051ad02ce8/2020-06-16T20%3A30%3A50Z/1a893b18-c21e-4c8b-a8ce-191c86ab5698?X-Amz-Algorithm=D%RT-DEDS&X-Amz-Credential=AKIAQKDFRD2F20200617%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=2020D$RF2309Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=fc61433aeef53cefe5e05d92adab98229cae8637bd22eb3b2d6f5ffced5

Agora rode o comando para mostrar todos os containers que estão rodando docker container ls

Você deve pegar o CONTAINER ID ou o nome do container do Postgres, daí rode o comando:

docker exec -it <container id/name> bash

Com isso você deve entrar no prompt do container.

O próximo passo é atualizar o container e instalar uma ferramenta chamada 'curl'. Para fazer isso rode o seguinte comando:

$> apt-get update
$> apt-get install curl

Agora podemos usar a URL para baixar o backup do Heroku.

$> curl "https://xfrtu.s3.amazonaws.com/a0d7710-Amz-SignedHeaders=host&X-Amz-Signature973bfb67435ae235b6876a1edf37ee3" > production.dump

Importante: Não esqueça de adicionar as aspas "http://..." na URL. Agora podemos restaurar o backup com esse comando:

pg_restore --verbose --clean --no-acl --no-owner -U postgres -h localhost -d <database name> production.dump

Lembre-se que se você estiver usando Rails e Git, você precisará estar no mesmo commit da versão que do banco de dados que será restaurado.

É isso, gente! Qualquer dúvida deixem nos comentários.

Vlw!