O que são variáveis de ambiente (e por que usar)

Variáveis de ambiente são pares chave-valor que o sistema operacional entrega a cada processo quando ele inicia. Servem para guardar configurações e segredos fora do código.

Atualizado em 4 min de leitura

Objetivos de aprendizado

Depois de ler este artigo, você vai conseguir:

  • Entender o que são variáveis de ambiente e de onde elas vêm
  • Ler variáveis no Node.js e no Python, com valor padrão e validação
  • Separar configuração e segredos do código, com .env e sem vazar token
Nesta página

Toda aplicação precisa de valores que mudam conforme o lugar onde roda: o endereço do banco de dados, a porta, o token de um bot, a chave de uma API de pagamento. Escrever esses valores direto no código funciona no seu computador e vira problema no primeiro deploy.

Variáveis de ambiente resolvem isso. O código pergunta ao sistema "qual é o valor de DATABASE_URL?" e cada ambiente responde o seu. O código fica igual, a configuração muda. É um dos primeiros conceitos a dominar antes de qualquer deploy.

Mesmo códigoLocalDATABASE_URLTOKENPORTTesteDATABASE_URLTOKENPORTProduçãoDATABASE_URLTOKENPORT
O código é o mesmo; cada ambiente entrega ao processo os seus próprios valores na hora de iniciar.

O que é uma variável de ambiente?#

É um par nome-valor que pertence ao ambiente de um processo. Quando o sistema operacional inicia um programa, entrega a ele uma cópia desse conjunto. O programa pode lê-la a qualquer momento, e os processos filhos que ele iniciar herdam a mesma cópia.

Você já usa algumas sem perceber: PATH diz onde o sistema procura executáveis e HOME aponta para a pasta do usuário. As suas são do mesmo tipo. No Linux/macOS, o primeiro exemplo define a variável só para aquele comando; no PowerShell, o segundo a mantém até você fechar o terminal:

bash
PORT=3000 node index.js
powershell
$env:PORT = "3000"; node index.js

Duas regras valem para todas as linguagens. Primeiro, todo valor é texto: 3000 chega como "3000" e false chega como "false" (que, em muitas linguagens, é verdadeiro). Segundo, por convenção o nome não começa com número e usa MAIÚSCULAS e underscore, como API_KEY.

Como ler variáveis no código?#

No Node.js, elas ficam em process.env. No Python, em os.environ, que lança KeyError se a chave não existir; os.getenv devolve um valor padrão nesse caso.

js
// Node.js
const port = Number(process.env.PORT ?? 3000);
const token = process.env.DISCORD_TOKEN;
if (!token) {
  throw new Error("Defina DISCORD_TOKEN antes de iniciar");
}
python
import os

port = int(os.getenv("PORT", "8000"))
token = os.environ["DISCORD_TOKEN"]  # KeyError se não existir

Use valor padrão para o que é opcional (a porta) e falhe cedo para o que é obrigatório (o token). Um erro claro na inicialização custa menos que um undefined aparecendo em produção horas depois.

Por que não colocar a configuração no código?#

O guia 12-factor, uma referência clássica para apps na nuvem, define configuração como tudo que varia entre deploys: credenciais, endereços de serviços, nome de host. O teste que ele propõe: se você pudesse tornar o código público agora sem expor nenhuma credencial, a configuração está bem separada.

Há três ganhos práticos:

  • Segurança. Um token no código vai para o Git, e o histórico guarda para sempre. Um token de bot do Discord ou uma chave de API que chega a um repositório público fica visível para qualquer pessoa: trate essa credencial como comprometida.
  • Um código, vários ambientes. O mesmo build roda em desenvolvimento, teste e produção, trocando só as variáveis.
  • Troca sem alterar o código. Rotacionar uma senha vira mudar um valor e reiniciar, sem novo commit.

O que é o arquivo .env e como usar?#

Definir dez variáveis na mão a cada execução cansa. O arquivo .env guarda um NOME=valor por linha e serve só para desenvolvimento:

ini
DISCORD_TOKEN=cole_o_token_aqui
DATABASE_URL=postgres://usuario:senha@localhost:5432/app
PORT=3000

O Node.js lê esse formato sem biblioteca, com a flag --env-file:

bash
node --env-file=.env index.js

Se a variável já existir no ambiente, ela vence o valor do arquivo. Em Python, o pacote python-dotenv faz o mesmo com load_dotenv().

O ponto crítico: coloque .env no .gitignore. Para quem clonar o projeto, versione um .env.example com os nomes e valores falsos: assim todos sabem o que configurar.

Como lidar com segredos?#

Variável de ambiente é melhor que valor escrito no código, mas não é cofre. Alguns cuidados:

  1. Não imprima valores em logs nem em mensagens de erro.
  2. Dê a cada serviço só as credenciais de que ele precisa.
  3. Se um token vazou, revogue e gere outro. Apagar o commit não basta, pois o valor já pode ter sido copiado.
  4. Nunca coloque segredos em variáveis lidas pelo navegador. Em frameworks de front-end, prefixos como NEXT_PUBLIC_ ou VITE_ expõem o valor no JavaScript enviado ao visitante: use-os só para dados públicos.

Quando variável de ambiente não é a melhor opção?#

Para configuração estrutural e longa, como listas de regras ou textos, um arquivo de configuração versionado é mais legível. Para segredos que mudam o tempo todo ou exigem auditoria de acesso, um cofre de segredos dedicado faz mais sentido. Para a imensa maioria dos bots e das APIs, porém, variáveis de ambiente bastam.

Como fazer isso na Square Cloud#

Na Square Cloud, o .env que você usa em desenvolvimento vira a configuração de produção sem copiar valor por valor: o painel importa o arquivo e cria as variáveis da aplicação, e exporta tudo de volta no formato KEY=VALUE quando você precisar. Cada variável também pode ser definida pela CLI (app env set KEY=VALUE), pela API ou pela extensão do VS Code.

Dois detalhes seguem as regras deste guia. Cada aplicação tem o próprio conjunto de variáveis e não lê as de outra, mesmo na mesma conta, então o bot nunca enxerga as credenciais da API. E uma mudança vale no próximo reinício, sem reenviar o código: rotacionar uma senha é trocar o valor e reiniciar. As variáveis já existem durante a instalação das dependências, e SQUARECLOUD_APP_ID entrega o ID da própria aplicação em runtime.

Veja o passo a passo na página de variáveis de ambiente e os comandos da CLI.

Deploy

Envie pelo GitHub, pela CLI ou em ZIP e publique em segundos

Saiba mais

Perguntas frequentes

Variável de ambiente e arquivo .env são a mesma coisa?

Não. A variável de ambiente pertence ao processo em execução. O arquivo .env é só um jeito de preenchê-las em desenvolvimento: um programa ou o próprio Node.js lê o arquivo e cria as variáveis no processo.

Variáveis de ambiente são seguras para guardar senhas?

São bem melhores que escrever a senha no código, porque não vão para o repositório. Mas quem tem acesso ao processo ou ao painel do servidor consegue lê-las, então limite quem tem acesso e nunca imprima os valores nos logs.

Por que process.env.PORT vem como texto e não como número?

Toda variável de ambiente é uma string. Se você precisa de número ou booleano, converta no código, por exemplo com Number(process.env.PORT) ou int(os.getenv('PORT')).

Preciso reiniciar a aplicação depois de mudar uma variável?

Sim. O processo recebe as variáveis quando inicia e não as relê sozinho. Para o novo valor valer, reinicie a aplicação.

Próximo passo · Passo 3 de 5Como hospedar um banco de dados (e conectar sua aplicação)Para hospedar um banco de dados, escolha o motor, crie a instância, guarde a string de conexão em variável de ambiente e teste a conexão. Veja o passo a passo.