Ich habe zu Hause einen Server mit Ubuntu 13.10, der als Webserver und Git-Repository konfiguriert ist. Wenn ich mein Projekt von meinem System auf den Server pushe, wird ein Post-Receive-Hook ausgeführt, der die Dateien (Symfony2-Projekt) in das richtige Web-Root des virtuellen Servers verschiebt.
Einer der Gründe, warum ich dies tue (meinen eigenen Server hosten), ist, dass ich mehr über die Best Practices im Server-Hosting erfahren möchte.
Ich pushe per SSH auf meinen Git-Server als Benutzer „git“, der Zugriff auf die Git-Repositorys in /opt/git hat (einige Anleitungen empfehlen diese Vorgehensweise). Die Shell für den Git-Benutzer ist auf /usr/bin/git-shell eingestellt.
Mein Webserver ist Nginx und wird als Benutzer „www-data“ ausgeführt. Ich glaube, das ist die Standardeinstellung, da ich dies nicht konfiguriert habe.
Mein derzeitiges Problem besteht darin, dass der Benutzer www-data und mein eigener Benutzer (Tim) nach der Bereitstellung keine Schreibberechtigung für das Cache-Verzeichnis haben, was zu einem Absturz von Symfony führt.
Der Grund, warum mein Benutzer (Tim) beteiligt ist, liegt darin, dass das Projekt einen Cronjob hat, den ich in meinem eigenen Benutzerkonto eingerichtet habe, was vielleicht nicht die beste Idee aller Zeiten ist.
Aus irgendeinem Grund sind die Standardberechtigungen für das Verzeichnis cache/ nach einem Commit
drwxr-xr-x 4 git git 4096 Jul 29 09:33 cache
Soweit mir bekannt ist, bedeutet das, dass nur der Git-Benutzer Dateien/Verzeichnisse im Cache-Ordner erstellen darf.
Mir fallen zwar 101 Möglichkeiten ein, mit diesem Problem umzugehen, aber ich bin mehr an einer richtigen/beabsichtigten Lösung meines Problems interessiert.
Sollte ich die Dateien irgendwie dem WWW-Data-Benutzer zuordnen und die Cronjobs als derselbe Benutzer ausführen?
- Dies scheint kompliziert, da ich nicht glaube, dass der Git-Benutzer „Dateien an jemand anderen weitergeben“ darf.
Sollte ich eine Möglichkeit finden, den Post-Receive-Hook als anderer Benutzer, www-data oder tim, auszuführen?
Als welcher Benutzer soll mein Cronjob laufen? Kann es einfach Tim sein? Oder sollte es der WWW-Data-Benutzer sein? (oder Gott bewahre Root)
Dies ist der Inhalt meines Post-Receive-Skripts (ich habe es auf einer Website gefunden, weiß aber nicht mehr, auf welcher)
#!/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
Ich bin ziemlich sicher, dass Composer derjenige ist, der meine Dateiberechtigungen auf 755 zurücksetzt, da das Cache-Verzeichnis jedes Mal gelöscht wird.