2016-05-17 7 views
0

Я пытаюсь установить свой собственный репозиторий Git на одном из моих серверов с помощью интеллектуального HTTP.Git со смарт-HTTP и suexec: репозиторий не найден

Он работает на виртуальном сервере без suexec, но не на моем рабочем сервере, который имеет suexec. Когда я пытаюсь клонировать или толкать его, говорит:

фатальным: хранилище 'http://domain.tld/git/project/' не найден

конфигурации Apache, как:

<VirtualHost *:80> 
    Options -Indexes +ExecCGI 

    ServerAdmin [email protected] 

    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 не жалуется ни о чем в своем журнале.

Может ли кто-нибудь сказать мне, где я сделал что-то не так?

Заранее спасибо.

ответ

0

Это легко: mod_suexec стирает все переменные окружения перед запуском целевой программы, и поэтому все ваши директивы SetEnv не влияют.

К сожалению, в последний раз я проверил (перед той же проблемой) mod_suexec не был «белой списком» ручки настройки для переменных окружения и поэтому правильный подход заключается в следующем:

  1. Создание сценария wrappnig фактического git-http-backend.

    Кажется, что у вас уже есть.

  2. Переформулируйте все соответствующие директивы 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 поведение можно найти here.

+0

Это сработало! Обертка сценарий я содержал это: '/ bin/Баш PATH_INFO = $ SCRIPT_URL GIT_PROJECT_ROOT =/вар/WWW/мерзавец/git_domain REMOTE_USER = $ REDIRECT_REMOTE_USER экспорт GIT_HTTP_EXPORT_ALL = верно USR/Lib/ГИТ-ядро/git-http-backend' Потому что учебное пособие должно выглядеть так. После удаления всех строк, но '!/Bin/Баш экспорт GIT_PROJECT_ROOT =/вар/WWW/мерзавец/git_domain USR/Lib/ГИТ-ядро/ГИТ-HTTP-backend' и "экспортировали" GIT_PROJECT_ROOT это работает ожидается. Спасибо kostix! – vdavid

+0

@vdavid, переменные 'REMOTE_USER' и' GIT_HTTP_EXPORT_ALL' могут быть полезны, если вы поймете, что они делают. Первый экспортируется веб-сервером в программу CGI, если веб-сервер выполнил аутентификацию клиента, и в этом случае переменная содержит имя аутентифицированного пользователя. Последний говорит Git, что он должен рассматривать все репозитории как «экспортированные», а не только те, которые содержат в них файл 'git-daemon-export-ok'. – kostix

+0

@vdavid, переменная 'REMOTE_USER' может быть полезна, если вы хотите использовать HTTP вместе с интерфейсом Git-хоста' gitolite', потому что в этом случае 'gitolite' не выполняет собственную аутентификацию на основе SSH на основе pubkey - отключение этого на веб-сервер - и, следовательно, хочет знать имя аутентифицированного пользователя для применения его правил контроля доступа. – kostix