Краткая инструкция по быстрому развёртыванию собственного 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 и мы должны будем увидеть список созданных проектов:
Здесь он пока один.
Кликнув на проект можно увидеть историю его коммитов