GH GambleHub

Tecnologia e Infraestrutura → Docker Compose e Ambiente Dave

Docker Compose e Ambiente Dave

1) Porquê Compose

Docker Compose é uma maneira rápida de elevar a réplica de prod-stack para locais/CI: aplicativos, BD, filas, cachês, proxy inverso, serviços MK. Objetivos:
  • A paridade com a venda (imagens, variáveis, redes) é menor do que «funciona comigo».
  • Início rápido para os novatos → 'make up' e para a luta.
  • Estandes isolados por desenvolvedor/ramo → trabalho paralelo sem conflitos.
  • Testes de integração em dependências reais.

2) Estrutura básica do repositório


project/
docker/
app/      # Dockerfile, скрипты web/      # Nginx/Traefik конфиги seed/      # сидеры/фикстуры compose.yaml       # общий базовый стек compose.override.yaml   # локальные оверрайды (в.gitignore)
compose.ci.yaml      # для CI
.env.example       # шаблон окружения
Makefile         # удобные цели devcontainer.json     # VS Code Dev Containers (опционально)
Recomendações:
  • compose. yaml - descreve o «esqueleto» (serviços, redes, volumes) igual para dave/CI.
  • override - apenas edições locais: mappings de diretório, portas, bandeiras debug.
  • .env. example → o desenvolvedor cópia em '.eng' e configura os valores.

3) Esqueleto compose. yaml (exemplo)

yaml name: project services:
gateway:
image: traefik:v3 command:
- "--providers.docker=true"
- "--entrypoints.web.address=:80"
- "--entrypoints.websecure.address=:443"
- "--certificatesresolvers.dev.acme.tlschallenge=true"
ports: ["80:80", "443:443"]
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro networks: [edge, core]

api:
build:
context:.
dockerfile: docker/app/Dockerfile target: dev env_file: [.env]
command:./scripts/dev-start.sh volumes:
-./:/app:cached depends_on: [db, redis, kafka]
labels:
- "traefik.http.routers.api.rule=Host(`${API_HOST}`)"
- "traefik.http.services.api.loadbalancer.server.port=8080"
networks: [core]

db:
image: postgres:16 environment:
POSTGRES_USER: ${DB_USER}
POSTGRES_PASSWORD: ${DB_PASS}
POSTGRES_DB: ${DB_NAME}
volumes:
- pgdata:/var/lib/postgresql/data healthcheck: {test: ["CMD-SHELL","pg_isready -U $$POSTGRES_USER"], interval: 5s, timeout: 3s, retries: 20}
networks: [core]

redis:
image: redis:7 command: ["redis-server","--appendonly","yes"]
volumes: [ "redisdata:/data" ]
networks: [core]

kafka:
image: bitnami/kafka:3 environment:
KAFKA_ENABLE_KRAFT: "yes"
KAFKA_CFG_PROCESS_ROLES: "controller,broker"
KAFKA_CFG_NODE_ID: 1
KAFKA_CFG_LISTENERS: PLAINTEXT://:9092
KAFKA_CFG_ADVERTISED_LISTENERS: PLAINTEXT://kafka:9092 networks: [core]

mailhog:
image: mailhog/mailhog ports: ["8025:8025"]
networks: [core]

mock-psp:
image: wiremock/wiremock:3 command: ["--verbose","--global-response-templating"]
volumes: ["./docker/mocks/psp:/home/wiremock"]
labels:
- "traefik.http.routers.mockpsp.rule=Host(`${PSP_HOST}`)"
networks: [core]

volumes:
pgdata: {}
redisdata: {}

networks:
edge: {}
core: {}
Pontos-chave:
  • Traefik/NGINX como gateway: aproxima o padrão de routing do de venda.
  • Healthcheck e depends _ on com 'condition: service _ healthy' (em v3 através de script waiting) é um começo ordenado.
  • Volumes para Persistência (BD/dinheiro) e bind-mount para código (hot-reload).

