Установка и настройка git на FreeBSD (freebsd+nginx+fcgiwrap+git+gitweb)

Материал из Bas Wiki
Перейти к навигации Перейти к поиску

Для удобной работы с конфигами и моими проектами в очередной раз решил попробовать систему контроля версий. В этот раз выбор пал на git. В качестве операционной системы используется FreeBSD, в качестве web-сервера используется nginx. Так же будет установлен web-интерфейс GitWeb[1].

Установка пакетов

Установка git

# cd /usr/ports/devel/git
# make install

Откроется стандартное окно для выбора опций:

Для установка web-интерфейса GITWEB необходимо выбрать опцию PERL. После установки на консоль вывалится портянка текста, которую лучше прочитать, чтобы понять, что и где искать:

------------------------------------------------------------------------
*************************** GITWEB *************************************
If you installed the GITWEB option please follow these instructions:

In the directory /usr/local/share/examples/git/gitweb you can find all files to
make gitweb work as a public repository on the web.

All you have to do to make gitweb work is:
1) Copy the files /usr/local/share/examples/git/gitweb/* to a directory on
   your web server (e.g. Apache2) in which you are able to execute
   CGI-scripts.
2) In gitweb.cgi, adjust the variable $projectroot to point to
   your git repository (that is where you have your *.git project
   directories).
*************************** GITWEB *************************************

*************************** CONTRIB ************************************
If you installed the CONTRIB option please note that the scripts are
installed in /usr/local/share/git-core/contrib. Some of them require
other ports to be installed (perl, python, etc), which you may need to
install manually.
*************************** CONTRIB ************************************
------------------------------------------------------------------------


===> SECURITY REPORT:
      This port has installed the following files which may act as network
      servers and may therefore pose a remote security risk to the system.
/usr/local/libexec/git-core/git-daemon
/usr/local/libexec/git-core/git-credential-cache--daemon

      This port has installed the following startup scripts which may cause
      these network services to be started at boot time.
/usr/local/etc/rc.d/git_daemon

      If there are vulnerabilities in these programs there may be a security
      risk to the system. FreeBSD makes no guarantee about the security of
      ports included in the Ports Collection. Please type 'make deinstall'
      to deinstall the port if this is a concern.

      For more information, and contact details about the security
      status of this software, see the following webpage:
http://git-scm.com/

Установка fcgiwrap

Для работы web-интерфейса нам потребуется порт fcgiwrap, который выполняет роль обработчика cgi-скриптов, написанных на Perl (наподобие php-fpm для PHP):

# cd /usr/ports/www/fcgiwrap
# make install

Настройка портов

git

Добавляем в /etc/rc.conf:

git_daemon_enable="YES"

Запускаем git:

# service git_daemon start

Проверяем, что демон запустился:

# pgrep -l git
87753 git-daemon

fcgiwrap

Если посмотреть содержимое скрипта /usr/local/etc/rc.d/fcgiwrap, то можно увидеть те опции, которые мы можем настроить для работы с демоном. Обратите внимание, что мы можем использовать как unix-сокет, так и повесить демон для прослушки на определённом порту. Так же мы можем создать для своих web-приложений отдельные сокеты (например, для повышения отказоустойчивости). Более подробно как всегда в man fcgiwrap. Так же обращаем внимание на строку name="fcgiwrap", которая означает, что в списке процессов демон будет отображаться как fcgiwrap.

Добавляем в /etc/rc.conf:

fcgiwrap_enable="YES"

Если мы хотим использовать отдельные сокеты для разных приложений (в нашем примере для git свой, а для irc свой), то необходимо добавить следующие строки:

fcgiwrap_enable="YES"
fcgiwrap_profiles="git irc"
fcgiwrap_git_socket="unix:/var/run/fcgiwrap/fcgiwrap.git.socket"
fcgiwrap_irc_socket="unix:/var/run/fcgiwrap/fcgiwrap.irc.socket"
fcgiwrap_git_user="www"

Внимание! Тут есть небольшая засада.
Во-первых, nginx по умолчанию работает от пользователя www (запускается от root, но потом создаётся процесс от пользователя www). По этой причине web-сервер доступа к сокету fcgiwrap иметь не будет.
Во-вторых, сокет по умолчанию создаётся в папке /var/run куда писать может только root. По этой причине если мы укажем опцию fcgiwrap_git_user="www", то сокет не поднимется.

Для решения этих проблем мы указываем, что сокет будет находится в папке /var/run/fcgiwrap и создаваться от имени пользователя www. Запускаем fcgiwrap:

# service fcgiwrap start

Проверяем, что демон запустился:

# pgrep -l fcgiwrap
93932 fcgiwrap

gitweb

При установке git я обратил Ваше внимание на большую стену текста. Одним и важных моментов было то, что там указан путь к файлам web-интерфейса, которые необходимо скопировать в папку web-сервера.
Файлы для копирования находятся в папке /usr/local/share/examples/git/gitweb. В нашем случае я копирую эти файлы в папку /usr/local/www/gwtools.ru/git.

Вторым важным моментом было указание на редактирование файла gitweb.cgi. Нам необходимо найти переменную $projectroot и указать полный путь к папке, где будут храниться все проекты, к которым мы хотим предоставить доступ через web. В моём случае я создал папку git в домашней папке:

$ mkdir /home/bas/git

Для работы gitweb.cgi требуется модуль p5-CGI:

# pkg install p5-CGI

nginx

Теперь необходимо добавить обработчик cgi-скриптов в web-сервер nginx. Для этого в конфиг web-сервера добавляем следующее:

    location ~ ^/(.*\.cgi)$ {
        include         fastcgi_params;
        fastcgi_pass    unix:/var/run/fcgiwrap/fcgiwrap.git.socket;
        fastcgi_index   gitweb.cgi;
        fastcgi_param   SCRIPT_FILENAME /usr/local/www/gwtools.ru/git/gitweb.cgi;
        fastcgi_param   DOCUMENT_ROOT   /usr/local/www/gwtools.ru/git;
    }

    location /git {
        root            /usr/local/www/gwtools.ru;
        index           gitweb.cgi;
        autoindex       off;
    }

Перезапускаем nginx:

# service nginx restart


Теперь у нас есть настроенный git с web-интерфейсом, доступным по адресу http://www.gwtools.ru/git.

Работа с git

Создаём папку с каким-нибудь проектом:

$ cd ~bas/git
$ mkdir my_project

Создадим пустой репозитарий:

$ cd my_project
$ git init
Initialized empty Git repository in /usr/home/bas/git/my_project/.git/

Теперь в web-интерфейсе появился наш проект :)

Примечания

  1. При написании статьи использовались следующие версии программного обеспечения: FreeBSD 9.2 amd64, nginx 1.6.0, PHP 5.4.29, git 1.9.3.