Установка и настройка git на FreeBSD (freebsd+nginx+fcgiwrap+git+gitweb)
Для удобной работы с конфигами и моими проектами в очередной раз решил попробовать систему контроля версий. В этот раз выбор пал на 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-интерфейсе появился наш проект :)
Примечания
- ↑ При написании статьи использовались следующие версии программного обеспечения: FreeBSD 9.2 amd64, nginx 1.6.0, PHP 5.4.29, git 1.9.3.