Pular para o conteúdo principal
Esta página fornece uma referência completa e anotada de values.yaml otimizada para implantações em produção. Copie, adapte os marcadores de posição ao seu ambiente e implante.
Esta é uma configuração de referência. Você deve substituir todos os valores de marcador de posição (marcados com {...}) com os dados reais da sua infraestrutura antes de implantar.

Como usar


  1. Copie a configuração completa abaixo em um arquivo chamado values-production.yaml
  2. Substitua todos os marcadores {...} com seus valores reais
  3. Revise cada seção e ajuste os limites de recursos para sua carga de trabalho esperada
  4. Implante:
helm install midaz oci://registry-1.docker.io/lerianstudio/midaz-helm \
  --version <version> \
  -n midaz \
  --create-namespace \
  -f values-production.yaml

Valores completos de produção


As variáveis de ambiente ACCOUNT_TYPE_VALIDATION e TRANSACTION_ROUTE_VALIDATION foram deprecadas e substituídas pela API de Configurações do Ledger. Use PATCH /v1/organizations/{org_id}/ledgers/{ledger_id}/settings para configurar a validação contábil por ledger.
# =============================================================================
# Midaz Production Values Reference
# =============================================================================
# Este arquivo configura Midaz para um ambiente Kubernetes de produção com:
# - Serviço Ledger unificado (recomendado sobre onboarding/transaction legacy)
# - Bancos de dados externos (PostgreSQL, MongoDB, RabbitMQ, Valkey/Redis)
# - Ingress com TLS
# - Observabilidade habilitada
# - Plugin CRM habilitado
# - Alta disponibilidade com autoscaling
# =============================================================================

# -- Sobrecargas de nome globais
nameOverride: "midaz"
fullnameOverride: ""
namespaceOverride: "midaz"

# =============================================================================
# GLOBAL: Jobs de bootstrap para bancos de dados externos
# =============================================================================

global:
  # -- Job de bootstrap para PostgreSQL externo
  externalPostgresDefinitions:
    enabled: true
    connection:
      host: "{seu-host-postgres}"         # ex: "prod-postgres.example.com"
      port: "5432"
    postgresAdminLogin:
      useExistingSecret:
        name: "{seu-secret-admin-postgres}" # Deve conter DB_USER_ADMIN e DB_ADMIN_PASSWORD
    midazCredentials:
      useExistingSecret:
        name: "{seu-secret-credenciais-midaz}" # Deve conter DB_PASSWORD_MIDAZ

  # -- Job de bootstrap para RabbitMQ externo
  externalRabbitmqDefinitions:
    enabled: true
    connection:
      protocol: "https"
      host: "{seu-host-rabbitmq}"
      port: "15672"
      portAmqp: "5672"
    rabbitmqAdminLogin:
      useExistingSecret:
        name: "{seu-secret-admin-rabbitmq}"
    appCredentials:
      useExistingSecret:
        name: "{seu-secret-app-rabbitmq}"

# =============================================================================
# LEDGER: Serviço unificado (recomendado para novas instalações)
# =============================================================================

