Про Ruby, ищу учебный план и материалы

Хочу быстро всё узнать про Ruby. Как известно, наиболее скоростным методом изучения является чтение специально составленных монографий по теме (это важно, если монография не по теме, или версия описываемых программ не такая же, то магия не срабатывает).

Что Вы думаете по этой теме в 2023-м году. Как оцениваете перспективы направления в целом по сравнению с .Net Core, например, или с другими технологиями. А то бесплатный Ruby хостинг найти сложно (у меня не получилось). Я усиленно не хочу изучать PHP и Python, они не позволят понтоваться так, как Ruby.

Уверен, что в интернете должны быть викиучебники, на stackoverflow уже отвечен такой же вопрос, но пятнадцать лет назад, а в github висят списки “Awesome Ruby”.

Википедия:
https://en.wikipedia.org/wiki/Ruby_(programming_language)
https://ru.wikipedia.org/wiki/Ruby

Викиучебники:
https://ru.wikibooks.org/wiki/Ruby
https://en.wikibooks.org/wiki/Ruby_Programming

Stackoverflow
https://stackoverflow.com/questions/1548301/learning-ruby-where-do-i-start
https://stackoverflow.com/questions/12834074/can-anyone-advice-good-materials-for-studying-ruby-starting-from-the-very-begin

Awesome Ruby:
https://awesome-ruby.com/
https://github.com/search?q=awesome-ruby&type=repositories&s=forks&o=desc
https://github.com/markets/awesome-ruby
https://github.com/sdogruyol/awesome-ruby
https://github.com/gramantin/awesome-rails
https://github.com/hothero/awesome-rails-gem

Как видите, постить ссылки я могу не хуже чатбота. Проблема в том, чтобы всё это действительно прочитать…

Library Genesis #3710486
2023, Noel Rappin & Dave Thomas, Programming Ruby 3.2: The Pragmatic Programmers’ Guide [5 ed.], 450 pages, .pdf
изображение

А для чего тебе Руби, спросите Вы. Мне надо простые веб-приложения, и понимать как работает отправка почты. Не подумайте что спам, но мне надо уметь отправлять письма с запросом подтверждения почтового адреса, чтобы автоматизировать процесс восстановления пользователями паролей на сайте. Почта сама-по-себе отдельная дремучая тема, где много протоколов и стандартов. Да ещё и провайдер накладывает ограничения, чтобы не было спам-рассылок. А мне в программе надо обеспечить соблюдение этих ограничений. А значит надо иметь очередь отсылаемых сообщений, соблюдать интервалы рассылки писем, желательно ещё информировать пользователя - пора ли ему уже искать письмо, или оно ещё ждёт в очереди на стороне сайта. Такое информирование, сами понимаете, потребует особоизвращённой настройки HTTP/2 или HTTP/3 потому что только там push-уведомления сделаны не поллингом. А я всего этого совершенно не знаю. Debian, Apache, Postfix, Postgress, есличё.

Ну и просто мне хочется пофлудить. Пишите!

Про то, как пользоваться утилитой Bundle написано на страницах 251-257 книжки #3710486.
Там написано, какой консольной командой проинсталлировать гем с Bundle,
что редактировать в проекте,
«listing of all the gems in your application in a file called “Gemfile”.»
как запускать Bundle из командной строки.
У бандлера свой сайт:
https://bundler.io/
у репозитория гемов - свой:
https://rubygems.org/

Пришла в голову мысль, что нужно поискать форум конкретно по Ruby, чтобы прям вот русскоязычная коммьюнити была именно по нему.
Не нашел, только разделы на форумах общего характера:
https://www.cyberforum.ru/ruby/
https://forum.sources.ru/index.php?showforum=89
(последнее сообщение год назад)

Вы конечно скажете “шел бы ты на английский форум https://www.ruby-forum.com/ или https://discuss.rubyonrails.org/” и не парил бы нам мозги своей писаниной.
Я вам и сам много всего разного наговорить могу.

Непонятно, а какой собственно гем надо устанавливать для работы с почтой?

Поискал слово mail в гемах:
https://rubygems.org/search?query=mail

Там много всего, в частности:

