Executando um Servidor "Git"

Introdução

Esta seção descreverá como configurar, administrar e proteger um servidor git. Git tem muitas opções disponíveis. Para documentação mais detalhada, veja-se https://git-scm.com/book/en/v2.

Dependências do Servidor

Exigidas

git-2.46.0 e OpenSSH-9.8p1

Configurando um Servidor "Git"

As instruções a seguir instalarão um servidor git. Ele será configurado para usar OpenSSH como método de acesso remoto seguro.

A configuração do servidor consiste nas seguintes etapas:

1. Configurar Usuários(as), Grupos e Permissões

Você precisará ser o(a) usuário(a) root para a parte inicial da configuração. Crie o(a) usuário(a) e grupo git e defina um resumo de senha inutilizável com os seguintes comandos:

groupadd -g 58 git &&
useradd -c "Proprietário(a) do git" -d /home/git -m -g git -s /usr/bin/git-shell -u 58 git &&
sed -i '/^git:/s/^git:[^:]:/git:NP:/' /etc/shadow

Colocar um resumo de senha inutilizável (substituindo ! por NP) desbloqueia a conta, mas ela não pode ser usada para se conectar via autenticação de senha. Isso é exigido pelo sshd para funcionar corretamente. Em seguida, crie alguns arquivos e diretórios no diretório "home" do(a) usuário(a) git, permitindo acesso ao repositório "git" usando chaves "ssh".

install -o git -g git -dm0700 /home/git/.ssh &&
install -o git -g git -m0600 /dev/null /home/git/.ssh/authorized_keys

Para qualquer desenvolvedor(a) que devesse ter acesso ao repositório, adicione a chave pública "ssh" dele/dela em /home/git/.ssh/authorized_keys. Primeiro, acrescente algumas opções para evitar que os(as) usuários(as) usem a conexão com o "git" para encaminhamento de porta para outras máquinas que o servidor "git" possa alcançar.

echo -n "no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty " >> /home/git/.ssh/authorized_keys &&
cat <chave-ssh-usuário(a)> >> /home/git/.ssh/authorized_keys

Também é útil definir o nome padrão da ramificação inicial de novos repositórios modificando a configuração do "git". Como o(a) usuário(a) root, execute:

git config --system init.defaultBranch trunk

Por fim, adicione a entrada /usr/bin/git-shell ao arquivo de configuração /etc/shells. Esse shell foi definido no perfil do(a) usuário(a) git e serve para garantir que somente ações relacionadas ao "git" possam ser executadas:

echo "/usr/bin/git-shell" >> /etc/shells

2. Criar um repositório "git"

O repositório pode estar em qualquer lugar no sistema de arquivos. É importante que o(a) usuário(a) "git" tenha acesso de leitura/escrita a esse local. Usamos /srv/git como diretório base. Crie um novo repositório git com os seguintes comandos (como o(a) usuário(a) root):

[Nota]

Nota

Em todas as instruções abaixo, usamos projeto1 como um nome de repositório de exemplo. Você deveria nomear seu repositório como um nome descritivo curto para seu projeto específico.

install -o git -g git -m755 -d /srv/git/projeto1.git &&
cd /srv/git/projeto1.git                             &&
git init --bare                                      &&
chown -R git:git .

3. Povoar o repositório a partir de um sistema cliente

[Nota]

Nota

Todas as instruções nesta seção e na próxima deveriam ser feitas em um sistema do(a) usuário(a), não no sistema do servidor.

Agora que o repositório foi criado, ele pode ser usado pelos(as) desenvolvedores(as) para colocar alguns arquivos nele. Depois que a chave "ssh" do(a) usuário(a) for importada para o arquivo authorized_keys do "git", o(a) usuário(a) poderá interagir com o repositório.

Uma configuração mínima deveria estar disponível no sistema do(a) desenvolvedor(a) especificando o nome de usuário(a) e endereço de correio eletrônico dele(a). Crie esse arquivo de configuração mínima no lado do cliente:

cat > ~/.gitconfig <<EOF
[user]
        name = <nome-usuário(a)>
        email = <endereço-correio-eletrônico-usuário(a)>
EOF

Na máquina do(a) desenvolvedor(a), configure alguns arquivos para serem enviados ao repositório como conteúdo inicial:

[Nota]

Nota

O termo gitserver usado abaixo deveria ser o nome do dispositivo (ou endereço "IP") do servidor "git".

mkdir meuprojeto
cd meuprojeto
git init --initial-branch=trunk
git remote add origin git@gitserver:/srv/git/projeto1.git
cat >LEIAME <<EOF
Este é o arquivo 'LEIAME'
EOF
git add LEIAME
git commit -m 'Criação inicial do LEIAME'
git push --set-upstream origin trunk

