Docker Compose¶
O projeto ProtectKids utiliza o Docker Compose para organizar e executar os serviços necessários para o funcionamento da aplicação em ambiente local.
O arquivo docker-compose.yml define três serviços principais:
db: banco de dados PostgreSQL;backend: API desenvolvida com FastAPI;frontend: interface web desenvolvida com React e Vite.
Além dos serviços, o arquivo também define um volume persistente para armazenar os dados do banco PostgreSQL.
Estrutura geral¶
services:
db:
...
backend:
...
frontend:
...
volumes:
postgres_data:
A chave services agrupa os containers da aplicação.
A chave volumes define volumes persistentes utilizados pelos containers.
Serviço db¶
O serviço db é responsável por executar o banco de dados PostgreSQL utilizado pelo backend.
db:
container_name: ProtectKids_db
image: postgres:15
env_file:
- .env
ports:
- "5432:5432"
volumes:
- postgres_data:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U $${POSTGRES_USER} -d $${POSTGRES_DB}"]
interval: 10s
timeout: 5s
retries: 5
start_period: 10s
container_name¶
container_name: ProtectKids_db
Define o nome do container do banco de dados.
Esse nome facilita a identificação do container ao executar comandos como:
docker ps
image¶
image: postgres:15
Define que o serviço utilizará a imagem oficial do PostgreSQL na versão 15.
env_file¶
env_file:
- .env
Indica que o serviço deve carregar variáveis de ambiente a partir do arquivo .env.
No caso do PostgreSQL, as principais variáveis esperadas são:
POSTGRES_USER=usuario
POSTGRES_PASSWORD=senha
POSTGRES_DB=nome_do_banco
Essas variáveis configuram o usuário, a senha e o nome do banco criado no container.
ports¶
ports:
- "5432:5432"
Mapeia a porta do PostgreSQL.
O primeiro valor representa a porta da máquina local. O segundo valor representa a porta interna do container.
Neste caso:
localhost:5432 -> container:5432
Isso permite acessar o banco PostgreSQL localmente pela porta 5432.
volumes¶
volumes:
- postgres_data:/var/lib/postgresql/data
Define um volume persistente para armazenar os dados do PostgreSQL.
Sem esse volume, os dados poderiam ser perdidos ao remover o container.
O volume postgres_data é definido no final do arquivo:
volumes:
postgres_data:
healthcheck¶
healthcheck:
test: ["CMD-SHELL", "pg_isready -U $${POSTGRES_USER} -d $${POSTGRES_DB}"]
interval: 10s
timeout: 5s
retries: 5
start_period: 10s
O healthcheck verifica se o PostgreSQL está pronto para receber conexões.
O comando utilizado é:
pg_isready
Ele testa a conexão usando as variáveis:
POSTGRES_USER
POSTGRES_DB
O uso de $${POSTGRES_USER} e $${POSTGRES_DB} é necessário para evitar que o Docker Compose tente substituir essas variáveis antes da execução dentro do container.
Configurações do healthcheck:
| Campo | Função |
|---|---|
test |
Comando usado para testar se o banco está pronto |
interval |
Intervalo entre as tentativas |
timeout |
Tempo máximo de espera por tentativa |
retries |
Número de tentativas antes de marcar como falha |
start_period |
Tempo inicial antes de começar a validar falhas |
Serviço backend¶
O serviço backend é responsável por executar a API do projeto ProtectKids.
backend:
container_name: ProtectKids_backend
build:
context: ./backend
dockerfile: Dockerfile
# image: ghcr.io/unb-mds/2026-1-protectkids-backend:latest
ports:
- "8000:8000"
volumes:
- ./backend:/app
depends_on:
db:
condition: service_healthy
env_file:
- .env
command: uvicorn main:app --host 0.0.0.0 --port 8000 --reload
container_name¶
container_name: ProtectKids_backend
Define o nome do container do backend.
Esse nome facilita a identificação do serviço durante testes e depuração.
build¶
build:
context: ./backend
dockerfile: Dockerfile
Indica que a imagem do backend será construída localmente a partir da pasta ./backend.
O campo dockerfile informa qual Dockerfile será utilizado para montar a imagem.
Essa configuração é adequada para ambiente de desenvolvimento, pois permite executar o backend diretamente a partir do código local do projeto.
Imagem GHCR comentada¶
# image: ghcr.io/unb-mds/2026-1-protectkids-backend:latest
Essa linha está comentada e representa uma alternativa para usar uma imagem publicada no GitHub Container Registry.
No ambiente atual de desenvolvimento, foi priorizado o uso de build local para evitar problemas de autenticação com imagem privada no GHCR.
Caso a imagem seja futuramente publicada de forma acessível, essa configuração poderá ser revisada.
ports¶
ports:
- "8000:8000"
Mapeia a porta da API.
Neste caso:
localhost:8000 -> container:8000
Com isso, a API pode ser acessada em:
http://localhost:8000
A documentação Swagger da API fica disponível em:
http://localhost:8000/docs
volumes¶
volumes:
- ./backend:/app
Monta a pasta local ./backend dentro do container no caminho /app.
Isso permite que alterações feitas no código local sejam refletidas dentro do container.
Essa configuração é útil para desenvolvimento, principalmente junto com o modo --reload do Uvicorn.
depends_on¶
depends_on:
db:
condition: service_healthy
Define que o backend depende do serviço db.
Com a condição service_healthy, o backend só será iniciado depois que o banco PostgreSQL passar no healthcheck.
Isso evita que a API tente se conectar ao banco antes dele estar pronto.
env_file¶
env_file:
- .env
Carrega as variáveis de ambiente do arquivo .env.
O backend utiliza principalmente a variável DATABASE_URL, responsável pela conexão com o banco de dados.
Exemplo:
DATABASE_URL=postgresql://usuario:senha@db:5432/nome_do_banco
Dentro do Docker Compose, o host do banco deve ser db, pois esse é o nome do serviço definido no arquivo.
command¶
command: uvicorn main:app --host 0.0.0.0 --port 8000 --reload
Define o comando executado ao iniciar o container do backend.
Esse comando inicia a aplicação FastAPI usando o Uvicorn.
Partes do comando:
| Trecho | Função |
|---|---|
uvicorn |
Servidor ASGI usado para executar a API |
main:app |
Indica que a aplicação está no arquivo main.py, variável app |
--host 0.0.0.0 |
Permite acesso externo ao container |
--port 8000 |
Define a porta da API |
--reload |
Reinicia automaticamente o servidor ao detectar alterações no código |
O parâmetro --reload é recomendado para desenvolvimento, mas não deve ser utilizado em produção.
Serviço frontend¶
O serviço frontend é responsável por executar a interface web do ProtectKids.
frontend:
container_name: ProtectKids_frontend
build:
context: ./frontend
dockerfile: Dockerfile
ports:
- "5173:5173"
volumes:
- ./frontend:/app
- /app/node_modules
depends_on:
- backend
command: npm run dev -- --host
container_name¶
container_name: ProtectKids_frontend
Define o nome do container do frontend.
build¶
build:
context: ./frontend
dockerfile: Dockerfile
Indica que a imagem do frontend será construída localmente a partir da pasta ./frontend.
O Dockerfile usado será o arquivo localizado dentro dessa pasta.
ports¶
ports:
- "5173:5173"
Mapeia a porta usada pelo Vite.
Neste caso:
localhost:5173 -> container:5173
Com isso, o frontend pode ser acessado em:
http://localhost:5173
volumes¶
volumes:
- ./frontend:/app
- /app/node_modules
O primeiro volume monta a pasta local ./frontend dentro do container no caminho /app.
Isso permite que alterações feitas no código do frontend sejam refletidas no container.
O segundo volume:
- /app/node_modules
preserva a pasta node_modules dentro do container.
Essa configuração evita conflitos entre as dependências instaladas no container e a pasta local do desenvolvedor.
depends_on¶
depends_on:
- backend
Define que o frontend depende do backend.
Isso organiza a ordem de inicialização dos serviços, fazendo com que o backend seja iniciado antes do frontend.
command¶
command: npm run dev -- --host
Executa o servidor de desenvolvimento do frontend.
Esse comando inicia o Vite em modo de desenvolvimento e permite acesso ao serviço fora do container.
Uma alternativa mais explícita seria:
command: npm run dev -- --host 0.0.0.0
Volume postgres_data¶
volumes:
postgres_data:
Define o volume persistente usado pelo banco PostgreSQL.
Esse volume armazena os dados do banco fora do ciclo de vida do container.
Assim, mesmo que o container do banco seja removido e recriado, os dados podem ser mantidos.
Comunicação entre os serviços¶
Dentro da rede criada automaticamente pelo Docker Compose, os containers conseguem se comunicar usando o nome do serviço.
Por isso, o backend deve acessar o banco usando o host:
db
Exemplo de DATABASE_URL:
DATABASE_URL=postgresql://usuario:senha@db:5432/nome_do_banco
Não deve ser usado localhost para conectar o backend ao banco dentro do Docker, pois localhost dentro do container do backend aponta para o próprio container do backend.
Portas utilizadas¶
| Serviço | Porta local | Porta interna | URL local |
|---|---|---|---|
| PostgreSQL | 5432 | 5432 | localhost:5432 |
| Backend | 8000 | 8000 | http://localhost:8000 |
| Frontend | 5173 | 5173 | http://localhost:5173 |
Arquivo .env¶
O arquivo .env deve conter as variáveis necessárias para configurar o banco e o backend.
Exemplo:
POSTGRES_USER=usuario
POSTGRES_PASSWORD=senha
POSTGRES_DB=protectkids_db
DATABASE_URL=postgresql://usuario:senha@db:5432/protectkids_db
O arquivo .env não deve ser versionado no GitHub.
Para isso, ele deve estar listado no .gitignore.
O repositório deve manter apenas um arquivo .env.example, sem credenciais reais.
Como executar o ambiente¶
Na raiz do projeto, execute:
docker compose up --build
Esse comando constrói as imagens locais e inicia os containers.
Para parar os containers:
docker compose down
Para parar os containers e remover o volume do banco:
docker compose down -v
Atenção: o comando docker compose down -v remove o volume postgres_data e apaga os dados locais do banco.
Como verificar os containers¶
docker ps
Para visualizar os logs:
docker compose logs
Logs específicos do backend:
docker compose logs backend
Logs específicos do banco:
docker compose logs db
Logs específicos do frontend:
docker compose logs frontend
Resumo da configuração¶
| Serviço | Função | Tecnologia | Porta |
|---|---|---|---|
db |
Banco de dados | PostgreSQL 15 | 5432 |
backend |
API da aplicação | FastAPI + Uvicorn | 8000 |
frontend |
Interface web | React + Vite | 5173 |
Observações importantes¶
- O backend utiliza build local para facilitar o desenvolvimento.
- A imagem do GHCR permanece comentada como alternativa futura.
- O banco possui
healthcheckpara evitar falhas de conexão no início da aplicação. - O backend só inicia após o banco estar saudável.
- O frontend depende do backend para organizar a ordem de inicialização.
- As variáveis sensíveis devem ficar no
.env. - O arquivo
.env.exampledeve ser mantido atualizado no repositório.