Instalar Redmine en Debian

Mascote do LinuxPro movendo um cartão entre colunas no quadro de tarefas do Redmine, com a espiral do Debian ao lado

Nota (2026): Texto original de abril de 2017, con Debian 8.7, Redmine 3.3.2 y scripts en gist. Todo esto está obsoleto. A continuación, el camino actual: Redmine 7.0 (agosto de 2026) en Debian 13, con PostgreSQL, Puma y nginx. La entrada de 2017 se conserva al final como registro.

Redmine es un gestor de proyectos y rastreador de errores en Ruby on Rails, libre, con Gantt, calendario, wiki, foro, control de tiempo e integración con repositorios (Git, Subversion, Mercurial y otros). Existe desde 2006, nunca se convirtió en SaaS y sigue siendo la elección correcta cuando quieres los datos del proyecto dentro de tu infraestructura, sin suscripción por usuario.

Qué versión instalar

El proyecto lanza cada seis meses y mantiene tres líneas al mismo tiempo. En septiembre de 2026:

Versión Situación Rails Ruby soportado
7.0.x Estable actual: recibe funcionalidades, correcciones y seguridad 8.1 3.2, 3.3, 3.4 y 4.0
6.1.x Estable: solo correcciones y seguridad 7.2 3.2, 3.3, 3.4
6.0.x Legado: solo seguridad importante 7.2 3.1, 3.2, 3.3
5.x y anteriores Sin soporte — —

Instalación nueva: 7.0.x. Un detalle del upstream que ahorra dolores de cabeza: Ruby 4.0.0 a 4.0.3 tiene una regresión que hace que el renderizado del wiki sea muy lento, corregida en 4.0.4. Si usas Ruby 4, usa 4.0.4 o más nuevo, o quédate con 3.3/3.4, que es lo que ofrecen las distribuciones hoy en día.

¿Paquete de la distribución o instalación desde el tarball?

Debian empaqueta Redmine (apt install redmine-pgsql) y funciona, pero la versión del repositorio suele ir bastante por detrás de la actual, y los plugins y temas esperan el árbol de archivos estándar del proyecto. Para un servidor que vas a mantener durante años, el tarball oficial ofrece más control. Ese es el camino que se describe a continuación.

Dependencias

sudo apt update
sudo apt install -y ruby ruby-dev build-essential 
  libpq-dev zlib1g-dev libssl-dev libyaml-dev 
  imagemagick libmagickwand-dev ghostscript 
  git subversion curl postgresql

# confira a versão do Ruby: o Redmine 7.0 aceita de 3.2 a 4.0
ruby -v

Los opcionales merecen la pena: ImageMagick habilita miniaturas y la exportación del Gantt a PNG, Ghostscript genera la miniatura de un PDF adjunto, y el Pandoc (3.8.3 o más nuevo) habilita la vista previa de .docx, .xlsx, .pptx e .odt en Redmine 7.

Base de datos

PostgreSQL 14 o más nuevo es la recomendación del proyecto:

sudo -u postgres psql -c "CREATE ROLE redmine LOGIN ENCRYPTED PASSWORD 'troque-esta-senha' NOINHERIT VALID UNTIL 'infinity';"
sudo -u postgres psql -c "CREATE DATABASE redmine WITH ENCODING='UTF8' OWNER=redmine;"

Descargando y configurando Redmine

sudo adduser --system --group --disabled-password --home /opt/redmine redmine

cd /tmp
VER=7.0.1
curl -fLO https://www.redmine.org/releases/redmine-${VER}.tar.gz
# confira o SHA-256 publicado na página de download antes de extrair
sha256sum redmine-${VER}.tar.gz

sudo tar xzf redmine-${VER}.tar.gz --strip-components=1 -C /opt/redmine
sudo chown -R redmine:redmine /opt/redmine

Cree /opt/redmine/config/database.yml:

production:
  adapter: postgresql
  database: redmine
  host: localhost
  username: redmine
  password: "troque-esta-senha"
  encoding: utf8

Gemas, clave secreta y migración

cd /opt/redmine

sudo -u redmine bundle config set --local without 'development test'
sudo -u redmine bundle config set --local path 'vendor/bundle'
sudo -u redmine bundle install

sudo -u redmine bundle exec rake generate_secret_token
sudo -u redmine RAILS_ENV=production bundle exec rake db:migrate
sudo -u redmine RAILS_ENV=production REDMINE_LANG=pt-BR bundle exec rake redmine:load_default_data

O REDMINE_LANG=pt-BR carga trackers, roles, prioridades y estados ya en español — si lo dejas en blanco, lo pregunta interactivamente.

Permisos de los directorios en los que Redmine escribe en tiempo de ejecución:

sudo mkdir -p /opt/redmine/tmp/pdf /opt/redmine/public/plugin_assets
sudo chown -R redmine:redmine /opt/redmine/files /opt/redmine/log /opt/redmine/tmp /opt/redmine/public/plugin_assets
sudo chmod -R 755 /opt/redmine/files /opt/redmine/log /opt/redmine/tmp /opt/redmine/public/plugin_assets

Prueba antes de convertirlo en servicio:

sudo -u redmine RAILS_ENV=production bundle exec rails server -b 127.0.0.1 -p 3000

Abre http://127.0.0.1:3000 por un túnel SSH. El inicio de sesión inicial es admin / admin — cambia la contraseña en la primera entrada, antes de publicar el servicio.

Puma como servicio en systemd

Cree /opt/redmine/config/puma.rb:

directory "/opt/redmine"
environment "production"

bind "unix:///opt/redmine/tmp/puma.sock"
pidfile "/opt/redmine/tmp/puma.pid"
state_path "/opt/redmine/tmp/puma.state"

workers 2
threads 2, 8
preload_app!

Y /etc/systemd/system/redmine.service:

[Unit]
Description=Redmine (Puma)
After=network-online.target postgresql.service
Wants=network-online.target

[Service]
Type=simple
User=redmine
Group=redmine
WorkingDirectory=/opt/redmine
Environment=RAILS_ENV=production
ExecStart=/usr/bin/bundle exec puma -C /opt/redmine/config/puma.rb
Restart=always
RestartSec=5
TimeoutStartSec=120

NoNewPrivileges=true
PrivateTmp=false
ProtectSystem=full

[Install]
WantedBy=multi-user.target

Atención al PrivateTmp=false: el socket de Puma se encuentra en /opt/redmine/tmp, y el nginx debe poder verlo.

sudo systemctl daemon-reload
sudo systemctl enable --now redmine
journalctl -u redmine -f

Nginx delante, con TLS

upstream redmine {
    server unix:///opt/redmine/tmp/puma.sock;
}

server {
    listen 443 ssl;
    http2 on;
    server_name projetos.exemplo.com.br;

    ssl_certificate     /etc/letsencrypt/live/projetos.exemplo.com.br/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/projetos.exemplo.com.br/privkey.pem;

    root /opt/redmine/public;
    client_max_body_size 100m;

    # arquivos estáticos direto pelo nginx
    location ~ ^/(assets|plugin_assets)/ {
        expires 1y;
        add_header Cache-Control public;
    }

    location / {
        try_files $uri @app;
    }

    location @app {
        proxy_pass http://redmine;
        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;
    }
}
sudo usermod -aG redmine www-data     # nginx precisa ler o socket
sudo certbot --nginx -d projetos.exemplo.com.br
sudo systemctl reload nginx

El camino corto: Docker

Si solo quieres tener Redmine en marcha sin montar la pila Ruby a mano:

services:
  db:
    image: postgres:17
    restart: always
    environment:
      POSTGRES_DB: redmine
      POSTGRES_USER: redmine
      POSTGRES_PASSWORD: troque-esta-senha
    volumes:
      - ./pgdata:/var/lib/postgresql/data

  redmine:
    image: redmine:6
    restart: always
    depends_on: [db]
    ports:
      - "127.0.0.1:3000:3000"
    environment:
      REDMINE_DB_POSTGRES: db
      REDMINE_DB_DATABASE: redmine
      REDMINE_DB_USERNAME: redmine
      REDMINE_DB_PASSWORD: troque-esta-senha
      REDMINE_SECRET_KEY_BASE: gere-uma-chave-longa-e-aleatoria
    volumes:
      - ./files:/usr/src/redmine/files
      - ./plugins:/usr/src/redmine/plugins
docker compose up -d

La imagen oficial en Docker Hub suele acompañar la línea estable anterior a la más reciente: comprueba la etiqueta disponible antes de fijar la versión, y sigue poniendo nginx delante para el TLS.

Backup

Tres cosas, y ninguna es opcional:

# 1. banco
sudo -u postgres pg_dump -Fc redmine > /var/backups/redmine-$(date +%F).dump

# 2. anexos enviados pelos usuários
sudo tar czf /var/backups/redmine-files-$(date +%F).tar.gz -C /opt/redmine files

# 3. configuração
sudo tar czf /var/backups/redmine-conf-$(date +%F).tar.gz -C /opt/redmine config

Restaurar solo la base de datos y olvidar el files/ es el error clásico: Redmine arranca bien y cada adjunto acaba siendo un enlace roto.

Actualizando

sudo systemctl stop redmine
# backup dos três itens acima ANTES de qualquer coisa

# extraia a nova versão por cima, preservando config/, files/ e plugins/
cd /opt/redmine
sudo -u redmine bundle install
sudo -u redmine RAILS_ENV=production bundle exec rake db:migrate
sudo -u redmine RAILS_ENV=production bundle exec rake tmp:cache:clear

sudo systemctl start redmine

Los plugins son la causa número uno de actualizaciones atascadas. Desactiva los que no sean compatibles con la nueva versión antes de ejecutar la migración y lee la guía oficial RedmineUpgrade cuando el salto sea de una línea mayor.


El post original (abril de 2017)

Conservado como registro. Los siguientes scripts instalaban Redmine 3.3.2 en Debian 8.7 y no deben usarse hoy:

## Redmine 3.3.2 integrado ao ISPConfig3 (Debian 8)
cd /tmp/
wget https://gist.githubusercontent.com/jniltinho/66c64a33d8b0a515c95ea9750f8f69d5/raw/5318d664f213155c7e5a5c5f55e4ef2e078a082c/install_redmine.sh
chmod +x install_redmine.sh
./install_redmine.sh

## Redmine 3.3.2 com nginx, em Debian 8.7 limpo
cd /tmp/
wget https://gist.githubusercontent.com/jniltinho/cb0743ed1ddc1544f644c223d1a0578e/raw/1ccfaba34095920d939b1db2461c52bddbab8ef3/install_redmine_nginx.sh
chmod +x install_redmine_nginx.sh
./install_redmine_nginx.sh

Las entradas citadas en la versión original siguen en línea: ISPConfig3 en Debian y la Serie Servidores Linux.

Enlaces