Cómo instalar Gitea con Nginx y Let’s Encrypt SSL gratuito en Ubuntu 20.04

Gitea es un sistema de control de versiones de código abierto y autoalojado, escrito en Go. Es sencillo, ligero y puede instalarse en sistemas poco potentes. Es un fork de Gogs y una alternativa a GitHub y GitLab. Viene con un montón de características, incluyendo, editor de archivos del repositorio, seguimiento de problemas del proyecto, gestión de usuarios, notificaciones, wiki incorporado, y mucho más. Se puede instalar en todos los sistemas operativos modernos, incluyendo Linux, macOS, Windows, ARM y arquitecturas PowerPC.

En este tutorial, te mostraremos cómo instalar el servicio Gitea Git con Nginx y Let’s Encrypt SSL en Ubuntu 20.04.

Requisitos previos

  • Un servidor con Ubuntu 20.04.
  • Un nombre de dominio válido que apunte a tu servidor.
  • Una contraseña de root configurada en tu servidor.

Instalar Git

En primer lugar, tendrás que instalar el paquete Git en tu servidor. Puedes instalarlo ejecutando el siguiente comando:

apt-get install git -y

Una vez instalado el paquete Git, puedes pasar al siguiente paso.

Instalar y configurar MariaDB

Por defecto, MariaDB no está protegida. Por lo tanto, tendrás que asegurarlo primero. Puedes asegurarlo ejecutando el script mysql_secure_installation:

mysql_secure_installation

Este script establecerá la contraseña de root, eliminará los usuarios anónimos, no permitirá el inicio de sesión de root de forma remota y eliminará la base de datos de prueba, como se muestra a continuación:

Enter current password for root (enter for none):
Set root password? [Y/n]: Y
Remove anonymous users? [Y/n]: Y
Disallow root login remotely? [Y/n]: Y
Remove test database and access to it? [Y/n]:  Y
Reload privilege tables now? [Y/n]:  Y

Una vez que MariaDB esté asegurada, entra en el shell de MariaDB con el siguiente comando:

mysql -u root -p

Introduce tu contraseña de root cuando se te pida. A continuación, cambia la opción GLOBAL innodeb_file_per_table a On:

MariaDB [(none)]>SET GLOBAL innodb_file_per_table = ON;

A continuación, crea una base de datos y un usuario para Gitea con el siguiente comando:

MariaDB [(none)]>CREATE DATABASE giteadb;
MariaDB [(none)]>CREATE USER 'gitea'@'localhost' IDENTIFIED BY 'password';

A continuación, concede todos los privilegios a la base de datos giteadb:

MariaDB [(none)]>GRANT ALL ON giteadb.* TO 'gitea'@'localhost' IDENTIFIED BY 'password' WITH GRANT OPTION;

A continuación, actualiza el conjunto de caracteres de la base de datos con el siguiente comando:

MariaDB [(none)]>ALTER DATABASE giteadb CHARACTER SET = utf8mb4 COLLATE utf8mb4_unicode_ci;

Por último, vacía los privilegios y sal del shell de MariaDB con el siguiente comando:

MariaDB [(none)]>FLUSH PRIVILEGES;
MariaDB [(none)]>EXIT;

A continuación, tendrás que editar el archivo de configuración por defecto de MariaDB y añadir los parámetros de innodb:

nano /etc/mysql/mariadb.conf.d/50-server.cnf

Añade las siguientes líneas dentro de la sección [mysqld]:

innodb_file_format = Barracuda
innodb_large_prefix = 1
innodb_default_row_format = dynamic

Guarda y cierra el archivo. A continuación, reinicia el servicio de MariaDB para aplicar los cambios:

systemctl restart mariadb

En este punto, tu base de datos MariaDB está configurada. Ahora puedes pasar al siguiente paso.

Instalar y configurar Gitea

En primer lugar, tendrás que descargar la última versión del binario de Gitea del repositorio Git. Puedes descargarlo con el siguiente comando:

wget https://dl.gitea.io/gitea/1.12.1/gitea-1.12.1-linux-amd64

A continuación, copia el archivo descargado en el directorio /usr/bin/ y dale permisos de ejecución:

cp gitea-1.12.1-linux-amd64 /usr/bin/gitea
chmod 755 /usr/bin/gitea

A continuación, crea un usuario del sistema para Gitea con el siguiente comando:

adduser --system --shell /bin/bash --group --disabled-password --home /home/git git

A continuación, crea una estructura de directorios para Gitea con el siguiente comando:

mkdir -p /etc/gitea /var/lib/gitea/{custom,data,indexers,public,log}
chown git:git /etc/gitea /var/lib/gitea/{custom,data,indexers,public,log}
chmod 750 /var/lib/gitea/{data,indexers,log}
chmod 770 /etc/gitea

Una vez que hayas terminado, puedes pasar al siguiente paso.

Crear el archivo de servicio Systemd de Gitea

A continuación, tendrás que crear un archivo de servicio systemd para gestionar el servicio Gitea. Puedes crearlo con el siguiente comando:

nano /etc/systemd/system/gitea.service

Añade las siguientes líneas:

[Unit]
Description=Gitea
After=syslog.target
After=network.target
After=mysql.service

[Service]
RestartSec=2s
Type=simple
User=git
Group=git
WorkingDirectory=/var/lib/gitea/
ExecStart=/usr/bin/gitea web -c /etc/gitea/app.ini
Restart=always
Environment=USER=git HOME=/home/git GITEA_WORK_DIR=/var/lib/gitea

[Install]
WantedBy=multi-user.target

Guarda y cierra el archivo. A continuación, recarga el demonio systemd e inicia el servicio Gitea con el siguiente comando

systemctl daemon-reload
systemctl start gitea

Ahora puedes comprobar el estado del servicio Gitea con el siguiente comando:

systemctl status gitea

Deberías ver la siguiente salida:

? gitea.service - Gitea
     Loaded: loaded (/etc/systemd/system/gitea.service; disabled; vendor preset: enabled)
     Active: active (running) since Thu 2020-06-25 08:23:01 UTC; 6s ago
   Main PID: 24046 (gitea)
      Tasks: 9 (limit: 2353)
     Memory: 134.3M
     CGroup: /system.slice/gitea.service
             ??24046 /usr/bin/gitea web -c /etc/gitea/app.ini

Jun 25 08:23:02 ubuntu20 gitea[24046]: 2020/06/25 08:23:02 routers/init.go:127:GlobalInit() [I] Delete all repository archives
Jun 25 08:23:02 ubuntu20 gitea[24046]: 2020/06/25 08:23:02 ...dules/setting/log.go:233:newLogService() [I] Gitea v1.12.1 built with GNU Make 4>
Jun 25 08:23:02 ubuntu20 gitea[24046]: 2020/06/25 08:23:02 ...dules/setting/log.go:279:newLogService() [I] Gitea Log Mode: Console(Console:inf>
Jun 25 08:23:02 ubuntu20 gitea[24046]: 2020/06/25 08:23:02 ...les/setting/cache.go:70:newCacheService() [I] Cache Service Enabled
Jun 25 08:23:02 ubuntu20 gitea[24046]: 2020/06/25 08:23:02 ...les/setting/cache.go:81:newCacheService() [I] Last Commit Cache Service Enabled
Jun 25 08:23:02 ubuntu20 gitea[24046]: 2020/06/25 08:23:02 ...s/setting/session.go:63:newSessionService() [I] Session Service Enabled
Jun 25 08:23:02 ubuntu20 gitea[24046]: 2020/06/25 08:23:02 routers/init.go:165:GlobalInit() [I] SQLite3 Supported
Jun 25 08:23:02 ubuntu20 gitea[24046]: 2020/06/25 08:23:02 routers/init.go:51:checkRunMode() [I] Run Mode: Development
Jun 25 08:23:03 ubuntu20 gitea[24046]: 2020/06/25 08:23:03 cmd/web.go:161:runWeb() [I] Listen: http://0.0.0.0:3000
Jun 25 08:23:03 ubuntu20 gitea[24046]: 2020/06/25 08:23:03 ...s/graceful/server.go:55:NewServer() [I] Starting new server: tcp:0.0.0.0:3000 on>
lines 1-19/19 (END)

A continuación, activa el servicio Gitea para que se inicie al reiniciar el sistema con el siguiente comando:

systemctl enable gitea

En este punto, Gitea está iniciado y escuchando en el puerto 3000. Ahora puedes pasar al siguiente paso.

Configurar Nginx para Gitea

Por defecto, Gitea escucha en el puerto 3000. Por tanto, tendrás que configurar Nginx como proxy inverso para acceder a Gitea sin especificar el puerto.

Primero, instala el servidor web Nginx ejecutando el siguiente comando:

apt-get install nginx -y

Una vez instalado, crea un nuevo archivo de configuración de host virtual Nginx para Gitea:

nano /etc/nginx/sites-available/gitea

Añade las siguientes líneas:

upstream gitea {
    server 127.0.0.1:3000;
}

server {
    listen 80;
    server_name gitea.linuxbuz.com;
    root /var/lib/gitea/public;
    access_log off;
    error_log off;

    location / {
      try_files maintain.html $uri $uri/index.html @node;
    }

    location @node {
      client_max_body_size 0;
      proxy_pass http://localhost:3000;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header Host $http_host;
      proxy_set_header X-Forwarded-Proto $scheme;
      proxy_max_temp_file_size 0;
      proxy_redirect off;
      proxy_read_timeout 120;
    }
}

Guarda y cierra el archivo. A continuación, habilita el archivo de configuración del host virtual Nginx con el siguiente comando:

ln -s /etc/nginx/sites-available/gitea /etc/nginx/sites-enabled/

Por último, reinicia el servicio Nginx con el siguiente comando:

systemctl restart nginx

También puedes comprobar el estado del servicio Nginx con el siguiente comando:

systemctl status nginx

Deberías obtener la siguiente salida:

? nginx.service - A high performance web server and a reverse proxy server
     Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled)
     Active: active (running) since Thu 2020-06-25 08:26:00 UTC; 1min 24s ago
       Docs: man:nginx(8)
    Process: 24866 ExecStartPre=/usr/sbin/nginx -t -q -g daemon on; master_process on; (code=exited, status=0/SUCCESS)
    Process: 24877 ExecStart=/usr/sbin/nginx -g daemon on; master_process on; (code=exited, status=0/SUCCESS)
   Main PID: 24879 (nginx)
      Tasks: 3 (limit: 2353)
     Memory: 3.6M
     CGroup: /system.slice/nginx.service
             ??24879 nginx: master process /usr/sbin/nginx -g daemon on; master_process on;
             ??24880 nginx: worker process
             ??24881 nginx: worker process

