08.06.2025

Redmine – установка окружения и запуск приложения

Установка Redmine простая, но сегодня не тот случай, в качестве примера будет рассматриваться установка старого Redmine 3.4.9 и нового 6.0.5.

Требуется установить Redmine на сервер, используя стек RVM, Unicorn, Nginx с автоматическим запуском приложения.

Ruby Version Manager (RVM) – менеджер окружений Ruby, начиная от версий интерпретатора и заканчивая gem.

Redmine при обновлении может требовать разные версии окружения. Необходимо иметь возможность установки приложений с разным окружением.

Unicorn – веб-сервер для Rack приложений.

Для каждого приложения можно создать отдельные Unicorn, против глобального который будет ограничен только одной версией приложения.

Nginx будет выступать в роли frontend сервера, а так решит проблему медленных клиентов.

Для разных версий Redmine необходимо выбрать правильную версию ОС, это связано с OpenSSL (несмотря на возможность внутри RVM установить OpenSSL 1.0 это не решает проблем с запуском приложений)

Зависимости версий Redmine

  • Redmine 3.4: OpenSSL 1.0 (Ubuntu 20, Debian 10, Debian 11), PostreSQL 9.5+, Ruby 2.4
  • Redmine 4.0: OpenSSL 1.0 (Ubuntu 20, Debian 10, Debian 11), PostreSQL 9.5+, Ruby 2.4-2.6
  • Redmine 4.2: OpenSSL 1.0 (Ubuntu 20, Debian 10, Debian 11), PostreSQL 9.5+, Ruby 2.4 – 2.7
  • Redmine 5.0: OpenSSL 1.0+ (Ubuntu 20, Debian 10, Debian 11), PostreSQL 9.5+, Ruby 2.4 – 3.0
  • Redmine 5.1: OpenSSL 3.0+, PostreSQL 14, Ruby 2.4 – 3.2
  • Redmine 6.0: OpenSSL 3.0+, PostreSQL 14, Ruby 3.3

Предварительная подготовка

Подготовка сервера для работы это личные предпочтения, у каждого они свои, например вот

ImageMagick используется для обработки изображений для экспорта в PDF и PNG

Software Properties Common позволяет источниками программного обеспечения независимых поставщиков программного обеспечения

apt install -y software-properties-common gnupg2 imagemagick libmagickwand-dev git

Установка корректной локали

Локали определяют язык, который использует система, а также региональные особенности. Для корректной работы 1С нужна ru_RU.UTF8

locale-gen en_US.UTF-8
locale-gen ru_RU.UTF-8
update-locale LANG=ru_RU.UTF-8

Либо

dpkg-reconfigure locales

Установка PosgreSQL

add-apt-repository "deb http://apt.postgresql.org/pub/repos/apt/ $(lsb_release -sc)-pgdg main"
wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | apt-key add -
curl -fsSL https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo gpg --dearmor -o /etc/apt/trusted.gpg.d/postgresql.gpg
apt update && apt upgrade -y && apt autoremove -y

PosgreSQL 9.5

Для Redmine 3.4 и выше можно спокойно использовать PostgreSQL 14

apt install -y postgresql-9.5 libpq5 libpq-dev

PosgreSQL 14

apt install -y postgresql-14 libpq5 libpq-dev

Конфиг под PostgreSQL

Не претендую на правильность, конфиг для примера, много зависит от того, сколько ресурсов вы выделяете и какая нагрузка. В зависимости PosgreSQL от версии набор параметров для кастомизации отличается (пример взят для установки под 9.5)

nano /etc/postgresql/14/main/conf.d/redmine.conf

# Add settings for extensions here
#listen_addresses = '*'
shared_buffers = 1024MB # 25% of RAM
temp_buffers = 128MB
max_files_per_process = 10000
max_parallel_workers_per_gather = 0
max_parallel_maintenance_workers = 2 # Количество CPU/4, минимум 2, максимум 6
commit_delay = 100
max_wal_size = 2GB
min_wal_size = 1GB
checkpoint_timeout = 10min
effective_cache_size = 2048MB # 50-75% of RAM
from_collapse_limit = 8
join_collapse_limit = 8
autovacuum_max_workers = 2 # Количество CPU/2, минимум 2
vacuum_cost_limit = 1600 # 100* autovacuum_max_workers
autovacuum_naptime = 20s
autovacuum_vacuum_scale_factor = 0.01
autovacuum_analyze_scale_factor = 0.005
max_locks_per_transaction = 256
#escape_string_warning = off
#standard_conforming_strings = off
#shared_preload_libraries = 'online_analyze, plantuner'
online_analyze.threshold = 50
online_analyze.scale_factor = 0.1
online_analyze.enable = on
online_analyze.verbose = off
online_analyze.min_interval = 10000
online_analyze.table_type = 'temporary'
#plantuner.fix_empty_table = on

