Как установить Redmine правильно. (Redmine без root, без passenger, без мусора. Полное руководство, to rule them all!)

Полезные советы и программы от пользователей нашего форума.

Модератор: Модераторы разделов

Аватара пользователя
kasak
Сообщения: 896
ОС: OpenBSD

Как установить Redmine правильно.

Сообщение kasak »

Вместо предисловия:
ruby.jpeg
Зачем я это пишу:
Я хочу раз и навсегда сделать один НОРМАЛЬНЫЙ мануал по установке redmine. С полным объяснением происходящего, т.к. больше нигде подробно об этом не описано, либо описано, но устарело. Я скорее опишу как не совершать ошибок, потому что сам их уже не раз совершил и хочу чтоб другие этого не делали.

RVM:
Внимание: ВСЕ указанные команды должны выполнятся от имени простого не-root пользователя. Если потребуется запуск чего-то от root, об этом будет указано отдельно!

Я буду устанавливать redmine на archlinux. Но на самом деле это не имеет никакого значения, т.к. кроме выбора базовых пакетов, всё остальное будет одинаково для любой системы.

Первую ошибку, которую может совершить не шарящий в руби человек, это установить руби из системного менеджера пакетов.
Дело в том, что если установить руби из системного менеджера пакетов, никак не получится установить часть гемов в юзерскую папку; Часть из них по-любому захочет установиться в путь установки руби. Тем самым, нам придётся вызывать bundler из sudo, и мы замусорим системную папку компилированными гемами. Потом отличить компилированные от системных будет невозможно.
Именно поэтому, установку redmine да и вообще любого другого руби приложения надо производить через rvm.

rvm это что-то вроде "менеджера версий руби" который позволяет установить в юзерскую директорию любую версию руби.
Для установки rvm на арчлинукс и последующей компиляции руби нужно установить через pacman эти пакеты:

Код: Выделить всё

base-devel tar gzip diffutils git curl libyaml
На самом деле у меня всё кроме git и libyaml шло уже в минимальной установке. Но на всякий случай проверьте.
Теперь можно скачать и установить rvm:

Shell

curl -sSL https://get.rvm.io | bash
Если кому не понятно что происходит - curl скачает скрипт установки rvm (ключи sSL буквально означают "отключить вывод, кроме вывода ошибок, переходить по ссылкам" ) после чего по трубе | передаст этот скрипт в баш, а баш его выполнит. После исполнения скрипта у нас появится директория .rvm ; Внутри этой директории у нас будут расположены наборы гемов, установленные версии руби и "обертки". Обертки нам понадобятся для работы с systemd, но об этом позже. Кроме того, скрипт добавит в bash_profile строку, импортирующую переменные руби.

Ruby:
Теперь нужно понять какую версию руби нам скомпилировать. Для этого скачиваем редмайн и распаковываем. На сегодняшний день актуальная версия редмайна 6.0.2, я распаковал её в /home/kasak/redmine-6.0.2

Внутри нам нужно заглянуть на самый верх файла Gemfile и увидеть там следующее:

Код: Выделить всё

source 'https://rubygems.org'

ruby '>= 3.1.0', '< 3.4.0'
Это означает что разработчики redmine хотят видеть руби версии выше чем 3.1.0 но меньше чем 3.4.0
Теперь посмотрим какие версии руби может установить rvm, для этого выполняем

Код: Выделить всё

rvm list known
Вывод будет достаточно длинный, но нас интересует только верхушка:

Код: Выделить всё

# MRI Rubies
[ruby-]1.8.6[-p420]
[ruby-]1.8.7[-head] # security released on head
[ruby-]1.9.1[-p431]
[ruby-]1.9.2[-p330]
[ruby-]1.9.3[-p551]
[ruby-]2.0.0[-p648]
[ruby-]2.1[.10]
[ruby-]2.2[.10]
[ruby-]2.3[.8]
[ruby-]2.4[.10]
[ruby-]2.5[.9]
[ruby-]2.6[.10]
[ruby-]2.7[.8]
[ruby-]3.0[.7]
[ruby-]3.1[.5]
[ruby-]3.2[.6]
[ruby-]3[.3.6]
[ruby-]3.4[.1]
ruby-head
Из этого следует, что версия 3.4.1 нам не подходит так как она больше чем 3.4.0 а вот версия 3.3.6 в самый раз. Поэтому устанавливаем версию 3.3.6:

Shell

rvm install 3.3.6
Redmine:
Теперь нужно создать конфиг для базы данных redmine. Переходим в директорию redmine-6.0.2/config, копируем файл database.yml.example в файл database.yml
После чего внутри удаляем или комментируем всё что связано с development и test, оставляя только production. Это нужно для того, чтобы bundle установил нужный драйвер базы данных. А development и test нужно убрать, так как они по-умолчанию требуют mysql и bundle обязательно попытается его найти и установить.
Для написания этого мануала я оставил бд sqlite3 чтобы не усложнять:

Код: Выделить всё

production:
  adapter: sqlite3
  database: db/redmine.sqlite3
Теперь не забудьте установить клиентскую часть приложений от выбранной базы данных. У меня это sqlite3 и она в системе уже установлена.

Теперь переходите в директорию redmine-6.0.2 и создайте там файл Gemfile.local с содержимым:

Код: Выделить всё

gem "puma"
Пума это "сервер" который и будет запускать для нас редмайн (вместо модуля для apache/nginx, который называется passenger). На самом деле это не единственный способ, но насколько я могу судить, он самый простой и проверенный, и якобы самый производительный.

Теперь можно приступать к установке гемов:

Shell

bundle config set without 'development:test'
bundle install
На этом этапе произойдёт компиляция и установка "гемов" нужных для работы redmine. Гемы это что-то вроде расширений в php.
Если всё прошло успешно - это хорошо. Если же нет - проверьте может быть нужно установить какой-нибудь системный пакет, которого не хватает для компиляции. Например забыли установить клиентскую часть mysql, если такая применяется. Честно говоря, я с таким не сталкивался, поэтому не могу сказать бывают ли другие ошибки при компиляции или нет.

После того как всё будет скомпилировано, нужно запустить пару команд:

Shell

bundle exec rake generate_secret_token
bundle exec rake db:migrate RAILS_ENV="production"
Первая команда создаёт файл redmine-6.0.2/config/initializers/secret_token.rb, вторая заполняет пока ещё пустующую базу данных.

Puma:
Теперь у нас всё готово чтобы попробовать свежеустановленный редмайн.
Для этого из директории redmine-6.0.2 запустите:

Shell

puma -e production
Мы должны увидеть это:

Код: Выделить всё

Puma starting in single mode...
* Puma version: 6.5.0 ("Sky's Version")
* Ruby version: ruby 3.3.6 (2024-11-05 revision 75015d4c1f) [x86_64-linux]
*  Min threads: 0
*  Max threads: 5
*  Environment: production
*          PID: 33237
* Listening on http://0.0.0.0:9292
Use Ctrl-C to stop
Если вы вдруг не поняли где пума взяла конфиг - на самом деле это файл config.ru внутри директории redmine-6.0.2
Мы можем точно так же успешно запустить пуму через указание этого файла:

Shell

puma -e production redmine-6.0.2/config.ru
Попробуйте браузером зайти по адресу сервера, добавив порт 9292 в конце например http://redmine:9292
Если вы увидели главную страницу redmine - ура! Всё получилось.
Можно нажимать Ctrl-C и продолжать дальше.

systemd:
А под "дальше" я подразумеваю создание юнита systemd для автоматического старта.
Я не буду создавать системный юнит а создам юзерский. Для этого сначала создаём папку

Shell

mkdir -p ~/.config/systemd/user
А кладём внутрь файл redmine.service со следующим содержимым:

Код: Выделить всё

[Unit]
Description=Redmine puma server
After=default.target

[Service]
Type=notify
WorkingDirectory=/home/kasak/redmine-6.0.2
ExecStart=/home/kasak/.rvm/wrappers/default/puma -e production -b unix:///run/redmine/redmine.sock
Restart=always

