Rails: estratégia de implementação de múltiplos aplicativos

1

Na minha empresa, atualmente temos um projeto principal que é um grande aplicativo Rails monolítico. A implantação é fácil, temos alguns servidores frontend (configuração com o Puppet) que o Capistrano implementa em /var/www/<hostname>/current . Em seguida, ele reinicia o Unicorn (zero downtime deploys!) E todos ficam felizes.

Infelizmente, há um problema. A natureza monolítica do aplicativo está começando a nos morder. Agora leva mais de 30 minutos para executar todos os testes, e isso está nos atrasando. Estamos procurando dividi-lo em partes menores e adotar uma arquitetura mais μService. No entanto, isso me fez pensar em nossa estratégia de implantação. Como está:

  • o aplicativo Rails e o Nginx são executados como www-data user
  • Qualquer usuário que tenha acesso à caixa pode implantar (no Capistrano, chown coisas para o usuário do aplicativo durante a implantação)

A segurança disso é bastante baixa (tudo funcionando como o mesmo usuário, todos podem acessar tudo). Isso também me lembra de como fizemos as coisas em uma empresa anterior - foi um pesadelo, pois todos os aplicativos estavam presos no Ruby 1.6, já que eles compartilhavam a mesma versão.

Estou pensando que podemos melhorar isso instalando rbenv para permitir que cada aplicativo execute sua própria versão do Ruby e tenha usuários por aplicativo para aumentar a segurança. Mas eu realmente não vi nenhum exemplo disso na prática. Por exemplo 37signals executam todos os aplicativos como o mesmo usuário - Estou preocupado que haja uma boa razão pela qual os aplicativos não devem ser executados como usuários diferentes.

Para resumir:

  • Qual é a melhor maneira de implantar vários aplicativos Rails em um servidor em uma arquitetura de estilo μService?
  • Qual é a melhor maneira de isolar cada um dos aplicativos (em termos de versões do Ruby e segurança do usuário)?

Obrigado antecipadamente!

    
por Luca Spiller 10.04.2013 / 14:47

2 respostas

0

Nós temos uma configuração similar (embora estejamos trabalhando com Tomcat e Grails ao invés de nginx e RoR). Nós criamos userids individuais para cada instância do Tomcat. Nós definimos os diretórios home para Java, Grails e quaisquer outras bibliotecas dependentes no .profile para o usuário como variáveis de ambiente, para que cada Tomcat possa ser executado com qualquer versão que tenhamos instalado.

O usuário userid pelo nosso software de implementação automatizado (Atlassian Bamboo) é um membro do grupo atribuído a cada um dos diretórios do Tomcat.

    
por 02.05.2013 / 18:07
0

Para várias instâncias do Ruby, eu definitivamente recomendaria o RVM (Gerente de Gerenciamento de Ruby) . Achei mais sólido que o rbenv para ambientes de produção.

O Nginx pode ligar-se a portas com privilégios (< = 1024) somente se for iniciado como um usuário privilegiado. Assim, uma configuração de proxy reverso pode ser necessária para atender sua necessidade de iniciar cada instância do Unicorn como um processo separado pelo usuário permitido.

Se a sua avaliação de executar cada um em uma VM separada for definitiva, uma forma de isolar cada aplicativo no GNU / Linux é o SELinux . O SELinux é bastante complexo, mas fornece recursos que permitem separar com segurança processos e contexto.

    
por 12.06.2013 / 16:32