У 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. Но это уже другая история.

Комментарии (2)


  1. Keeper9
    11.01.2023 14:16

    Зачем вообще решили использовать jail? Разве Redmine представляет опасность?


  1. chifth
    13.01.2023 09:32

    Предлагаю автору ещё больше сэкономить время и установить редмайн из маркета cbsd

    https://marketplace.bsdstore.ru/