[Install]
WantedBy=default.target
На что тут следует обратить внимание:
  1. Самое главное тут это путь к пуме, обратите внимание что вызов пумы идёт через wrappers. Я уже упоминал выше, что rvm создаёт для нас "обертки". Они позволяют запускать программы без активации "окружения ruby", то есть без импорта переменных и переписывания PATH.
  2. /home/kasak можно заменить на %h. Я указал абсолютный путь для наглядности.
  3. обязательно указывайте ключ -e production, иначе пума будет пытаться запустится в окружении development
  4. -b unix:/// указывает unix сокет, к которому мы будем адресовать какой-нибудь прокси. Его следует вынести из /home/user, поскольку, обычно у домашних директорий права доступа не позволят прокси считать сокет. Если вы хотите разместить сокет там же, где я его разместил, следует сначала создать директорию /run/redmine, и дать ей права нашего пользователя. А можно разместить сокет в /tmp.
Теперь следует добавить это всё в автозапуск:

Shell

systemctl --user daemon-reload
systemctl --user enable --now redmine
lighttpd:
Конечно можно назначить пуме порт 80 и никакая прокся будет не нужна, и так всё будет работать. Однако, пума не ведёт логи, и к примеру организовать letsencrypt одной лишь пумой задача мягко говоря сложно выполнимая.
Поэтому можно взять почти любой http сервер, например lighttpd. Такого конфига будет вполне достаточно:

Код: Выделить всё

server.username         = "http"
server.groupname        = "http"
server.document-root    = "/srv/http"
index-file.names        = ( "index.html" )

server.modules += ( "mod_proxy" )
$HTTP["url"] =~ "^/" {
proxy.server = ( "" => (( "host" => "/run/redmine/redmine.sock" )) )
}
Et voila!

Дополнения:
1) Возможно вы захотите сделать небольшой hardening, и порезать права доступа у сокета пумы. Тогда после указания сокета укажите параметр umask:

Код: Выделить всё

-b unix:///run/redmine/redmine.sock?umask=0007
в таком случае придётся добавить прокси в группу пользователя владеющего redmine, но зато доступ к сокету для others будет закрыт. Хочу отметить, что когда создаётся tcp сокет он в любом случае доступен всем, так что не вижу ничего опасного в открытом unix сокете.
2) Кроме puma, существует ещё webrick, unicorn, thin, тот же пресловутый passenger который описан чуть более чем везде. puma самый популярный и рекомендуемый, поэтому я его и включил в это руководство.
3) в данном руководстве, единственное для чего может потребоваться root - это прокси.
4) Если вы по какой-то причине не хотите создавать "юзерский" юнит для systemd, создайте системный в /etc/systemd/system но укажите User=, Group= нашего пользователя в контексте [Service]. То же самое касается дистрибутивов где нет systemd. Вам придётся написать инит файл самостоятельно и указать там запуск от имени простого пользователя.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Последний раз редактировалось kasak 23.01.2025 13:52, всего редактировалось 1 раз.
Linux kasakoff 6.10.11-200.fc40.x86_64 #1 SMP PREEMPT_DYNAMIC Wed Sep 18 21:09:58 UTC 2024 x86_64 GNU/Linux
Спасибо сказали:
Аватара пользователя
SwapON
Сообщения: 217
ОС: Gentoo Xfce4

Re: Как установить Redmine правильно.

Сообщение SwapON »

С полгода назад был собес в одну шарагу "Рога и копыта". Дали тестовое - развернуть редмайн + по возможности вывалить это в мир (публичный доступ), прислюнявить сертфикат + постфикс с гуем для уведомлений и ещё что-то.

Будь у меня тогда такой ман, мне сократило бы время на тестовое как минимум день, так как сейчас не вспомню точно с чем, возможно как раз с установкой руби и столкнулся. Из-за чего долго не мог понять почему взлетал редмайн с ошибками. По итогу на каком-то из сайтов наткнулся на решение.

В любом случае чувак, ты кросссафффчЕГ...!
Спасибо сказали: