Back

Arquivos .env e a Arte de Não Commitar Segredos

Arquivos .env e a Arte de Não Commitar Segredos

Você já viu um arquivo .env em um projeto e se perguntou para que serve? Ou talvez tenha ouvido sobre os perigos de acidentalmente commitar chaves de API no GitHub? Este guia explicará tudo o que você precisa saber sobre arquivos .env – o que são, por que são importantes e como usá-los adequadamente para manter seus segredos seguros.

Principais Pontos

  • Arquivos .env armazenam configurações específicas do ambiente e segredos separadamente do seu código
  • Nunca commite arquivos .env no controle de versão
  • Use arquivos .env.example para documentar variáveis necessárias sem revelar valores reais
  • Valide variáveis de ambiente quando sua aplicação iniciar
  • Considere soluções mais avançadas conforme sua equipe e aplicação crescem

O que são Arquivos .env?

Um arquivo .env é um arquivo de texto simples que armazena variáveis de ambiente no formato CHAVE=valor. Estes arquivos servem a um propósito crítico: mantêm dados de configuração sensíveis separados do seu código.

# Exemplo de arquivo .env
API_KEY=a1b2c3d4e5f6g7h8i9j0
DATABASE_URL=postgres://username:password@localhost:5432/mydb
DEBUG=false

Variáveis de ambiente são valores que podem afetar como sua aplicação em execução se comporta. Ao armazená-las em um arquivo .env em vez de codificá-las diretamente na aplicação, você obtém várias vantagens:

  1. Segurança: Dados sensíveis ficam fora do seu código
  2. Flexibilidade: Diferentes ambientes podem usar configurações diferentes
  3. Simplicidade: Fácil de atualizar sem alterar código

Por que Arquivos .env Existem: Um Breve Histórico

A abordagem de arquivos .env ganhou popularidade por volta de 2012 como parte da metodologia Twelve-Factor App, que recomenda armazenar configuração no ambiente. Antes desta padronização, desenvolvedores frequentemente cometiam erros perigosos:

  • Codificar credenciais de banco de dados diretamente no código
  • Armazenar chaves de API em arquivos de configuração commitados
  • Usar diferentes mecanismos de configuração entre ambientes

Essas práticas levaram a violações de segurança graves. Em 2016, a Uber sofreu uma violação massiva de dados expondo dados de 57 milhões de usuários porque desenvolvedores haviam publicado credenciais da AWS em um repositório do GitHub. O acordo custou $148 milhões.

Como Arquivos .env Funcionam

Arquivos .env são simples em conceito, mas poderosos na prática. Veja como tipicamente funcionam:

  1. Você cria um arquivo .env na raiz do seu projeto
  2. Você adiciona variáveis específicas do ambiente no formato CHAVE=valor
  3. Uma biblioteca na sua aplicação carrega essas variáveis em tempo de execução
  4. O código da sua aplicação acessa esses valores através de variáveis de ambiente

A parte mais importante: seu arquivo .env nunca deve ser commitado no controle de versão.

Configurando Arquivos .env em um Projeto Node.js

Vamos percorrer um exemplo prático usando Node.js:

1. Criar um arquivo .env

Na raiz do seu projeto, crie um arquivo chamado .env:

# Credenciais da API
API_KEY=your_secret_api_key
API_SECRET=your_secret_api_secret

# Configuração do Banco de Dados
DB_HOST=localhost
DB_USER=root
DB_PASS=password
DB_NAME=myapp

# Configurações da Aplicação
PORT=3000
NODE_ENV=development

2. Adicionar .env ao .gitignore

Crie ou atualize seu arquivo .gitignore para incluir:

# Variáveis de ambiente
.env
.env.local
.env.*.local

3. Instalar o pacote dotenv

npm install dotenv --save

4. Carregar variáveis de ambiente na sua aplicação

No topo do seu arquivo principal da aplicação (antes de qualquer outro código):

require('dotenv').config();

// Agora você pode acessar variáveis usando process.env
const apiKey = process.env.API_KEY;
const port = process.env.PORT || 3000;

console.log(`Iniciando servidor na porta ${port}`);

Melhores Práticas de Segurança

Seguir essas melhores práticas ajudará você a evitar armadilhas comuns de segurança:

1. Nunca commitar arquivos .env no controle de versão

Esta é a regra mais importante. Verifique seu arquivo .gitignore para garantir que .env esteja excluído.

2. Criar um arquivo template .env.example

Forneça um template com as variáveis necessárias, mas sem valores reais:

# Credenciais da API
API_KEY=
API_SECRET=

