Na maioria das vezes, eu armazeno a configuração do aplicativo de desenvolvimento no diretório raiz do projeto, assim:
app
|-- config.json
Mas essa não parece ser a melhor abordagem, pois essa configuração acaba sendo armazenada no sistema de controle de versão - possivelmente resultando em nomes de usuário, senhas e outras coisas confidenciais vazadas.
O guia 12 Factor App recomenda eliminar completamente os arquivos de configuração e usar variáveis de ambiente para a instalação:
... armazena a configuração em variáveis de ambiente. Os envs são fáceis de alterar entre implantações sem alterar nenhum código; ao contrário dos arquivos de configuração, há pouca chance deles serem verificados no repositório de códigos acidentalmente; e, diferentemente dos arquivos de configuração personalizados ou de outros mecanismos de configuração, como as Propriedades do sistema Java, eles são um padrão independente de idioma e sistema operacional.
Isso me parece muito bom, mas onde se armazena essas variáveis de ambiente, sem as verificar no controle de origem? E quais ferramentas posso usar para passar essas variáveis para o aplicativo? Pode haver dezenas de opções de configuração, e digitá-las manualmente sempre que você inicia o aplicativo não é bom - portanto, elas precisam ser armazenadas em algum tipo de arquivo em algum lugar. O arquivo, portanto, acabará no controle de origem e voltaremos para onde começamos.
Existe alguma maneira universalmente aceita de lidar com opções de configuração, que não corre o risco de armazenar a configuração local no controle de origem?
.gitignore
onde eu posso definir arquivos ou pastas que não devem ser verificados no controle de versão. Como você diz, não vejo onde o Env vars realmente deve ajudar, mas você tem um script para defini-los e deve ser armazenado junto com o projeto ou você os encontra em algum lugar do seu sistema (diretório inicial ou mesmo na inicialização da máquina) scripts), que parece criar muitos problemas por si só, especialmente se muita configuração for necessária. De qualquer forma, eu dividiria os arquivos de configuração para que as informações confidenciais fossem inseridas em arquivos diferentes.Respostas:
Possivelmente não há uma boa resposta para isso. Parece que você precisa armazenar esses dados em algum lugar seguro, pois serão necessários para fins de recuperação de desastres um dia. Isso se aplica igualmente aos arquivos e scripts de propriedades que configuram variáveis de ambiente.
Atualmente, estamos procurando soluções para esse problema e estamos inclinados para um repositório de código com acesso restrito. Este repositório conteria apenas dados de cofiguração. Outros têm experiências para compartilhar?
fonte
Ao examinar problemas e possíveis soluções, me ajuda a usar um método popularizado por Jeff Atwood : Se Deus criasse uma maneira de armazenar informações confidenciais de configuração, como ele faria isso?
Bem, ele saberia quem precisa de informações de configuração e as forneceria apenas a essas pessoas, e as informações nunca poderiam ser acessadas por mais ninguém.
A primeira parte já deve ser resolvida: seu sistema de controle de origem deve autenticar usuários. E essa abordagem também tem validade, de acordo com o item 10 dos 10 mandamentos de controle de fontes de Troy Hunt , "as dependências precisam estar no controle de fontes".
Mas como mantê-lo seguro se vazar? Bem, ele não precisa ser armazenado lá em texto simples! Use criptografia. No .NET, existem etapas que você pode executar para criptografar os dados da cadeia de conexão nos seus arquivos de configuração . Você precisaria encontrar os métodos equivalentes para fazer isso com sua tecnologia de escolha específica.
fonte
Muitas pessoas criticam o armazenamento da configuração em arquivos regulares, juntamente com o seu código-fonte, mas, na minha experiência, essa é realmente uma solução muito boa:
Portanto, em muitos casos, a configuração textual armazenada no controle de origem juntamente com o código é um bom começo.
Se você estiver em sistemas distribuídos ou desejar trocar sua configuração a quente sem reimplementar seus aplicativos, poderá encontrar uma solução melhor baseada em um servidor de configuração. O Spring Cloud tem suporte para esses mecanismos , e as configurações de veiculação de back-end podem ser um repositório git ou Eureka . Você também pode rolar o seu próprio usando, por exemplo, Zookeeper . Qualquer uma dessas abordagens facilitará o gerenciamento de configurações consistentes em muitos servidores para atualizar configurações sem a necessidade de reconstruir e reimplementar seu software. Isso tem um custo, é claro, que é aprender o servidor de configuração e como usá-lo em seus aplicativos, além de outro sistema para implantar e manter.
fonte
Estamos lutando contra o mesmo problema em que trabalho. No momento, todas as nossas configurações são baseadas em arquivos e controladas pela fonte com os aplicativos individuais que as utilizam. Isso leva à duplicação e aos desenvolvedores tendo acesso às senhas de produção / qa, em vez de apenas desenvolvimento.
Dito isto, acho que apresentamos uma boa solução daqui para frente. Estamos movendo nossos arquivos de configuração para um repositório git separado (rotulado como repositório de configuração). Em seguida, configuramos um servidor spring-cloud-config (java) que simplesmente serve os arquivos do repositório de configuração com base nos perfis transmitidos a ele. Isso é ótimo para aplicativos Java que podem usar o cliente e baixá-los no momento da inicialização. Para nossos aplicativos PHP / não-java, baixaremos o arquivo diretamente. (Não é ideal). No futuro, poderemos escrever algo que permita que o aplicativo PHP faça o download das configurações por conta própria e as armazene em algum lugar, mas não é de alta prioridade na primeira execução. Penso nesta solução como config-as-a-service, que não viola explicitamente as recomendações de aplicativos de 12 fatores.
Eu acredito que o zookeeper pode ser usado para a mesma coisa (eu vi uma configuração com o kubernetes + zookeeper), então não tenho muita certeza do porquê dessa resposta ter um -1 acima.
Ligações:
https://spring.io/guides/gs/centralized-configuration/
https://cloud.spring.io/spring-cloud-config/
fonte
Em vez de armazenar toda a configuração em um arquivo, armazene-a em vários arquivos.
README*
.01-logging.json
.02-database.json
etc.Na sua caixa Linux mais próxima, dê uma olhada em
/etc/sudoers.d
ou/etc/nginx/conf.d
. Mostra o mesmo padrão.A gestão de segredos é uma fera diferente. Você pode gerenciá-los como uma etapa manual enquanto é pequeno. Você pode usar coisas como o Zookeeper. Você pode até verificar os segredos em um VCS na forma criptografada e descriptografá-los como uma etapa de implantação. Existem várias outras opções.
(Além disso, um artigo de opinião: JSON não é um bom formato de arquivo de configuração, porque não permite comentários; comentários são cruciais. Os formatos TOML, YAML e até INI são melhores em uso prático.)
fonte
Eu acho que suas opções são um pouco definidas pelo sistema operacional para o qual você está implantando
Eu sugeriria, sim, coloque os valores no controle de origem. MAS apenas as versões 'dev'. Você quer que seu código fonte compile E funcione! não inclui etapas secretas extras
Seu processo de compilação e implantação deve trocar esses valores por ambiente durante a implantação. (o polvo tem esse tipo de modelo)
fonte
O Apache zookeeper oferece opções maravilhosas para armazenar as configurações de aplicativos para sistemas distribuídos. As alterações feitas no zookeeper podem ser capturadas e processadas com um curador ou ouvinte do zookeeper no final do aplicativo.
fonte