#
wal_buffers = 4MB

Перезапускаем и проверяем

service postgresql restart
service postgresql status

Создание базы данных

Смените пользователя на postgres

sudo -i -u postgres

либо

su -l postgres

Переходим в PSQL

psql

Создаем пользователя redmine c паролем pas$w0rd, создаем базу данных redmine_db и делаем владельцем пользователя redmine.

CREATE ROLE redmine LOGIN ENCRYPTED PASSWORD 'pas$w0rd' NOINHERIT VALID UNTIL 'infinity';
DROP DATABASE redmine_db;
CREATE DATABASE redmine_db WITH ENCODING='UTF8' OWNER=redmine;
ALTER DATABASE "redmine_db" SET datestyle="ISO,MDY";
\q

Установка Ruby Version Manager (RVM)

gpg --keyserver keyserver.ubuntu.com --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3 7D2BAF1CF37B13E2069D6956105BD0E739499BDB
gpg2 --keyserver hkp://keyserver.ubuntu.com --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3 7D2BAF1CF37B13E2069D6956105BD0E739499BDB

curl -sSL https://get.rvm.io | bash

echo '[[ -s "/etc/profile.d/rvm.sh" ]] && source "/etc/profile.d/rvm.sh"' >> ~/.bashrc
/etc/profile.d/rvm.sh

curl -sSL https://rvm.io/mpapis.asc | gpg --import -
curl -sSL https://rvm.io/pkuczynski.asc | gpg --import -
rvm get head

Установка окружения для Redmine

Создадим директорию где будет расположено приложение и перейдем в /opt/

mkdir -p /opt/redmine/
cd /opt/

Дополнительные библиотеки которые могут понадобиться, лучше установить заранее

rvm pkg install openssl
rvm pkg install zlib

Смотрим какие версии доступны и выбираем необходимую

rvm list known | grep ruby-

Устанавливаем нужную версию Ruby

Redmine 3.4 – Ruby 2.4.10, Redmine 6.0 – Ruby 3.3.8 смотрите блок Зависимости версий Redmine

 

Для старых версий Ruby требуется OpenSSL 1.0, их можно указать так

rvm install ruby-2.4.10 -C –with-openssl-dir=/usr/share/rvm/usr/

Redmine 3.4 – 4.2

rvm install ruby-2.4.10

Redmine 5.0 – 6.0

rvm install ruby-3.3.8

Создаем отдельное окружение для приложения и указываем какая версия Ruby будет использоваться именно для него.

При необходимости можно в окружение приложения передать дополнительные параметры .rvmrc
echo “export rvm_configure_flags=\”–with-openssl-dir=/usr/share/rvm/usr/ –with-readline-dir=$rvm_path/usr\”” >> /opt/redmine/.rvmrc

rvm gemset create redmine

Redmine 3.4 – 4.2

echo "rvm use ruby-2.4.10@redmine" > /opt/redmine/.rvmrc

Redmine 5.0 – 6.0

echo "rvm use ruby-3.3.8@redmine" > /opt/redmine/.rvmrc

Переходим в директорию приложения redmine и загружаем окружение, обычно оно автоматически загружается, но лучше сделать самостоятельно

cd /opt/redmine
rvm rvmrc load
rvm gemset empty redmine

Скачиваем Redmine 3.4.9 и распаковываем в /opt/redmine

wget https://www.redmine.org/releases/redmine-3.4.9.tar.gz
tar -xzf redmine-3.4.9.tar.gz -C /opt/redmine/ --strip-components=1

Скачиваем Redmine 6.0.5 и распаковываем в /opt/redmine

wget https://www.redmine.org/releases/redmine-6.0.5.tar.gz 
tar -xzf redmine-6.0.5.tar.gz -C /opt/redmine/ --strip-components=1

Redmine 3.4 – 5.2

mkdir -p tmp tmp/pdf public/plugin_assets

Redmine 6.0 и старше

mkdir -p tmp tmp/pdf public/assets

Установка скачанных gem, или тех что нет в обычных репозиториях

wget https://github.com/rubygems/rubygems.org-vendor/raw/refs/heads/master/mimemagic-0.3.2.gem
gem install mimemagic --local mimemagic-0.3.2.gem

Настройка подключения к базе данных

nano /opt/redmine/config/database.yml

