Cómo instalar el software de gestión de proyectos Redmine en Rocky Linux 8

Redmine es un software de gestión de proyectos y herramienta de seguimiento de incidencias gratuito y de código abierto. Está escrito utilizando el framework Ruby on Rails y puede integrarse con varios sistemas de control de versiones. Incluye un navegador de repositorios y un visor de diferencias. Puede utilizarse para gestionar las características de los proyectos por wikis y foros de proyectos, seguimiento del tiempo y control de acceso basado en roles. Es multiplataforma, multibase de datos y soporta 49 idiomas.

En este tutorial, aprenderás a instalar Redmine en un servidor basado en Rocky Linux 8.

Requisitos previos

  • Un servidor con Rocky Linux.

  • Un usuario no-sudo con privilegios de root.

  • Desactivar SELinux.

  • Todo actualizado.

    $ sudo dnf update
    

Paso 1 – Configurar el cortafuegos

El primer paso es configurar el cortafuegos. Rocky Linux utiliza el cortafuegos Firewalld. Comprueba el estado del cortafuegos.

$ sudo firewall-cmd --state
running

Abre el puerto 3000, que podemos utilizar para comprobar Redmine.

$ sudo firewall-cmd --permanent --add-port=3000

Permite los puertos HTTP y HTTPS.

$ sudo firewall-cmd --permanent --add-service=http
$ sudo firewall-cmd --permanent --add-service=https

Recarga el cortafuegos para activar los cambios.

$ sudo firewall-cmd --reload

Paso 2 – Instalar el servidor Apache

Utilizaremos el servidor web Apache para desplegar Redmine. Instala Apache con el siguiente comando.

$ sudo dnf install httpd

Habilita e inicia el servicio Apache.

$ sudo systemctl enable --now httpd.service

Concede a tu usuario actual el usuario apache para que tenga el acceso necesario al directorio /var/www/redmine.

$ sudo usermod -aG $USER apache

Paso 3 – Instalar y configurar el servidor MySQL

Utilizaremos la base de datos MySQL para almacenar los datos. El repositorio Appstream de Rocky Linux incluye la última versión de MySQL.

Instala MySQL.

$ sudo dnf install mysql-server

Habilita e inicia el servicio MySQL.

$ sudo systemctl enable mysqld --now

Asegura la instalación de MySQL.

$ sudo mysql_secure_installation

En el primer paso, se te preguntará si quieres configurar el Plugin de Validación de Contraseñas, que puedes utilizar para comprobar la solidez de tu contraseña de MySQL. Elige Y para proceder. Se te pedirá que elijas el nivel de validación de la contraseña en el siguiente paso. Elige 2 que es el nivel más fuerte y requerirá que tu contraseña tenga al menos ocho caracteres e incluya una mezcla de mayúsculas, minúsculas, números y caracteres especiales.

Securing the MySQL server deployment.

Connecting to MySQL using a blank password.

VALIDATE PASSWORD COMPONENT can be used to test passwords
and improve security. It checks the strength of password
and allows the users to set only those passwords which are
secure enough. Would you like to setup VALIDATE PASSWORD component?

Press y|Y for Yes, any other key for No: Y

There are three levels of password validation policy:

LOW    Length >= 8
MEDIUM Length >= 8, numeric, mixed case, and special characters
STRONG Length >= 8, numeric, mixed case, special characters and dictionary                  file

Please enter 0 = LOW, 1 = MEDIUM and 2 = STRONG: 2

En el siguiente paso se te pedirá que elijas una contraseña de root. Elige una contraseña fuerte que cumpla los requisitos del plugin de validación de contraseñas. En el siguiente paso, se te preguntará si quieres continuar con la contraseña elegida. Pulsa y para continuar.

Please set the password for root here.

New password:

Re-enter new password:

Estimated strength of the password: 100
Do you wish to continue with the password provided?(Press y|Y for Yes, any other key for No) : Y

Pulsa Y y luego ENTER para todas las siguientes indicaciones para eliminar los usuarios anónimos y la base de datos de prueba, desactivar los inicios de sesión de root y cargar las reglas recién establecidas.

...
Remove anonymous users? (Press y|Y for Yes, any other key for No) : Y
Success.
...
Disallow root login remotely? (Press y|Y for Yes, any other key for No) : Y
Success.
...
Remove test database and access to it? (Press y|Y for Yes, any other key for No) : Y
 - Dropping test database...
Success.
 - Removing privileges on test database...
Success.
Reloading the privilege tables will ensure that all changes
made so far will take effect immediately.
...
Reload privilege tables now? (Press y|Y for Yes, any other key for No) : Y
Success.
All done!

