У Redmine и FreeBSD трудные отношения. На данный момент Redmine в пакетах FreeBSD отсутствует, а в портах присутствуют две версии, возня с которыми только отнимает время и занимает дисковое пространство. Найденные в сети гайды по установке redmine на FreeBSD давно устарели. Так что пришлось засучить рукава и действовать методом проб и ошибок. Успешным данный кейс стал не сразу, поэтому я и решил оставить сухой остаток для себя и последователей.
Сразу оговорю, что цель данного поста - сэкономить время, а вовсе не научить кого-то тому, чего он раньше не знал.
Для простоты в джейле все делалось от root, тем более что кроме redmine в нем ничего нет и не планировалось.
Итак, поднимаем джейл:
zfs create -o mountpoint=/jails zroot/jails
zfs create zroot/jails/redmine
bsdinstall jail /jails/redmine
В /etc/jail.conf добавляем (интерфейс и IP-адрес прописываем свои)
redmine {
host.hostname = "redmine";
path = "/jails/redmine/";
interface = "wlan0";
ip4.addr = 192.168.20.203;
mount.devfs;
devfs_ruleset = 4;
exec.start = "/bin/sh /etc/rc";
exec.stop = "/bin/sh /etc/rc.shutdown";
}
Запускаем джейл, логинимся по номеру JID.
service jail start redmine
jls
JID IP Address Hostname Path
1 192.168.20.203 redmine /jails/redmine
jexec 1 /bin/sh
Итак, мы на месте.
pkg update
The package management tool is not yet installed on your system.
Do you want to fetch and install it now? [y/N]: y
Bootstrapping pkg from pkg+http://pkg.FreeBSD.org/FreeBSD:13:amd64/quarterly, please wait...
Verifying signature with trusted certificate pkg.freebsd.org.2013102301... done
[redmine] Installing pkg-1.18.4...
[redmine] Extracting pkg-1.18.4: 100%
Updating FreeBSD repository catalogue...
[redmine] Fetching meta.conf: 100% 163 B 0.2kB/s 00:01
[redmine] Fetching packagesite.pkg: 100% 6 MiB 3.4MB/s 00:02
Processing entries: 100%
FreeBSD repository update completed. 32318 packages processed.
All repositories are up to date.
Дальше отправляемся за премудростями на сайт redmine.org
https://www.redmine.org/projects/redmine/wiki/RedmineInstall
Первым делом находим там ссылку на нужную версию и скачиваем ее.
fetch https://www.redmine.org/releases/redmine-5.0.4.tar.gz
Распаковываем, размещаем в папку, где и будет в дальнейшем жить проект. Пусть это будет /opt/redmine
mkdir /opt
tar xfvz redmine-5.0.4.tar.gz -C /opt
mv /opt/redmine-5.0.4/ /opt/redmine
Далее одной командой инсталлируем ruby и ruby-gems:
pkg install ruby30-gems
Что насчет базы данных в джейле? Лично я на своем не самом крутом домашнем сервере держу насколько джейлов с разными сервисами, среди которых Home Assistant, Nextcloud, тот же Redmine и ряд других тестовых проектов. Держать в каждом джейле свою СУБД накладно, так что весь этот зоопарк ходит за данными на хост. Итак, пусть база данных и веб-прокси у нас будут на хосте, адрес которого для примера 192.168.20.138. А посему, инсталляцию сервера БД выносим за пределы данного поста, поднимаем сервер БД самостоятельно, затем создаем базу данных так, как это описано на сайте https://www.redmine.org/projects/redmine/wiki/RedmineInstall. Не забываем настроить сервер БД на прием подключения клиентов из локальной сети.
Диаграммы Гаусса на данном этапе я оставил для эстетов и отказался от инсталляции всего, что касается работы с графикой, ImageMagic и GhostScript соответственно не ставил.
После того, как СУБД взлетела и готова обслуживать базу, приступаем к следующему шагу:
cd /opt/redmine
gem install bundler
Еще раз удостоверяемся, что в /opt/redmine/config/database.yml все заполнено в соответствии с той базой данных, которую вы подняли, основываясь на указаниях отсюда: https://www.redmine.org/projects/redmine/wiki/RedmineInstall
У меня это выглядит так:
cat database.yml
production:
adapter: postgresql
database: redmine
host: 192.168.20.138
username: redmine
password: "xxxxxx"
encoding: utf8
Не забываем скачать и установить клиент базы данных.
В моем случае:
pkg install postgresql13-client
Далее запускаем важную процедуру, которая скачает и установит rails и все необходимые gem-приложения, описанные в файле Gemfile.
bundle install --without development test rmagick
Последний аргумент в этой команде предписывает не ставить графический функционал, который требует наличия в системе ImageMagic и GhostScript.
Следующая команда определяет правила работы с coockie, предотвращая возможность перехвата сессий.
bundle exec rake generate_secret_token
Теперь пришло время заполнить созданную ранее базу данных начальными значениями, если вы поднимали базу с нуля. После ввода второй команды система попросит ввести язык, на котором с вами будет общаться Redmine.
RAILS_ENV=production bundle exec rake db:migrate
RAILS_ENV=production bundle exec rake redmine:load_default_data
Дальше самое интересное. Весь этот зоопарк, написанный на ruby on rails, чем-то надо отдавать по http. "Из коробки" в тот момент был доступен к установке только web-сервер puma. Все остальные обозначенные в документации сервера нужно разыскивать и ставить отдельно без всяких гарантий совместимости версий, что у Redmine сплошь и рядом. По дефолту puma находится в группе test, и поэтому автоматом не устанавливается. Чтобы это исправить надо разыскать в файле /opt/regmine/Gemfile строку
gem 'puma', '< 6.0.0'
и перенести ее в начало файла, разместив под строкой
gem 'bundler', '>= 1.12.0'
после чего повторить команду
bundle install --without development test rmagick
Теперь можно проверить, что у нас получилось.
bundle exec rails server -u puma -e production
Если все правильно, вы увидите нечто вроде:
=> Booting Puma=> Rails 6.1.7 application starting in production=> Run bin/rails server --help
for more startup optionsPuma starting in single mode...
Puma version: 5.6.5 (ruby 3.0.5-p211) ("Birdie's Version")
Min threads: 0
Max threads: 5
Environment: production
PID: 14769
Listening on http://192.168.20.203:3000Use Ctrl-C to stop
А в браузере по вышеуказанному адресу перед вами предстанет девственно чистый Redmine.
Использование Ctrl-C для остановки сервиса выглядит не вполне удобно, поэтому сразу возникает желание эту самую пуму демонизировать. Для этого существует еще одно gem-приложение, которое надо узаконить в GemFile, разместив над строкой
gem 'puma', '< 6.0.0'
такую строку
gem 'puma-daemon', require: false
после чего еще раз повторить уже известное заклинание:
bundle install --without development test rmagick
Но это еще не все. Чтобы демонизация заработала, нужно в директории /opt/redmine/config создать файл puma.rb, в котором должно содержаться как минимум следующее:
#!/usr/bin/env puma
application_path = '/opt/redmine'
directory application_path
environment 'production'
require 'puma/daemon'
daemonize true
port 3000
workers 3
threads 2,3
pidfile "#{application_path}/tmp/pids/puma.pid"
state_path "#{application_path}/tmp/pids/puma.state"
stdout_redirect "#{application_path}/log/puma.stdout.log", "#{application_path}/log/puma.stderr.log"
Запускаем еще раз:
bundle exec rails server -u puma -e production
В результате должно появиться нечто вроде:
=> Booting Puma
=> Rails 6.1.7 application starting in production
=> Run `bin/rails server --help` for more startup options
[14931] Puma starting in cluster mode...
[14931] * Puma version: 5.6.5 (ruby 3.0.5-p211) ("Birdie's Version")
[14931] * Min threads: 2
[14931] * Max threads: 3
[14931] * Environment: production
[14931] * Master PID: 14931
[14931] * Workers: 3
[14931] * Restarts: (✔) hot (✔) phased
[14931] * Listening on http://192.168.20.203:3000
Остановить демона можно командой
bundle exec pumactl --state /opt/redmine/tmp/pids/puma.state stop
С опциями start и restart соответственно запуск и рестарт, но работает только из директории приложения.
Вуаля. В результате мы имеем созданный с нуля джейл с работающим Redmine 5.0.4, сервер БД при этом живет за пределами джейла. Собственно, ничто не мешает при необходимости запустить MySQL или MariaDB внутри джейла, а вот Postgres такого насилия над собой не любит, в клетке ему тоскливо.
Теперь можно озаботиться отдачей Редмайна наружу через reverse proxy. Но это уже другая история.