Jun 25 08:25:59 ubuntu20 systemd[1]: Starting A high performance web server and a reverse proxy server...
Jun 25 08:26:00 ubuntu20 systemd[1]: Started A high performance web server and a reverse proxy server.

En este punto, Nginx está configurado para servir a Gitea. Ahora puedes pasar al siguiente paso.

Asegurar Gitea con Let’s Encrypt SSL

En primer lugar, necesitarás instalar el cliente Certbot para instalar y gestionar el SSL de Let’s Encrypt en tu sistema. Puedes instalarlo ejecutando el siguiente comando:

apt-get install certbot python3-certbot-nginx -y

Una vez instalado el Certbot, ejecuta el siguiente comando para descargar e instalar el sitio web de Let’s Encrypt SSL para Gitea.

certbot --nginx -d gitea.linuxbuz.com

Proporciona tu dirección de correo electrónico y acepta las condiciones del servicio como se muestra a continuación:

Saving debug log to /var/log/letsencrypt/letsencrypt.log
Plugins selected: Authenticator nginx, Installer nginx
Enter email address (used for urgent renewal and security notices) (Enter 'c' to
cancel): [email protected]

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Please read the Terms of Service at
https://letsencrypt.org/documents/LE-SA-v1.2-November-15-2017.pdf. You must
agree in order to register with the ACME server at
https://acme-v02.api.letsencrypt.org/directory
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(A)gree/(C)ancel: A

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Would you be willing to share your email address with the Electronic Frontier
Foundation, a founding partner of the Let's Encrypt project and the non-profit
organization that develops Certbot? We'd like to send you email about our work
encrypting the web, EFF news, campaigns, and ways to support digital freedom.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(Y)es/(N)o: Y
Obtaining a new certificate
Performing the following challenges:
http-01 challenge for gitea.linuxbuz.com
Waiting for verification...
Cleaning up challenges
Deploying Certificate to VirtualHost /etc/nginx/sites-enabled/gitea

A continuación, elige si quieres redirigir el tráfico HTTP a HTTPS como se muestra a continuación:

Please choose whether or not to redirect HTTP traffic to HTTPS, removing HTTP access.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1: No redirect - Make no further changes to the webserver configuration.
2: Redirect - Make all requests redirect to secure HTTPS access. Choose this for
new sites, or if you're confident your site works on HTTPS. You can undo this
change by editing your web server's configuration.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Select the appropriate number [1-2] then [enter] (press 'c' to cancel): 2

Escribe 2 y pulsa Intro para instalar el certificado como se muestra a continuación:

Redirecting all traffic on port 80 to ssl in /etc/nginx/sites-enabled/gitea

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Congratulations! You have successfully enabled https://gitea.linuxbuz.com

You should test your configuration at:
https://www.ssllabs.com/ssltest/analyze.html?d=gitea.linuxbuz.com
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at:
   /etc/letsencrypt/live/gitea.linuxbuz.com/fullchain.pem
   Your key file has been saved at:
   /etc/letsencrypt/live/gitea.linuxbuz.com/privkey.pem
   Your cert will expire on 2020-09-23. To obtain a new or tweaked
   version of this certificate in the future, simply run certbot again
   with the "certonly" option. To non-interactively renew *all* of
   your certificates, run "certbot renew"
 - If you like Certbot, please consider supporting our work by:

   Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
   Donating to EFF:                    https://eff.org/donate-le

Ahora, tu sitio web de Gitea está protegido con Let’s Encrypt SSL. Ahora puedes pasar al siguiente paso.

Acceder a la interfaz web de Gitea

Ahora, abre tu navegador web y escribe la URL https://gitea.linuxbuz.com/install. Serás redirigido a la siguiente página:

Configuración de la base de datos

Ajustes generales

URL y puerto

Ajustes opcionales

Proporciona el nombre de tu base de datos Gitea, el nombre de usuario, la contraseña, la ruta del repositorio, el nombre de usuario de ejecución, el puerto de escucha, la URL de la base Gitea, la ruta del registro, el nombre de usuario y la contraseña del administrador de Gitea y haz clic en el botón Instalar Gitea. Una vez finalizada la instalación, deberías ver el panel de control de Gitea en la siguiente pantalla:

Panel de control de Gitea

Conclusión

Enhorabuena! has instalado con éxito Gitea con Nginx y Let’s Encrypt SSL en el servidor Ubuntu 20.04. Ahora puedes explorar Gitea y crear tu primer repositorio con Gitea. Para más información, visita la documentación deGitea.

Scroll al inicio