mail 2.8.1 (429,024,064 Downloads)
Mail provides a nice Ruby DSL for making, sending and reading emails.

mail_daemon 0.1.0 (24,240 Downloads)
IMAP account daemon to watch for new mail and to execute a ruby block with data from me…

backgrounded_mail 0.1.0 (5,385 Downloads)
deliver email in background

mail_runner 0.2.0 (5,313 Downloads)
Gem for inbound mail via Postfix MTA. Creates separate worker process for delivery to app.

mail_generator 0.0.1 (4,196 Downloads)
Compile your mail templates to html/txt files

Не нашел, как отсортировать список по убыванию количества скачиваний.

ChatGPT рекомендует “mail”, “pony”, “actionmailer”

pony 1.13.1 (7,913,119 Downloads)
Send email in one command: Pony.mail(:to => ‘someone@example.com’, :body => ‘hello’)

actionmailer 7.0.5 (428,167,798 Downloads)
Email composition and delivery framework (part of Rails).

Что из этого нужно, а что нет,
я смогу узнать, рассмотрев исходные тексты проекта Discourse. Он же отправляет почту?

Файл почему-то называется Gemfile.lock, а не Gemfile.
Ага, “этот файл создаётся командой bundle install и фиксирует версии гемов, чтобы они не обновлялись без спроса”
и список там более 650 строк (671-13+1). Мне что, изучать, какие из этих пакетов для чего, чтобы отобрать нужные именно мне?

Так или иначе, actionmailer, mail в списке, pony - нет, выбывает из забега.

Дальше, наверное, надо почитать другую книжку, про Rails. Потому что в этой нет ничего про actionmailer.
«take a look at the online documentation at http://rubyonrails.org »

https://guides.rubyonrails.org/

«This guide provides you with all you need to get started in sending emails from your application, and many internals of Action Mailer.»
https://guides.rubyonrails.org/configuring.html#configuring-action-mailer

Думаю изучение с помощью хорошего наставника может быть продуктивнее. Вопрос только в его наличии или деньгах ) Есть сайты по поиску ментора типа мкдев.

Еще не знаю как сейчас, но раньше в сообществе Хекслета были люди/создатель шарящие по Руби (ну и собственно он на нем разрабатывается) и желающие делиться опытом. Возможно в их подканале по руби в тг чате до сих пор можно извлечь пользу, еще там есть опенсорс проекты, в которых можно попрактиковаться и получить фидбек.

Да и для PHP они обычно так себе )

Раньше Хероку был неплох для экспериментов и обучения (бесплатно с ограничением по часам в месяц), но уже убрали бесплатный план.

Или просто взять сервис типа Mailgun.
А чего за очередь если речь о просто подтверждении адреса? Сразу планируется регистрация сотни новых пользователей в минуту?)

Так смотря что делать надо. Если отправлять, то вряд ли нужны те, что про обработку в приложении полученных.
И например backgrounded_mail явно не живой уже, 13 лет назад последнее обновление.

discourse/Gemfile at main · discourse/discourse · GitHub

О! Стало в два с половиной раза хуже! Теперь надо не только два файла обработать (что было бы вдвое), но ещё и разбираться с разницей между содержимым файлов.

В Gemfile то, что прописали разработчики. В .lock - точные версии и зависимости. Обычно приложение напрямую использует в основном то, что в Gemfile.

В дебиане есть свой пакетный менеджер. В Руби - свой. Если я хочу сделать пакеты под каждый отдельный гем, значит мне придётся разобраться со всем этим деревом зависимостей, неважно в каком файле они записаны (и возможно ещё зависимости записаны в самих гемах, но я этого не знаю пока, потому что не разбирался, как у них сделаны манифесты).
Ну вот для того, чтобы определить какие должны стать версии у пакетов в дебиане и при каких сменах версий в Ruby надо менять версии в Debian - надо разобрать оба файла Gemfile и Gemfile.lock. И это не просто сделать в общем случае, учитывая что у них не какой-то конкретный синтаксис, а синтаксис самого руби. Конечно общий случай не всем нужен, но так-то можно и вообще ничего не делать, всегда отмазка найдётся. И мне уже что-то не хочется, если честно. (Это в предположении, если я захочу сделать пакет для Discourse под Debian “по высшим стандартам орлов”).

