Qual é a melhor maneira de configurar usuários e permissões para um servidor Web de produção que usa o git para implantar no servidor?
Plano de fundo
Rodando o Ubuntu 12.04, eu tenho arquivos de serviço do apache em /var/www
as www-data
. Eu também tinha um repositório nulo no diretório de usuários raiz que efetuaria o checkout para /var/www/example.com
no gancho pós-recebimento.
Isso funcionou bem, mas considerando que é um servidor de produção, eu queria abotoar alguma segurança e remover o repositório do usuário root. Então criei um usuário git e configurei o repo em /home/git
. Mas agora tenho problemas de permissões sobre o fato de um usuário possuir o repositório enquanto outro usuário possui a raiz da Web.
Li muitos fóruns e tutoriais on-line. A maioria parece apenas usar o usuário root, outros parecem ter problemas de segurança piores (como www-data
permissões de leitura sobre o repositório). Estou procurando insights da experiência do mundo real porque há muitas maneiras de fazer isso.
Como nota, o gancho pós-recebimento faz mais do que a finalização da compra. Ele também executa alguns processos de construção, como a execução do Composer e alguns outros scripts php que podem levar vários minutos.
Eu tentei várias soluções:
Eu tentei adicionar o usuário git ao www-data group
, depois chowning a raiz da web de volta para www-data
no final do gancho. Isso tem dois problemas. Primeiro, eu tenho que modificar o arquivo sudoers, e os resultados que obtenho são erráticos. Em segundo lugar, durante esses vários minutos enquanto o gancho está em execução, os arquivos que sofreram check-out são de propriedade de git, não www-data
, para que os usuários no site possam receber erros de leitura.
Eu tentei colocar o conteúdo do post-receive em outro arquivo e executá-lo com o sudo. Novamente, isso requer a edição dos arquivos sudoers, para que o usuário git possa sudo sem uma senha.
Ou pode ser que deixar o repositório sob o usuário root seja o mal menor e eu estou fazendo tudo isso por nada.
Existe uma solução melhor que eu não tentei?