production:
adapter: postgresql
database: redmine_db
host: localhost
port: 5432
username: redmine
password: "pas$w0rd"
encoding: utf8

Далее переходим к шагу Установка необходимых gems и их зависимостей

Установка необходимых gems и их зависимостей

данный шаг выполняется для любой версии Redmine

bundle install

Сохранить все установленные Gem в папке приложения /vendor/cache, крайне выполнить, помогает при миграции приложения на другой сервер 

bundle package

Необходимо сгенерировать случайный ключ для хранилища сеансов, используемый Rails для кодирования файлов cookie, текущий токен будет недействительным после перезапуска приложения

bundle exec rake generate_secret_token

Создайте структуру базы данных

RAILS_ENV=production bundle exec rake db:migrate

Набор данных базы данных по умолчанию, при восстановлении и обновлении шаг пропускается

RAILS_ENV=production REDMINE_LANG=ru bundle exec rake redmine:load_default_data

Требуется выполнить при восстановление из резервной копии, обновлении или добавлении плагинов

RAILS_ENV=production bundle exec rake redmine:plugins:migrate

Очистка темп и кеш файлов

RAILS_ENV=production bundle exec rake tmp:cache:clear

Разрешения файловой системы и необходимые папки

find /opt/redmine/ -type d -exec chmod 755 {} +
find /opt/redmine/ -type f -exec chmod 644 {} +
rvm fix-permissions

Проверка установки

Webrick не подходит для использования в производстве, используйте Webrick только для проверки работоспособности установки до этого момента. Используйте модуль Passenger или сервера Rack: Unicorn, Thin, Puma для обслуживания Redmine

Веб-сервер Puma

bundle exec rails server -e production -b 0.0.0.0

Веб-сервер WEBrick:

rails server webrick -e production -b 0.0.0.0

Установка и настройка Unicorn

Перейдем в окружение приложения и установим unicorn, версию unicorn лучше ставить соответствующую установленному Ruby, предпочитаю оринетироваться на год выхода Ruby и Uncorn

cd /opt/redmine/
rvm rvmrc load

Redmine 3.4 – 4.2

gem install 'unicorn' -v '5.4.0'

Redmine 5.0 – 6.0

gem install 'unicorn'

Создадим необходимые директории

mkdir -p /opt/redmine/shared/{pids,sockets,service,log}

Конфигурационный фаил Unicorn

nano /opt/redmine/config/unicorn.rb

# установка путей до приложения
app_dir = File.expand_path("../..", __FILE__)
shared_dir = "#{app_dir}/shared"
working_directory app_dir

# установка некоторых опций unicorn
worker_processes 4
timeout 30

# сокет файл для доступа nginx
listen "#{shared_dir}/sockets/unicorn.sock", :backlog => 64
#listen 8080, :tcp_nopush => true

# установка файлов логов
stderr_path "#{shared_dir}/log/unicorn.error.log"
stdout_path "#{shared_dir}/log/unicorn.log"

# установка pid файла, который будет сопоставим с процессом unicorn (чтобы по нему определять процесс)
pid "#{shared_dir}/pids/unicorn.pid"

# Мастер процесс загружает приложение, перед тем, как плодить рабочие процессы.
preload_app true

before_exec do |server|
ENV["BUNDLE_GEMFILE"] = "#{rails_root}/Gemfile"
end

before_fork do |server, worker|
# Перед созданием рабочих процессов, главный процесс отсоединяется
# рекомендуется "preload_app true"
    # поскольку нет необходимости главному процессу удерживать соединение
defined?(ActiveRecord::Base) and
        ActiveRecord::Base.connection.disconnect!

    # Следующее рекомендуется только для установок с ограничениями памяти/БД
# Это не нужно, если ваша система может вместить вдвое больше worker_processes, чем вы настроили
  # # Это позволяет новому главному процессу постепенно, выключать старый главный процесс с помощью SIGTTOU, чтобы избежать
  # # массового отключения (особенно в случае "preload_app false") при выполнении бесшовного обновления

# Последний созданный рабочий процесс затем убьет старый главный процесс с помощью SIGQUIT
    # old_pid = "#{server.config[:pid]}.oldbin"
    # if old_pid != server.pid
  #    begin
  #      sig = (worker.nr + 1) >= server.worker_processes ? :QUIT : :TTOU
  #      Process.kill(sig, File.read(old_pid).to_i)
  #    rescue Errno::ENOENT, Errno::ESRCH
  #    end
    # end

  # Запретить главному процессу слишком быстро разветвляться, переведя его в режим сна
# Предотвращает потерю идентичных, повторяющихся сигналов, когда принимающий процесс занят
    # sleep 1