Зачем? Версии чего именно в Дебиане? Если например гем про Postgress требует какой-то определенной версии Postgress, то это будет в ридми гема. Но скорее всего там не будет больших сложностей с версиями и более-менее свежий Postgress будет работать с актуальными версиями гема.

А так вообще чтобы не париться многие используют Docker. Дискорс тоже.

Мне надо сосредоточиться на задаче. Хотя бы сформулировать её. Я не могу изучая Ruby отвлекаться на изучение Docker, они никак не связаны. Хотя было бы интересно найти скрипт (гиперссылку на него), которым в Docker собирается тот контейнер, который команда Discourse предлагает для распространения.

изображение
Library Genesis # 2466440
2020, Michael Hartl, The Ruby on Rails Tutorial (6th edition), 915 pages, .pdf
изображение
Library Genesis # 3420322
2022, Michael Hartl, The Ruby on Rails Tutorial (7th edition), .epub

Есть сайт с английским текстом:
https://www.railstutorial.org/book

Работа над русским переводом этой книги:
https://github.com/mhartl/rails_tutorial_translation/tree/russian
(брошена 11 лет назад)

Там сложно, много всего внутри и разные варианты настройки и использования.
GitHub - discourse/discourse_docker: A Docker image for Discourse

Чтоб просто получить докер с руби, веб-сервером и бд можно найти способы намного проще.

Так а задача-то какая?
Чтоб сделать веб-приложение с регистрацией и отправкой письма о подтверждении можно

  1. Изучать основы ruby/rails по любому учебнику/курсу.
  2. Где-то там же разобраться с любым вариантом как это приложение развернуть на сервере.
  3. Взять Mailgun для отправки писем. У них даже есть оф. обертка для руби GitHub - mailgun/mailgun-ruby: Mailgun's Official Ruby Library

Выше по топику есть три картинки двух книжек. Первая книжка по самому руби, вторая книжка как раз описывает, как сделать приложение, и там есть глава 11 про подтверждение по почте. Это покрывает предложенные тобой пункты 1 и 2. Поэтому тебе надо подождать, пока я это прочитаю и перепробую.

«to read 1365 pages, an average reader would need approximately 27-41 hours»
(это чистого времени, без сна, еды, дел и без экспериментов)

а задача-то какая?

Я сформулирую новые вопросы позже.

В книжке #3420322 деплоймент рассматривается на примере Heroku. Но у меня нет такой штуки.

И вот, вместо того, чтобы деплоить при помощи git, rsync, sftp или filezilla,
мне предлагают изучать какой-то Capistrano.

LOR:
2019, запуск resque через systemd-сервис и Capistrano
2013, ssh доступ только в определённую директорию и с ограниченными правами на vps
2013, Capistrano. Dont know how to build task.

Вы им пользуетесь? Или есть более правильные способы?

Ещё, вот, про какой-то Coolify говорят, что он опенсорсная альтернатива Heroku
Самостоятельный хостинг в 2023-м году

У пакетного менеджера операционной системы есть политика развёртывания web-приложений. Я опасаюсь, что использование capistrano или ansistrano не будет соблюдать политику операционной системы.

Дык это хостинг. Одну из подобных штук надо заиметь если не хочется заморачиваться с использованием своего компа как сервера.

Ну это по идее самый правильный способ потому что там описывается как разворачивать и т.д. свое приложение на сервере, и исчезают проблемы типа “через 2 года надо поменять сервер, а как приложение разворачивать забыл”. Ну и сам процесс быстрее, чем руками, соответственно можно заниматься этим как угодно часто без страха.

Я Ansible пользовался, он вроде проще. Но может Капистрано больше заточен под Руби.

А гит и т.д. скорее параллельно этому. Можно гитом запушить на сервер (или наоборот, сервером следить за репозиторием и забирать обновления) и после этого автоматически или вручную запустить ансибл/капистрано. Или запуском ансибла/капистрано проверять гит и продолжать если надо.

