Redmine es una aplicación de gestión de proyectos y seguimiento de incidencias escrita en Ruby on Rails, con diagramas de Gantt, wiki y control de tiempos por proyecto. En este tutorial instalarás Redmine 6.1 en Ubuntu 24.04 usando el Ruby de la distribución y MySQL 8, lo ejecutarás con Puma como servicio de systemd bajo un usuario propio y lo publicarás detrás de Nginx con HTTPS.
Requisitos previos
Para seguir esta guía necesitas:
- Un servidor con Ubuntu 24.04 LTS, por ejemplo un VPS de CubePath, con al menos 2 GB de RAM y 15 GB de disco.
- Un usuario no root con privilegios
sudo. - Un dominio o subdominio (en esta guía,
redmine.example.com) con un registro DNS A que apunte a la IP del servidor. Sustituyeredmine.example.compor tu dominio en todos los pasos. - Los puertos 80 y 443 abiertos.
NotaRedmine 6.1 admite Ruby 3.2, 3.3 y 3.4. Ubuntu 24.04 incluye Ruby 3.2, así que no hace falta un gestor de versiones como RVM o rbenv. Esta guía usa Redmine 6.1.4; consulta la página de descargas de Redmine por si hay una versión más reciente de la rama 6.1.
Paso 1: Instalar Ruby, MySQL y las dependencias de compilación
Algunas gemas de Redmine, como mysql2, compilan extensiones nativas, por lo que necesitas las herramientas de compilación y las cabeceras de las bibliotecas:
sudo apt update
sudo apt install -y ruby-full build-essential libmysqlclient-dev libyaml-dev zlib1g-dev imagemagick git mysql-server nginx
Instala Bundler, el gestor de dependencias de Ruby, desde RubyGems:
sudo gem install bundler
Comprueba las versiones:
ruby --version
bundle --version
ruby 3.2.3 (2024-01-18 revision 52bb2ac0a6) [x86_64-linux-gnu]
Bundler version 2.7.2
Paso 2: Crear la base de datos
Ejecuta el script de seguridad de MySQL para eliminar usuarios anónimos y la base de datos de pruebas:
sudo mysql_secure_installation
En Ubuntu, root se autentica por socket, así que puedes entrar en la consola sin contraseña con sudo:
sudo mysql
Crea la base de datos y un usuario exclusivo. Sustituye your_strong_password por una contraseña robusta:
CREATE DATABASE redmine CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci;
CREATE USER 'redmine'@'localhost' IDENTIFIED BY 'your_strong_password';
GRANT ALL PRIVILEGES ON redmine.* TO 'redmine'@'localhost';
FLUSH PRIVILEGES;
EXIT;
Comprueba que el usuario puede conectarse:
mysql -u redmine -p -e "SHOW DATABASES;"
+--------------------+
| Database |
+--------------------+
| information_schema |
| performance_schema |
| redmine |
+--------------------+
Paso 3: Crear el usuario del sistema y descargar Redmine
Redmine se ejecutará con un usuario sin privilegios llamado redmine, cuyo directorio personal será la instalación:
sudo useradd --system --create-home --home-dir /opt/redmine --shell /bin/bash redmine
Cambia a ese usuario. Todos los comandos hasta el paso 5 se ejecutan como redmine:
sudo -iu redmine
Descarga Redmine y extráelo en /opt/redmine:
wget https://www.redmine.org/releases/redmine-6.1.4.tar.gz
tar -xzf redmine-6.1.4.tar.gz --strip-components=1
rm redmine-6.1.4.tar.gz
ls
CONTRIBUTING.md Gemfile LICENSE.txt README.rdoc Rakefile app bin config config.ru db doc extra files lib log package.json plugins public test themes tmp vendor yarn.lock
Paso 4: Configurar la conexión a la base de datos
Copia la plantilla de configuración:
cp config/database.yml.example config/database.yml
nano config/database.yml
Sustituye el bloque production por el siguiente, con la contraseña del paso 2. La variable transaction_isolation es la recomendada por Redmine para MySQL y evita problemas de concurrencia:
production:
adapter: mysql2
database: redmine
host: localhost
username: redmine
password: "your_strong_password"
encoding: utf8mb4
variables:
transaction_isolation: "READ-COMMITTED"
Protege el archivo, que contiene la contraseña:
chmod 600 config/database.yml
Paso 5: Instalar las gemas e inicializar Redmine
Redmine no incluye un servidor de aplicaciones para producción. El mecanismo oficial para añadir gemas propias es el archivo Gemfile.local; añade Puma en él:
echo "gem 'puma'" > Gemfile.local
Configura Bundler para instalar las gemas dentro del proyecto (en vendor/bundle, sin necesidad de root) y sin los grupos de desarrollo y pruebas:
bundle config set --local path 'vendor/bundle'
bundle config set --local without 'development test'
bundle install
La instalación tarda unos minutos. Al final verás:
Bundle complete! ...
Gems in the groups 'development' and 'test' were not installed.
Bundled gems are installed into `./vendor/bundle`
Es posible que Bundler avise de que puma aparece más de una vez en el Gemfile; es esperado y no impide la instalación.
Genera la clave secreta de sesiones, crea las tablas y carga los datos por defecto (roles, tipos de incidencia, estados) en español:
bundle exec rake generate_secret_token
RAILS_ENV=production bundle exec rake db:migrate
RAILS_ENV=production REDMINE_LANG=es bundle exec rake redmine:load_default_data
Default configuration data loaded.
Crea los directorios de trabajo que Redmine necesita y vuelve a tu usuario:
mkdir -p tmp/pdf public/assets
exit
Paso 6: Ejecutar Redmine con systemd
Crea una unidad de systemd para que Puma arranque con el sistema y se reinicie si falla:
sudo nano /etc/systemd/system/redmine.service
[Unit]
Description=Redmine (Puma)
After=network.target mysql.service
Requires=mysql.service
[Service]
Type=simple
User=redmine
Group=redmine
WorkingDirectory=/opt/redmine
Environment=RAILS_ENV=production
ExecStart=/usr/local/bin/bundle exec rails server -e production -b 127.0.0.1 -p 3000
Restart=on-failure
RestartSec=5
[Install]
WantedBy=multi-user.target
Puma escucha solo en 127.0.0.1:3000; el acceso desde fuera pasará por Nginx. Activa e inicia el servicio:
sudo systemctl daemon-reload
sudo systemctl enable --now redmine
sudo systemctl status redmine
● redmine.service - Redmine (Puma)
Loaded: loaded (/etc/systemd/system/redmine.service; enabled; preset: enabled)
Active: active (running) since Fri 2026-09-25 10:20:14 UTC; 6s ago
El primer arranque compila los assets y puede tardar unos segundos. Comprueba que responde en local:
curl -sI http://127.0.0.1:3000/login | head -n 1
HTTP/1.1 200 OK
Si no responde, revisa el registro con sudo journalctl -u redmine -n 50.
Paso 7: Configurar Nginx como proxy inverso con HTTPS
Crea el bloque de servidor:
sudo nano /etc/nginx/sites-available/redmine
server {
listen 80;
listen [::]:80;
server_name redmine.example.com;
client_max_body_size 20M;
location / {
proxy_pass http://127.0.0.1:3000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
client_max_body_size debe coincidir con el tamaño máximo de adjunto que configures en Redmine. Activa el sitio, desactiva el de por defecto y recarga Nginx:
sudo ln -s /etc/nginx/sites-available/redmine /etc/nginx/sites-enabled/
sudo rm /etc/nginx/sites-enabled/default
sudo nginx -t
sudo systemctl reload nginx
Si usas UFW, abre HTTP y HTTPS:
sudo ufw allow 'Nginx Full'
Solicita el certificado de Let's Encrypt. Certbot añade el bloque HTTPS y la redirección desde HTTP:
sudo apt install -y certbot python3-certbot-nginx
sudo certbot --nginx -d redmine.example.com
Comprueba que la renovación automática funciona:
sudo certbot renew --dry-run
Paso 8: Primer acceso y ajustes básicos
Abre https://redmine.example.com e inicia sesión con el usuario admin y la contraseña admin. Redmine te obliga a cambiarla en el primer acceso; elige una contraseña robusta.
Después ve a Administración > Configuración > General y ajusta:
- Nombre y ruta del servidor:
redmine.example.com. - Protocolo:
HTTPS.
Estos valores se usan para generar los enlaces de los correos. En Administración > Información puedes comprobar que el directorio de archivos, tmp y log tienen permisos de escritura y ver la versión de Redmine, Ruby y la base de datos.
Paso 9: Configurar el envío de correo
Redmine envía notificaciones de incidencias por correo. La configuración SMTP va en config/configuration.yml, que no existe por defecto (configuration.yml.example solo sirve de referencia). Créalo como usuario redmine:
sudo -u redmine nano /opt/redmine/config/configuration.yml
Pega un bloque production con los datos de tu proveedor:
production:
email_delivery:
delivery_method: :smtp
smtp_settings:
address: "smtp.your_provider.com"
port: 587
domain: "example.com"
authentication: :login
user_name: "your_smtp_user"
password: "your_smtp_password"
enable_starttls_auto: true
Protege el archivo y reinicia Redmine:
sudo chmod 600 /opt/redmine/config/configuration.yml
sudo systemctl restart redmine
En Administración > Configuración > Notificaciones por correo define el remitente y pulsa Enviar un correo de prueba para comprobar que llega.
Paso 10: Instalar plugins
Los plugins se copian en /opt/redmine/plugins/<nombre>, con el nombre de directorio que indique su documentación. Comprueba siempre que el plugin declara compatibilidad con Redmine 6.1. El procedimiento general, como usuario redmine:
sudo -iu redmine
git clone https://github.com/your_org/your_plugin.git plugins/your_plugin
bundle install
RAILS_ENV=production bundle exec rake redmine:plugins:migrate
exit
Reinicia el servicio para cargarlo:
sudo systemctl restart redmine
El plugin aparecerá en Administración > Plugins.
Paso 11: Programar copias de seguridad
Una copia de Redmine consiste en la base de datos y el directorio files, donde se guardan los adjuntos. Crea un script:
sudo nano /usr/local/sbin/redmine-backup
#!/usr/bin/env bash
set -euo pipefail
backup_dir="/var/backups/redmine"
stamp="$(date +%Y%m%d-%H%M%S)"
mkdir -p "$backup_dir"
# root se autentica por socket, sin contraseña en el script
mysqldump --single-transaction --default-character-set=utf8mb4 redmine \
| gzip > "$backup_dir/redmine-db-$stamp.sql.gz"
tar -czf "$backup_dir/redmine-files-$stamp.tar.gz" -C /opt/redmine files config/database.yml config/configuration.yml
# Conservar 14 días
find "$backup_dir" -type f -name 'redmine-*' -mtime +14 -delete
Hazlo ejecutable, pruébalo y prográmalo cada noche:
sudo chmod 750 /usr/local/sbin/redmine-backup
sudo /usr/local/sbin/redmine-backup
sudo ls -lh /var/backups/redmine
echo '30 2 * * * root /usr/local/sbin/redmine-backup' | sudo tee /etc/cron.d/redmine-backup
-rw-r--r-- 1 root root 412K Sep 25 10:40 redmine-db-20260925-104012.sql.gz
-rw-r--r-- 1 root root 2.1M Sep 25 10:40 redmine-files-20260925-104012.tar.gz
Copia /var/backups/redmine a otro servidor con regularidad.
Solución de problemas
bundle install falla al compilar mysql2 o psych. Faltan cabeceras de desarrollo. Asegúrate de tener instalados libmysqlclient-dev y libyaml-dev y repite bundle install.
Nginx devuelve 502 Bad Gateway. Puma no está escuchando. Comprueba el servicio con sudo systemctl status redmine y el registro con sudo journalctl -u redmine -n 50; un error habitual es una contraseña incorrecta en config/database.yml.
Los enlaces de los correos apuntan a http:// o a localhost. Revisa el nombre del servidor y el protocolo en Administración > Configuración > General.
Conclusión
Tienes Redmine 6.1 funcionando en Ubuntu 24.04 con MySQL 8, Puma gestionado por systemd y Nginx con HTTPS delante, con correo y copias de seguridad configurados. Como siguientes pasos, crea tus proyectos y define los roles y flujos de trabajo en Administración > Roles y permisos y Flujo de trabajo, y valora activar la API REST para integrar Redmine con otras herramientas. Para actualizar a una nueva versión, sigue la guía oficial de actualización de Redmine: descarga la nueva versión, conserva config/database.yml, config/configuration.yml y files, y ejecuta de nuevo bundle install y rake db:migrate.
