Eu tenho um servidor em casa rodando Ubuntu 13.10 configurado como servidor web e repositório git. Se eu enviar meu projeto do meu sistema para o servidor, um gancho pós-recebimento será executado e moverá os arquivos (projeto Symfony2) para a raiz da web do servidor virtual correto.
Parte do motivo pelo qual estou fazendo isso (hospedar meu próprio servidor) é porque quero aprender mais sobre as melhores práticas em hospedagem de servidores.
Eu envio para meu servidor git por meio de SSH como usuário git que tem permissão para os repositórios git em /opt/git (algum guia recomendou fazer dessa maneira). O shell do usuário git está definido como /usr/bin/git-shell.
Meu servidor web é nginx rodando como usuário 'www-data'. Acredito que esta seja a configuração padrão, pois não configurei isso.
O problema que tenho agora é que depois de implantar o usuário www-data e meu próprio usuário (tim) não tenho permissão para gravar no diretório de cache, resultando no travamento do Symfony.
A razão pela qual meu usuário (tim) está envolvido é porque o projeto tem um cronjob que configurei em minha própria conta de usuário, o que pode não ser a melhor ideia.
Além disso, por algum motivo, as permissões padrão para o diretório cache/ após um commit são
drwxr-xr-x 4 git git 4096 Jul 29 09:33 cache
Então, até onde sei, isso significa que apenas o usuário git tem permissão para criar arquivos/diretórios dentro da pasta de cache.
Agora posso pensar em 101 maneiras de lidar com esse problema, mas estou mais interessado em uma maneira correta/pretendida de resolver meu problema.
Devo de alguma forma enviar os arquivos para o usuário www-data e executar os cronjobs como o mesmo usuário?
- Isso parece complicado porque não acho que o usuário git tenha permissão para "fornecer arquivos para outra pessoa"
Devo encontrar uma maneira de executar o gancho pós-recebimento como um usuário diferente www-data ou tim?
Como qual usuário meu cronjob deve ser executado? Pode ser apenas o tempo? ou deveria ser o usuário www-data? (ou Deus me livre root)
Este é o conteúdo do meu script pós-recebimento (encontrei em algum site, não lembro qual)
#!/bin/sh
#
## store the arguments given to the script
read oldrev newrev refname
## Where to store the log information about the updates
LOGFILE=./post-receive.log
# The deployed directory (the running site)
DEPLOYDIR=/var/www/project.timfennis.com
## Record the fact that the push has been received
echo -e "Received Push Request at $( date +%F )" >> $LOGFILE
echo " - Old SHA: $oldrev New SHA: $newrev Branch Name: $refname" >> $LOGFILE
## Update the deployed copy
echo "Starting Deploy" >> $LOGFILE
echo " - Starting code update"
GIT_WORK_TREE="$DEPLOYDIR" git checkout -f
echo " - Finished code update"
echo " - Starting composer update"
cd "$DEPLOYDIR"; composer update; cd -
echo " - Finished composer update"
echo "Finished Deploy" >> $LOGFILE
Tenho certeza de que o compositor é quem está redefinindo minhas permissões de arquivo para 755 porque o diretório de cache é sempre excluído.