Насколько я понял:

  1. когда в проекте используется Capistrano, это видно в репозитории (оно туда встраивается) проекта;
  2. конкретно в репозитории discourse никакого Capfile нет в корне
    хотя есть какой-то пример:
    discourse/config/deploy.rb.sample at main · discourse/discourse · GitHub
  3. использование Capistrano удлиняет кривую обучения
    (у них прямо в документации написано: «Capistrano is a large project encompassing multiple GitHub repositories and a community of plugins, and it can be overwhelming when you are just getting started.»);
  4. использование Capistrano требует от системного администратора знания Ruby и Rake (~= «Ruby-make»), то есть изучать надо не только сам Capistrano, но и Rake, и Ruby (это вместо того, чтобы продеплоить какой-нибудь языково-нейтральной утилитой, в которой не надо этого ничего знать). Изучение Rake удлиняет кривую обучения дополнительно.

2013, David Celis, Deploying Discourse with Capistrano

В книге
2008, Noel Rappin, Professional Ruby on Rails (Programmer to Programmer), 457 страниц
Library Genesis # 567761
изображение

есть глава 12 про деплоймент:


плохо, только, что сама книга 2008-го года, старая («As of this writing, the current version (of Capistrano) is 2.1.0.»).

Ну там для простого приложения вроде бы всё просто, скрипт пару строк типа как тут Deploy Ruby On Rails to Ubuntu 22.04 Jammy Jellyfish (2023 Update) | GoRails

Но может неплохо было бы разобраться и как без него, для лучшего понимания процесса.
Только такие туториалы уже и найти сложно ))

Обучение работает не так.
Сначала нужно изучить основные концепции (составить список концепций, по каждой концепции подготовить текст).
А затем нужно описать конкретику по нужной версии (без конкретики, как мы помним, магия не работает).

Например, в книге # 567761 на странице 325 рассказывается про концепцию «Multistage Deployment», и там предлагается установить для этого гем «capistrano-ext». Фича мне понравилось, хочу так же. Но там старая, вторая версия Capistrano. Надо найти текст про версию 3, чтобы узнать - нужно это делать или не нужно.

Я не говорю, что это нужно делать тебе вместо меня. Я говорю, что для меня описанная ситуация представляет сложность.

Релиз Capistrano 3.0.0 был 2013-10-08:
https://github.com/capistrano/capistrano/releases/tag/3.0.0
(знание этой даты нужно для того, чтобы понимать, по какой версии были написаны заметки и туториалы)

Например:
2013-09-23, Jakob Lægdsmand, Multi-stage deployment with capistrano
https://jakoblaegdsmand.com/en/blog/multi-stage-deployment-with-capistrano/
написана по версии 2, потому что дата меньше.

узнал о существовании тега capistrano3 на stackoverflow:
https://stackoverflow.com/questions/24829187/capistrano-3-how-to-have-deploy-to-location-in-different-stages

А вот статья после релиза:
https://semaphoreci.com/blog/2013/11/26/capistrano-3-upgrade-guide.html
«Capistrano 2 didn’t have support for multistage configurations so you had to also use capistrano-ext gem. Capistrano 3 has multistage setup included. It is framework agnostic so you would have to use capistrano-rails gem which adds support for deploying Rails applications.»

Capistrano 2:

group :development do
  gem "capistrano"
  gem "capistrano-ext"
end

Capistrano 3:

group :development do
  gem "capistrano-rails"
end

А у меня такого гема нет:
$ gem list | grep “capistrano”
capistrano (3.17.2)
и в дебиане его нет (я имею в виду нет пакета capistrano-rails):
https://packages.debian.org/search?keywords=capistrano&searchon=names&suite=stable&section=all

«If you deploy Rails, you wil also need capistrano-rails and capistrano-bundler gems (Rails and Bundler integrations were moved out from Capistrano 3).»

Значит его надо опакечивать…

Там ещё есть ссылка на официальный upgrade guide:
https://capistranorb.com/documentation/upgrading/

Но изучение какой-нибудь Джавы начинают же не с изучения неймспейсов, классов и чего там еще в их хеллоу ворлде нужно.
Можно сначала просто повторить по примеру и получить задеплоенное приложение, а потом уже разбираться глубже с деплоем если надо.

Так это список установленных.
Поиск среди всех существующих это search.

Я не могу устанавливать в обход пакетного менеджера операционной системы, иначе партия не выдаст мне ласковый кошкожена.

