aboutsummaryrefslogtreecommitdiff

Разворачивание git+Сgit под OpenResty

Идея в том, что наружу показываются только публичные репозитории через Cgit, а репозитории приватные остаются доступными только по ssh.

Создание нового пользователя и создание папок публичных и приватных репозиториев

sudo adduser --system --shell /bin/bash --group --disabled-password git

# Переключаемся на пользователя git
sudo -u git -i

# Создаем структуру папок
mkdir -p ~/repositories/public
mkdir -p ~/repositories/private
mkdir ~/.ssh
chmod 700 ~/.ssh

Создание репозитория (под созданным пользователем)

sudo -u git mkdir -p /home/git/repositories/public/new.git
sudo -u git git init --bare /home/git/repositories/public/new.git

Установка Сgit

sudo apt update
sudo apt install cgit spawn-fcgi fcgiwrap
sudo systemctl status fcgiwrap.socket

Cgit работает от www-data, поэтому даем права, но только на публичные репозитории

sudo chown -R git:www-data /home/git/repositories/public
sudo find /home/git/repositories/public -type d -exec chmod 750 {} \;
sudo find /home/git/repositories/public -type f -exec chmod 640 {} \;
sudo chmod +x /home/git
sudo chmod +x /home/git/repositories
sudo chmod +x /home/git/repositories/public
sudo chmod -R 755 /usr/share/cgit/

Подстветка синтаксиса:

sudo apt update
sudo apt install python3-pygments
sudo apt install python3-markdown
sudo chmod +x /usr/lib/cgit/filters/syntax-highlighting.py
sudo chmod +x /usr/lib/cgit/filters/about-formatting.sh

about-formatting.sh заменяем на about-formatting.sh из этого репозитория, чтобы не перебирал разные варианты рендеринга.

Перед этим провяерем, что markdown рендерится

python3 -m markdown --version
echo "# Тестовый заголовок" | /usr/lib/cgit/filters/about-formatting.sh readme.md

Настраиваем конфиг

sudo nano /etc/cgitrc

В нем должно быть так если хотим, чтобы Cgit работал в location / (virtual-root=/). Если в другом - вставляем другой, по умолчанию (если строки этой нет) работает от /git/

cache-size=1000
virtual-root=/
css=/cgit-css/cgit.css
logo=/cgit-css/cgit.png
favicon=/cgit-css/favicon.ico
source-filter=/usr/lib/cgit/filters/syntax-highlighting.py
about-filter=/usr/lib/cgit/filters/about-formatting.sh
readme=:README.md
readme=:readme.md
readme=:README.txt
readme=:README
root-readme=:README.md
enable-git-config=0
remove-suffix=1
scan-path=/home/git/repositories/public
main-title=Мои репозитории
snapshots=tar.gz zip

Тест:

CGIT_CONFIG=/etc/cgitrc /usr/lib/cgit/cgit.cgi

При необходимости рестартуем cgit

sudo systemctl restart fcgiwrap

В конфиг OpenResty добавляем location в нужное место:

location /cgit-css/ {
    alias /usr/share/cgit/;
    try_files $uri =404;
}

location / {
    include fastcgi_params;
    fastcgi_param SCRIPT_FILENAME /usr/lib/cgit/cgit.cgi;
    fastcgi_param PATH_INFO $uri;
    fastcgi_param QUERY_STRING $args;
    fastcgi_pass unix:/run/fcgiwrap.socket;
}

Клиентская часть

Выпускаем ключи

ssh-keygen -t ed25519 -f ~/.ssh/id_git_server -C "git-admin"
cat ~/.ssh/id_git_server.pub

Ключ копируем текстом и вставляем на сервере

nano ~/.ssh/authorized_keys

Чтобы git знал какой ключ используем:

nano ~/.ssh/config

Добавляем:

Host my-git-server
    HostName IP_ВАШЕГО_СЕРВЕРА
    User git
    IdentityFile ~/.ssh/id_git_server

Добавляем репозиторий в созданный на сервере тестовый (в папке локального репозитория):

git remote remove origin

git remote add origin git@IP_ВАШЕГО_СЕРВЕРА:/home/git/repositories/public/new.git

git push -u origin --all

Создаем скрипт для автоматического создания репозитория:

sudo nano /usr/local/bin/git-create
sudo chmod +x  /usr/local/bin/git-create

В этот скрипт вставляем код из git-create из этого репозитория и далее создаем репозитории с использованием его:

git init
git add .
git commit -m "Initial commit"
git-create private new
git push -u origin --all