Entra en el shell de MySQL. Introduce la contraseña de root para continuar.

$ mysql -u root -p

Crea el usuario redmine. Asegúrate de que la contraseña cumple los requisitos establecidos anteriormente.

mysql> CREATE USER 'redmine'@'localhost' IDENTIFIED BY 'Your_password2';

Crea la base de datos redmine.

mysql> CREATE DATABASE redmine CHARACTER SET utf8mb4;

Concede al usuario privilegios en la base de datos redmine.

mysql> GRANT ALL PRIVILEGES ON redmine.* TO 'redmine'@'localhost';

Sal de la Shell.

mysql> exit

Paso 4 – Instalar el repositorio EPEL

Algunos de los paquetes necesarios para Redmine están disponibles en el repositorio EPEL. Ejecuta el siguiente comando para instalar el repositorio EPEL.

$ sudo dnf install epel-release

Habilita el repositorio PowerTools.

$ sudo dnf config-manager --set-enabled powertools

Paso 5 – Instalar Ruby y otros requisitos

Rocky Linux 8 viene con cuatro versiones diferentes de Ruby: 2.5, 2.6, 2.7 y 3.0.

Enumera todos los módulos de Ruby disponibles.

$ dnf module list ruby
Last metadata expiration check: 0:18:58 ago on Mon 03 Jan 2022 11:50:10 AM UTC.
Rocky Linux 8 - AppStream
Name            Stream             Profiles              Summary
ruby            2.5 [d]            common [d]            An interpreter of object-oriented scripting language
ruby            2.6                common [d]            An interpreter of object-oriented scripting language
ruby            2.7                common [d]            An interpreter of object-oriented scripting language
ruby            3.0                common [d]            An interpreter of object-oriented scripting language

Hint: [d]efault, [e]nabled, [x]disabled, [i]nstalled

La última versión de Redmine es compatible con todas las versiones excepto con la 3.0. Instalaremos Ruby 2.7 para nuestro tutorial.

Restablece las demás versiones y habilita la versión 2.7 de Ruby.

$ sudo dnf module reset ruby
$ sudo dnf module enable ruby:2.7

Instala Ruby.

$ sudo dnf install ruby ruby-devel

Verifica la instalación.

$ ruby -v
ruby 2.7.4p191 (2021-07-07 revision a21a3b7d23) [x86_64-linux]

Instala el resto de paquetes necesarios para Redmine.

$ sudo dnf install rpm-build wget libxml2-devel make automake libtool ImageMagick ImageMagick-devel mariadb-devel httpd-devel openssl-devel libcurl-devel gcc gcc-c++

Paso 6 – Instalar Redmine

Visita la página de descargas de Redmine y comprueba la última versión estable disponible. En el momento de escribir este tutorial, la última versión disponible es la 4.2.3.

Utiliza wget para descargar Redmine.

$ wget https://redmine.org/releases/redmine-4.2.3.tar.gz

Extrae y mueve los archivos al directorio /var/www/redmine.

$ tar xfz redmine-4.2.3.tar.gz
$ sudo mv redmine-4.2.3 /var/www/redmine

Desplázate al directorio /var/www/redmine.

$ cd /var/www/redmine

Crea los archivos de configuración de Redmine utilizando los archivos de ejemplo suministrados.

$ cp config/configuration.yml.example config/configuration.yml
$ cp config/database.yml.example config/database.yml
$ cp public/dispatch.fcgi.example public/dispatch.fcgi

Abre el archivo database.yml para editarlo.

$ nano config/database.yml

Busca y configura los ajustes de tu base de datos en la siguiente sección.

production:
  adapter: mysql2
  database: redmine
  host: localhost
  username: redmine
  password: "Your_password2"
  # Use "utf8" instead of "utfmb4" for MySQL prior to 5.7.7
  encoding: utf8mb4

Guarda el archivo pulsando Ctrl + X e introduciendo Y cuando se te pida.

Instala bundler para gestionar las dependencias de las gemas de rubí.

$ gem install bundler

Configura el entorno para instalar las dependencias de las gemas.

$ bundle config set --local without 'development test'

Instala las dependencias de las gemas.

$ bundle install

Si tienes algún problema con las versiones de las gemas, utiliza el siguiente comando para restaurarlas.

$ sudo gem pristine --all

Genera una clave secreta aleatoria para evitar la manipulación de las cookies para almacenar los datos de la sesión.

$ bundle exec rake generate_secret_token

Crea la estructura de la base de datos.

$ RAILS_ENV=production bundle exec rake db:migrate

Inserta los datos en la base de datos MySQL.