4) Perfis e arquivos múltiplos

Os profiles ('profiles: [dave, ci, extras]') incluem/excluem serviços ('docker compose --profile extras up -d').

Vários arquivos:
  • `docker compose -f compose. yaml -f compose. dev. yaml up '- fundir configurações.
Conjunto típico:
  • `compose. yaml '- básico.
  • `compose. dev. yaml '- bind-mounts, debag, fichicheflags.
  • `compose. extras. yaml '- ferramentas (Grafana, pgAdmin, Kafdrop).
  • `compose. ci. yaml '- «cabeça sem gráficos», sem bind-mounts.

5) Variáveis, segredos e configurações

.eng é a fonte geral de variáveis: hosts, credenciais de base de teste, bandeiras.

Segredos não são mantidos de forma explícita; usamos:
  • segredos de dummy local (chaves de braçadeira),
  • integração com skinny-Vault/SOPS para particularmente sensível.
  • Princípio: Dados minimamente necessários. PAN/PII - tokens/ficstures.

6) Montagens e velocidade

6. 1 Multi-stage + BuildKit

Dockerfile com os objetivos 'base', 'dave', 'prod'; cache-layer compartilhado para dependências.
Ativar o BuildKit: 'DOCKER _ BUILDKIT = 1' (ou no configh).
«--mount = tipo = cachê, target =/root/.cache/...» para pip/npm/maven.

6. 2 Ciclo rápido

Bind-mount кода + hot-reload (nodemon, uvicorn --reload, Spring Devtools).
Uma meta particular dave com a montagem apenas do que você deseja.
Makefile цели: `make up`, `make down`, `make logs`, `make rebuild`, `make seed`.

A exemplo de Makefile:
make
ENV?= dev up:
docker compose --profile $(ENV) up -d down:
docker compose down -v logs:
docker compose logs -f --tail=200 rebuild:
DOCKER_BUILDKIT=1 docker compose build --pull --no-cache api seed:
docker compose run --rm api./scripts/seed.sh migrate:
docker compose run --rm api./scripts/migrate.sh test:
docker compose -f compose.yaml -f compose.ci.yaml run --rm api./scripts/test.sh

7) BD, migração, siding

As migrações (Flyway/Liquibase/Albic/Prisma) são iniciadas com um hub após o início de 'db' (espera healthcheck).
Ciding: um contêiner «seed» separado com ficturas; repetível e idimpotente.
O volume 'pgdata' pode ser reativado/restaurado com o script 'reset-db'. sh`.


8) Corretores, cachês, CDC

Kafka/Rabbit/Redpanda - como na venda (configs mínimos).
Redis com AOF incluído para realismo.
Conectores CDC (opcional): Debezium em um serviço separado para testes de integração de analistas.


9) Moki fornecedores externos

WireMock/Prism para o REST, MockServer para os cenários complexos.
Mailhog/SMTP4Dev para cartas.
Localstack/MinIO para estoques de nuvem e compatibilidade S3.
Política: Todos os PSP/KYC/KMS externos - por meio de McHab contratos (OpenAPI) e não «Internet».


10) Proxy inverso e TLS

O Traefik/NGINX distribui serviços para domínios locais ('.test', '.local'):
  • `api. local. test`, `mockpsp. local. test`.
  • TLS: mkcert para emitir um certificado local de confiança para testar HSTS/secure-cookies.
  • Use as sessões de sticky apenas para as malas onde isso é realmente importante.

11) Perfis de desenvolvedor: Node/Python/Java

Node: mount 'node _ modales' como um dinheiro (volume) para acelerar install; 'CHOKIDAR _ USEPOLLING = 1' no Windows/WSL.
Python: `pip cache` как volume, `watchfiles`/`uvicorn --reload`.
Java: JRebel/Devtools, 'mvn -T 1C + camada com dependências.


12) Testes e qualidade