Да там вроде много чего популярного нет. А этого нет даже в AUR Arch.
Устанавливать библиотеки языка через пакеты ОС это путь боли с непонятными преимуществами :donald:. Не получится использовать разные версии в разных проектах (например, надо что-то исправить в старом проекте и оказывается что новая версия не совместима со старым кодом) и не будет возможности легко получить новую версию пока ее не обновят в пакетах ОС, что может занимать много месяцев/лет. И еще тогда же не нужен/не используется Gemfile, сложно узнать что нужно проекту (надо документировать отдельно, но можно забыть это сделать).

У меня не получается настраивать Passenger. Я хочу использовать Apache (и не хочу использовать nginx), я хочу использовать Passenger (и не хочу использовать Puma), я хочу внутри одного VirtualHost на двух относительных путях запустить два приложения: /example1 и /пример2.

Я не понимаю, как убедить mod_passenger в том, что мне нужно два разных приложения. Кроме того, я бы хотел иметь возможность конфигурировать эти приложения не меняя конфигурацию Apache, однако начиная с версии Passenger 5.2 они перестали обрабатывать файл .htaccess (и теперь выдают ошибки) - Passenger 5.2.0: deterministic config, Ruby 2.5, fixed license warning

Что надо читать?

В каждую директорию (“application root”) я положил по файлу config.ru
(как написано здесь - How Passenger autodetects applications - Passenger Library )
но я не уверен в том, как именно работает autodetection.
Предлагают повписывать директиву PassengerAppRoot в каждый кусок <Directory> (или <Location> ?), но это как раз то, чего хотелось бы избежать - конфигурирование системных настроек апача.

Выглядит файл config.ru примерно так:

# This file is used by Rack-based servers to start the application.

require_relative "config/environment"

run Rails.application

Rails.application.load_server

Не получается у меня вписать директиву PassengerAppRoot, потому что некуда (в .htaccess нельзя после версии 5.2, в конфигурационный файл Apache нежелательно потому что нужны права админа-не-пользователя, а в файле config.ru ничего такого не указывается). А значение, передаваемое в эту директиву, позволяло указать директорию на диске, отличную от DirectoryRoot вебсайта. Например
PassengerAppRoot /usr/local/webapps/myapp/v1

Мой конфиг для Apache выглядит как-то так:

<IfModule mod_ssl.c>
<VirtualHost *:443>
    ServerName my.web.site
    DocumentRoot /var/www/my.web.site/htdocs

    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined

SSLCertificateFile /etc/letsencrypt/live/my.web.site/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/my.web.site/privkey.pem
Include /etc/letsencrypt/options-ssl-apache.conf

    PassengerRuby /usr/bin/ruby
    RailsEnv development
<Directory /var/www/my.web.site/htdocs>
    PassengerEnabled off
    Options -MultiViews
    Allow from all
    Require all granted
    AllowOverride All
</Directory>
<Location /example1>
    PassengerEnabled on
    PassengerBaseURI /example1
    PassengerAppRoot /var/www/my.web.site/htdocs/example1
</Location>
<Location /пример2>
    PassengerEnabled on
    PassengerBaseURI /пример2
    PassengerAppRoot /var/www/my.web.site/htdocs/пример2
</Location>
</VirtualHost>
</IfModule>

И если я из него убираю строки PassengerAppRoot ... то всё перестаёт работать, наличие config.ru не помогает.

Кроме того, хотя название с латинскими буквами работает, такое же с кириллическими буквами - не работает, выдаётся ошибка:

# Encoding::UndefinedConversionError

"\xD0" from ASCII-8BIT to UTF-8

