Запуск git на Debian 11 и Ubuntu Server 21.10

Краткая инструкция по быстрому развёртыванию собственного git сервера с веб-интерфейсом в связке Linux, git, nginx, fcgiwrap и gitweb на ОС Debian GNU/Linux 11.2 и Ubuntu Server 21.10.

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

# cat /etc/hosts

В Debian:

127.0.0.1 localhost
127.0.1.1 dvm30.homenet.local dvm30

В Ubuntu Server:

127.0.0.1 localhost
127.0.1.1 usvm40.homenet.local usvm40

Также желательно иметь DNS-сервер с соответствующими записями для обращения к этим хостам. Если его нет, то на клиентских машинах в файле hosts должны быть примерно такие записи:

# Пример IP-адреса и имени хоста для сервера на Debian
192.168.1.30 dvm30.homenet.local homenet.local

# Пример IP-адреса и имени хоста для сервера на Ubuntu Server
192.168.1.40 usvm40.homenet.local homenet.local

Устанавливаем необходимые пакеты

# apt install build-essential net-tools curl git software-properties-common nginx fcgiwrap apache2-utils unzip

Затем создадим директорию с проектами /var/www/html/prj/ и переходим на неё

# mkdir /var/www/html/prj/
# cd /var/www/html/prj/

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

# mkdir gitproject.git/
# cd gitproject.git/
# git --bare 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/www/html/prj/gitproject.git/

Для правильной работы получения изменений и клонирования по HTTP выполняем команду

# git update-server-info

Далее зададим необходимые права на директорию с проектами

# chown -R www-data:www-data /var/www/html/prj/
# chmod -R 755 /var/www/html/prj/

После этого с помощью утилиты htpasswd зададим пароль пользователю gituser

# htpasswd -c /var/www/html/prj/htpasswd gituser

Теперь приступим к конфигурированию nginx. Для этого создадим файл /etc/nginx/sites-available/git и откроем его

# touch /etc/nginx/sites-available/git
# nano /etc/nginx/sites-available/git

Внесём такую конфигурацию:

server {
        listen 80;
        server_name dvm30.homenet.local;

        root /var/www/html/prj;
        index index.html index.htm;

        location / {
                try_files $uri $uri/ =404;
        }

        location ~ (/.*) {
                client_max_body_size 0;
                auth_basic "Login to Git Server";
                auth_basic_user_file "/var/www/html/prj/htpasswd";
                include /etc/nginx/fastcgi_params;
                fastcgi_param SCRIPT_FILENAME /usr/lib/git-core/git-http-backend;
                fastcgi_param GIT_HTTP_EXPORT_ALL "";
                fastcgi_param GIT_PROJECT_ROOT /var/www/html/prj;
                fastcgi_param REMOTE_USER $remote_user;
                fastcgi_param PATH_INFO $1;
                fastcgi_pass unix:/var/run/fcgiwrap.socket;
        }

}

Подключаем конфигурацию

# ln -s /etc/nginx/sites-available/git /etc/nginx/sites-enabled/

и проверим nginx на ошибки

# /usr/sbin/nginx -t

Ошибок быть не должно.

Перезапускаем службу nginx и проверяем её статус

# systemctl restart nginx
# systemctl status nginx

Далее создадим проект в директории /var/www/html/prj/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/www/html/prj/gitproject.git/project/.git/

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

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

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

# git remote add origin http://gituser@dvm30.homenet.local/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 (корневой коммит) b234617] Test Commit
 1 file changed, 2 insertions(+)
 create mode 100644 text/example.txt

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

# git push origin master

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

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

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

Перечисление объектов: 4, готово.
Подсчет объектов: 100% (4/4), готово.
Запись объектов: 100% (4/4), 277 bytes | 138.00 KiB/s, готово.
Total 4 (delta 0), reused 0 (delta 0), pack-reused 0
To http://dvm30.homenet.local/gitproject.git
 * [new branch]      master -> master

После этого переходим к клиенту.

Создадим каталог git/dvm30/ и перейдём в него

# mkdir -p git/dvm30/
# cd git/dvm30/

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

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

В консоли появится сообщение:

Cloning into 'gitproject'...
remote: Перечисление объектов: 4, готово.
remote: Подсчет объектов: 100% (4/4), готово.
remote: Total 4 (delta 0), reused 0 (delta 0), pack-reused 0
Unpacking objects: 100% (4/4), 257 bytes | 1024 bytes/s, done.

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

# cd gitproject/

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

# nano text/example.txt

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

Success!

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

# touch text/privet.txt

откроем его

# nano text/privet.txt

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

Hello, world!

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

# git add .

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

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

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

[master 7906651] 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), 374 bytes | 46.00 KiB/s, done.
Total 5 (delta 0), reused 0 (delta 0), pack-reused 0
To http://dvm30.homenet.local//gitproject.git
   b234617..7906651  master -> master

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

Далее установим веб-интерфейс gitweb

# apt install gitweb

откроем файл конфигурации /etc/gitweb.conf

# nano /etc/gitweb.conf

и исправим параметр $projectroot

$projectroot = "/var/www/html/prj";

Затем в директории /etc/nginx/sites-available/ создадим файл конфигурации homenet для nginx

# touch /etc/nginx/sites-available/homenet

откроем его

# nano /etc/nginx/sites-available/homenet

и внесём в него такую конфигурацию:

server {
        listen 80;
        server_name homenet.local;

        location /index.cgi {
                root /usr/share/gitweb;
                include fastcgi_params;
                gzip off;
                fastcgi_param SCRIPT_NAME $uri;
                fastcgi_param GITWEB_CONFIG /etc/gitweb.conf;
                fastcgi_pass unix:/var/run/fcgiwrap.socket;
        }

        location / {
                root /usr/share/gitweb;
                index index.cgi;
        }

}

После этого создадим на него символическую ссылку в директории /etc/nginx/sites-enabled/

# ln -s /etc/nginx/sites-available/homenet /etc/nginx/sites-enabled/

удалим символическую ссылку на файл конфигурации по умолчанию

# rm /etc/nginx/sites-enabled/default

проверим конфигурацию nginx

# /usr/sbin/nginx -t

и перезапустим службу nginx

# systemctl restart nginx

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

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

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

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

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *