From ee1f50ff2a0f4c98bbd17139555744b3459f7659 Mon Sep 17 00:00:00 2001 From: dunossauro Date: Sun, 2 Jun 2024 23:46:56 -0300 Subject: [PATCH] =?UTF-8?q?Adicionando=20nota=20sobre=20inicializa=C3=A7?= =?UTF-8?q?=C3=A3o=20do=20postgres=20com=20healthcheck?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit related #48 Modified-by: dunossauro --- aulas/10.md | 33 +++++++++++++++++++++++++++++++-- 1 file changed, 31 insertions(+), 2 deletions(-) diff --git a/aulas/10.md b/aulas/10.md index 5909fc16..ec1eb6bf 100644 --- a/aulas/10.md +++ b/aulas/10.md @@ -443,7 +443,7 @@ Este processo garante que as migrações do banco de dados são realizadas autom --- ??? info "Nota de revisão sobre variáveis de ambiente" - Utilizar variáveis de ambiente definidas em um arquivo `.env` é uma prática recomendada para cenários de produção devido à segurança que oferece. No entanto, para manter a simplicidade e o foco nas funcionalidades do FastAPI neste curso, optamos por explicitar essas variáveis no `compose.yaml`. Isso é particularmente relevante, pois o Docker Compose é utilizado apenas para o ambiente de desenvolvimento; no deploy para [fly.io](http://fly.io), o qual é o nosso foco, o compose não será utilizado em produção. + Utilizar variáveis de ambiente definidas em um arquivo `.env` é uma prática recomendada para cenários de produção devido à segurança que oferece. No entanto, para manter a simplicidade e o foco nas funcionalidades do FastAPI neste curso, optamos por explicitar essas variáveis no `compose.yaml`. Isso é particularmente relevante, pois o Docker Compose é utilizado apenas para o ambiente de desenvolvimento; no deploy para [fly.io](http://fly.io){:target="_blank"}, o qual é o nosso foco, o compose não será utilizado em produção. Ainda assim, é valioso mencionar como essa configuração mais segura seria realizada, especialmente para aqueles que planejam utilizar o Docker Compose em produção. @@ -498,7 +498,36 @@ Este processo garante que as migrações do banco de dados são realizadas autom Com essa configuração, o Pydantic irá ignorar quaisquer variáveis no `.env` que não sejam explicitamente declaradas na classe `Settings`, evitando assim conflitos e erros inesperados. - > Agradecimentos especiais a [@vcwild](https://github.com/vcwild) e [@williangl](https://github.com/williangl) pelas revisões valiosas nesta aula que me fizeram criar essa nota. :heart: + > Agradecimentos especiais a [@vcwild](https://github.com/vcwild){:target="_blank"} e [@williangl](https://github.com/williangl){:target="_blank"} pelas revisões valiosas nesta aula que me fizeram criar essa nota. :heart: + + +??? example "Boas práticas de inicialização do banco de dados" + Como esse é um caso pensado em estudo, possivelmente não haverá problemas relacionados à inicialização. Em um ambiente de produção, porém, não existe a garantia de que o postgres está pronto para uso no momento em que o `entrypoint` for executado. Seria necessário que, antes da execução da migração, o container do banco de dados tivesse a inicialização finalizada. + + Isso é feito usando o campo `healthcheck` do `compose.yaml`: + + ```py title="compose.yaml" hl_lines="12-16" + services: + fastzero_database: + image: postgres + volumes: + - pgdata:/var/lib/postgresql/data + environment: + POSTGRES_USER: app_user + POSTGRES_DB: app_db + POSTGRES_PASSWORD: app_password + ports: + - "5432:5432" + healthcheck: + test: ["CMD-SHELL", "pg_isready"] + interval: 5s + timeout: 5s + retries: 10 + ``` + + Dessa forma, ele irá executar o comando [`pg_isready`](https://www.postgresql.org/docs/current/app-pg-isready.html){:target="_blank"} a cada 5 segundos por 10 vezes. `pg_isready` é um utilitário do PostgreSQL que verifica se ele já está operando e pronto para receber conexões. Desta forma, a inicialização do container só termina quando o postgres estiver ouvindo conexões. + + Dica do [@ayharano](https://github.com/ayharano){:target="_blank"} nessa [issue](https://github.com/dunossauro/fastapi-do-zero/issues/48){:target="_blank"}. ## Testes com Docker