Site icon OS CONFIG

Запуск git сервера на Gentoo

Краткое руководство по быстрому развёртыванию собственного git сервера с веб-интерфейсом в связке git + Apache HTTP Server + gitweb на ОС Gentoo GNU/Linux.

Перед тем, как начинать разворачивать сервер, необходимо убедиться в наличии полных имён хостов в файле /etc/hosts

# nano /etc/hosts

После строки

127.0.0.1 localhost

дописать такую:

127.0.1.1 gvm45.homenet.local gvm45

Затем создаём файл /etc/portage/package.use/git

# touch /etc/portage/package.use/git

открываем его

# nano /etc/portage/package.use/git

и пропишем в нём такую строчку:

# dev-vcs/git cgi highlight

Запускаем установку git

# emerge -av dev-vcs/git

gitweb будет автоматически установлен в /usr/share/gitweb/

Затем устанавливаем apache-tools

# emerge --ask app-admin/apache-tools

а также сам apache

# emerge --ask apache

Запускаем необходимые для работы службы и включаем их в автозагрузку

# rc-service apache2 start
# rc-update add apache2 default
# rc-service git-daemon start
# rc-update add git-daemon default

Теперь откроем файл /etc/conf.d/git-daemon

# nano /etc/conf.d/git-daemon

и исправим там строки:

GITDAEMON_OPTS="--syslog --enable=receive-pack --base-path=/pub/git"
GIT_USER="nobody"
GIT_GROUP="nobody"

на:

GITDAEMON_OPTS="--syslog --export-all --enable=receive-pack --base-path=/var/git"
GIT_USER="apache"
GIT_GROUP="apache"

Затем создадим каталог /var/git/, в котором будут храниться проекты

# mkdir /var/git/

Далее создадим директорию для хранения данных о логинах и паролях пользователей

# mkdir /etc/apache2/gitusers/

После этого открываем файл /etc/apache2/httpd.conf

# nano /etc/apache2/httpd.conf

и в самом конце допишем

Include /etc/apache2/httpd_git.conf

Теперь создадим файл /etc/apache2/httpd_git.conf для хранения конфигурации Apache для нашего git-сервера

# touch /etc/apache2/httpd_git.conf

открываем его

# nano /etc/apache2/httpd_git.conf

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

SetEnv GIT_PROJECT_ROOT /var/git
SetEnv GIT_HTTP_EXPORT_ALL
ScriptAlias /git/ /usr/libexec/git-core/git-http-backend/

<Location /git>
    Options ExecCGI
    AuthName "Login to Git"
    AuthType Basic
    AuthUserFile /etc/apache2/gitusers/.htpasswd
    Require valid-user
</Location>

Затем создадим пользователя gituser с помощью утилиты htpasswd

# htpasswd -c /etc/apache2/gitusers/.htpasswd gituser

Теперь перезапустим службы apache2 и git-daemon

# rc-service apache2 restart
# rc-service git-daemon restart

Затем создадим репозиторий gitproject.git и инициализируем его

# mkdir /var/git/gitproject.git/
# cd /var/git/gitproject.git/
# git init --bare --shared

В консоли должно появиться такое сообщение:

подсказка: Using 'master' as the name for the initial branch. This default branch name
подсказка: is subject to change. To configure the initial branch name to use in all
подсказка: of your new repositories, which will suppress this warning, call:
подсказка:
подсказка:      git config --global init.defaultBranch <name>
подсказка:
подсказка: Names commonly chosen instead of 'master' are 'main', 'trunk' and
подсказка: 'development'. The just-created branch can be renamed via this command:
подсказка:
подсказка:      git branch -m <name>
Инициализирован пустой общий репозиторий Git в /var/git/gitproject.git/

Далее дадим права группе apache для этого репозитория

# chgrp -R apache /var/git/gitproject.git/

После этого создадим проект в директории /var/lib/git/gitproject.git/ и инициализируем его

# mkdir project/
# cd project/
# git init

В консоли должно появиться такое сообщение:

подсказка: Using 'master' as the name for the initial branch. This default branch name
подсказка: is subject to change. To configure the initial branch name to use in all
подсказка: of your new repositories, which will suppress this warning, call:
подсказка:
подсказка:      git config --global init.defaultBranch <name>
подсказка:
подсказка: Names commonly chosen instead of 'master' are 'main', 'trunk' and
подсказка: 'development'. The just-created branch can be renamed via this command:
подсказка:
подсказка:      git branch -m <name>
Инициализирован пустой репозиторий Git в /var/git/gitproject.git/project/.git/ 

