# Разворачивание 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 ``` Если надо, то добавляем CSS форматирование ``` sudo nano /usr/share/cgit/cgit.css ``` В конец файла добавляем содержимое add.css из репозитория. Сбрасываем кеш: ``` sudo rm -rf /var/cache/cgit/* ``` Настраиваем конфиг ``` 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=Мои репозитории index-header=Мое персональное Git-хранилище проектов 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 ```