networks: metrics: driver: bridge transactional: driver: bridge services: db: image: postgres healthcheck: # Serve de condicional para que o docker compose saiba que o banco # foi criado com sucesso antes de inicializar a aplicação. test: ["CMD-SHELL", "pg_isready -U ${PG_USER} -d ${PG_DB}"] interval: 10s retries: 5 start_period: 30s timeout: 10s volumes: - ./data/postgres:/var/lib/postgresql/data environment: POSTGRES_USER: ${PG_USER} POSTGRES_PASSWORD: ${PG_PASS} POSTGRES_DB: ${PG_DB} ports: - 5432:5432 networks: - transactional # Interface web para monitoramento e consultas no banco. adminer: image: adminer ports: - 8090:8080 depends_on: - db networks: - transactional # Observabilidade e coleta de dados prometheus: image: prom/prometheus expose: - '9090' ports: - "9090:9090" volumes: - ./prometheus/prometheus.yml:/etc/prometheus/prometheus.yml networks: - metrics # Necessário para que o serviço consiga encontrar a aplicação quando # estivermos desenvolvendo localmente, fora de um contêiner. extra_hosts: - "host.docker.internal:host-gateway" # Servidor. rodar apenas quando estivermos em produção. app: build: . environment: # Aplicação não se conecta com o banco sem isso. # Apenas funciona pois o docker compose registra o nome de cada serviço como um # endereço de rede, e esse é o endereço do banco. PG_ADDR: db depends_on: db: # Não incializa até que o banco esteja recebendo requisições condition: service_healthy restart: true ports: - 8888:8888 networks: - metrics - transactional