$ RAILS_ENV=production REDMINE_LANG=en bundle exec rake redmine:load_default_data

Crea los directorios necesarios y establece los permisos de los archivos.

$ mkdir -p tmp/pdf
$ mkdir -p public/plugin_assets
$ chown -R $USER:$USER files log tmp public/plugin_assets
$ chmod -R 755 /var/www/remine/

Ejecuta el siguiente comando para iniciar una instancia del servidor Rails.

$ bundle exec rails server webrick -e production
=> Booting WEBrick
=> Rails 5.2.6 application starting in production on http://0.0.0.0:3000
=> Run `rails server -h` for more startup options
[2022-01-03 12:58:19] INFO  WEBrick 1.6.1
[2022-01-03 12:58:19] INFO  ruby 2.7.4 (2021-07-07) [x86_64-linux]
[2022-01-03 12:58:19] INFO  WEBrick::HTTPServer#start: pid=117224 port=3000

Abre la URL http://<yourserverIP>:3000/login para obtener la pantalla de inicio de sesión de Redmine.

Pantalla de inicio de sesión de Redmine

Introduce las credenciales por defecto(admin/admin) para iniciar la sesión. Se te pedirá que cambies la contraseña.

Pantalla de caducidad de la contraseña de Redmine

A continuación, serás redirigido a la página Mi cuenta.

Redmine Mi cuenta

Redmine se ha instalado correctamente.

A continuación, pulsa CTRL+C en el terminal para detener el servidor.

Paso 7 – Instalar Phusion Passenger

Phusion Passenger es un servidor de aplicaciones ruby que nos permite servir Redmine a través de un servidor de terceros. En nuestro caso, utilizaremos Apache.

Instala Passenger.

$ gem install passenger

Instala el módulo Passenger para el servidor Apache.

$ passenger-install-apache2-module

Aparecerá un mensaje de bienvenida. Pulsa Enter para continuar.

Welcome to the Phusion Passenger Apache 2 module installer, v6.0.12.

This installer will guide you through the entire installation process. It
shouldn't take more than 3 minutes in total.

Here's what you can expect from the installation process:

 1. The Apache 2 module will be installed for you.
 2. You'll learn how to configure Apache.
 3. You'll learn how to deploy a Ruby on Rails application.

Don't worry if anything goes wrong. This installer will advise you on how to
solve any problems.

Press Enter to continue, or Ctrl-C to abort.


--------------------------------------------

A continuación, se te pedirá el idioma. Ruby está seleccionado por defecto, así que pulsa Enter para continuar.

Which languages are you interested in?

Use <space> to select.
If the menu doesn't display correctly, press '!'

 ? ?  Ruby
   ?  Python
   ?  Node.js
   ?  Meteor

--------------------------------------------

Es posible que recibas una advertencia sobre los permisos de los archivos. Si has seguido nuestro tutorial, sólo tienes que pulsar Enter para continuar.

Warning: some directories may be inaccessible by the web server!

The web server typically runs under a separate user account for security
reasons. That user must be able to access the Phusion Passenger(R) files.
However, it appears that some directories have too strict permissions. This
may prevent the web server user from accessing Phusion Passenger(R) files.

It is recommended that you relax permissions as follows:

  sudo chmod o+x "/home/navjot"

Press Ctrl-C to return to the shell. (Recommended)
After relaxing permissions, re-run this installer.
  -OR-
Press Enter to continue anyway.

Todo el proceso tardará unos 10-15 minutos en terminar. Si te aparece un error como el siguiente, lo más probable es que se deba a la escasa memoria RAM. Deberías aumentar la RAM de tu servidor o instalar espacio de intercambio.

c++: fatal error: Killed signal terminated program cc1plus
compilation terminated.
rake aborted!

Una vez finalizado el proceso, recibirás el siguiente mensaje.

--------------------------------------------
Almost there!

Please edit your Apache configuration file, and add these lines:

   LoadModule passenger_module /home/navjot/.gem/ruby/gems/passenger-6.0.12/buildout/apache2/mod_passenger.so
   <IfModule mod_passenger.c>
     PassengerRoot /home/navjot/.gem/ruby/gems/passenger-6.0.12
     PassengerDefaultRuby /usr/bin/ruby
   </IfModule>

After you restart Apache, you are ready to deploy any number of web
applications on Apache, with a minimum amount of configuration!

Press ENTER when you are done editing.

No pulses todavía la tecla Enter. Abre una nueva sesión en tu servidor como el usuario actual y realiza las siguientes configuraciones.

Configurar el servidor Apache

