$
pwd

Índice

Em busca de uma interface git self-hosted

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 git@someserver.domain/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.