# Configuração do Banco de Dados
DB_HOST=
DB_USER=
DB_PASS=
DB_NAME=

# Configurações da Aplicação
PORT=3000
NODE_ENV=development

Este arquivo deve ser commitado no seu repositório para ajudar outros desenvolvedores a saber quais variáveis eles precisam definir.

3. Validar variáveis de ambiente obrigatórias

Verifique se todas as variáveis necessárias estão presentes quando sua aplicação iniciar:

const requiredEnvVars = ['API_KEY', 'DB_HOST', 'DB_USER', 'DB_PASS'];
const missingEnvVars = requiredEnvVars.filter(
  envVar => !process.env[envVar]
);

if (missingEnvVars.length > 0) {
  throw new Error(`Variáveis de ambiente obrigatórias ausentes: ${missingEnvVars.join(', ')}`);
}

4. Usar diferentes arquivos .env para diferentes ambientes

Para configurações mais complexas, você pode querer múltiplos arquivos de ambiente:

  • .env.development - Configurações do ambiente de desenvolvimento
  • .env.test - Configurações do ambiente de teste
  • .env.production - Configurações do ambiente de produção

Desafios Comuns e Soluções

Desafio: Compartilhar Segredos Entre Membros da Equipe

Compartilhar segredos de forma segura entre membros da equipe é complicado. Evite enviar credenciais por email ou chat.

Soluções:

  • Use um gerenciador de senhas com capacidades de compartilhamento
  • Considere um serviço de gerenciamento de segredos como Doppler ou HashiCorp Vault
  • Para equipes pequenas, canais criptografados seguros podem ser aceitáveis

Desafio: Gerenciar Múltiplos Ambientes

Conforme sua aplicação cresce, você precisará gerenciar variáveis entre ambientes.

Soluções:

  • Use arquivos .env específicos por ambiente (.env.development, .env.production)
  • Implemente uma hierarquia de carregamento onde .env.local sobrescreve .env
  • Considere ferramentas de gerenciamento de variáveis de ambiente para equipes maiores

Desafio: Integração com Pipeline CI/CD

Seu pipeline CI/CD precisa de acesso aos segredos, mas você não pode commitar arquivos .env.

Soluções:

  • Use o gerenciamento de segredos do seu provedor CI/CD (GitHub Secrets, GitLab CI/CD Variables)
  • Integre com um serviço de gerenciamento de segredos
  • Gere arquivos .env durante o deployment a partir de uma fonte segura

Além do Uso Básico

Trabalhando com TypeScript

Para projetos TypeScript, você pode adicionar type safety às suas variáveis de ambiente:

// src/env.d.ts
declare namespace NodeJS {
  interface ProcessEnv {
    NODE_ENV: 'development' | 'production' | 'test';
    PORT: string;
    API_KEY: string;
    // Adicione outras variáveis aqui
  }
}

Docker e Containerização

Ao usar Docker, você tem várias opções para lidar com variáveis de ambiente:

  1. Use a flag --env-file:

    docker run --env-file .env myapp
  2. Defina variáveis no seu docker-compose.yml:

    services:
      app:
        image: myapp
        env_file:
          - .env

Alternativas aos Arquivos .env

Embora arquivos .env sejam populares, eles não são a única solução:

AbordagemPrósContras
Arquivos .envSimples, amplamente suportadoCompartilhamento manual, sem versionamento
Variáveis de ambienteSuporte nativo do SO, sem arquivos necessáriosMais difícil de gerenciar conjuntos de variáveis
Servidores de configCentralizado, versionado, controle de acessoConfiguração mais complexa, potencial ponto único de falha
Gerenciadores de segredosSeguro, auditado, controle de acessoCusto, dependência adicional

Perguntas Frequentes

Sim, comentários começam com #.

Arquivos .env são carregados pela sua aplicação em tempo de execução, enquanto variáveis de ambiente do sistema são definidas no nível do SO. Variáveis .env afetam apenas a aplicação específica que as carrega.

Use arquivos específicos por ambiente como .env.development e .env.production, ou use um serviço de gerenciamento de segredos.

O impacto é negligível para a maioria das aplicações. O arquivo é tipicamente lido uma vez na inicialização.

Use um gerenciador de senhas seguro ou uma ferramenta dedicada de gerenciamento de segredos em vez de email ou chat.

Conclusão

Ao manter seus segredos fora do seu código com arquivos .env, você está dando um passo importante em direção ao desenvolvimento de aplicações mais seguras. Lembre-se: o segredo mais seguro é aquele que nunca sai do seu ambiente local.

Listen to your bugs 🧘, with OpenReplay

See how users use your app and resolve issues fast.
Loved by thousands of developers