end

after_fork do |server, worker|
# После того как рабочий процесс создан, он устанавливает соединение с базой.
defined?(ActiveRecord::Base) and
ActiveRecord::Base.establish_connection
end

Запуск Unicorn

unicorn_rails -c config/unicorn.rb -E production -D

Остановка Unicorn

pkill -QUIT --pidfile /opt/redmine/shared/pids/unicorn.pid

Создание сервиса Unicorn в systemd

Создаем апплеты {start,stop,restart}

nano /opt/redmine/shared/service/start

#!/bin/bash

test -f "/usr/share/rvm/scripts/rvm" source /usr/share/rvm/scripts/rvm
test -f "/usr/local/rvm/scripts/rvm" && source /usr/local/rvm/scripts/rvm
cd /opt/redmine/
#rvm rvmrc load
unicorn_rails -c /opt/redmine/config/unicorn.rb -E production -D

nano /opt/redmine/shared/service/stop

#!/bin/bash

pkill -QUIT --pidfile /opt/redmine/shared/pids/unicorn.pid

nano /opt/redmine/shared/service/restart

#!/bin/bash


/opt/redmine/shared/service/stop
/opt/redmine/shared/service/start

Даем права на запуск

chmod -R +x /opt/redmine/shared/service/

Создаем unit для systemd

Стартовать будем после запуска сети и PostgreSQL

nano /etc/systemd/system/unicorn.service

[Unit]
Description=Unicorn Service for Redmine on RVM
After=syslog.target network.target postgresql.service

[Service]
# systemd considers the service started up once the process forks and the parent has exited.
# For classic daemons, use this type unless you know that it is not necessary.
# You should specify PIDFile= as well so systemd can keep track of the main process.
Type=forking
PIDFile=/opt/redmine/shared/pids/unicorn.pid
WorkingDirectory=/opt/redmine/
User=www-data
Group=www-data
Environment=RAILS_ENV=production
ExecStart=/opt/redmine/shared/service/start
ExecReload=/opt/redmine/shared/service/restart
ExecStop=/opt/redmine/shared/service/stop
OOMScoreAdjust=-100
TimeoutSec=30
Restart=always
RestartSec=20s

[Install]
WantedBy=multi-user.target

После создания загружаем изменения в systemd используя daemon-reload 

systemctl daemon-reload

Включаем новый unit как сервис и разрешает автостарт после перезагрузки

systemctl --now enable unicorn

Перезапускаем и проверяем

service unicorn restart
service unicorn status

Установка и настройка Nginx

apt install -y nginx

Меняем владельца на директории с приложением приложение

chown -R www-data:www-data /opt/redmine/

Удаляем дефолтный конфиг

rm -f /etc/nginx/sites-available/default.conf
rm -f /etc/nginx/sites-enabled/default.conf

Создаем конфигурацию для Redmine

Особо внимательные заметят сходство с BitrixENV, да так и есть, часть их конфигурации позаимствована, и стала неким mainstream для сервисов, ввиду сбалансированной настройке и простоте работы с подключаемыми настройками для приложений.

Данная конфигурация является примером. Для использовании производственной среде, рекомендуется использовать защищенное соединение с SSL сертификатом

nano /etc/nginx/sites-available/redmine.conf

upstream unicorn {
server unix:/opt/redmine/shared/sockets/unicorn.sock fail_timeout=0;
}
# Redmine website
server {
listen 80 default_server;
server_name rm.notdev.ru red.notdev.ru;
server_name_in_redirect off;

access_log /var/log/nginx/notdev.ru-access.log main;
error_log /var/log/nginx/notdev.ru-error.log warn;

proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $host:80;

proxy_redirect ~^(http://[^:]+):\d+(/.+)$ $1$2;
proxy_redirect ~^(https://[^:]+):\d+(/.+)$ $1$2;

set $proxyserver "http://unicorn";
set $docroot "/opt/redmine";
root "/opt/redmine";
}
ln -s /etc/nginx/sites-available/redmine.conf /etc/nginx/sites-enabled/

Добавляем nginx в автозапуск, если он не получил этого при установке и перезапускаем

systemctl --now enable nginx
service nginx restart

Итоговые права на директории Redmine

chown -R www-data:www-data /opt/redmine/
find /opt/redmine/ -type d -exec chmod 755 {} +
find /opt/redmine/ -type f -exec chmod 644 {} +
chmod -R +x /opt/redmine/shared/service/

Дополнительные настройки

  • Установка и настройка Unicorn
  • Установка и настройка Nginx
  •  

Дополнительная информация