Git с умным HTTP и suexec: хранилище не найдено
Я пытаюсь установить свой собственный репозиторий Git на одном из моих серверов с интеллектуальным HTTP.
Он работает на виртуальном сервере без suexec, но не на моем рабочем сервере, на котором включен suexec. Когда я пытаюсь клонировать или выдвинуть, это говорит:
Неустранимый: хранилище ' http://domain.tld/git/project/ ' не найдено
Конфигурация Apache выглядит так:
<VirtualHost *:80>
Options -Indexes +ExecCGI
ServerAdmin user@domain.tld
DocumentRoot /var/www/domain.tld
ServerName domain.tld
Alias /fcgi-bin/ /var/www/domain.tld/fcgi-bin/
SuexecUserGroup domainuser domainuser
########## GIT ##########
SetEnv GIT_PROJECT_ROOT /var/www/git/git_domain
SetEnv GIT_HTTP_EXPORT_ALL
SetEnv REMOTE_USER=$REDIRECT_REMOTE_USER
ScriptAlias /git/ /var/www/git/git_domain/git-http-backend/
Alias /git /var/www/git/git_domain
<Directory /usr/lib/git-core>
Options +ExecCGI +SymLinksIfOwnerMatch
AllowOverride All
Require all granted
</Directory>
<Directory /var/www/git/git_domain>
Options -Indexes -SymLinksIfOwnerMatch
AllowOverride All
Require all granted
</Directory>
########## PROJECT DIRS HTPASS ##########
<LocationMatch "^/git/project1/.*$">
# DAV on
AuthType Basic
AuthName "project1"
AuthUserFile /var/www/git/gitpass/domain/project1
Require valid-user
</LocationMatch>
########## /PROJECT DIRS HTPASS ##########
########## /GIT ##########
Если я отключу
ScriptAlias / git / / var / www / git / git_domain / git-http-backend /
Я могу клонировать, но нажать, потому что в этом случае это работает с DAV.
Я думаю, что изменил владельцев и разрешения всех файлов на правильное значение (domainuser, 755), и suexec не жалуется ни на что в своем журнале.
Может кто-нибудь сказать мне, где я сделал что-то не так?
Заранее спасибо.
1 ответ
Это легко: mod_suexec
стирает все переменные окружения перед запуском целевой программы и поэтому все ваши SetEnv
директивы не имеют никакого эффекта.
К сожалению, последний раз я проверял (столкнулся с той же проблемой) mod_suexec
не было ручки настройки "белого списка" для переменных среды, поэтому правильный подход такой:
Создайте скрипт, который обернет ваш фактический
git-http-backend
,Похоже, у вас уже есть.
Переформулируйте все соответствующие
SetEnv
директивы там, используя оболочкуexport
встроенный.То есть,
SetEnv GIT_PROJECT_ROOT /var/www/git/git_domain
becames
export GIT_PROJECT_ROOT=/var/www/git/git_domain
в коде скрипта.
Если вам нужен один и тот же конфигурационный файл virtualhost для работы как в "обычном" режиме, так и под mod_suexec
поместите подробный комментарий об этой причуде рядом с блоком вашего SetEnv
директивы, предлагающие следующему парню синхронизировать их с тем, что помещено в скрипт-обертку.
Подробнее о mod_suexec
поведение можно найти здесь.