Разворачивание 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
