Понадобился репозиторий для хранения конфигов серверов и активного сетевого оборудования. Почитав про системы контроля версий и немного поразмыслив выбрал git. У меня уже имелся готовый веб хостинг на nginx под FreeBSD - решил использовать его.

Итак смотрим что есть в составе порта git:

cd /usr/ports/devel/git/
make config
[*] CONTRIB    Install contributed scripts
[*] CURL       Data transfer via cURL
[*] CVS        Enable CVS support
[ ] ETCSHELLS  Modify /etc/shells
[*] GITWEB     Install gitweb
[ ] GUI        GUI (Graphical User Interface)
[ ] HTMLDOCS   Install additional documentation
[*] ICONV      Encoding conversion via iconv
[*] NLS        Native Language Support
[*] P4         Enable Perforce support
[*] PERL       Perl scripting language
[ ] SVN        Subversion support

Меня интересовали 2 вещи, какая-нибудь простенькая веб морда интерфейс и собственно сам git. Видим, что в составе порта есть GITWEB, как говорит wikipedia "gitweb - написан на Perl (Kay Sievers). Большинство приведённых ниже крупных публичных git-репозиториев его и применяет."

Настраиваем по вкусу и ставим:

make config-recursive
make install clean

Затем идем в /etc/rc.conf и приводим блок с веб сервером примерно к такому виду:

#----------------------------- nginx --------------------------------------#
nginx_enable="YES"  # (bool) Set to "NO" by default. Set it to "YES" to enable nginx
nginx_profiles=""  # (str) Set to "" by default. Define your profiles here.
nginxlimits_enable="NO"  # (bool) Set to "NO" by default. Set it to yes to run `limits $limits_args` just before nginx starts.
nginx_flags=""  # (str) Set to "" by default. Extra flags passed to start command.
nginxlimits_args="-e -U www"  # (str) Default to "-e -U www" Arguments of pre-start limits run.

php_fpm_enable="YES"

fcgiwrap_enable="YES"
fcgiwrap_user="www"  # (str) run fcgiwrap as user
#fcgiwrap_socket="unix:/var/run/fcgiwrap/fcgiwrap.sock" #this could also be: tcp:[ipv4_addr]:port (for ipv4) | tcp6:[ipv6_addr]:port (for ipv6)
#fcgiwrap_flags="-c 4"
fcgiwrap_profiles="gitweb"
fcgiwrap_gitweb_socket="unix:/var/run/fcgiwrap/gitweb.socket"
#--------------------------------------------------------------------------#

Я специально запускаю отдельный экземпляр fcgiwrap для каждого "сайта". Если не дай бог упадет, то упадет только один сайт, а не все сразу. :)

Теперь настройки nginx:

server {
#-------------------------- Options --------------------------#
 listen 192.168.4.27:443;
 server_name git.local git;

 open_file_cache max=100000 inactive=40s;
 open_file_cache_valid 60s;
 open_file_cache_min_uses 2;
 open_file_cache_errors on;

#ssl
# ssl on;
# ssl_certificate  ssl/git/git.local.crt;
# ssl_certificate_key ssl/git/git.local.key;

#logs
 access_log /var/log/nginx/git.local_https_access.log;
 error_log /var/log/nginx/git.local_https_error.log;


#-------------------------- Configs --------------------------#
 # Default config
 include confs/main.conf;
 gzip off;

#-------------------------- Locations ------------------------#

# Main location
 location / {
  root /usr/local/www/gitweb;
  index gitweb.cgi;

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

 }

}

Теперь самое интересное, после установки порта devel/git в каталоге веб сервера /usr/local/www ничего не появилось, хотя опция GITWEB была отмечена, беглый анализ логов установки и поиск по винту навел на папочку:

FreeBSD# find /usr -name gitweb
/usr/local/share/examples/git/gitweb

FreeBSD# ls /usr/local/share/examples/git/gitweb
gitweb.cgi static

Вот оно! Копируем всю найденную папку gitweb в каталог веб сервера:

cp /usr/local/share/examples/git/gitweb /usr/local/www

Запускаем сервисы:

FreeBSD# service nginx reload
Performing sanity check on nginx configuration:
nginx: the configuration file /usr/local/etc/nginx/nginx.conf syntax is ok
nginx: configuration file /usr/local/etc/nginx/nginx.conf test is successful
FreeBSD# service fcgiwrap start
===> fcgiwrap profile: gitweb
Starting fcgiwrap.

Переходим по ссылке http://git.local - все работает, ура! :)

P.S. Памятка работы с git репозиторием:

Создаю на сервере новую папку (например /git/www/test).

mkdir -p /git/www/test

Делаю в ней инициализацию пустого репозитория git init:

cd /git/www/test
git init

На локальной машине скачиваю созданный репозиторий:

git clone git@git.local:/git/www/test/.git

Это создаст локальную копию удалённого репозитория (пока пустого).

Накидываю кучу файлов в локальную папку, которую мы создали на предыдущем шаге. Делаю, так сказать, каркас проекта. Если нужно — добавляю исключения в файл (.gitignore)

Выполняю:

cd /git/www/test
git add .
git commit
git push

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

  • git add . - добавляет новые файлы в репозиторий от текущего каталога.
  • `git commit - Фиксирует новую ревизию кода - тут-то и спросит ввести комментарий.
  • `git push - Отправляет изменения на сервер.
  • Всё. Локальный и удалённый репозиарии обновлены и синхронизированы.

Если вы веб-разрабочик и вам нужно довольно часто показывать текущий результат работы — очень полезно будет положить файл post-receive в папку .git/hooks какого-либо проекта с таким содержимым:

#!/bin/sh
cd ..
env -i git checkout -f
echo "Удалённый репозиторий успешно обновлён!"

И дайте ему права на исполнение. Теперь после каждого обновления (шаг 5) будет также обновляться рабочее дерево проекта и реальные файлы всегда будут последней, актуальной версии (а этого почти все и ожидают, когда обновили удалённый репозиторий, но так по умолчанию не происходит).

UPD: 21.06.2014

Если после настройки появляется ошибка:

404 - No projects found.

Возможно причина в правах на репазитории, необходимо, чтобы владельцем файлов в репазиториях был тот же пользователь, что и у fcgiwrap.

Если репазитории храятся в /git-repos, то решением будет:

cd /git-repos
chown -R www:www .

Ссылки по теме:

  1. Wikipedia - Git
  2. HOWTO: GIT hosting = nginx + cgit + gitosis + ssh
  3. Устанавливаем и настраиваем cGit на Ubuntu
  4. Собственный сервер Git на базе Ubuntu или Debian/GNU Linux
  5. Tip по использованию Git под Windows
  6. Installing Git and Gitweb on FreeBSD
  7. Simple CGI support for Nginx (fcgiwrap)
  8. 4.1 Git на сервере - Протоколы
  9. Configuring GitWeb - 404 - No projects found

Comments

comments powered by Disqus