집에 웹 서버와 git 저장소로 구성된 Ubuntu 13.10을 실행하는 서버가 있습니다. 내 프로젝트를 내 시스템에서 서버로 푸시하면 파일(Symfony2 프로젝트)을 올바른 가상 서버의 웹 루트로 이동하는 수신 후 후크가 실행됩니다.
내가 이 일을 하는 이유 중 하나는 서버 호스팅의 모범 사례에 대해 더 많이 배우고 싶기 때문입니다.
/opt/git에 있는 git 저장소에 대한 권한이 있는 사용자 git으로 SSH를 통해 내 git 서버에 푸시합니다(일부 가이드에서는 이 방법을 권장함). git 사용자의 쉘은 /usr/bin/git-shell로 설정됩니다.
내 웹서버는 'www-data' 사용자로 실행되는 nginx입니다. 저는 이것을 구성하지 않았기 때문에 이것이 기본 설정이라고 생각합니다.
지금 내가 겪고 있는 문제는 www-data 사용자와 내 사용자(tim)를 배포한 후 캐시 디렉터리에 쓸 수 있는 권한이 없어 Symfony가 충돌한다는 것입니다.
내 사용자(tim)가 관련된 이유는 프로젝트에 내 사용자 계정에 내가 설정한 cronjob이 있기 때문인데, 이는 최고의 아이디어가 아닐 수도 있습니다.
또한 어떤 이유로 커밋 후 캐시/ 디렉터리에 대한 기본 권한은 다음과 같습니다.
drwxr-xr-x 4 git git 4096 Jul 29 09:33 cache
따라서 내가 아는 한 이는 git 사용자만이 캐시 폴더 내에 파일/디렉터리를 만들 수 있다는 것을 의미합니다.
이제 이 문제를 처리하는 101가지 방법을 생각할 수 있지만 문제를 해결하는 올바른/의도된 방법에 더 관심이 있습니다.
어떤 방식으로든 파일을 www-data 사용자에게 chown하고 동일한 사용자로 cronjob을 실행해야 합니까?
- git 사용자가 "다른 사람에게 파일을 제공"하는 것이 허용되지 않는다고 생각하기 때문에 이것은 복잡해 보입니다.
다른 사용자 www-data 또는 tim으로 수신 후 후크를 실행하는 방법을 찾아야 합니까?
내 cronjob을 어떤 사용자로 실행해야 합니까? 팀만 그럴 수 있나요? 아니면 www-data 사용자여야 합니까? (또는 신이 루트를 금지함)
이것은 내 수신 후 스크립트의 내용입니다. (일부 웹사이트에서 발견했는데 어떤 웹사이트인지 기억이 나지 않습니다.)
#!/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
캐시 디렉토리가 매번 삭제되기 때문에 작곡가가 내 파일 권한을 755로 재설정한 사람이라고 확신합니다.