ledger:
  enabled: true
  replicaCount: 3

  image:
    repository: lerianstudio/midaz-ledger
    pullPolicy: IfNotPresent
    tag: ""

  securityContext:
    runAsGroup: 1000
    runAsUser: 1000
    runAsNonRoot: true
    capabilities:
      drop:
        - ALL
    readOnlyRootFilesystem: true

  pdb:
    enabled: true
    minAvailable: 2
    maxUnavailable: 1

  deploymentUpdate:
    type: RollingUpdate
    maxSurge: 1
    maxUnavailable: 0

  service:
    type: ClusterIP
    port: 3002

  ingress:
    enabled: true
    className: "{sua-classe-ingress}"
    annotations:
      nginx.ingress.kubernetes.io/proxy-body-size: "10m"
      nginx.ingress.kubernetes.io/proxy-read-timeout: "60"
    hosts:
      - host: "{seu-dominio-api-midaz}"
        paths:
          - path: /
            pathType: Prefix
    tls:
      - secretName: "{seu-secret-tls}"
        hosts:
          - "{seu-dominio-api-midaz}"

  resources:
    requests:
      cpu: "1000m"
      memory: "512Mi"
    limits:
      cpu: "2000m"
      memory: "2Gi"

  autoscaling:
    enabled: true
    minReplicas: 3
    maxReplicas: 10
    targetCPUUtilizationPercentage: 70
    targetMemoryUtilizationPercentage: 80

  affinity:
    podAntiAffinity:
      preferredDuringSchedulingIgnoredDuringExecution:
        - weight: 100
          podAffinityTerm:
            labelSelector:
              matchExpressions:
                - key: app.kubernetes.io/name
                  operator: In
                  values:
                    - ledger
            topologyKey: kubernetes.io/hostname

  configmap:
    ENABLE_TELEMETRY: "true"
    PLUGIN_AUTH_ENABLED: "false"
    PLUGIN_AUTH_HOST: ""
    # Accounting Configuration
    # Managed via Ledger Settings API — see PATCH /v1/organizations/{org_id}/ledgers/{ledger_id}/settings
    # Request body: {"accounting": {"validateRoutes": true, "validateAccountType": true}}
    DB_ONBOARDING_HOST: "{seu-host-postgres}"
    DB_ONBOARDING_USER: "midaz"
    DB_ONBOARDING_NAME: "onboarding"
    DB_ONBOARDING_PORT: "5432"
    DB_ONBOARDING_REPLICA_HOST: "{seu-host-replica-postgres}"
    DB_ONBOARDING_REPLICA_USER: "midaz"
    DB_ONBOARDING_REPLICA_NAME: "onboarding"
    DB_ONBOARDING_REPLICA_PORT: "5432"
    MONGO_ONBOARDING_URI: "mongodb"
    MONGO_ONBOARDING_HOST: "{seu-host-mongodb}"
    MONGO_ONBOARDING_NAME: "onboarding"
    MONGO_ONBOARDING_USER: "midaz"
    MONGO_ONBOARDING_PORT: "27017"
    DB_TRANSACTION_HOST: "{seu-host-postgres}"
    DB_TRANSACTION_USER: "midaz"
    DB_TRANSACTION_NAME: "transaction"
    DB_TRANSACTION_PORT: "5432"
    DB_TRANSACTION_REPLICA_HOST: "{seu-host-replica-postgres}"
    DB_TRANSACTION_REPLICA_USER: "midaz"
    DB_TRANSACTION_REPLICA_NAME: "transaction"
    DB_TRANSACTION_REPLICA_PORT: "5432"
    MONGO_TRANSACTION_URI: "mongodb"
    MONGO_TRANSACTION_HOST: "{seu-host-mongodb}"
    MONGO_TRANSACTION_NAME: "transaction"
    MONGO_TRANSACTION_USER: "midaz"
    MONGO_TRANSACTION_PORT: "27017"
    REDIS_HOST: "{seu-host-redis}:6379"
    RABBITMQ_URI: "amqps"
    RABBITMQ_HOST: "{seu-host-rabbitmq}"
    RABBITMQ_PORT_HOST: "5672"
    RABBITMQ_PORT_AMQP: "15672"
    RABBITMQ_DEFAULT_USER: "transaction"
    RABBITMQ_CONSUMER_USER: "consumer"
    RABBITMQ_TRANSACTION_ASYNC: "false"
    AUDIT_LOG_ENABLED: "true"
    # -- Balance Sync Worker
    BALANCE_SYNC_BATCH_SIZE: "100"
    BALANCE_SYNC_FLUSH_TIMEOUT_MS: "1000"
    BALANCE_SYNC_POLL_INTERVAL_MS: "500"

  useExistingSecret: true
  existingSecretName: "midaz-ledger"

  serviceAccount:
    create: true
    annotations: {}

# =============================================================================
# SERVIÇOS LEGACY: Desabilitados ao usar Ledger
# =============================================================================

onboarding:
  enabled: false

transaction:
  enabled: false

# =============================================================================
# CRM
# =============================================================================

crm:
  enabled: true
  replicaCount: 2

  image:
    repository: lerianstudio/midaz-crm
    pullPolicy: IfNotPresent
    tag: ""

  securityContext:
    runAsGroup: 1000
    runAsUser: 1000
    runAsNonRoot: true
    capabilities:
      drop:
        - ALL
    readOnlyRootFilesystem: true

  pdb:
    enabled: true
    minAvailable: 1
    maxUnavailable: 1

  service:
    type: ClusterIP
    port: 4003

  ingress:
    enabled: true
    className: "{sua-classe-ingress}"
    hosts:
      - host: "{seu-dominio-api-crm}"
        paths:
          - path: /
            pathType: Prefix
    tls:
      - secretName: "{seu-secret-tls-crm}"
        hosts:
          - "{seu-dominio-api-crm}"

  resources:
    requests:
      cpu: "200m"
      memory: "256Mi"
    limits:
      cpu: "500m"
      memory: "512Mi"

  autoscaling:
    enabled: true
    minReplicas: 2
    maxReplicas: 5
    targetCPUUtilizationPercentage: 80
    targetMemoryUtilizationPercentage: 80

  configmap:
    ENV_NAME: "production"
    PLUGIN_AUTH_ENABLED: "false"
    PLUGIN_AUTH_ADDRESS: ""
    MONGO_HOST: "{seu-host-mongodb}"
    MONGO_NAME: "crm"
    MONGO_PORT: "27017"
    MONGO_USER: "midaz"

  useExistingSecret: true
  existingSecretName: "midaz-crm"

