Não combine desenvolvimento e produção. Idealmente, o servidor de produção NÃO contém VCS - ou quaisquer outros vestígios de toolchain de desenvolvimento. Desde que você está agora colocando esforço na automação da implantação, aumente a separação enquanto você está nisso.
Além disso: Permissões separadas para tarefas separadas. Uma interface de administração solicita a implantação. Um servidor da Web serve arquivos praticamente imutáveis. Um script de implantação grava arquivos.
- O usuário que atende os arquivos não deve poder gravar em (quase nenhum de) seus arquivos.
- O usuário que implanta os sites para o apache deve configurar essas permissões e evitar a veiculação de arquivos de implantação intermediária (um desenvolvedor pode não ter pensado nos efeitos colaterais do acesso do apache a qualquer coisa enquanto os aplicativos não são cópias completas)
- O usuário que implanta os arquivos deve ter permissões de somente leitura para o git e apenas implantar versões com tags e confirmadas (e fazer o checkout de uma maneira semelhante como os desenvolvedores já fazem)
- uma interface web php nunca deve lidar com qualquer magia satânica de shell. marcar um site como "precisa de implantação" por qualquer meio (criar uma pasta, etc) e ser feito com ele (não implantar de forma síncrona em uma interface web)
- o script de implantação deve ser independente do aplicativo que está implantando além de alguns padrões comuns ("os arquivos do apache estão na pasta X", "a pasta tmp deve estar sob o nome Y")
Como eu fiz isso em uma configuração aparentemente similar: Um script de propriedade e executado pelo usuário deploy
(parte do grupo www-data
).
O usuário deploy
tem a chave ssh para uma conta readonly no servidor git (no seu caso, gerenciado via gitlab). O script seleciona os nomes do repositório que foram marcados e implementados da seguinte forma:
- verifique se a última implantação foi limpa
- verifique se algum site precisa ser implantado
- derrubar (impedir que o servidor exiba sites parcialmente copiados)
- se necessário, obtenha um clone (no seu caso, um usuário somente leitura no git)
- checkout nova versão (para sanidade: a última tag marcou uma que corresponda a um regex razoável)
- configuração (copie os arquivos para webroot, no seu caso atual, não recomendável , que é uma pasta local, chown to www-data)
- remove mark "precisa ser implantado" para este site
- marcar implantação como bem-sucedida