Gogs | Self-Hosted Git

Tu propio servicio de hospedaje para repositorios Git

Roberto Lodeiro

Todos los que de uno u otro modo estamos relacionados con el desarrollo de software, antes o después hemos usado algún servicio de repositorios Git en la nube. Por lo general, son gratuitos para repositorios públicos, y pagando podemos crear repositorios privados.

Gogs es un servicio de Git opensource para alojar nuestros repositorios Git en nuestro propio servidor. He probado otras alternativas similares, pero para mi, Gogs es la ganadora ya que consume poquísimos recursos y funciona perfectamente ¿que más se puede pedir? Que sea gratuito, y lo es.

Estoy seguro de que una de las razones principales por las que consume tan pocos recursos, es el hecho de estar escrito en GO. Explicaré como instalarlo en una Raspberry Pi con Raspbian, pero simplemente cambiando la versión ARM de GO por una x86, se podrá instalar en Debian y derivados.


Primeros pasos

  • Si no los tenemos, instalar git y wget:
$ sudo apt install -y git wget
  • Crear el usuario Gogs:
$ sudo adduser --disabled-login --gecos 'Gogs' git

Si ya tenemos corriendo en nuestro servidor MySQL/MariaDB y Nginx podemos saltar a la instalación de GO, si no:

  • Instalamos MariaDB y Nginx:
$ sudo apt install mariadb-server nginx
  • Para dejar lista nuestra nueva instalación de MariaDB:
$ sudo mysql_secure_installation

Iremos respondiendo a todas las preguntas, con el fin de establecer el password de nuestro usuario root para MariaDB.

1. Instalación de GO (Golang)

  • Creamos el directorio /home/git/local:
$ sudo su - git
$ mkdir $HOME/local && cd $_
  • Descargar Go y extraer el contenido:

En el momento de escribir este tutorial la última versión estable disponible en golang.org es GO 1.11.1

$ wget https://dl.google.com/go/go1.11.1.linux-armv6l.tar.gz
$ tar -C /home/git/local -xvzf go1.11.1.linux-armv6l.tar.gz
  • Establecer la variable de entorno GOPATH para especificar la ubicación de nuestro espacio de trabajo:
$ echo 'export GOROOT=$HOME/local/go' >> $HOME/.bashrc
$ echo 'export GOPATH=$HOME/go' >> $HOME/.bashrc
$ echo 'export PATH=$PATH:$GOROOT/bin:$GOPATH/bin' >> $HOME/.bashrc
$ source $HOME/.bashrc
  • Comprobar que Go está bien instalado:
$ go version
  • Si está bien instalado, se mostrará algo como lo siguiente:
go version go1.11.1 linux/arm

2. Descargar y compilar Gogs

  • Descargar Gogs:
$ go get -u github.com/gogs/gogs

Tardará unos minutos y parecerá que la consola no responde, ya que no muestra progreso.

  • Compilar Gogs:
$ cd $GOPATH/src/github.com/gogs/gogs
$ go build
  • Ejecutamos:
$ ./gogs web

Esto arrancará el servidor web integrado escuchando en el puerto 3000 Abrir localhost:3000 en el explorador. Gogs mostrará la página de instalación. Como no tenemos todavía configurada la base de datos, cerraremos el explorador y pararemos el servidor web con CTRL+C Volveremos a la página de instalación de Gogs tras configurar MariaDB y Nginx.

  • Salir del usuario git :
$ exit

3. Configuración de la base de datos

  • Entramos en MariaDB
$ sudo mysql -u root -p
  • Creamos el nuevo usuario para Gogs:
> CREATE USER 'gogs'@'localhost' IDENTIFIED BY 'password';

Sustituye password por la contraseña que decidas y guárdala, se necesitará después para configurar Gogs.

  • Crear nueva base de datos para Gogs:
> CREATE DATABASE gogs CHARACTER SET utf8 COLLATE utf8_general_ci;
  • Dar permisos al usuario gogs:
> GRANT ALL PRIVILEGES ON gogs.* TO gogs@localhost ;
  • Salir de Mariadb:
> quit

4. Configuración de Nginx

Configuraremos un Reverse Proxy en Nginx, de esta forma podremos acceder a Gogs con nuestro nombre de dominio. Si queremos establecer un subdominio del estilo gogs.tudominio.com solo tendremos que establecer location \ e indicar el server_name deseado.

  • Entrar en /etc/nginx/sites-available y añadir la configuración del Reverse Proxy:
$ cd /etc/nginx/sites-available
$ sudo nano gogs

Pegar lo siguiente modificando segun nuestra configuración:

http{
server {
listen 80;
server_name tudominio.com;

location /gogs/ {
proxy_pass http://localhost:3000/;
}
}
  • Habilitamos el nuevo sitio:
$ sudo ln -s /etc/nginx/sites-available/gogs /etc/nginx/sites-enabled/
  • Reiniciamos Nginx:
$ sudo systemctl restart nginx
  • Configuramos Gogs con la url tudominio.com/gogs/
$ sudo nano /home/git/go/src/github.com/gogits/gogs/custom/conf/app.ini

Buscar la ROOT URL y modificarla así:

[server] ROOT_URL = tudominio.com/gogs/

5. Inicio automático con systemd

  • Crear el archivo gogs.service:
$ sudo nano /etc/systemd/system/gogs.service

Pegar el siguiente contenido y guardar los cambios:

[Unit]
Description=Gogs (Go Git Service)
After=syslog.target
After=network.target
After=mariadb.service
After=nginx.service
[Service]
Type=simple
User=git
Group=git
WorkingDirectory=/home/git/go/src/github.com/gogits/gogs
ExecStart=/home/git/go/src/github.com/gogs/gogs/gogs web
Restart=always
Environment=USER=git HOME=/home/git
[Install]
WantedBy=multi-user.target
  • Habilitar Gogs, iniciar el servicio y comprobar el estado:
$ sudo systemctl enable gogs
$ sudo systemctl restart gogs
$ sudo systemctl status gogs 

Por último, entra en tudominio.com/gogs/ para iniciar la configuración de Gogs, y completar lo siguiente:

Database type = MySQL
Host = 127.0.0.1:3306
User = gogs
Password = <password para el usuario gogs>
Database Name = gogs

Espero que sea útil, ¡gracias por leerme!