Install Redmine on 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, com Debian 8.7, Redmine 3.3.2 e scripts em gist. Tudo isso está obsoleto. Abaixo, o caminho atual: Redmine 7.0 (agosto de 2026) em Debian 13, com PostgreSQL, Puma e nginx. O post de 2017 fica preservado no fim como registro.

O Redmine é gerenciador de projetos e rastreador de bugs em Ruby on Rails, livre, com Gantt, calendário, wiki, fórum, controle de tempo e integração com repositórios (Git, Subversion, Mercurial e outros). Ele existe desde 2006, nunca virou SaaS e continua sendo a escolha certa quando você quer o dado do projeto dentro da sua infraestrutura, sem assinatura por usuário.

Qual versão instalar

O projeto lança a cada seis meses e mantém três linhas ao mesmo tempo. Em setembro de 2026:

Versão Situação Rails Ruby suportado
7.0.x Estável atual — recebe recursos, correções e segurança 8.1 3.2, 3.3, 3.4 e 4.0
6.1.x Estável — só correções e segurança 7.2 3.2, 3.3, 3.4
6.0.x Legado — só segurança importante 7.2 3.1, 3.2, 3.3
5.x e anteriores Sem suporte

Instalação nova: 7.0.x. Um detalhe do upstream que economiza dor de cabeça: o Ruby 4.0.0 a 4.0.3 tem uma regressão que deixa a renderização de wiki muito lenta, corrigida no 4.0.4. Se for de Ruby 4, use 4.0.4 ou mais novo — ou fique no 3.3/3.4, que é o que as distribuições entregam hoje.

Pacote da distro ou instalação a partir do tarball?

O Debian empacota o Redmine (apt install redmine-pgsql) e isso funciona — mas a versão do repositório costuma ficar bem atrás da atual, e plugins e temas esperam a árvore de arquivos padrão do projeto. Para servidor que você vai manter por anos, o tarball oficial dá mais controle. É esse o caminho abaixo.

Dependências

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

Os opcionais valem a pena: ImageMagick habilita miniaturas e a exportação do Gantt em PNG, Ghostscript gera miniatura de PDF anexado, e o Pandoc (3.8.3 ou mais novo) liga a pré-visualização de .docx, .xlsx, .pptx and .odt no Redmine 7.

Banco de dados

PostgreSQL 14 ou mais novo é a recomendação do projeto:

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;"

Baixando e configurando o 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

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

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

Gems, chave secreta e migração

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

The REDMINE_LANG=pt-BR carrega trackers, papéis, prioridades e status já em português — se você deixar em branco, ele pergunta interativamente.

Permissões dos diretórios que o Redmine escreve em tempo de execução:

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

Teste antes de virar serviço:

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

Open http://127.0.0.1:3000 por um túnel SSH. O login inicial é admin / admintroque a senha na primeira entrada, antes de publicar o serviço.

Puma como serviço no systemd

Create /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!

E /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

Atenção ao PrivateTmp=false: o socket do Puma fica em /opt/redmine/tmp, e o nginx precisa enxergá-lo.

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

Nginx na frente, com 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

O caminho curto: Docker

Se você só quer o Redmine no ar sem montar a pilha Ruby na mão:

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

A imagem oficial no Docker Hub costuma acompanhar a linha estável anterior à mais recente — confira a tag disponível antes de fixar a versão, e continue pondo o nginx na frente para o TLS.

Backup

Três coisas, e nenhuma é 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 só o banco e esquecer o files/ é o erro clássico: o Redmine sobe bonito e todo anexo vira link quebrado.

Atualizando

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

Plugins são a causa número um de atualização travada. Desative os que não forem compatíveis com a versão nova before de rodar a migração — e leia o RedmineUpgrade oficial quando o salto for de linha maior.


O post original (abril de 2017)

Preservado como registro. Os scripts abaixo instalavam o Redmine 3.3.2 no Debian 8.7 e não devem ser usados hoje:

## 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

Os posts citados na versão original continuam no ar: ISPConfig3 no Debian and the Série Servidores Linux.

Links