У Redmine и FreeBSD трудные отношения. На данный момент Redmine в пакетах FreeBSD отсутствует, а в портах присутствуют две версии, возня с которыми только отнимает время и занимает дисковое пространство. Найденные в сети гайды по установке redmine на FreeBSD давно устарели. Так что пришлось засучить рукава и действовать методом проб и ошибок. Успешным данный кейс стал не сразу, поэтому я и решил оставить сухой остаток для себя и последователей. Сразу оговорю, что цель данного поста - сэкономить время, а вовсе не научить кого-то тому, чего он раньше не знал. Для простоты в джейле все делалось от root, тем более что кроме 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. JID IP Address Hostname Path1 192.168.20.203 redmine /jails/redmine Итак, мы на месте. The package management tool is not yet installed on your system.Do you want to fetch and install it now? [y/N]: yBootstrapping 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:02Processing 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 Первым делом находим там ссылку на нужную версию и скачиваем ее. Распаковываем, размещаем в папку, где и будет в дальнейшем жить проект. Пусть это будет /opt/redmine Далее одной командой инсталлируем ruby и ruby-gems: Что насчет базы данных в джейле? Лично я на своем не самом крутом домашнем сервере держу насколько джейлов с разными сервисами, среди которых Home Assistant, Nextcloud, тот же Redmine и ряд других тестовых проектов. Держать в каждом джейле свою СУБД накладно, так что весь этот зоопарк ходит за данными на хост. Итак, пусть база данных и веб-прокси у нас будут на хосте, адрес которого для примера 192.168.20.138. А посему, инсталляцию сервера БД выносим за пределы данного поста, поднимаем сервер БД самостоятельно, затем создаем базу данных так, как это описано на сайте https://www.redmine.org/projects/redmine/wiki/RedmineInstall. Не забываем настроить сервер БД на прием подключения клиентов из локальной сети. Диаграммы Гаусса на данном этапе я оставил для эстетов и отказался от инсталляции всего, что касается работы с графикой, ImageMagic и GhostScript соответственно не ставил. После того, как СУБД взлетела и готова обслуживать базу, приступаем к следующему шагу: Еще раз удостоверяемся, что в /opt/redmine/config/database.yml все заполнено в соответствии с той базой данных, которую вы подняли, основываясь на указаниях отсюда: https://www.redmine.org/projects/redmine/wiki/RedmineInstall У меня это выглядит так: production:adapter: postgresqldatabase: redminehost: 192.168.20.138username: redminepassword: "xxxxxx"encoding: utf8 Не забываем скачать и установить клиент базы данных.В моем случае: Далее запускаем важную процедуру, которая скачает и установит rails и все необходимые gem-приложения, описанные в файле Gemfile. Последний аргумент в этой команде предписывает не ставить графический функционал, который требует наличия в системе ImageMagic и GhostScript. Следующая команда определяет правила работы с coockie, предотвращая возможность перехвата сессий. Теперь пришло время заполнить созданную ранее базу данных начальными значениями, если вы поднимали базу с нуля. После ввода второй команды система попросит ввести язык, на котором с вами будет общаться Redmine. Дальше самое интересное. Весь этот зоопарк, написанный на ruby on rails, чем-то надо отдавать по http. "Из коробки" в тот момент был доступен к установке только web-сервер puma. Все остальные обозначенные в документации сервера нужно разыскивать и ставить отдельно без всяких гарантий совместимости версий, что у Redmine сплошь и рядом. По дефолту puma находится в группе test, и поэтому автоматом не устанавливается. Чтобы это исправить надо разыскать в файле /opt/regmine/Gemfile строку gem 'puma', '< 6.0.0' и перенести ее в начало файла, разместив под строкой gem 'bundler', '>= 1.12.0' после чего повторить команду Теперь можно проверить, что у нас получилось. Если все правильно, вы увидите нечто вроде: => 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 после чего еще раз повторить уже известное заклинание: Но это еще не все. Чтобы демонизация заработала, нужно в директории /opt/redmine/config создать файл puma.rb, в котором должно содержаться как минимум следующее: #!/usr/bin/env pumaapplication_path = '/opt/redmine'directory application_pathenvironment 'production'require 'puma/daemon'daemonize trueport 3000workers 3threads 2,3pidfile "#{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" Запускаем еще раз: В результате должно появиться нечто вроде: => 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 Остановить демона можно командой С опциями start и restart соответственно запуск и рестарт, но работает только из директории приложения. Вуаля. В результате мы имеем созданный с нуля джейл с работающим Redmine 5.0.4, сервер БД при этом живет за пределами джейла. Собственно, ничто не мешает при необходимости запустить MySQL или MariaDB внутри джейла, а вот Postgres такого насилия над собой не любит, в клетке ему тоскливо. Теперь можно озаботиться отдачей Редмайна наружу через reverse proxy. Но это уже другая история.