Crea un archivo de configuración del módulo Apache para Phusion Passenger.

$ sudo nano /etc/httpd/conf.modules.d/00-passenger.conf

Pega el código que has obtenido al final de la instalación de passenger.

 LoadModule passenger_module /home/navjot/.gem/ruby/gems/passenger-6.0.12/buildout/apache2/mod_passenger.so
   <IfModule mod_passenger.c>
     PassengerRoot /home/username/.gem/ruby/gems/passenger-6.0.12
     PassengerDefaultRuby /usr/bin/ruby
   </IfModule>

Guarda el archivo pulsando Ctrl + X e introduciendo Y cuando te lo pida.

Crea otro archivo de configuración de Apache para el sitio de Redmine.

$ sudo nano /etc/httpd/conf.d/redmine.conf

Pega en él el siguiente código.

Listen 3000
<IfModule mod_passenger.c>
  PassengerRoot /home/username/.gem/ruby/gems/passenger-6.0.12
  PassengerDefaultRuby /usr/bin/ruby
</IfModule>
<VirtualHost *:3000>
    ServerName redmine.example.com
    DocumentRoot "/var/www/redmine/public" 

    CustomLog logs/redmine_access.log combined
    ErrorLog logs/redmine_error_log
    LogLevel warn

    <Directory "/var/www/redmine/public">
        Options Indexes ExecCGI FollowSymLinks
        Require all granted
        AllowOverride all
    </Directory>
</VirtualHost>

Guarda el archivo pulsando Ctrl + X e introduciendo Y cuando se te pida.

Abre el archivo principal de configuración de Apache /etc/httpd/conf/httpd.conf para editarlo.

$ sudo nano /etc/httpd/conf/httpd.conf

Busca la variable ServerName y descoméntala eliminando la almohadilla (#) que la precede y estableciendo su valor como el siguiente.

ServerName localhost

Guarda el archivo pulsando Ctrl + X e introduciendo Y cuando se te solicite.

Verifica tu configuración de Apache.

$ httpd -t
Syntax OK

Vuelve y pulsa Enter para continuar con la instalación de Passenger. Realizará algunas comprobaciones, y deberías ver el siguiente mensaje al finalizar con éxito.

Deploying a web application

To learn how to deploy a web app on Passenger, please follow the deployment
guide:

  https://www.phusionpassenger.com/library/deploy/apache/deploy/

Enjoy Phusion Passenger, a product of Phusion® (www.phusion.nl) :-)
https://www.phusionpassenger.com

Passenger® is a registered trademark of Phusion Holding B.V.

Reinicia tu servidor Apache.

$ sudo systemctl restart httpd

Tu sitio web debería estar disponible en http://redmine.example.com:3000.

Esta no es la forma perfecta de acceder a Redmine. Todavía se sirve a través del protocolo inseguro HTTP y utiliza un número de puerto. Instalaremos Nginx para que actúe como proxy inverso y sirva a Redmine utilizando el protocolo HTTPS para mejorar esto. Antes de pasar a la instalación y configuración de Nginx, tenemos que configurar el certificado SSL.

Paso 8 – Instalar el SSL

Para instalar un certificado SSL usando Let’s Encrypt, necesitamos instalar la herramienta Certbot. Ejecuta los siguientes comandos para instalar Certbot.

$ sudo dnf install certbot

Detener el servidor Apache.

$ sudo systemctl stop httpd

Genera el certificado SSL.

$ sudo certbot certonly --standalone --agree-tos --no-eff-email --staple-ocsp --preferred-challenges http -m [email protected] -d redmine.example.com

El comando anterior descargará un certificado en el directorio /etc/letsencrypt/live/redmine.example.com de tu servidor.

Inicia el servidor Apache.

$ sudo systemctl start httpd

Genera un certificado de grupo Diffie-Hellman.

$ sudo openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048

Crea un directorio webroot de desafío para la renovación automática de Let’s Encrypt.

$ sudo mkdir -p /var/lib/letsencrypt

Crea un Cron Job para renovar el SSL. Se ejecutará cada día para comprobar el certificado y renovarlo si es necesario. Para ello, primero crea el archivo /etc/cron.daily/certbot-renew y ábrelo para editarlo.

$ sudo nano /etc/cron.daily/certbot-renew

Pega el siguiente código.

#!/bin/sh
certbot renew --cert-name redmine.example.com --webroot -w /var/lib/letsencrypt/ --post-hook "systemctl restart nginx"

Guarda el archivo pulsando Ctrl + X e introduciendo Y cuando te lo pida.

Cambia los permisos del archivo de la tarea para que sea ejecutable.

