Я хочу раз и навсегда сделать один НОРМАЛЬНЫЙ мануал по установке redmine. С полным объяснением происходящего, т.к. больше нигде подробно об этом не описано, либо описано, но устарело. Я скорее опишу как не совершать ошибок, потому что сам их уже не раз совершил и хочу чтоб другие этого не делали.
RVM:
Внимание: ВСЕ указанные команды должны выполнятся от имени простого не-root пользователя. Если потребуется запуск чего-то от root, об этом будет указано отдельно!
Я буду устанавливать redmine на archlinux. Но на самом деле это не имеет никакого значения, т.к. кроме выбора базовых пакетов, всё остальное будет одинаково для любой системы.
Первую ошибку, которую может совершить не шарящий в руби человек, это установить руби из системного менеджера пакетов.
Дело в том, что если установить руби из системного менеджера пакетов, никак не получится установить часть гемов в юзерскую папку; Часть из них по-любому захочет установиться в путь установки руби. Тем самым, нам придётся вызывать bundler из sudo, и мы замусорим системную папку компилированными гемами. Потом отличить компилированные от системных будет невозможно.
Именно поэтому, установку redmine да и вообще любого другого руби приложения надо производить через rvm.
rvm это что-то вроде "менеджера версий руби" который позволяет установить в юзерскую директорию любую версию руби.
Для установки rvm на арчлинукс и последующей компиляции руби нужно установить через pacman эти пакеты:
Код: Выделить всё
base-devel tar gzip diffutils git curl libyaml
Теперь можно скачать и установить rvm:
Shell
curl -sSL https://get.rvm.io | bash
Ruby:
Теперь нужно понять какую версию руби нам скомпилировать. Для этого скачиваем редмайн и распаковываем. На сегодняшний день актуальная версия редмайна 6.0.2, я распаковал её в /home/kasak/redmine-6.0.2
Внутри нам нужно заглянуть на самый верх файла Gemfile и увидеть там следующее:
Код: Выделить всё
source 'https://rubygems.org'
ruby '>= 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
Shell
rvm install 3.3.6
Теперь нужно создать конфиг для базы данных 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
Теперь переходите в директорию redmine-6.0.2 и создайте там файл Gemfile.local с содержимым:
Код: Выделить всё
gem "puma"
Теперь можно приступать к установке гемов:
Shell
bundle config set without 'development:test'
bundle install
Если всё прошло успешно - это хорошо. Если же нет - проверьте может быть нужно установить какой-нибудь системный пакет, которого не хватает для компиляции. Например забыли установить клиентскую часть mysql, если такая применяется. Честно говоря, я с таким не сталкивался, поэтому не могу сказать бывают ли другие ошибки при компиляции или нет.
После того как всё будет скомпилировано, нужно запустить пару команд:
Shell
bundle exec rake generate_secret_token
bundle exec rake db:migrate RAILS_ENV="production"
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
Мы можем точно так же успешно запустить пуму через указание этого файла:
Shell
puma -e production redmine-6.0.2/config.ru
Если вы увидели главную страницу redmine - ура! Всё получилось.
Можно нажимать Ctrl-C и продолжать дальше.
systemd:
А под "дальше" я подразумеваю создание юнита systemd для автоматического старта.
Я не буду создавать системный юнит а создам юзерский. Для этого сначала создаём папку
Shell
mkdir -p ~/.config/systemd/user
Код: Выделить всё
[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
- Самое главное тут это путь к пуме, обратите внимание что вызов пумы идёт через wrappers. Я уже упоминал выше, что rvm создаёт для нас "обертки". Они позволяют запускать программы без активации "окружения ruby", то есть без импорта переменных и переписывания PATH.
- /home/kasak можно заменить на %h. Я указал абсолютный путь для наглядности.
- обязательно указывайте ключ -e production, иначе пума будет пытаться запустится в окружении development
- -b unix:/// указывает unix сокет, к которому мы будем адресовать какой-нибудь прокси. Его следует вынести из /home/user, поскольку, обычно у домашних директорий права доступа не позволят прокси считать сокет. Если вы хотите разместить сокет там же, где я его разместил, следует сначала создать директорию /run/redmine, и дать ей права нашего пользователя. А можно разместить сокет в /tmp.
Shell
systemctl --user daemon-reload
systemctl --user enable --now redmine
Конечно можно назначить пуме порт 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" )) )
}
Дополнения:
1) Возможно вы захотите сделать небольшой hardening, и порезать права доступа у сокета пумы. Тогда после указания сокета укажите параметр umask:
Код: Выделить всё
-b unix:///run/redmine/redmine.sock?umask=0007
2) Кроме puma, существует ещё webrick, unicorn, thin, тот же пресловутый passenger который описан чуть более чем везде. puma самый популярный и рекомендуемый, поэтому я его и включил в это руководство.
3) в данном руководстве, единственное для чего может потребоваться root - это прокси.
4) Если вы по какой-то причине не хотите создавать "юзерский" юнит для systemd, создайте системный в /etc/systemd/system но укажите User=, Group= нашего пользователя в контексте [Service]. То же самое касается дистрибутивов где нет systemd. Вам придётся написать инит файл самостоятельно и указать там запуск от имени простого пользователя.