Как организовать локальный сервер git? (возможно через доступ по ssh)

Суть: есть машина с несколькими пользователями. Необходимо создать репозиторий git для этих пользователей, который бы находился на этой же машине (даже на том же диске). Вариант использовать локальный протокол не устраивает, т.к. вижу при этом два похожих варианта развития:

  1. если разрешить rwc* всех пользователей к репозиторию, то юзеры могут изменить сам репозиторий (имею ввиду не через push, а прямым доступом);
  2. если создать отдельного пользователя и только он имел право rwc репозитория, тогда ему нужно будет также дать права на rwc home-ов реальных пользователей, а это тоже чревато. Если тут я ошибаюсь - прошу поправить :)

Доступ по ssh к репозиторию мне кажется наиболее защищенным в этом плане, т.к. и пользователь с сервера, и локальные пользователи не могут навредить кому-либо. Однако не знаю, можно ли организовать доступ к локальной папке через ssh. В гугле ничего не нашел по этому вопросу.

*rwc - чтение-запись-модификация


Ответы (2 шт):

Автор решения: KoVadim

Посмотрите на Gitea или Gogs. Минимальные усилия и у Вас будет сервер, который решит 99% задач для маленькой компании. Эти сервера можно развернуть даже на локальной машине или на рядом лежащей Raspberry Pi. На линукс сервере все подымается быстро и легко (особенно в докере). Дает хорошие возможности по администрированию и управлению.

Но если очень хочется, то можно и полноценный Gitlab развернуть. Но это перебор.

→ Ссылка
Автор решения: aleksandr barakin

помимо уже перечисленных огромных программ gitea и gogs стоит упомянуть и минималистичный gitolite (в отличие от упомянутых, он опакетирован во многих дистрибутивах, например, в debian gnu/linux под именем gitolite3).


но для «внутреннего упонтребления», если не требуется разграничения доступа к хранилищам, можно обойтись и вообще без установки дополнительных программ (сервер openssh стоит рассматривать как присутствующий по умолчанию).

  1. создайте пользователя. например, tig (домашний каталог — по умолчанию — /home/tig, пароль на ваш вкус):

    $ sudo adduser tig
    

    это для дистрибутива debian gnu/linux и «наследников». в вашем дистрибутиве процедура создания пользователя может отличаться. см. документацию к дистрибутиву.

  2. от имени этого пользователя создайте bare-хранилище:

    $ sudo -u tig git init --bare /home/tig/repo1
    
  3. создайте для этого пользователя каталог ~/.ssh и файл authorized_keys в нём (с соответствующими правами доступа и принадлежностью):

    $ sudo -u tig mkdir /home/tig/.ssh
    $ sudo -u tig touch /home/tig/.ssh/authorized_keys
    $ sudo chmod -R go= /home/tig/.ssh
    
  4. добавьте публичный ключ разработчика в созданный файл, только в начале строки с ключом вставьте такой текст:

    command="read c r o < <(echo \"$SSH_ORIGINAL_COMMAND\");case $c in git-upload-pack|git-receive-pack)eval $c $r;;*)exit 1;;esac"
    

    в конце этой строки должен быть пробел, чтобы полный текст ключа выглядел так (команду и содержимое ключа я заменил многоточиями для наглядности):

    command="..." ssh-rsa ...
    

    в виде однострочника (не забудьте подставить актуальный путь и имя файла с добавляемым публичным ключом):

    $ (printf 'command="read c r o < <(echo \\"$SSH_ORIGINAL_COMMAND\\");case $c in git-upload-pack|git-receive-pack)eval $c $r;;*)exit 1;;esac" '; cat файл.с.публичным.ключом) | sudo tee -a /home/tig/.ssh/authorized_keys
    

    что это за command=? а это такая уличная магия программы openssh. подробности смотрите в документации.

собственно, теперь всё. можете клонировать созданное хранилище, выполнять push и pull (от имени того пользователя, которому принадлежит секретная часть ключа):

$ git clone tig@localhost:repo1

понятно, что если команда выполняется на другом компьютере, вместо localhost надо подставить имя/ip-адрес того компьютера, где вы создавали пользователя tig.

чтобы создать новое хранилище, повторите шаг два, указав новое имя каталога.

чтобы добавить новый ключ, повторите шаг четыре.

→ Ссылка