Создание веб-интерфейса Git и Git-сервера с помощью FreeBSD + fcgiwrap + cgit

7 min

language: ja bn en es hi pt ru zh-cn zh-tw

Здравствуйте, это Муно.
До недавнего времени я использовал GItea, но он был слишком функциональным и потреблял ненужные серверные ресурсы, поэтому я хотел это улучшить.
Кроме того, я хотел создавать базовые репозитории, насколько это возможно, из командной строки. Хотя для Github существует команда gh, я не хотел использовать такие платформозависимые команды, поэтому не внедрял ее.
Это потому, что платформозависимые бинарные файлы не дают много знаний о низкоуровневых аспектах.

Поэтому я решил использовать cgit в качестве веб-интерфейса для git, а git хранить на удаленном сервере через SSH, что позволило мне реализовать желаемую структуру.

Включение возможности git push

Проще говоря, достаточно создать пустой репозиторий на стороне Git-сервера и иметь возможность делать в него push.
Предполагается, что вы уже можете подключиться по SSH к удаленному серверу, в данном случае к Git-серверу.

Создание пользователя git

В случае FreeBSD создание возможно в интерактивном режиме с помощью команды "adduser".

adduser

После создания пользователя git переключитесь на него и добавьте открытый ключ клиента в .ssh/authorized_keys.

su - git
mkdir .ssh
chmod 700 .ssh
vim .ssh/authorized_keys
# Или
echo "открытый ключ клиента" > ".ssh/authorized_keys"
chmod 600 .ssh/authorized_keys

Убедитесь, что теперь вы можете подключиться по ssh.
Дополнительно создайте каталог для хранения репозиториев в домашнем каталоге этого пользователя git.

mkdir repos

Затем настройте ветку по умолчанию для использования с помощью git config.

git config --global init.defaultBranch main

Разрешение создания репозиториев с клиентской стороны на серверную

В текущем виде вам придется каждый раз входить на Git-сервер, создавать репозиторий, а затем делать git push с клиентской стороны, что слишком утомительно. Поэтому мы сделаем так, чтобы последовательность действий можно было выполнять с клиентской стороны.
Я добавил следующее в .bashrc.

mkr() {
  ssh git@bsd "git init --bare repos/$1.git"
  ssh git@bsd "cd repos/$1.git; git branch -m main"
  echo "remote add origin git@bsd:~/repos/$1.git"
}

Теперь вы можете создавать репозитории на клиентской стороне, используя имя репозитория, переданное в качестве аргумента.
Наконец, вывод команды для установки удаленного URL в стандартный вывод упрощает его настройку.

Установка cgit

Для использования cgit требуется cgi, поэтому установите необходимые пакеты. Предполагается, что Nginx уже установлен.

pkg install cgit fcgiwrap

Необходимо убедиться, что Nginx может получить доступ через UNIX-сокет с правами пользователя и группы www:www, а также включить службу.

sysrc fcgiwrap_enable=YES
sysrc fcgiwrap_user=www
sysrc fcgiwrap_group=www
sysrc fcgiwrap_socket_owner=www
sysrc fcgiwrap_socket_group=www
service fcgiwrap start

Настройка cgit

Необходимо настроить cgit.
На этот раз я немного изменил настройки по умолчанию, и получилось следующее:

$ cat /usr/local/etc/cgitrc 
root-title=Git
root-desc=public repositories

virtual-root=/
scan-path=/home/git/repos/

css=/style.css
logo=/top.png

head-include=/usr/local/www/cgit/head.html
readme=:README.md
readme=:README.rst
enable-commit-graph=1

Файлы для распространения были созданы в каталоге /usr/local/www/cgit/ после установки пакета.

Настройка Nginx

Итак, вот наш Nginx.

server {
    if ($host = git.soulminingrig.com) {
        return 301 https://$host$request_uri;
    } # управляется Certbot

    server_name git.soulminingrig.com;
    listen 80;
}

server {
    server_name git.soulminingrig.com;
    listen 443 ssl;

    root /usr/local/www/cgit;

    location / {
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME /usr/local/www/cgit/cgit.cgi;
        fastcgi_param PATH_INFO $uri;
        fastcgi_param QUERY_STRING $query_string;
        fastcgi_pass unix:/var/run/fcgiwrap/fcgiwrap.sock;
    }

    location ~* \.(css|png|ico)$ {
        root /usr/local/www/cgit;
    }

    ssl_certificate /usr/local/etc/letsencrypt/live/git.soulminingrig.com/fullchain.pem; # управляется Certbot
    ssl_certificate_key /usr/local/etc/letsencrypt/live/git.soulminingrig.com/privkey.pem; # управляется Certbot
}

После создания вышеуказанного файла conf проверьте синтаксис с помощью nginx -t, а затем перезапустите Nginx.

nginx -t
service nginx restart

Кстати, я уже получил сертификат с помощью certbot.

certbot --nginx -d git.soulminingrig.com

Теперь доступ возможен.

В заключение

Таким образом, мне удалось создать очень легкий веб-интерфейс для Git.
Я очень доволен, так как его можно построить с очень небольшими ресурсами.

До новых встреч. Всего наилучшего.