O conteúdo inicial agora é enviado ao servidor e fica disponível para outros(as) usuários(as). Na máquina atual, o argumento --set-upstream origin trunk agora não é mais necessário, pois o repositório local agora está conectado ao repositório remoto. Envios subsequentes podem ser realizados como

git push

Outros(as) desenvolvedores(as) agora podem clonar o repositório e fazer modificações no conteúdo (desde que as chaves "ssh" deles(as) tenham sido instaladas):

git clone git@gitserver:/srv/git/projeto1.git
cd projeto1
vi LEIAME
git commit -am 'Correção para o arquivo LEIAME'
git push
[Nota]

Nota

Essa é uma configuração de servidor muito básica baseada no acesso OpenSSH. Todos(as) os(as) desenvolvedores(as) estão usando o(a) usuário(a) git para realizar ações no repositório e as mudanças que os(as) usuários(as) estão "comitando" podem ser distinguidas como o nome de usuário(a) local (veja-se ~/.gitconfig) sendo registrado nos conjuntos de mudanças.

O acesso é restrito pelas chaves públicas adicionadas ao arquivo authorized_keys do "git" e não existe opção para o público exportar/clonar o repositório. Para habilitar isso, continue com a etapa quatro (4) para configurar o servidor "git" para acesso público somente leitura.

Na "URL" usada para clonar o projeto, o caminho absoluto (aqui /srv/git/projeto1.git) tem de ser especificado, pois o repositório não está no diretório "home" do "git", mas em /srv/git. Para eliminar a necessidade de expor a estrutura de instalação do servidor, um link simbólico pode ser adicionado no diretório "home" do "git" para cada projeto, como isto:

ln -svf /srv/git/projeto1.git /home/git/

Agora, o repositório pode ser clonado usando

git clone git@gitserver:projeto1.git

4. Configurar o Servidor

A configuração descrita acima torna um repositório disponível para usuários(as) autenticados(as) (via fornecimento do arquivo de chave pública "ssh"). Também existe uma maneira simples de publicar o repositório para usuários(as) não autenticados(as) — certamente, sem acesso de escrita.

A combinação do acesso via "ssh" (para usuários(as) autenticados(as)) e a exportação de repositórios para usuários(as) não autenticados(as) via processo de segundo plano é, na maioria dos casos, suficiente para um sítio de desenvolvimento.

[Nota]

Nota

O processo de segundo plano estará alcançável na porta 9418 por padrão. Certifique-se de que a configuração do seu "firewall" permite acesso a essa porta.

Para iniciar o servidor em tempo de inicialização, instale a unidade git-daemon.service a partir do pacote blfs-systemd-units-20240801:

make install-git-daemon

Para a finalidade de permitir que o git exporte um repositório, um arquivo chamado git-daemon-export-ok é necessário em cada diretório de repositório no servidor. O arquivo não necessita de conteúdo; apenas a existência dele habilita; a ausência dele desabilita a exportação daquele repositório.

touch /srv/git/projeto1.git/git-daemon-export-ok

Junto com a unidade git-daemon.service, um arquivo de configuração chamado /etc/default/git-daemon foi instalado. Revise esse arquivo de configuração para corresponder às suas necessidades.

Existem somente três opções a configurar no arquivo de configuração:

  • GIT_BASE_DIR=<nome-diretório>

    Especifique o local dos repositórios "git". Os caminhos relativos usados ao acessar o processo de segundo plano serão traduzidos relativos a esse diretório.

  • DFT_REPO_DIR=<nome-diretório>

    Esse diretório é adicionado à lista branca de diretórios permitidos. Essa variável pode conter vários nomes de diretório, mas geralmente é definida igual a GIT_BASE_DIR.

  • GIT_DAEMON_OPTS=<opções>

    No caso de opções especiais para o comando git daemon serem necessárias, elas tem de ser especificadas nessa configuração. Um exemplo pode ser ajustar o número da porta onde o processo de segundo plano está escutando. Nesse caso, adicione --port=<número da porta> a essa variável. Para mais informações relativas a quais opções podem ser definidas, dê uma olhada na saída gerada de git daemon --help.

Após iniciar o processo de segundo plano, usuários(as) não autenticados(as) conseguem clonar repositórios exportados usando

git clone git://gitserver/projeto1.git

Como o diretório base é /srv/git por padrão (ou definido como um valor personalizado na configuração), git interpreta o caminho de entrada (/projeto1.git) relativo a esse diretório base, de modo que o repositório em /srv/git/projeto1.git seja servido.