Construindo um Frontend Web Git e um Servidor Git com FreeBSD + fcgiwrap + cgit
Olá, sou um incompetente.
Até pouco tempo atrás, eu estava construindo com GItea, mas como era muito rico em recursos e consumia recursos de servidor desnecessários, eu queria melhorar esse ponto.
Além disso, eu queria criar repositórios básicos o máximo possível a partir da CLI, e embora o Github tenha o comando gh, eu não queria adotar comandos dependentes de plataforma como esse para uso pessoal, então não os implementei.
Isso porque binários dependentes de plataforma não oferecem muito aprendizado de baixo nível.
Então, adotei cgit como um frontend web separado para git e armazenei git em um local remoto via SSH, conseguindo a configuração desejada.
Habilitar push para o git
Em outras palavras, basta criar um repositório bare no lado do servidor Git e poder fazer push para ele.
Presume-se que você já pode fazer SSH para o destino remoto, neste caso, o lado do servidor Git.
Criação do usuário git
No caso do FreeBSD, é possível criar interativamente com o comando "adduser".
adduser
Depois de criar o usuário git aqui, mude para ele e adicione a chave pública do cliente em .ssh/authorized_keys.
su - git
mkdir .ssh
chmod 700 .ssh
vim .ssh/authorized_keys
# ou
echo "Chave pública do cliente" > ".ssh/authorized_keys"
chmod 600 .ssh/authorized_keys
Com isso, confirme que você pode fazer ssh.
Além disso, crie um diretório para armazenar os repositórios no diretório home deste usuário git.
mkdir repos
Em seguida, configure o branch padrão a ser usado com git config.
git config --global init.defaultBranch main
Permitir a criação de repositórios do lado do cliente para o lado do servidor
Do jeito que está, seria necessário fazer login no servidor git toda vez, criar um repositório e fazer git push do lado do cliente, o que é muito tedioso, então faremos com que uma série de operações possam ser realizadas do lado do cliente.
Adicionei o seguinte ao .bashrc.
mkr() {
ssh git@bsd "git init --bare repos/$1.git"
ssh git@bsd "cd repos/$1.git; git branch -m main"
echo "remote add origin git@bsd:~/repos/$1.git"
}
Com isso, agora é possível criar repositórios do lado do cliente a partir do nome do repositório fornecido como argumento.
Finalmente, ao imprimir o comando para executar a URL remota na saída padrão, será fácil configurar a URL remota.
Instalação do cgit
Para usar cgit, cgi é necessário, então instale os pacotes necessários. Presume-se que o Nginx já esteja instalado.
pkg install cgit fcgiwrap
É necessário permitir que o Nginx acesse via socket UNIX com as permissões de usuário e grupo www:www, e habilitar o serviço.
sysrc fcgiwrap_enable=YES
sysrc fcgiwrap_user=www
sysrc fcgiwrap_group=www
sysrc fcgiwrap_socket_owner=www
sysrc fcgiwrap_socket_group=www
service fcgiwrap start
Configuração do cgit
É necessário configurar o cgit.
Desta vez, fiz algumas personalizações em relação ao padrão, resultando no seguinte:
$ cat /usr/local/etc/cgitrc
root-title=Git
root-desc=public repositories
virtual-root=/
scan-path=/home/git/repos/
css=/style.css
logo=/top.png
head-include=/usr/local/www/cgit/head.html
readme=:README.md
readme=:README.rst
enable-commit-graph=1
Os arquivos a serem distribuídos já haviam sido criados em /usr/local/www/cgit/ no momento da instalação do pacote.
Configuração do Nginx
Agora, é a vez do Nginx.
server {
if ($host = git.soulminingrig.com) {
return 301 https://$host$request_uri;
} # managed by Certbot
server_name git.soulminingrig.com;
listen 80;
}
server {
server_name git.soulminingrig.com;
listen 443 ssl;
root /usr/local/www/cgit;
location / {
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME /usr/local/www/cgit/cgit.cgi;
fastcgi_param PATH_INFO $uri;
fastcgi_param QUERY_STRING $query_string;
fastcgi_pass unix:/var/run/fcgiwrap/fcgiwrap.sock;
}
location ~* \.(css|png|ico)$ {
root /usr/local/www/cgit;
}
ssl_certificate /usr/local/etc/letsencrypt/live/git.soulminingrig.com/fullchain.pem; # managed by Certbot
ssl_certificate_key /usr/local/etc/letsencrypt/live/git.soulminingrig.com/privkey.pem; # managed by Certbot
}
Após criar o arquivo conf acima, verifique a sintaxe com nginx -t e reinicie.
nginx -t
service nginx restart
A propósito, eu já havia obtido o certificado com certbot.
certbot --nginx -d git.soulminingrig.com
Com isso, o acesso agora é possível.
Conclusão
Com isso, consegui construir um frontend web para Git de forma muito leve.
Como pode ser construído com recursos muito limitados, estou bastante satisfeito.
Até a próxima. Obrigado.