Недавно мне понадобилось быстро развернуть git-сервер, но разворачивать что-то крупное было лень, поэтому покажу затерянный временем способ создания удаленного git-репозитория без использования gitlab, Gogs или Gitea.
Git использует 2 протокола передачи данных — HTTP и SSH. Для людей, которые только начали знакомится с git, использование первого протокола проблем не вызывает, а вот со вторым начинаются затупы на этапе настройки доступа через открытые ключи.
На самом деле SSH в git работает буквально так, как мы привыкли его использовать — подключается с именем пользователя git по публичному ключу и открывает оболочку, но не bash или zsh, а git-shell. Она ограничивает лишний доступ к системе и работает только с файлами репозитория. При этом директории с именами репозиториев должны иметь формат
<имя_репы>.git . Далее показан пример настройки доступа через ssh.apt update && apt install -y git
# Создание пользователя git
useradd -m git -s /usr/bin/git-shell
# Включение авторизации по публичным ключам
sed -i 's/^#*PubkeyAuthentication.*/PubkeyAuthentication yes/' /etc/ssh/sshd_config
sudo systemctl restart sshd
# Создание .ssh директории и файла authorized_keys
mkdir -p /home/git/.ssh
touch /home/git/.ssh/authorized_keys
chmod 700 /home/git/.ssh
chmod 600 /home/git/.ssh/authorized_keys
chown -R git:git /home/git/.ssh
echo 'ssh-ed25519 <ПУБЛИЧНЫЙ_КЛЮЧ_С_ДРУГОГО_УСТРОЙСТВА>' >> /home/git/.ssh/authorized_keys
# Создание репозитория
REPO_NAME="repo"
su -s /bin/bash git -c "mkdir -p ~/$REPO_NAME.git && cd ~/$REPO_NAME.git && git init --bare"
Всё это будет нормально работать на любой виртуалке с минимальной конфигурацией. Теперь можно пушить свою ветку на удаленный репозиторий:
REPO_NAME="repo"
git remote add origin "ssh://git@<HOST>:$REPO_NAME.git"
git push remote master
#ToolTricks