Objetivos de aprendizado
Depois de ler este artigo, você vai conseguir:
- Escrever um .env com a sintaxe correta
- Carregar o .env no Node.js e no Python
- Manter o arquivo fora do Git e configurar os valores em produção com segurança
Todo projeto tem valores que não pertencem ao código: o token de um bot, a senha do banco, a chave de uma API. Digitar tudo isso no terminal a cada execução cansa, e escrever no código é perigoso. O arquivo .env é a solução comum: um arquivo de texto ao lado do projeto, lido na hora de iniciar.
Na prática, ele é só um jeito de preencher as variáveis de ambiente em desenvolvimento. O sistema operacional não lê o arquivo: quem lê é o runtime (Node.js) ou uma biblioteca (python-dotenv), que copia os pares para o processo.
Qual é a sintaxe de um arquivo .env?#
Uma variável por linha, no formato NOME=valor. Não existe um padrão oficial único, mas as regras abaixo valem no Node.js e no python-dotenv:
DEBUG=false # comentário
DISCORD_TOKEN=cole_o_token_aqui
PORT=3000
DATABASE_URL="postgresql://usuario:senha@localhost:5432/meubanco" # comentário no fim
FRASE='aqui o # não começa comentário'
CHAVE_PRIVADA="linha 1
linha 2"
export NODE_ENV=development- Nomes usam letras, números e underscore, sem começar por número, em geral em MAIÚSCULAS. No Node.js,
my-vare1_VARsão inválidos. - Aspas são opcionais, mas necessárias quando o valor tem
#ou várias linhas. Valores entre aspas podem ocupar mais de uma linha. - Tudo é texto.
PORT=3000chega como"3000"eDEBUG=falsechega como"false", que em JavaScript e Python é verdadeiro. Converta no código. exportno começo da linha é aceito e ignorado, o que permite carregar o mesmo arquivo comsource .envno shell.
Cuidado também com $ em valores. O Next.js expande $OUTRA_VAR dentro de arquivos .env e exige \$ para um cifrão literal. O python-dotenv só expande a forma ${VAR}.
Como carregar o .env no Node.js?#
As versões recentes do Node.js têm suporte nativo, sem instalar pacote, e a flag --env-file já não é experimental:
node --env-file=.env index.js// index.js
const token = process.env.DISCORD_TOKEN;
if (!token) throw new Error("DISCORD_TOKEN não definido");
const port = Number(process.env.PORT ?? 3000);
console.log(`Subindo na porta ${port}`);Se o arquivo não existir, --env-file dá erro. Use --env-file-if-exists=.env, que também vem nas versões recentes do Node.js, quando o arquivo é opcional, por exemplo em produção. Também dá para carregar de dentro do código com process.loadEnvFile('.env'), e util.parseEnv() só interpreta o texto, sem mexer em process.env.
Você pode passar vários arquivos. Os posteriores sobrescrevem os anteriores, mas uma variável já definida no ambiente sempre vence o arquivo:
node --env-file=.env --env-file=.env.local index.jsComo carregar o .env no Python?#
Use o pacote python-dotenv:
pip install python-dotenvimport os
from dotenv import load_dotenv
load_dotenv() # procura .env na pasta do script ou acima
token = os.environ["DISCORD_TOKEN"] # KeyError se faltar
port = int(os.getenv("PORT", "3000"))
print(f"Subindo na porta {port}")Por padrão load_dotenv() não substitui variáveis já existentes no ambiente; load_dotenv(override=True) faz o contrário. Se quiser só ler os valores sem alterar os.environ, use dotenv_values(".env"), que devolve um dicionário.
Em outros frameworks o arquivo pode ser lido sozinho. O Next.js carrega .env, .env.local e variantes por NODE_ENV, e só expõe ao navegador as variáveis com prefixo NEXT_PUBLIC_, que são gravadas no JavaScript no momento do build. No Docker Compose, a chave env_file do serviço carrega as variáveis do arquivo no ambiente do container.
Como não vazar segredos do .env?#
O risco real do .env é ele ir parar no repositório. Faça isto antes do primeiro commit:
- Crie um
.gitignorecom a linha.env(e.env.*se usar variantes, liberando só.env.example). - Versione um
.env.examplecom os nomes e valores falsos, para quem clonar saber o que preencher:
DISCORD_TOKEN=
DATABASE_URL=postgresql://usuario:senha@localhost:5432/meubanco
PORT=3000- Confira com
git statusque o.envnão aparece como arquivo novo. - Nunca imprima valores em logs nem os coloque em prints de erro.
Se um segredo já foi commitado, apagar o arquivo não resolve, porque o histórico guarda o conteúdo. Gere uma chave nova e revogue a antiga. O passo a passo está em chave de API exposta no GitHub, e para bots vale ver o token do bot do Discord.
Quais erros são comuns com .env?#
A variável vem undefined. O arquivo não foi carregado (faltou --env-file ou load_dotenv()), está em outra pasta (o caminho do --env-file é relativo ao diretório atual, não ao script) ou o nome tem erro de digitação.
Mudei o valor e nada mudou. O processo lê o arquivo só ao iniciar: reinicie. Se a variável também existe no ambiente, ela vence o arquivo. Rode echo $DISCORD_TOKEN (ou $env:DISCORD_TOKEN no PowerShell) para ver.
O valor veio cortado no #. Coloque o valor entre aspas.
PORT não funciona como número. É texto. Converta com Number() ou int().
A variável do front-end aparece vazia. Em frameworks como o Next.js, só variáveis com prefixo NEXT_PUBLIC_ chegam ao navegador, e o valor é fixado no build. Nunca use esse prefixo para segredos.
Como fazer isso na Square Cloud#
Na Square Cloud, as variáveis de ambiente são configuradas por aplicação, no painel, pela API, pela CLI ou pela extensão do VS Code. O código continua lendo process.env ou os.environ normalmente.
Se você já tem um .env pronto, o painel importa o arquivo e preenche as variáveis. Também dá para exportar tudo de volta como KEY=VALUE. A mudança vale no próximo reinício da aplicação, sem rebuild. Dentro da aplicação, a variável SQUARECLOUD_APP_ID traz o ID dela em tempo de execução.
Assim o .env continua só no seu computador, listado no .gitignore, e os valores de produção ficam configurados na própria aplicação. Veja os detalhes em variáveis de ambiente na Square Cloud.
Deploy
Envie pelo GitHub, pela CLI ou em ZIP e publique em segundos
Perguntas frequentes
O arquivo .env precisa ter esse nome exato?
Não. O nome .env é uma convenção. O Node.js aceita qualquer caminho em --env-file=arquivo e o python-dotenv aceita qualquer caminho em load_dotenv('arquivo'). Frameworks como o Next.js procuram nomes específicos, como .env.local.
Posso commitar o .env no Git?
Não, se ele tiver segredos. Coloque .env no .gitignore e versione só um .env.example com os nomes das variáveis e valores de mentira. Se um segredo já foi commitado, troque a chave: apagar o arquivo depois não remove o histórico.
O .env substitui uma variável que já existe no sistema?
Por padrão, não. No Node.js com --env-file e no python-dotenv com load_dotenv(), o valor que já está no ambiente vence o do arquivo. No python-dotenv, override=True inverte isso.
Preciso do arquivo .env em produção?
Não necessariamente. Em produção, a plataforma costuma ter um campo próprio de variáveis de ambiente, e o código lê o mesmo process.env ou os.environ. O .env é principalmente uma conveniência para desenvolvimento local.
Mais em Deploy
Ver todos os 33 artigos- O que são variáveis de ambiente (e por que usar)Variáveis de ambiente são pares chave-valor que o sistema entrega ao processo. Veja como ler no Node.js e Python e por que tokens não ficam no código.
- O que é deploy (e o que acontece quando você faz um)Deploy é o processo de levar o código de uma aplicação para um servidor, prepará-lo e colocá-lo no ar. Veja as etapas, os métodos e como voltar atrás.
- Quanta RAM e CPU minha aplicação precisa?Dimensione RAM e CPU medindo o pico real da aplicação e somando uma folga de 30%. Veja como medir em Node.js, Python e Java e o que fazer quando faltar.
- Deploy automático com GitHub ActionsDeploy automático com GitHub Actions envia seu código para o servidor a cada push. Veja o workflow passo a passo, secrets, testes antes do deploy e erros comuns.