services: fake-tools: build: dockerfile: Dockerfile context: . image: fake-tools.local:1 container_name: fake-tools restart: no hostname: fake-tools extra_hosts: # O fake-starkbank precisa SAIR do container para entregar webhooks no # monolito, que roda no host — diferente do fake-binance, que só entra. # `host.docker.internal` não resolve por padrão em Docker no Linux. - 'host.docker.internal:host-gateway' environment: # Par que o monolito consumidor configura como BINANCE_API_KEY/SECRET # de dev — troque os defaults abaixo para casar com o outro lado. # `.env` está no .dockerignore e o serviço não declara `env_file:`, então # uma env FORA deste bloco NUNCA chega ao container — exportá-la no host # não basta. Toda `FAKE_*` documentada no .env.example precisa de uma # linha aqui; tests/Arch/DockerComposeEnvContractTest.php é o gate. FAKE_BINANCE_API_KEY: ${FAKE_BINANCE_API_KEY:-fake-binance-local-key} FAKE_BINANCE_API_SECRET: ${FAKE_BINANCE_API_SECRET:-fake-binance-local-secret} FAKE_BINANCE_RECV_WINDOW: ${FAKE_BINANCE_RECV_WINDOW:-5000} # Velocidade do auto-advance de ordens fiat/withdraw; consumido pelo # ticket do painel, que ainda vai implementar o scheduler. FAKE_BINANCE_FIAT_ADVANCE_SECONDS: ${FAKE_BINANCE_FIAT_ADVANCE_SECONDS:-60} FAKE_BINANCE_WITHDRAW_ADVANCE_SECONDS: ${FAKE_BINANCE_WITHDRAW_ADVANCE_SECONDS:-60} FAKE_BINANCE_DEPOSIT_ADVANCE_SECONDS: ${FAKE_BINANCE_DEPOSIT_ADVANCE_SECONDS:-60} # Ledger de partida. Formato: lista separada por vírgula de # ASSET:AMOUNT (ex.: BRL:100000,USDT:5000). FAKE_BINANCE_SEED_BALANCES: ${FAKE_BINANCE_SEED_BALANCES:-BRL:100000,USDT:5000} FAKE_BINANCE_FIAT_STATUS_DIALECT: ${FAKE_BINANCE_FIAT_STATUS_DIALECT:-live} FAKE_BINANCE_FIAT_DEPOSIT_ENABLED: ${FAKE_BINANCE_FIAT_DEPOSIT_ENABLED:-true} FAKE_BINANCE_FIAT_SUPPORTED_CURRENCY: ${FAKE_BINANCE_FIAT_SUPPORTED_CURRENCY:-BRL} FAKE_BINANCE_FIAT_SUPPORTED_PAYMENT_METHOD: ${FAKE_BINANCE_FIAT_SUPPORTED_PAYMENT_METHOD:-Pix} FAKE_BINANCE_FIAT_STRICT_PAYMENT_METHOD_CASING: ${FAKE_BINANCE_FIAT_STRICT_PAYMENT_METHOD_CASING:-false} FAKE_BINANCE_FIAT_BRCODE_PLACEMENT: ${FAKE_BINANCE_FIAT_BRCODE_PLACEMENT:-root} # Metade do contrato cruzado entre os dois fakes: precisa ser idêntica a # FAKE_STARKBANK_FUNDING_PIX_KEY abaixo, ou o preview do fake-starkbank # não resolve o BR Code que o fake-binance emite. FAKE_BINANCE_FIAT_PIX_KEY: ${FAKE_BINANCE_FIAT_PIX_KEY:-funding@fake-binance.dev} FAKE_BINANCE_FIAT_MERCHANT_NAME: ${FAKE_BINANCE_FIAT_MERCHANT_NAME:-Fake Binance} FAKE_BINANCE_FIAT_MERCHANT_CITY: ${FAKE_BINANCE_FIAT_MERCHANT_CITY:-Sao Paulo} FAKE_BINANCE_USDCBRL_PRICE: ${FAKE_BINANCE_USDCBRL_PRICE:-5.10} FAKE_BINANCE_USDCBRL_SPREAD: ${FAKE_BINANCE_USDCBRL_SPREAD:-0.02} FAKE_BINANCE_USDTBRL_PRICE: ${FAKE_BINANCE_USDTBRL_PRICE:-5.10} FAKE_BINANCE_USDTBRL_SPREAD: ${FAKE_BINANCE_USDTBRL_SPREAD:-0.02} FAKE_BINANCE_SPOT_COMMISSION_RATE: ${FAKE_BINANCE_SPOT_COMMISSION_RATE:-0.001} FAKE_BINANCE_DEPTH_LEVELS: ${FAKE_BINANCE_DEPTH_LEVELS:-5} FAKE_BINANCE_DEPTH_STEP: ${FAKE_BINANCE_DEPTH_STEP:-0.01} # Sobrescreva para casar com o hostname do ambiente onde o container roda. APP_URL: ${FAKE_TOOLS_APP_URL:-http://localhost:8080} # Banco: a instância do brd-digital, alcançada pelo nome do serviço dentro # da rede dev-brd — a porta aqui é a INTERNA (5432), nunca a publicada no # host. O database precisa existir antes do primeiro `up`; ver README. DB_CONNECTION: pgsql DB_HOST: ${FAKE_TOOLS_DB_HOST:-brd-db} DB_PORT: ${FAKE_TOOLS_DB_PORT:-5432} DB_DATABASE: ${FAKE_TOOLS_DB_DATABASE:-dev_fake_tools} DB_USERNAME: ${FAKE_TOOLS_DB_USERNAME:-postgres} DB_PASSWORD: ${FAKE_TOOLS_DB_PASSWORD:-postgres} # Contrato de env do fake-starkbank (ver README.md § Env contract) — # mesmo padrão dos FAKE_BINANCE_* acima. FAKE_STARKBANK_CLIENT_ACCESS_ID: ${FAKE_STARKBANK_CLIENT_ACCESS_ID:-project/6341320293482496} FAKE_STARKBANK_CLIENT_PUBLIC_KEY_PATH: ${FAKE_STARKBANK_CLIENT_PUBLIC_KEY_PATH:-docker/dev-keys/client-dev.pub.pem} FAKE_STARKBANK_RECV_WINDOW_SECONDS: ${FAKE_STARKBANK_RECV_WINDOW_SECONDS:-300} FAKE_STARKBANK_WEBHOOK_URL: ${FAKE_STARKBANK_WEBHOOK_URL:-http://host.docker.internal:8000/webhooks/starkbank} FAKE_STARKBANK_WEBHOOK_PRIVATE_KEY_PATH: ${FAKE_STARKBANK_WEBHOOK_PRIVATE_KEY_PATH:-docker/dev-keys/webhook-dev.pem} FAKE_STARKBANK_WEBHOOK_TIMEOUT_SECONDS: ${FAKE_STARKBANK_WEBHOOK_TIMEOUT_SECONDS:-5} FAKE_STARKBANK_INVOICE_ADVANCE_SECONDS: ${FAKE_STARKBANK_INVOICE_ADVANCE_SECONDS:-60} FAKE_STARKBANK_TRANSFER_ADVANCE_SECONDS: ${FAKE_STARKBANK_TRANSFER_ADVANCE_SECONDS:-60} FAKE_STARKBANK_BRCODE_ADVANCE_SECONDS: ${FAKE_STARKBANK_BRCODE_ADVANCE_SECONDS:-60} # Workspace servido por GET /v2/workspace. É por aqui que se arma o # cenário do endpoint: `status` fora de `active` ou lista de tax ids vazia. FAKE_STARKBANK_WORKSPACE_ID: ${FAKE_STARKBANK_WORKSPACE_ID:-6341320293482496} FAKE_STARKBANK_WORKSPACE_USERNAME: ${FAKE_STARKBANK_WORKSPACE_USERNAME:-brd-treasury} FAKE_STARKBANK_WORKSPACE_NAME: ${FAKE_STARKBANK_WORKSPACE_NAME:-BRD Treasury} FAKE_STARKBANK_WORKSPACE_ALLOWED_TAX_IDS: ${FAKE_STARKBANK_WORKSPACE_ALLOWED_TAX_IDS:-20.018.183/0001-80} FAKE_STARKBANK_WORKSPACE_STATUS: ${FAKE_STARKBANK_WORKSPACE_STATUS:-active} FAKE_STARKBANK_WORKSPACE_ORGANIZATION_ID: ${FAKE_STARKBANK_WORKSPACE_ORGANIZATION_ID:-5716662276096000} FAKE_STARKBANK_WORKSPACE_PICTURE_URL: ${FAKE_STARKBANK_WORKSPACE_PICTURE_URL:-https://s3.amazonaws.com/starkbank/workspaces/brd-treasury.png} FAKE_STARKBANK_BRCODE_RECONCILIATION_ID: ${FAKE_STARKBANK_BRCODE_RECONCILIATION_ID:-recon-9f2c} FAKE_STARKBANK_BRCODE_DESCRIPTION: ${FAKE_STARKBANK_BRCODE_DESCRIPTION:-Invoice 2026-07} FAKE_STARKBANK_DICT_REFERENCE_PIX_KEY: ${FAKE_STARKBANK_DICT_REFERENCE_PIX_KEY:-ada@brd.digital} FAKE_STARKBANK_DICT_REFERENCE_TYPE: ${FAKE_STARKBANK_DICT_REFERENCE_TYPE:-email} FAKE_STARKBANK_DICT_REFERENCE_NAME: ${FAKE_STARKBANK_DICT_REFERENCE_NAME:-Ada Lovelace} FAKE_STARKBANK_DICT_REFERENCE_TAX_ID: ${FAKE_STARKBANK_DICT_REFERENCE_TAX_ID:-012.345.678-90} FAKE_STARKBANK_DICT_REFERENCE_OWNER_TYPE: ${FAKE_STARKBANK_DICT_REFERENCE_OWNER_TYPE:-naturalPerson} FAKE_STARKBANK_DICT_BANK_NAME: ${FAKE_STARKBANK_DICT_BANK_NAME:-Stark Bank S.A.} FAKE_STARKBANK_DICT_ISPB: ${FAKE_STARKBANK_DICT_ISPB:-20018183} FAKE_STARKBANK_DICT_ACCOUNT_TYPE: ${FAKE_STARKBANK_DICT_ACCOUNT_TYPE:-checking} FAKE_STARKBANK_DICT_STATUS: ${FAKE_STARKBANK_DICT_STATUS:-registered} # Outra metade do contrato cruzado — ver FAKE_BINANCE_FIAT_PIX_KEY acima. FAKE_STARKBANK_FUNDING_PIX_KEY: ${FAKE_STARKBANK_FUNDING_PIX_KEY:-funding@fake-binance.dev} FAKE_STARKBANK_FUNDING_TAX_ID: ${FAKE_STARKBANK_FUNDING_TAX_ID:-20.018.183/0001-80} FAKE_STARKBANK_FUNDING_NAME: ${FAKE_STARKBANK_FUNDING_NAME:-Fake Binance} # Plano de controle: o grupo /control que o monolito consumidor usa em dev # para observar (feed e snapshot) e dirigir os dois fakes por HTTP. # Desligado, as rotas nem registram — o `control:reset-baseline` continua. FAKE_TOOLS_CONTROL_ENABLED: ${FAKE_TOOLS_CONTROL_ENABLED:-true} FAKE_TOOLS_CONTROL_FEED_DEFAULT_LIMIT: ${FAKE_TOOLS_CONTROL_FEED_DEFAULT_LIMIT:-100} FAKE_TOOLS_CONTROL_FEED_MAX_LIMIT: ${FAKE_TOOLS_CONTROL_FEED_MAX_LIMIT:-500} FAKE_TOOLS_CONTROL_FEED_RETENTION_HOURS: ${FAKE_TOOLS_CONTROL_FEED_RETENTION_HOURS:-24} FAKE_TOOLS_CONTROL_STATE_RECENT_LIMIT: ${FAKE_TOOLS_CONTROL_STATE_RECENT_LIMIT:-10} # Conexão dedicada do produtor do feed: mesmo banco, autocommit fora da # transação da Action que logou. FAKE_TOOLS_CONTROL_CONNECTION: ${FAKE_TOOLS_CONTROL_CONNECTION:-control} ports: - '8080:8080' volumes: - fake-tools-data:/app/storage networks: - dev-brd healthcheck: test: ['CMD', 'curl', '--fail', 'http://127.0.0.1:8080/up'] interval: 10s retries: 5 timeout: 10s start_period: 15s volumes: fake-tools-data: name: fake-tools-data networks: # Rede do compose do brd-digital, onde vive o `brd-db` que este projeto reusa. # `external: true` porque quem a cria é o outro compose — um `up` aqui falha # se a stack do brd-digital nunca subiu. Acoplamento deliberado: não subimos # container de banco próprio. dev-brd: name: dev-brd external: true