Estive em busca de uma interface git para hospedar os meus projetos em meu próprio servidor, para de certa forma servir de meu portifólio.

Eu já tinha conhecimento de que o gitlab permite que os usuários criem a sua própria instância(self-host) em seus servidores, e eu mesmo já hospedei uma instância do gitlab em minha VPS.

Porém, achei a plataforma muito pesada, necessitando de muita memória RAM, e o “fresh install” do gitlab já consumia 8 GB de armazenamento.

Então iniciei a minha pesquisa a procura de uma interface git que fosse, simples e leve.

Início das pesquisas

Primeiro me lembrei que o projeto suckless faz a hospedagem de seus próprios repositórios utilizando uma interface git bem simples.

Pesquisando um pouco descobri que se trata do [stagit], uma ferramenta que gera páginas estáticas para os seus repositórios git.

Gostei da proposta do [stagit], porém, esta ferramenta precisa ser rodada periódicamente para gerar as páginas dos repositórios(ou a cada alteração).

Pesquisando mais um pouco, eu encontrei um post no blog paritybit citando algumas plataformas que ele encontrou em sua jornada em busca de um servidor git.

Neste post o autor cita vários servidores, mas um deles me chamou a atenção por ser escrito utilizando a linguagem C.

Este software se chama cgit. O que me chamou a atenção a respeito do cgit é o fato de ele poder ser rodado via CGI, e também por poder rendererizar as páginas a todo a acesso do usuário(não necessáriamente a toda alteração do projeto). O cgit também atende aos meus requisitos de ser um software leve e simples e de quebra é um software que segue a filosofia suckless.

Com estas informações em mãos eu decidi que o cgit será a minha interface git.

Configurando o cgit

Para começar a configuração do cgit eu li o verbete do cgit na Arch Wiki. Este verbete descreve com clareza os passos para instalar o cgit na sua VPS.

Após seguir as etapas de instalação descritas na Arch Wiki eu apliquei um css com tema dark que encontrei na internet.

O meu arquivo de css para o cgit pode ser encontrado no meu repositório: cgit.

Servidor git

Para eu poder ver meus repositórios renderizados pelo cgit eu preciso ter o meu próprio servidor git, não é mesmo?

Consegui configurar o meu próprio servidor git com facilidade seguindo o guia de referência do git.

Foi algo bem simples não tive problemas algum ao seguir os passos.

Após a configuração do servidor git eu apenas informei ao cgit em qual diretório os meus repositórios estavam armazenados preenchendo o arquivo de configuração localizado em /etc/cgitrepos.

Configurando mirrors

Após configurar o servidor git eu precisei espelhar no meu servidor, os meus projetos hospedados tanto no Github tanto no Gitlab.

Para isso utilizei um script que encontrei no Github, chamado git-mirror.

O git-mirror é uma ferramenta simples e escrito em shell script.

Para espelhar os meus projetos eu criei um diretório no meu computador para armazenar os meus repositórios, em seguida eu utilizei o seguinte comando para criar o espelho:

git-mirror setup path/to/directory https://someserver.domain/user/tomirror [email protected]/user/mirror

Este script tem que ser chamado com frequência para atualizar os remotos a cada alteração, para isso o próprio desenvolvedor criou um target do systemd para realizar a ação de update a cada 5 minutos.

Infelizmente os meus espelhos estão configurados apenas no meu computador pessoal no momento, logo, se eu realizar alguma alteração em algum dos meus projetos, e o meu computador estiver desligado, esta alteração não poderá ser vista no meu servidor git em git.calebe.dev.br.

E infelizmente também os espelhos são feitos em apenas uma direção, ou seja, somente as alterações enviadas para os remotos do Gitlab e Github podem ser vistas no meu servidor git.

Exemplo:

    Gitlab              Meu Servidor
    HEAD      ---->          Git
      |                       |
   Commit                   Commit
   cb35f94                  cb35f94

Futuramente eu quero descobrir um jeito de criar espelhos bidirecionais, ou seja, as alterações poderão ser feitas em ambos os remotos.

Exemplo:

    Gitlab              Meu Servidor
    HEAD      <>---->        Git
      |                       |
   Commit                   Commit
   cb35f94                  cb35f94

Conclusão

Configurar o cgit é uma tarefa relativamente fácil se você já tem um conhecimento de como aplicações [CGI] funcionam, de como configurar o nginx, de como funciona o ssh e conhecimentos intermediários do uso de comandos de linha de comando.

Lendo as documentações do git e do cgit eu consegui hospedar um servidor git simples e leve, e pode ser acessado em git.calebe.dev.br.

Veja também