Como desenvolvedores, enfrentamos constantemente o desafio de empacotar nossos aplicativos de maneira eficiente e segura. Ao trabalhar no empacotamento do meu próprio aplicativo, testei várias opções nos últimos meses, mas nenhuma parecia ser a solução ideal. Meu aplicativo consiste em dois componentes principais: um serviço web baseado em .NET que será auto-hospedado em uma máquina Linux dentro da organização de um cliente e um agente .NET que precisa ser implantado em várias estações de trabalho na organização.
O Desafio do Empacotamento
O agente se comunicará com o serviço web e, portanto, precisa saber seu IP/nome de host e a chave pública do certificado autogerado (estou usando MTLS GRPC e, embora eu pudesse solicitar o certificado do servidor na primeira execução, prefiro evitar qualquer comunicação não criptografada, se possível). Todos os clientes receberão o mesmo instalador de agente (presumo que não haja como gerar um instalador a partir de uma máquina Linux para que eu possa gerar um em tempo de execução?).
Cenário Ideal
Em um mundo perfeito, eu gostaria que meus clientes pudessem baixar um instalador para o agente de sua instância do serviço da web e que esse instalador contivesse todas as informações necessárias para uma instalação segura (ou seja, ele deveria conter o nome do host do servidor, detalhes do certificado etc.)
Opção 1 - Parâmetros MSI manuais/campo de texto
Minha abordagem original era fazer com que os clientes inserissem o IP dos servidores em uma etapa personalizada do meu MSI (ou passá-lo via msiexec). Isso funcionou, mas é menos do que o ideal, já que também preciso de um certificado que é bem desajeitado para copiar. O problema só piora quanto mais eu quero incluir.
Opção 2 - PowerShell
Uma opção que vi outros produtos usarem é fornecer um script básico do PowerShell que lida com a instalação (ou seja, baixar o instalador de um host remoto e, em seguida, executar o instalador, passando quaisquer parâmetros necessários na linha de comando). Não acredito que isso funcionará para mim, pois o servidor com o qual eu estaria me comunicando usaria um certificado autoassinado, então estou de volta tendo que confiar em uma conexão inicial não verificada. Eu poderia incorporar o certificado no script do PowerShell para contornar esse problema novamente, o que não é a melhor opção.
EDIT: A implementação de outros produtos disso é de 3 linhas do powershell (baixar, extrair e executar com os argumentos necessários) que podem ser facilmente copiados e colados no PS. No meu caso, eu também precisaria incluir um certificado autoassinado codificado e um código do powershell para adicionar um retorno de chamada de validação de certificado personalizado para usá-lo, o que é um pouco demais para um trabalho de copiar/colar, agora eu precisaria fornecer um script do PowerShell para download. É uma opção, mas não tão boa quanto um instalador de um clique, que é o que eu estava buscando.
Opção 3 - Edição MSI
Usando várias ferramentas MSI no Linux, consegui editar meu MSI para preencher previamente os campos. Isso funciona muito bem e é minha abordagem atual, mas tem a desvantagem de que minhas necessidades de instalação de serviço incluem software de edição MSI de terceiros.
Uma Solução Melhor?
Existe uma opção melhor do que as acima que permitiria adicionar valores que são conhecidos apenas no momento do download em um MSI pré-gerado? O MSI é a abordagem completamente errada?
Estou aberto a qualquer ajuda ou ideias que você possa fornecer para encontrar a solução ideal para o empacotamento do meu aplicativo. Precisamos encontrar uma maneira de tornar a instalação segura e conveniente para os clientes, sem sobrecarregá-los com muitas etapas ou configurações manuais.