Testes de integração dentro da rede Compose: 'docker compose run teste'.
Testcontainers (para JVM/Node/Python/.NET) é uma opção de integração unit sem pilha completa.
Um contrato de testes com um hub → gate na CI.
Linters/Pré-commit: execute em um contêiner de repetição.


13) Devcontainers e «IDE-como-código»

`devcontainer. json 'capta a imagem do escravo (CLI, SDK, linters), monta o projeto, expulsa' postCreateCommand '.
As mesmas ferramentas, não «entupimos» o hóspede, a nova máquina está pronta em minutos.


14) Segurança em dave

Sem root nas imagens de aplicativos; 'readOnlyRootFilesystem' sempre que possível.
Sem chaves de guerra ou segredos, mesmo temporariamente.
Logi - sem PII/PAN; camuflagem ao nível do formator.
Segregação de portas e redes: acesso externo somente por gateway.


15) FinOps/desempenho em local

Limite os recursos de 'deploy. resources. limits '(Compose lê parcialmente, mas ajuda a disciplina).
Reduza o fã-out (menos serviços padrão; extras - perfis).
Cash BuildKit e kits de volume para gerentes de pacotes.


16) CI с Compose

Use os mesmos 'compose. yaml` + `compose. ci. yaml 'sem bind-mounts.
Cash Dependence - Como um volume attachable entre jobs/camadas.
Jobs paralelo: 'name:' no Compose é diferente (ou prefixo por ramo) para que os estandes não fiquem em conflito.


17) Trapachuting

'docker compose ps '/' logs -f '/' exec' é um diagnóstico básico.
Verifique o DNS na rede Compose.
Se o bind-mount «trava» no macOS/Windows - ': cached '/': delegated' ou Mutagen/virtuofs.
Healthcheck é «verde», mas o serviço está «morto»: verifique «readiness» sua aplicação e ordem de migração.


18) Folha de cheque de implementação

1. Pilha básica (gateway, api, db, cachê, queue) em compose. yaml.
2. Edição local - override (v.gitignore).
3..env. example completa e atualizada; 'make bootstrap' a cópia em '.eng'.
4. Healthchecks e cenário de espera BD/migração.
5. WireMock/Localstack/MinIO para provedores externos.
6. Siding e migração como comandos 'make seed/migrate'.
7. BuildKit + multi-estágio, cases de dependências.
8. Devcontainers/Makefile para partida rápida.
9. Perfis 'extras' para ferramentas (Grafana/pgAdmin/Kafdrop).
10. A CI usa a mesma compose (+ ci-override).


19) Anti-pattern

«Monstro-compose» em 40 serviços, sempre em andamento: inclua perfis.
Portos duros e em conflito entre desenvolvedores.
Segredos/chaves em Git ou '.env. example`.
Dependência de «internet» para testes (PSP real/KYC).
Falta de healthcheck/espera - corrida de migração e lançamentos.
Falta de siding → testes de integração flaky.


20) Total

Compose é um motor de velocidade desenvolvida, um único arquivo descreve o seu mundo de serviços, e os perfis/overraides oferecem flexibilidade. Mantenha a paridade com a venda, automatize o siding e as migrações, mantenha os mooks e os TLS «como em combate», acelere as montagens do BuildKit 'om - e você terá um ambiente local em que você pode trabalhar, testar facilmente e reproduzir com segurança os cenários de venda iGaming/fintech.

Contact

Entrar em contacto

Contacte-nos para qualquer questão ou necessidade de apoio.Estamos sempre prontos para ajudar!

Iniciar integração

O Email é obrigatório. Telegram ou WhatsApp — opcionais.

O seu nome opcional
Email opcional
Assunto opcional
Mensagem opcional
Telegram opcional
@
Se indicar Telegram — responderemos também por lá.
WhatsApp opcional
Formato: +indicativo e número (ex.: +351XXXXXXXXX).

Ao clicar, concorda com o tratamento dos seus dados.