Executando verificação de segurança...
4

[DÚVIDA] Variáveis de ambiente

Galera, pode parecer uma dúvida besta, mas acho que pode gerar algum valor: qual a melhor maneira, ou, onde deixar a configuração original das variáveis de ambiente? Ela deve existir em algum lugar?

Meu ponto é: sei que não se deve commitar o .env no versionamento de código, e criar um ".env.example" ou algo do tipo com a estrutura que se espera. Porém, numa situação real de empresa, caso ninguém tenha a configuração completa desse arquivo, está certo eu ser obrigado a buscar todas as infos necessárias, uma por uma? Ou teria algum lugar seguro pra ter disponível essa configuração?

Carregando publicação patrocinada...
4

Na verdade... o seu .env tem que funcionar com os valores pertinentes para cada ambiente.

Deveria ter um .env.prod, .env.local, .env.dev... e assim por diante. Em teoria, as variáveis do .env real que rodam em produção deveriam ser conhecidas apenas por quem faz o deploy em produção, por quem gerencia as pipelines, etc.

Localmente, você deveria ter um .env que não tivesse nem um resquício das variáveis que são usadas de verdade e que todos os membros do projeto deveriam ter acesso e que poderiam inclusive ir para o repositório.

Vamos supor que você tem:

.env.example -> tem que estar no repositório

HOST_SERVICE_A=
AUTH_KEY_SERVICE_A=

.env.local -> pode ir pro repositório

HOST_SERVICE_A=localhost:8002
AUTH_KEY_SERVICE_A=uma_key_local_sem_importancia
.env.prod -> nunca jamais deve estar no repositório

HOST_SERVICE_A=host_servico_a_prod.com.br
AUTH_KEY_SERVICE_A=uma_key_secreta_que_ninguem_saberia_e_estaria_na_pipeline
.env.dev -> talvez possa estar no repositório

HOST_SERVICE_A=host_servico_a_homolog.com.br ou host_servico_a_mockado.com.br
AUTH_KEY_SERVICE_A=uma_key_de_homologação_ou_do_mock_que_é_menos_sensivel

Perceba que em todos esses casos, a variável do prod (sejam elas quais forem, aqui eu dei só o exemplo da url de um serviço) NUNCA foi exposta para os outros contextos. Se você for subir o serviço A localmente, você passaria o endereço localhost. Mas se isso fosse impossível, você usaria um ambiente de homologação ou um Mock, mas não o ambiente que se usa em produção.

Se seu projeto não possui essa organização então obrigatóriamente você precisa caçar esses valores pra conseguir trabalhar, mas é uma má prática de segurança que seja necessário saber os valores reais para conseguir desenvolver alguma coisa.

1

Achei muito boa sua resposta, é uma coisa que eu me perguntava do por quê não ser assim no contexto que me encontro, no caso daqui a gente só usa um .env mesmo com tudo (informações de staging, production e local) no mesmo arquivo, somente comentado (e claro ignoramos pra ser commitado). Então manipulamos o ambiente comentando e descomentando linhas, oq particularmente acho muito ruim e potencialmente podendo causar a famosa cagada no ambiente errado kkkkkkkkkkk.

1

"está certo eu ser obrigado a buscar todas as infos necessárias, uma por uma?"

não sei o resto do contexto...mas se essa foi a tarefa que foi alocada para que você realize, me parece que não tem outra saida..

chegou a questionar os outros devs do time se alguem tem um .env para compartilhar contigo? certamente vc nao é o primeiro que está passando por isso. por outro lado,
dependendo da stack é bem tranquilo descobrir os nomes das variaveis, e depois entender quais os valores que deveriam ter.

1

Pergunto isso pois, na verdade, sou eu quem detém as envs do projeto, então fiz o questionamento: se eu não tivesse essas envs, como proceder? Qual seria a melhor abordagem no caso pra não ter essa dependência em mim ou qualquer outra pessoa?

0

saquei, para esse caso, criar um .env.sample é uma opção, boa parte das envs da para deixar com configs genéricas, e da até para deixar pré-configurado como por ex DB_NAME, DB_USER e DB_PASS.

O ideal é que o nome das variaveis sejam beeem auto-explicativas para não gerar muitas dúvidas e o dev precisar fuçar no código pra entender onde a variavel é usada e pra que serve.

coisas mais especificas, por ex algum token de serviço de monitoramento eu ou deixaria o nome do serviço pra que o próprio dev crie o seu ou o contato de alguem do SRE por pra que possa fornecer esse token, ou ainda a página com o token do ambiente de desenvolvimento

1

váriaveis de ambiente para ambientes de dev (local) e homologação podem ser fácilmente compartilhadas em git, dado que não interferem no sistema PRD caso vaze alguma coisa e podem ser facilmente trocadas, já que na real não vai impactar o usuário

váriaveis para PRD já entra numa area complexa que vai depender do que seu time possui a disposição, ja trabalhei com duas situações:

  • Pipeline com key vault que "preenchiam" as variaveis no arquivo .env que ia para o servidor de produção
  • Servidor de provisionamento (que tinha um acesso bem restrito) e nele estava configurada a ferramenta de IaC (ansible) e as envs encriptadas usando o ansible vault

No seu caso, o ideal seria que informações de acesso para ambientes de dev/homologação fossem versionadas e/ou compartilhadas entre o time de maneira que seu tempo para começar a programar fosse minimo, ter essa dificuldade pode ser uma questão de organização do time que não foi colocada em pauta ainda, mas que pode ser uma boa tentar pelo menos organizar essas informações , sempre dentro do que o time/empresa permite fazer claro

1

Muito maneiro saber disso, eu não conhecia essas ferramentas, aqui é bem básico a forma que lidamos com as variáveis de ambiente, basicamente manipulamos no serviço que usamos de infra. Muito obrigado pela informação!

1

O dev senior responsavel pelo projeto costuma ter um exemplo na máquina local ou repo separado. Esse é o mais comum, mas em empresas maiores ou com escopo grande, (pelo que vi) se costuma dar commits esporadicos do .env