$ sudo chmod +x /etc/cron.daily/certbot-renew

Paso 9 – Instalar y configurar Nginx como proxy inverso

Rocky Linux 8 viene con cuatro versiones diferentes de Nginx: 1.14, 1.16, 1.18 y 1.20.

Enumera todos los módulos de Nginx disponibles.

$ dnf module list nginx
Last metadata expiration check: 20:23:20 ago on Mon 03 Jan 2022 12:38:07 PM UTC.
Rocky Linux 8 - AppStream
Name                      Stream                       Profiles                      Summary
nginx                     1.14 [d]                     common [d]                    nginx webserver
nginx                     1.16                         common [d]                    nginx webserver
nginx                     1.18                         common [d]                    nginx webserver
nginx                     1.20                         common [d]                    nginx webserver

Extra Packages for Enterprise Linux Modular 8 - x86_64
Name                      Stream                       Profiles                      Summary
nginx                     mainline                     common                        nginx webserver
nginx                     1.20                         common [d]                    nginx webserver

Hint: [d]efault, [e]nabled, [x]disabled, [i]nstalled

Restablece las otras versiones y activa la versión 1.20 de Nginx.

$ sudo dnf module reset nginx
$ sudo dnf module enable nginx:1.20

Instala Nginx. Desactivamos temporalmente el repositorioEpel ya que queremos coger Nginx del Appstream.

$ sudo dnf install nginx --disablerepo=epel-modular

Verifica la instalación.

$ nginx -v
nginx version: nginx/1.20.0

Para evitar cualquier conflicto con Nginx, tenemos que cambiar el puerto por defecto en el que escucha Apache.

Cambiar el puerto de escucha de Apache

Abre el archivo /etc/httpd/conf/httpd.conf para editarlo.

$ sudo nano /etc/httpd/conf/httpd.conf

Cambia el puerto de 80 a 8080 como sigue.

Listen 8080

Guarda el archivo pulsando Ctrl + X e introduciendo Y cuando te lo pida.

Reinicia Apache.

$ sudo systemctl restart httpd

Configurar Nginx

Crea y abre el archivo /etc/nginx/conf.d/redmine.conf para editarlo.

$ sudo nano /etc/nginx/conf.d/redmine.conf

Pega en él el siguiente código.

# Redirect all non-encrypted to encrypted
server {
    listen 80;
    server_name redmine.example.com;
    return 301 https://$host$request_uri;
}

server {
    listen 443 ssl http2;

    server_name redmine.example.com;

    ssl_certificate     /etc/letsencrypt/live/redmine.example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/redmine.example.com/privkey.pem;
	ssl_trusted_certificate /etc/letsencrypt/live/redmine.example.com/chain.pem;
	
	ssl_session_timeout  5m;
    ssl_session_cache shared:MozSSL:10m;
    ssl_session_tickets off;

    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_prefer_server_ciphers on;
    ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
    ssl_ecdh_curve X25519:prime256v1:secp384r1:secp521r1;
    ssl_stapling on;
    ssl_stapling_verify on;
    ssl_dhparam /etc/ssl/certs/dhparam.pem;
    resolver 8.8.8.8;

    access_log /var/log/nginx/redmine.example.com.access.log main;
    error_log  /var/log/nginx/redmine.example.com.error.log;
	
	location / {
        proxy_pass          http://localhost:3000;
        proxy_redirect      off;
        proxy_buffering     off;
        proxy_set_header    Host $host;
        proxy_set_header    X-Real-IP $remote_addr;
        proxy_set_header    X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

Guarda el archivo pulsando Ctrl + X e introduciendo Y cuando se te solicite una vez que hayas terminado.

Abre el archivo /etc/nginx/nginx.conf para editarlo.

$ sudo nano /etc/nginx/nginx.conf

Añade la siguiente línea antes de la línea include /etc/nginx/conf.d/*.conf;.

server_names_hash_bucket_size  64;

Guarda el archivo pulsando Ctrl + X e introduciendo Y cuando se te solicite.

Comprueba la sintaxis del archivo de configuración de Nginx.

$ sudo nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

Inicia el servicio Nginx para habilitar la nueva configuración.

$ sudo systemctl start nginx

Tu aplicación Redmine debería ser accesible en https://redmine.example.com.

Conclusión

Con esto concluye nuestro tutorial en el que has aprendido a instalar el Gestor de Proyectos Redmine en un servidor basado en Rocky Linux 8. También has aprendido a servir la aplicación Redmine a través de Nginx utilizando el protocolo HTTPS. Si tienes alguna pregunta, publícala en los comentarios de abajo.

También te podría gustar...