Теперь в директории /var/git/gitproject.git/hooks/ скопируем (или переименуем) файл post-update.sample в post-update

# cp /var/git/gitproject.git/hooks/post-update.sample /var/git/gitproject.git/hooks/post-update

Затем настраиваем пользователя gituser

# git config --global user.email "gituser@homenet.local"
# git config --global user.name "gituser"

После этого создадим новую запись для нового подключения к репозиторию

# git remote add origin http://gituser@gvm45.homenet.local/git/gitproject.git

Также создадим некоторые данные, например, директорию text с файлом example.txt

# mkdir text/
# touch text/example.txt
# nano text/example.txt

запишем какой-нибудь текст в этот файл:

Welcome to Git Server

Добавим содержимое рабочего каталога в индекс

# git add .

Сохраним изменения в рабочем каталоге

# git commit -a -m "Test Commit"

В консоли должен отобразиться такой текст:

[master (корневой коммит) 8890a77] Test Commit
 1 file changed, 2 insertions(+)
 create mode 100644 text/example.txt

Выгружаем содержимое локального репозитория в удалённый

# git push origin master

появится запрос пароля, который необходимо будет ввести:

Password for 'http://gituser@gvm45.homenet.local':

В консоли должны отобразиться данные о выгрузке:

Перечисление объектов: 4, готово.
Подсчет объектов: 100% (4/4), готово.
Запись объектов: 100% (4/4), 276 байтов | 138.00 КиБ/с, готово.
Всего 4 (изменений 0), повторно использовано 0 (изменений 0), повторно использовано пакетов 0
To http://gvm45.homenet.local/git/gitproject.git
 * [new branch]      master -> master

Обновляем данные

# git update-server-info

Далее переходим к клиенту.

Склонируем удалённый репозиторий

# git clone http://gituser@gvm45.homenet.local/git/gitproject.git

Сообщение в консоли должно быть таким:

Cloning into 'gitproject'...
remote: Enumerating objects: 4, done.
remote: Counting objects: 100% (4/4), done.
remote: Total 4 (delta 0), reused 0 (delta 0), pack-reused 0
Receiving objects: 100% (4/4), done.

Затем перейдём в каталог gitproject/

# cd gitproject/

откроем файл text/example.txt

# nano text/example.txt

и внесём в него какой-нибудь текст:

Yes, it works!

Также в директории text создадим файл privet.txt и откроем его

# touch text/privet.txt
# nano text/privet.txt

и в нём тоже напишем что-нибудь:

Hello, world!

Теперь добавим содержимое в индекс

# git add .

сохраним изменения

# git commit -a -m "Commit from client"

консоль покажет нам такое сообщение:

[master 7bf3560] Commit from client
 2 files changed, 4 insertions(+)
 create mode 100644 text/privet.txt

и отправим на сервер в удалённый репозиторий

# git push

в консоли отобразится такое сообщение:

Enumerating objects: 8, done.
Counting objects: 100% (8/8), done.
Delta compression using up to 2 threads
Compressing objects: 100% (2/2), done.
Writing objects: 100% (5/5), 378 bytes | 54.00 KiB/s, done.
Total 5 (delta 0), reused 0 (delta 0), pack-reused 0
To http://gvm45.homenet.local/git/gitproject.git
   8890a77..7bf3560  master -> master

Это значит, что наш git-сервер настроен и готов к использованию.

После этого переходим к настройке веб-интерфейса gitweb

Откроем файл /usr/share/gitweb/gitweb.cgi

# nano /usr/share/gitweb/gitweb.cgi

и исправим строчку

our $projectroot = "/pub/git";

на

our $projectroot = "/var/git";

Затем создадим файл конфигурации gitweb

# touch /etc/gitweb.conf

откроем его

# nano /etc/gitweb.conf

и добавим туда строчку

$projectroot = "/var/git";

Далее открываем файл конфигурации apache для git

# nano /etc/apache2/httpd_git.conf

и допишем в него следующие строки:

Alias /gitweb /usr/share/gitweb

<Directory /usr/share/gitweb>
  Options +ExecCGI
  AddHandler cgi-script .cgi
  DirectoryIndex gitweb.cgi
  Require all granted
</Directory>

Перезапускаем службу apache2

# rc-service apache2 restart

Если ошибок нет, то веб-интерфейс настроен.

На другой машине в сети в строке браузера вводим адрес http://gvm45.homenet.local/gitweb/ и мы должны будем увидеть список созданных проектов:

Здесь он пока один.

Кликнув на проект можно увидеть историю его коммитов

Exit mobile version