Свой сервер центральных Git-репозиториев
Установка Git на сервер
apt install git-core
Репозитории
Условимся, что у нас будет mygit пользователь, содержащий центральные Git репозитории. Клиенты будут подключаться к mygit пользователю через Git по SSH, однако напрямую по SSH доступ следует отключить.
Сперва создадим mygit пользователя:
adduser mygit
Создание репозитория
Дальнейшая работа необходима от имени этого пользователя для того, чтобы каталоги и файлы имели соответствующие права, группу и владельца. Войдём под ним:
su mygit
cd
mkdir название_репозитория.git
cd название_репозитория.git/
git init --bare
Когда все репозитории созданы, выходим из пользователя mygit:
exit
Работа без ввода пароля
Сейчас любое соединение клиента требует ввода пароля пользователя mygit. Чтобы клиенты могли работать с Git репозиториями пользователя без ввода пароля, необходимо добавить публичные ключи клиентов (содержимое файлов id_rsa.pub) в ~/.ssh/authorized_keys.
Но сперва установка OpenSSH клиента и сервера осуществляется командой
apt install ssh
Конфигурация SSH
С помощью редактора mcedit (или nano, в случае mcedit требуется сперва установить mc) откроем файл /etc/ssh/sshd_config:
mcedit /etc/ssh/sshd_config
Убедитесь, что следующий параметр имеет указанное значение:
PermitEmptyPasswords no
Здесь можно указать другой порт для SSH, но в этом случае, при последующем подключении клиентами, команда подключения должна будет иметь подобный вид:
ssh -p ПОРТ логин@сервер
Перезапустить SSH сервер можно командой:
service ssh restart
Чтобы в последующем не вводить логин, сервер и порт, можно задать пресет ssh в .ssh/config, например,
так:
Host preset1
HostName IP_адрес_или_домен
User имя_пользователя
Port порт
и уже авторизоваться по
ssh preset1
Клиенты
У пользователей, которые будут подключаться к серверу через SSH или Git (по SSH), должен быть установлен SSH клиент и сгенерированы ключи. Проверить, сгенерирован ли ключ, можно по наличию файла ~/.ssh/id_rsa.pub . В случае отсутствия, необходимо его сгенерировать, например, с помощью следующей команды:
ssh-keygen -t rsa -C "email@сервер"
Пароль можно не устанавливать.
Затем добавьте ключ в ssh-agent:
ssh-add ~/.ssh/id_rsa
Авторизация по ключу
Чтобы при каждом соединении с SSH и Git (он будет у нас работать тоже через SSH) не вводить пароль, нужно создать файл /home/mygit/.ssh/authorized_keys на сервере.
Обратите внимание: для создания каталога .ssh (если таковой отсутствует) и файла authorized_keys необходимо быть авторизованным под самым тем пользователем, в домашнем каталоге которого осуществляются действия, то бишь под mygit. Либо после установить соответствующие права, группу и владельца.
В этом файле на каждой строке должно быть содержимое публичного ключа (~/.ssh/id_rsa.pub) клиентов этого пользователя. В конце файла authorized_keys должна быть пустая строка.
Иными словами, если у нас имеется server_user_1, к которому будет осуществляться доступ через ssh клиентами client_user_1 и client_user_2, то в домашнем каталоге пользователя server_user_1 файл ~/.ssh/authorized_keys должен иметь три строки:
содержимое id_rsa.pub client_user_1
содержимое id_rsa.pub client_user_2
(пустая строка)
Отключаем прямой доступ к SSH
Когда все центральные репозитории созданы, а публичные ключи клиентов добавлены в соответствующий файл, и всё у всех работает, пора отключить прямой доступ к пользователю mygit по SSH.
Здесь и далее работаем от имени root. Узнаем полный путь к оболочке git-shell:
which git-shell
И запоминаем.
Затем открываем файл /etc/passwd в mcedit (или в другом редакторе, например, nano):
mcedit /etc/passwd
Находим (скорее всего в конце файла) строчку, начинающуюся на mygit, и вместо /bin/bash (или /bin/sh, далее буду указывать /bin/bash) оболочки указываем полный адрес оболочки git-shell. Например, /usr/bin/git-shell. Не удалите перенос строки в конце файла. Сохраняем.
Теперь доступ к пользователю mygit через SSH разрешён только для Git.
Однако ранее использованная команда «su mygit» тоже работать не будет! Поэтому, когда необходимо добавить новый публичный ключ в authorized_keys или создать новый центральный репозиторий, то сперва потребуется в файле /etc/passwd заменить git-shell на прежнюю оболочку (/bin/bash), войти под пользователем (su mygit), произвести необходимые изменения, выйти к root (exit), и затем снова заменить оболочку пользователя в файле /etc/passwd на git-shell. Довольно не удобно, думаю, что в этой ситуации следует поступить как-то иначе, но пока не знаю как.
Развернуть репозиторий на клиенте
На клиентах развёртывать репозиторий просто:
git clone mygit@сервер:название_репозитория.git конечный_каталог
Если порт отличается от стандартного, то уже так:
git clone ssh://mygit@сервер:порт/home/mygit/название_репозитория.git конечный_каталог