{"id":139,"date":"2017-04-06T10:05:03","date_gmt":"2017-04-06T13:05:03","guid":{"rendered":"https:\/\/www.linuxpro.com.br\/2017\/04\/redmine-setup-debian\/"},"modified":"2026-09-08T10:05:34","modified_gmt":"2026-09-08T13:05:34","slug":"redmine-setup-debian","status":"publish","type":"post","link":"https:\/\/www.linuxpro.com.br\/en\/2017\/04\/redmine-setup-debian\/","title":{"rendered":"Install Redmine on Debian"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" alt=\"Mascote do LinuxPro movendo um cart\u00e3o entre colunas no quadro de tarefas do Redmine, com a espiral do Debian ao lado\" src=\"\/wp-content\/uploads\/2026\/09\/redmine-v3.webp\" width=\"1486\" height=\"856\" \/><\/p>\n<div style=\"background:#fff8e1;border-left:4px solid #8b1a1a;padding:.8em 1em;margin:1em 0\"><strong>Nota (2026):<\/strong> Texto original de abril de 2017, com Debian 8.7, Redmine 3.3.2 e scripts em gist. Tudo isso est\u00e1 obsoleto. Abaixo, o caminho atual: <strong>Redmine 7.0<\/strong> (agosto de 2026) em Debian 13, com PostgreSQL, Puma e nginx. O post de 2017 fica preservado no fim como registro.<\/div>\n<p>O Redmine \u00e9 gerenciador de projetos e rastreador de bugs em Ruby on Rails, livre, com Gantt, calend\u00e1rio, wiki, f\u00f3rum, controle de tempo e integra\u00e7\u00e3o com reposit\u00f3rios (Git, Subversion, Mercurial e outros). Ele existe desde 2006, nunca virou SaaS e continua sendo a escolha certa quando voc\u00ea quer o dado do projeto <strong>dentro da sua infraestrutura<\/strong>, sem assinatura por usu\u00e1rio.<\/p>\n<h2>Qual vers\u00e3o instalar<\/h2>\n<p>O projeto lan\u00e7a a cada seis meses e mant\u00e9m tr\u00eas linhas ao mesmo tempo. Em setembro de 2026:<\/p>\n<table>\n<thead>\n<tr>\n<th>Vers\u00e3o<\/th>\n<th>Situa\u00e7\u00e3o<\/th>\n<th>Rails<\/th>\n<th>Ruby suportado<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><strong>7.0.x<\/strong><\/td>\n<td>Est\u00e1vel atual \u2014 recebe recursos, corre\u00e7\u00f5es e seguran\u00e7a<\/td>\n<td>8.1<\/td>\n<td>3.2, 3.3, 3.4 e 4.0<\/td>\n<\/tr>\n<tr>\n<td>6.1.x<\/td>\n<td>Est\u00e1vel \u2014 s\u00f3 corre\u00e7\u00f5es e seguran\u00e7a<\/td>\n<td>7.2<\/td>\n<td>3.2, 3.3, 3.4<\/td>\n<\/tr>\n<tr>\n<td>6.0.x<\/td>\n<td>Legado \u2014 s\u00f3 seguran\u00e7a importante<\/td>\n<td>7.2<\/td>\n<td>3.1, 3.2, 3.3<\/td>\n<\/tr>\n<tr>\n<td>5.x e anteriores<\/td>\n<td>Sem suporte<\/td>\n<td>\u2014<\/td>\n<td>\u2014<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>Instala\u00e7\u00e3o nova: <strong>7.0.x<\/strong>. Um detalhe do upstream que economiza dor de cabe\u00e7a: o Ruby 4.0.0 a 4.0.3 tem uma regress\u00e3o que deixa a renderiza\u00e7\u00e3o de wiki muito lenta, corrigida no <strong>4.0.4<\/strong>. Se for de Ruby 4, use 4.0.4 ou mais novo \u2014 ou fique no 3.3\/3.4, que \u00e9 o que as distribui\u00e7\u00f5es entregam hoje.<\/p>\n<h2>Pacote da distro ou instala\u00e7\u00e3o a partir do tarball?<\/h2>\n<p>O Debian empacota o Redmine (<code>apt install redmine-pgsql<\/code>) e isso funciona \u2014 mas a vers\u00e3o do reposit\u00f3rio costuma ficar bem atr\u00e1s da atual, e plugins e temas esperam a \u00e1rvore de arquivos padr\u00e3o do projeto. Para servidor que voc\u00ea vai manter por anos, o tarball oficial d\u00e1 mais controle. \u00c9 esse o caminho abaixo.<\/p>\n<h2>Depend\u00eancias<\/h2>\n<pre><code class=\"language-bash\">sudo apt update\nsudo apt install -y ruby ruby-dev build-essential \n  libpq-dev zlib1g-dev libssl-dev libyaml-dev \n  imagemagick libmagickwand-dev ghostscript \n  git subversion curl postgresql\n\n# confira a vers\u00e3o do Ruby: o Redmine 7.0 aceita de 3.2 a 4.0\nruby -v<\/code><\/pre>\n<p>Os opcionais valem a pena: <strong>ImageMagick<\/strong> habilita miniaturas e a exporta\u00e7\u00e3o do Gantt em PNG, <strong>Ghostscript<\/strong> gera miniatura de PDF anexado, e o <strong>Pandoc<\/strong> (3.8.3 ou mais novo) liga a pr\u00e9-visualiza\u00e7\u00e3o de <code>.docx<\/code>, <code>.xlsx<\/code>, <code>.pptx<\/code> e <code>.odt<\/code> no Redmine 7.<\/p>\n<h2>Banco de dados<\/h2>\n<p>PostgreSQL 14 ou mais novo \u00e9 a recomenda\u00e7\u00e3o do projeto:<\/p>\n<pre><code class=\"language-bash\">sudo -u postgres psql -c \"CREATE ROLE redmine LOGIN ENCRYPTED PASSWORD 'troque-esta-senha' NOINHERIT VALID UNTIL 'infinity';\"\nsudo -u postgres psql -c \"CREATE DATABASE redmine WITH ENCODING='UTF8' OWNER=redmine;\"<\/code><\/pre>\n<h2>Baixando e configurando o Redmine<\/h2>\n<pre><code class=\"language-bash\">sudo adduser --system --group --disabled-password --home \/opt\/redmine redmine\n\ncd \/tmp\nVER=7.0.1\ncurl -fLO https:\/\/www.redmine.org\/releases\/redmine-${VER}.tar.gz\n# confira o SHA-256 publicado na p\u00e1gina de download antes de extrair\nsha256sum redmine-${VER}.tar.gz\n\nsudo tar xzf redmine-${VER}.tar.gz --strip-components=1 -C \/opt\/redmine\nsudo chown -R redmine:redmine \/opt\/redmine<\/code><\/pre>\n<p>Crie <code>\/opt\/redmine\/config\/database.yml<\/code>:<\/p>\n<pre><code class=\"language-yaml\">production:\n  adapter: postgresql\n  database: redmine\n  host: localhost\n  username: redmine\n  password: \"troque-esta-senha\"\n  encoding: utf8<\/code><\/pre>\n<h2>Gems, chave secreta e migra\u00e7\u00e3o<\/h2>\n<pre><code class=\"language-bash\">cd \/opt\/redmine\n\nsudo -u redmine bundle config set --local without 'development test'\nsudo -u redmine bundle config set --local path 'vendor\/bundle'\nsudo -u redmine bundle install\n\nsudo -u redmine bundle exec rake generate_secret_token\nsudo -u redmine RAILS_ENV=production bundle exec rake db:migrate\nsudo -u redmine RAILS_ENV=production REDMINE_LANG=pt-BR bundle exec rake redmine:load_default_data<\/code><\/pre>\n<p>O <code>REDMINE_LANG=pt-BR<\/code> carrega trackers, pap\u00e9is, prioridades e status j\u00e1 em portugu\u00eas \u2014 se voc\u00ea deixar em branco, ele pergunta interativamente.<\/p>\n<p>Permiss\u00f5es dos diret\u00f3rios que o Redmine escreve em tempo de execu\u00e7\u00e3o:<\/p>\n<pre><code class=\"language-bash\">sudo mkdir -p \/opt\/redmine\/tmp\/pdf \/opt\/redmine\/public\/plugin_assets\nsudo chown -R redmine:redmine \/opt\/redmine\/files \/opt\/redmine\/log \/opt\/redmine\/tmp \/opt\/redmine\/public\/plugin_assets\nsudo chmod -R 755 \/opt\/redmine\/files \/opt\/redmine\/log \/opt\/redmine\/tmp \/opt\/redmine\/public\/plugin_assets<\/code><\/pre>\n<p>Teste antes de virar servi\u00e7o:<\/p>\n<pre><code class=\"language-bash\">sudo -u redmine RAILS_ENV=production bundle exec rails server -b 127.0.0.1 -p 3000<\/code><\/pre>\n<p>Abra <code>http:\/\/127.0.0.1:3000<\/code> por um t\u00fanel SSH. O login inicial \u00e9 <code>admin<\/code> \/ <code>admin<\/code> \u2014 <strong>troque a senha na primeira entrada<\/strong>, antes de publicar o servi\u00e7o.<\/p>\n<h2>Puma como servi\u00e7o no systemd<\/h2>\n<p>Crie <code>\/opt\/redmine\/config\/puma.rb<\/code>:<\/p>\n<pre><code class=\"language-ruby\">directory \"\/opt\/redmine\"\nenvironment \"production\"\n\nbind \"unix:\/\/\/opt\/redmine\/tmp\/puma.sock\"\npidfile \"\/opt\/redmine\/tmp\/puma.pid\"\nstate_path \"\/opt\/redmine\/tmp\/puma.state\"\n\nworkers 2\nthreads 2, 8\npreload_app!<\/code><\/pre>\n<p>E <code>\/etc\/systemd\/system\/redmine.service<\/code>:<\/p>\n<pre><code class=\"language-ini\">[Unit]\nDescription=Redmine (Puma)\nAfter=network-online.target postgresql.service\nWants=network-online.target\n\n[Service]\nType=simple\nUser=redmine\nGroup=redmine\nWorkingDirectory=\/opt\/redmine\nEnvironment=RAILS_ENV=production\nExecStart=\/usr\/bin\/bundle exec puma -C \/opt\/redmine\/config\/puma.rb\nRestart=always\nRestartSec=5\nTimeoutStartSec=120\n\nNoNewPrivileges=true\nPrivateTmp=false\nProtectSystem=full\n\n[Install]\nWantedBy=multi-user.target<\/code><\/pre>\n<p>Aten\u00e7\u00e3o ao <code>PrivateTmp=false<\/code>: o socket do Puma fica em <code>\/opt\/redmine\/tmp<\/code>, e o nginx precisa enxerg\u00e1-lo.<\/p>\n<pre><code class=\"language-bash\">sudo systemctl daemon-reload\nsudo systemctl enable --now redmine\njournalctl -u redmine -f<\/code><\/pre>\n<h2>Nginx na frente, com TLS<\/h2>\n<pre><code class=\"language-nginx\">upstream redmine {\n    server unix:\/\/\/opt\/redmine\/tmp\/puma.sock;\n}\n\nserver {\n    listen 443 ssl;\n    http2 on;\n    server_name projetos.exemplo.com.br;\n\n    ssl_certificate     \/etc\/letsencrypt\/live\/projetos.exemplo.com.br\/fullchain.pem;\n    ssl_certificate_key \/etc\/letsencrypt\/live\/projetos.exemplo.com.br\/privkey.pem;\n\n    root \/opt\/redmine\/public;\n    client_max_body_size 100m;\n\n    # arquivos est\u00e1ticos direto pelo nginx\n    location ~ ^\/(assets|plugin_assets)\/ {\n        expires 1y;\n        add_header Cache-Control public;\n    }\n\n    location \/ {\n        try_files $uri @app;\n    }\n\n    location @app {\n        proxy_pass http:\/\/redmine;\n        proxy_set_header Host $host;\n        proxy_set_header X-Real-IP $remote_addr;\n        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;\n        proxy_set_header X-Forwarded-Proto $scheme;\n    }\n}<\/code><\/pre>\n<pre><code class=\"language-bash\">sudo usermod -aG redmine www-data     # nginx precisa ler o socket\nsudo certbot --nginx -d projetos.exemplo.com.br\nsudo systemctl reload nginx<\/code><\/pre>\n<h2>O caminho curto: Docker<\/h2>\n<p>Se voc\u00ea s\u00f3 quer o Redmine no ar sem montar a pilha Ruby na m\u00e3o:<\/p>\n<pre><code class=\"language-yaml\">services:\n  db:\n    image: postgres:17\n    restart: always\n    environment:\n      POSTGRES_DB: redmine\n      POSTGRES_USER: redmine\n      POSTGRES_PASSWORD: troque-esta-senha\n    volumes:\n      - .\/pgdata:\/var\/lib\/postgresql\/data\n\n  redmine:\n    image: redmine:6\n    restart: always\n    depends_on: [db]\n    ports:\n      - \"127.0.0.1:3000:3000\"\n    environment:\n      REDMINE_DB_POSTGRES: db\n      REDMINE_DB_DATABASE: redmine\n      REDMINE_DB_USERNAME: redmine\n      REDMINE_DB_PASSWORD: troque-esta-senha\n      REDMINE_SECRET_KEY_BASE: gere-uma-chave-longa-e-aleatoria\n    volumes:\n      - .\/files:\/usr\/src\/redmine\/files\n      - .\/plugins:\/usr\/src\/redmine\/plugins<\/code><\/pre>\n<pre><code class=\"language-bash\">docker compose up -d<\/code><\/pre>\n<p>A imagem oficial no Docker Hub costuma acompanhar a linha est\u00e1vel anterior \u00e0 mais recente \u2014 confira a tag dispon\u00edvel antes de fixar a vers\u00e3o, e continue pondo o nginx na frente para o TLS.<\/p>\n<h2>Backup<\/h2>\n<p>Tr\u00eas coisas, e nenhuma \u00e9 opcional:<\/p>\n<pre><code class=\"language-bash\"># 1. banco\nsudo -u postgres pg_dump -Fc redmine > \/var\/backups\/redmine-$(date +%F).dump\n\n# 2. anexos enviados pelos usu\u00e1rios\nsudo tar czf \/var\/backups\/redmine-files-$(date +%F).tar.gz -C \/opt\/redmine files\n\n# 3. configura\u00e7\u00e3o\nsudo tar czf \/var\/backups\/redmine-conf-$(date +%F).tar.gz -C \/opt\/redmine config<\/code><\/pre>\n<p>Restaurar s\u00f3 o banco e esquecer o <code>files\/<\/code> \u00e9 o erro cl\u00e1ssico: o Redmine sobe bonito e todo anexo vira link quebrado.<\/p>\n<h2>Atualizando<\/h2>\n<pre><code class=\"language-bash\">sudo systemctl stop redmine\n# backup dos tr\u00eas itens acima ANTES de qualquer coisa\n\n# extraia a nova vers\u00e3o por cima, preservando config\/, files\/ e plugins\/\ncd \/opt\/redmine\nsudo -u redmine bundle install\nsudo -u redmine RAILS_ENV=production bundle exec rake db:migrate\nsudo -u redmine RAILS_ENV=production bundle exec rake tmp:cache:clear\n\nsudo systemctl start redmine<\/code><\/pre>\n<p>Plugins s\u00e3o a causa n\u00famero um de atualiza\u00e7\u00e3o travada. Desative os que n\u00e3o forem compat\u00edveis com a vers\u00e3o nova <em>antes<\/em> de rodar a migra\u00e7\u00e3o \u2014 e leia o <em>RedmineUpgrade<\/em> oficial quando o salto for de linha maior.<\/p>\n<hr \/>\n<h2>O post original (abril de 2017)<\/h2>\n<p>Preservado como registro. Os scripts abaixo instalavam o Redmine 3.3.2 no Debian 8.7 e <strong>n\u00e3o devem ser usados hoje<\/strong>:<\/p>\n<pre><code class=\"language-bash\">## Redmine 3.3.2 integrado ao ISPConfig3 (Debian 8)\ncd \/tmp\/\nwget https:\/\/gist.githubusercontent.com\/jniltinho\/66c64a33d8b0a515c95ea9750f8f69d5\/raw\/5318d664f213155c7e5a5c5f55e4ef2e078a082c\/install_redmine.sh\nchmod +x install_redmine.sh\n.\/install_redmine.sh\n\n## Redmine 3.3.2 com nginx, em Debian 8.7 limpo\ncd \/tmp\/\nwget https:\/\/gist.githubusercontent.com\/jniltinho\/cb0743ed1ddc1544f644c223d1a0578e\/raw\/1ccfaba34095920d939b1db2461c52bddbab8ef3\/install_redmine_nginx.sh\nchmod +x install_redmine_nginx.sh\n.\/install_redmine_nginx.sh<\/code><\/pre>\n<p>Os posts citados na vers\u00e3o original continuam no ar: <a href=\"\/2017\/04\/ispconfig3-no-debian\/\">ISPConfig3 no Debian<\/a> e a <a href=\"\/2017\/04\/serie-servidores-linux\/\">S\u00e9rie Servidores Linux<\/a>.<\/p>\n<h2>Links<\/h2>\n<ul>\n<li><a href=\"https:\/\/www.redmine.org\/projects\/redmine\/wiki\/Download\" target=\"_blank\" rel=\"noopener\">Download oficial<\/a> \u00b7 <a href=\"https:\/\/www.redmine.org\/projects\/redmine\/wiki\/RedmineInstall\" target=\"_blank\" rel=\"noopener\">RedmineInstall<\/a> \u00b7 <a href=\"https:\/\/www.redmine.org\/projects\/redmine\/wiki\/RedmineUpgrade\" target=\"_blank\" rel=\"noopener\">RedmineUpgrade<\/a><\/li>\n<li>Aqui no blog: <a href=\"\/2026\/09\/a-historia-do-git\/\">A hist\u00f3ria do Git<\/a> \u00b7 <a href=\"\/2017\/04\/instalando-gogs-no-ubuntu\/\">Instalando o Gogs no Ubuntu<\/a><\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>O Redmine \u00e9 gerenciador de projetos e rastreador de bugs em Ruby on Rails, livre, com Gantt, calend\u00e1rio, wiki, f\u00f3rum, controle de tempo e integra\u00e7\u00e3o com reposit\u00f3rios (Git, Subversion, Mercurial e outros). Ele existe desde 2006, nunca virou SaaS e &#8230; <a title=\"Install Redmine on Debian\" class=\"read-more\" href=\"https:\/\/www.linuxpro.com.br\/en\/2017\/04\/redmine-setup-debian\/\" aria-label=\"Read more about Install Redmine on Debian\">Read more<\/a><\/p>","protected":false},"author":0,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[11,2],"tags":[15,14,4,82],"class_list":["post-139","post","type-post","status-publish","format-standard","hentry","category-debian","category-linux","tag-debian","tag-howto","tag-linux","tag-redmine"],"_links":{"self":[{"href":"https:\/\/www.linuxpro.com.br\/en\/wp-json\/wp\/v2\/posts\/139","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.linuxpro.com.br\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.linuxpro.com.br\/en\/wp-json\/wp\/v2\/types\/post"}],"replies":[{"embeddable":true,"href":"https:\/\/www.linuxpro.com.br\/en\/wp-json\/wp\/v2\/comments?post=139"}],"version-history":[{"count":5,"href":"https:\/\/www.linuxpro.com.br\/en\/wp-json\/wp\/v2\/posts\/139\/revisions"}],"predecessor-version":[{"id":1308,"href":"https:\/\/www.linuxpro.com.br\/en\/wp-json\/wp\/v2\/posts\/139\/revisions\/1308"}],"wp:attachment":[{"href":"https:\/\/www.linuxpro.com.br\/en\/wp-json\/wp\/v2\/media?parent=139"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.linuxpro.com.br\/en\/wp-json\/wp\/v2\/categories?post=139"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.linuxpro.com.br\/en\/wp-json\/wp\/v2\/tags?post=139"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}