Extracted source (around line **#90**):

88 89 90 91 92 93 end

open_v2 file.encode("utf-8"), mode, zvfs

if options[:strict]

disable_quirk_mode

`Rails.root: /var/www/my.web.site/htdocs/пример2`

[Application Trace](https://my.web.site/%d0%bf%d1%80%d0%b8%d0%bc%d0%b5%d1%802/#) | [Framework Trace](https://my.web.site/%d0%bf%d1%80%d0%b8%d0%bc%d0%b5%d1%802/#) | [Full Trace](https://my.web.site/%d0%bf%d1%80%d0%b8%d0%bc%d0%b5%d1%802/#)

`          
            sqlite3-1.6.3-x86_64 (linux) lib/sqlite3/database.rb:90:in `encode'
          
          
          
            sqlite3-1.6.3-x86_64 (linux) lib/sqlite3/database.rb:90:in `initialize'
          
          
          
            activerecord (7.0.5) lib/active_record/connection_adapters/sqlite3_adapter.rb:35:in `new'
          
          
          
            activerecord (7.0.5) lib/active_record/connection_adapters/sqlite3_adapter.rb:35:in `sqlite3_connection'
          
          
          
            activerecord (7.0.5) lib/active_record/connection_adapters/abstract/connection_pool.rb:656:in `public_send'
          
          
          
            activerecord (7.0.5) lib/active_record/connection_adapters/abstract/connection_pool.rb:656:in `new_connection'
          
          
          
            activerecord (7.0.5) 
lib/active_record/connection_adapters/abstract/connection_pool.rb:700:in
 `checkout_new_connection'
          
          
          
            activerecord (7.0.5) 
lib/active_record/connection_adapters/abstract/connection_pool.rb:679:in
 `try_to_checkout_new_connection'
          
          
          
            activerecord (7.0.5) lib/active_record/connection_adapters/abstract/connection_pool.rb:640:in `acquire_connection'
          
          
          
            activerecord (7.0.5) lib/active_record/connection_adapters/abstract/connection_pool.rb:341:in `checkout'
          
          
          
            activerecord (7.0.5) lib/active_record/connection_adapters/abstract/connection_pool.rb:181:in `connection'
          
          
          
            activerecord (7.0.5) 
lib/active_record/connection_adapters/abstract/connection_handler.rb:211:in
 `retrieve_connection'
          
          
          
            activerecord (7.0.5) lib/active_record/connection_handling.rb:313:in `retrieve_connection'
          
          
          
            activerecord (7.0.5) lib/active_record/connection_handling.rb:280:in `connection'
          
          
          
            activerecord (7.0.5) lib/active_record/migration.rb:613:in `connection'
          
          
          
            activerecord (7.0.5) lib/active_record/migration.rb:608:in `build_watcher'
          
          
          
            activerecord (7.0.5) lib/active_record/migration.rb:590:in `block in call'
          
          
          
            activerecord (7.0.5) lib/active_record/migration.rb:589:in `synchronize'
          
          
          
            activerecord (7.0.5) lib/active_record/migration.rb:589:in `call'
          
          
          
            actionpack (7.0.5) lib/action_dispatch/middleware/callbacks.rb:27:in `block in call'
          
          
          
            activesupport (7.0.5) lib/active_support/callbacks.rb:99:in `run_callbacks'
          
          
          
            actionpack (7.0.5) lib/action_dispatch/middleware/callbacks.rb:26:in `call'
          
          
          
            actionpack (7.0.5) lib/action_dispatch/middleware/executor.rb:14:in `call'
          
          
          
            actionpack (7.0.5) lib/action_dispatch/middleware/actionable_exceptions.rb:17:in `call'
          
          
          
            actionpack (7.0.5) lib/action_dispatch/middleware/debug_exceptions.rb:28:in `call'
          
          
          
            web-console (4.2.0) lib/web_console/middleware.rb:132:in `call_app'
          
          
          
            web-console (4.2.0) lib/web_console/middleware.rb:19:in `block in call'
          
          
          
            web-console (4.2.0) lib/web_console/middleware.rb:17:in `catch'
          
          
          
            web-console (4.2.0) lib/web_console/middleware.rb:17:in `call'
          
          
          
            actionpack (7.0.5) lib/action_dispatch/middleware/show_exceptions.rb:26:in `call'
          
          
          
            railties (7.0.5) lib/rails/rack/logger.rb:40:in `call_app'
          
          
          
            railties (7.0.5) lib/rails/rack/logger.rb:25:in `block in call'
          
          
          
            activesupport (7.0.5) lib/active_support/tagged_logging.rb:99:in `block in tagged'
          
          
          
            activesupport (7.0.5) lib/active_support/tagged_logging.rb:37:in `tagged'
          
          
          
            activesupport (7.0.5) lib/active_support/tagged_logging.rb:99:in `tagged'
          
          
          
            railties (7.0.5) lib/rails/rack/logger.rb:25:in `call'
          
          
          
            sprockets-rails (3.4.2) lib/sprockets/rails/quiet_assets.rb:13:in `call'
          
          
          
            actionpack (7.0.5) lib/action_dispatch/middleware/remote_ip.rb:93:in `call'
          
          
          
            actionpack (7.0.5) lib/action_dispatch/middleware/request_id.rb:26:in `call'
          
          
          
            rack (2.2.7) lib/rack/method_override.rb:24:in `call'
          
          
          
            rack (2.2.7) lib/rack/runtime.rb:22:in `call'
          
          
          
            activesupport (7.0.5) lib/active_support/cache/strategy/local_cache_middleware.rb:29:in `call'
          
          
          
            actionpack (7.0.5) lib/action_dispatch/middleware/server_timing.rb:61:in `block in call'
          
          
          
            actionpack (7.0.5) lib/action_dispatch/middleware/server_timing.rb:26:in `collect_events'
          
          
          
            actionpack (7.0.5) lib/action_dispatch/middleware/server_timing.rb:60:in `call'
          
          
          
            actionpack (7.0.5) lib/action_dispatch/middleware/executor.rb:14:in `call'
          
          
          
            actionpack (7.0.5) lib/action_dispatch/middleware/static.rb:23:in `call'
          
          
          
            rack (2.2.7) lib/rack/sendfile.rb:110:in `call'
          
          
          
            actionpack (7.0.5) lib/action_dispatch/middleware/host_authorization.rb:137:in `call'
          
          
          
            railties (7.0.5) lib/rails/engine.rb:530:in `call'
          
          
          
            /usr/lib/ruby/vendor_ruby/phusion_passenger/rack/thread_handler_extension.rb:107:in `process_request'
          
          
          
            
/usr/lib/ruby/vendor_ruby/phusion_passenger/request_handler/thread_handler.rb:149:in
 `accept_and_process_next_request'
          
          
          
            /usr/lib/ruby/vendor_ruby/phusion_passenger/request_handler/thread_handler.rb:110:in `main_loop'
          
          
          
            /usr/lib/ruby/vendor_ruby/phusion_passenger/request_handler.rb:419:in `block (3 levels) in start_threads'
          
          
          
            /usr/lib/ruby/vendor_ruby/phusion_passenger/utils.rb:113:in `block in create_thread_and_abort_on_exception'
          
          `

ChatGPT говорит, что где-то надо раскодировать как-то так:

require 'uri'

encoded_uri = 'http://example.com/%D0%BF%D1%80%D0%B8%D0%BC%D0%B5%D1%80'
decoded_uri = URI.decode_www_form_component(encoded_uri)
puts decoded_uri

Интересно, есть ли такая бага в багтрекере Passenger?
https://github.com/phusion/passenger/issues/1635
https://github.com/phusion/passenger/issues/1328

passenger-status выглядит как-то так:

/var/www/my.web.site/htdocs/example1# passenger-status
Version : 6.0.17
Date    : 2023-08-03 19:53:49 +0300
Instance: qaNZy29g (Apache/2.4.25 (Debian) Phusion_Passenger/6.0.17)

----------- General information -----------
Max pool size : 6
App groups    : 2
Processes     : 2
Requests in top-level queue : 0

----------- Application groups -----------
/var/www/my.web.site/htdocs/пример2 (development):
  App root: /var/www/my.web.site/htdocs/пример2
  Requests in queue: 0
  * PID: 28719   Sessions: 0       Processed: 6       Uptime: 1h 34m 28s
    CPU: 0%      Memory  : 108M    Last used: 14m 10s 

/var/www/my.web.site/htdocs/example1 (development):
  App root: /var/www/my.web.site/htdocs/example1
  Requests in queue: 0
  * PID: 28870   Sessions: 0       Processed: 6       Uptime: 1h 33m 31s
    CPU: 0%      Memory  : 90M     Last used: 1h 10m 5

То есть, несклолько процессов запустить удалось, но пользоваться этим нельзя из-за ошибок и неясностей с конфигурацией.