Git: общий репозиторий с NGINX + spawn-fcgi

Автор: | 24/04/2015

git-logoЗадача – создать общедоступный репозиторий, с доступом по HTTP.

Авторизация – через .htaccess файл.

UPD: Вероятно – после такой установки не будет работать git push с ошибкой “PROPFIND … 405“. Что бы избежать этого – NGINX надо собрать с поддержкой модулей  http_dav_module и  nginx-dav-ext-module. Подробнее – смотрите в посте Git: свой репозиторий под NGINX + WebDAV + uWSGI. Да и вообще схема доступа по HTTP себя не оправдала много сложностей с установкой организацией доступа – намного проще и удобнее сделать доступ по SSH. Тем не менее – публикую этот пост из старых черновиков.

Устанавливаем fcgiwrap:

# yum install fcgi-devel autoconf automake
# cd /usr/local/src/
# git clone git://github.com/gnosek/fcgiwrap.git
# cd fcgiwrap-master/
# autoreconf -i
# ./configure
# make
# make install

Проверяем наличие файла:

# file /usr/local/sbin/fcgiwrap
/usr/local/sbin/fcgiwrap: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.18, not stripped

Для управления процессами FastCGI – устанавливаем spawn-fcgi:

# yum install spawn-fcgi
# chkconfig spawn-fcgi on

Редактируем файл /etc/sysconfig/spawn-fcgi:

FCGI_SOCKET=/var/run/fcgiwrap.socket
FCGI_PROGRAM=/usr/local/sbin/fcgiwrap
FCGI_USER=nginx
FCGI_GROUP=nginx
FCGI_EXTRA_OPTIONS="-M 0770"
OPTIONS="-u $FCGI_USER -g $FCGI_GROUP -s $FCGI_SOCKET -S $FCGI_EXTRA_OPTIONS -F 1 -P /var/run/spawn-fcgi.pid -- $FCGI_PROGRAM"

Запускаем:

# service spawn-fcgi start
Starting spawn-fcgi: [ OK ]

Устанавливаем NGINX:

# yum install nginx

Редактируем файл /etc/nginx/nginx.conf, и добавляем описание хоста:

    server {

        listen       80;
        server_name  zeus.domain.com;
        root /var/git;

        access_log /var/log/nginx/git_access;
        error_log /var/log/nginx/git_error;

        auth_basic "Password-protected Area";
        auth_basic_user_file /var/gitrepo/.htpasswd;

        location /git/ {

            fastcgi_pass unix:/var/run/fcgiwrap.socket;
            fastcgi_param GIT_HTTP_EXPORT_ALL "";
            fastcgi_param GIT_PROJECT_ROOT    /var/gitrepo;
            fastcgi_param PATH_INFO           $uri;
            fastcgi_param SCRIPT_FILENAME     /usr/libexec/git-core/git-http-backend;
            include /etc/nginx/fastcgi_params;

        }
    }

Что бы ограничить доступ по HTTP – создаём файл авторизации:

# mkdir /var/gitrepo/
# cd /var/gitrepo/
# htpasswd -c .htpasswd user
New password:
Re-type new password:
Adding password for user user

Проверяем конфиг:

# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

Запускаем:

# service nginx start
Stopping nginx: [ OK ]
Starting nginx: [ OK ]

Создаём Git-репозиторий:

# mkdir -p /var/gitrepo/test.git
# cd /var/gitrepo/test.git
# git init --bare
Initialized empty Git repository in /var/gitrepo/local.git/
# git update-server-info
# chown -R nginx:nginx /var/gitrepo/

Проверяем работу:

$ git clone http://user:[email protected]/test.git
Cloning into 'test'...
warning: You appear to have cloned an empty repository.
Checking connectivity... done.