# =============================================================================
# DEPENDÊNCIAS INCLUÍDAS: Todas desabilitadas (usando bancos de dados externos)
# =============================================================================

postgresql:
  enabled: false

mongodb:
  enabled: false

rabbitmq:
  enabled: false

valkey:
  enabled: false

# =============================================================================
# OBSERVABILIDADE
# =============================================================================

grafana:
  enabled: true
  name: grafana
  ingress:
    enabled: true
    className: "{sua-classe-ingress}"
    hosts:
      - host: "{seu-dominio-grafana}"
        paths:
          - path: /
            pathType: Prefix
    tls:
      - secretName: "{seu-secret-tls-grafana}"
        hosts:
          - "{seu-dominio-grafana}"

otel-collector-lerian:
  enabled: true
  external: false
  opentelemetry-collector:
    config:
      processors:
        resource/add_client_id:
          attributes:
            - key: client.id
              value: "{nome-da-sua-empresa}"
              action: upsert
  extraEnvs:
    - name: OTEL_API_KEY
      valueFrom:
        secretKeyRef:
          name: otel-api-key
          key: api-key
  exporters:
    otlphttp/server:
      endpoint: "https://telemetry.lerian.io:443"
      headers:
        x-api-key: "${OTEL_API_KEY}"

Decisões-chave explicadas


Por que Ledger em vez de Onboarding + Transaction?

O serviço unificado ledger é a abordagem recomendada para todas as novas instalações. Ele combina ambos os módulos em uma única implantação, reduzindo a carga operacional:
  • Menos pods para gerenciar e monitorar
  • Configuração simplificada (um único configmap/secret)
  • Um único endpoint de ingress
  • Melhor utilização de recursos
  • Será a única opção em versões futuras

Por que bancos de dados externos?

Implantações em produção devem usar serviços de bancos de dados gerenciados para:
  • Backups automatizados e recuperação point-in-time
  • Alta disponibilidade com failover automático
  • Monitoramento e alertas integrados
  • Escalamento sem tempo de inatividade da aplicação
  • Patches de segurança gerenciados pelo provedor
Serviços gerenciados recomendados:
DependênciaAWSGCPAzure
PostgreSQLAmazon RDSCloud SQLAzure Database for PostgreSQL
MongoDBAmazon DocumentDB ou MongoDB AtlasMongoDB AtlasAzure Cosmos DB (MongoDB API)
RabbitMQAmazon MQAuto-gerenciado no GKEAuto-gerenciado no AKS
Redis/ValkeyAmazon ElastiCacheMemorystoreAzure Cache for Redis

Por que usar Kubernetes Secrets em vez de senhas inline?

Senhas inline em values.yaml são visíveis no histórico de versões do Helm e podem ser commitadas em controle de versão. Usar useExistingSecret: true com Secrets pré-criados do Kubernetes:
  • Mantém as credenciais fora dos valores do Helm
  • Permite rotação sem necessidade de upgrade do Helm
  • Integra com ferramentas de gerenciamento de segredos (Vault, External Secrets Operator, Sealed Secrets)

Anti-afinidade de pods

A regra podAntiAffinity distribui os pods do Ledger em diferentes nós, de modo que a falha de um único nó não derrube todo o serviço.

Checklist antes de implantar


1

Criar Kubernetes Secrets

Crie todos os secrets necessários no namespace midaz antes de executar helm install:
  • midaz-ledger (credenciais de bancos de dados e broker de mensagens)
  • midaz-crm (chaves de criptografia e senha do MongoDB)
  • otel-api-key (se estiver usando telemetria da Lerian)
2

Configurar DNS

Aponte seus domínios para o IP externo do controlador de ingress.
3

Provisionar certificados TLS

Use cert-manager para provisionamento automático ou crie manualmente os secrets TLS.
4

Verificar conectividade com bancos de dados

Certifique-se de que seu cluster Kubernetes consegue alcançar todos os bancos de dados externos.
5

Revisar limites de recursos

Ajuste os limites de CPU e memória com base no seu volume de transações esperado.
6

Implantar

helm install midaz oci://registry-1.docker.io/lerianstudio/midaz-helm \
  --version <version> \
  -n midaz \
  --create-namespace \
  -f values-production.yaml
7

Verificar implantação

kubectl get pods -n midaz -o wide
kubectl get ingress -n midaz
helm list -n midaz

Recursos relacionados