Создание веб-интерфейса Git и Git-сервера с помощью FreeBSD + fcgiwrap + cgit
Здравствуйте, это Муно.
До недавнего времени я использовал 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.
Я очень доволен, так как его можно построить с очень небольшими ресурсами.
До новых встреч. Всего наилучшего.