Отсутствуют ресурсы Discourse

Привет,
Я установил Discourse на сервер Fedora 31, следуя рекомендованному руководству по установке, но использовал podman вместо docker для запуска контейнера. Утром всё прошло отлично при первоначальной настройке, однако у меня возникли проблемы с настройкой обычного HTTP-доступа к Nginx на хосте, и мне пришлось использовать SSL-сертификаты на обоих экземплярах Nginx. Я настроил Discourse, и всё работало нормально.
Позже я решил пересобрать Discourse с отключённым SSL и выполнить сборку от имени пользователя без прав root. Обычный HTTP-доступ к хосту работал корректно, но я получил белый экран (заголовок отображался, иконка сайта тоже).


Я проверил каталог внутри контейнера:

root@xena-app:/var/www/discourse# ls public/assets -al
total 15640
drwxr-xr-x. 2 discourse discourse      10 Jan 11 13:54 .
drwxr-xr-x. 3 discourse discourse      29 Jan 11 13:57 ..
-rw-r--r--. 1 discourse discourse     595 Jan 11 13:49 _activate-account-7a1f8d46287194007ee607f79af56217e6e6238e4ca159c5da6974005a1254c5.js
-rw-r--r--. 1 discourse discourse     250 Jan 11 13:54 activate-account-7a1f8d46287194007ee607f79af56217e6e6238e4ca159c5da6974005a1254c5.js.br
-rw-r--r--. 1 discourse discourse     420 Jan 11 13:54 activate-account-7a1f8d46287194007ee607f79af56217e6e6238e4ca159c5da6974005a1254c5.js.gz
-rw-r--r--. 1 discourse discourse     695 Jan 11 13:54 activate-account-7a1f8d46287194007ee607f79af56217e6e6238e4ca159c5da6974005a1254c5.js.map
-rw-r--r--. 1 discourse discourse  990519 Jan 11 13:50 _admin-91c2a24a61c0ecd0200db1e808dbadafb9f0f1bb5179acea5b2b7dbd4b4cc5f9.js
-rw-r--r--. 1 discourse discourse   83903 Jan 11 13:54 admin-91c2a24a61c0ecd0200db1e808dbadafb9f0f1bb5179acea5b2b7dbd4b4cc5f9.js.br
-rw-r--r--. 1 discourse discourse  106465 Jan 11 13:54 admin-91c2a24a61c0ecd0200db1e808dbadafb9f0f1bb5179acea5b2b7dbd4b4cc5f9.js.gz
-rw-r--r--. 1 discourse discourse  366446 Jan 11 13:54 admin-91c2a24a61c0ecd0200db1e808dbadafb9f0f1bb5179acea5b2b7dbd4b4cc5f9.js.map
drwxr-xr-x. 2 discourse discourse    4096 Jan 11 13:54 admin-login
...

Запрашиваемые файлы действительно отсутствуют, и Nginx подтверждает это:

2020/01/11 13:59:49 [error] 60#60: *20 open() "/var/www/discourse/public/assets/plugins/poll-57c9059384e3daeaee3d974c985d85a2b8462bb2629eb0b1834451056d1e1459.js" failed (2: No such file or directory), client: 10.0.2.2, server: _, request: "GET /assets/plugins/poll-57c9059384e3daeaee3d974c985d85a2b8462bb2629eb0b1834451056d1e1459.js HTTP/1.0", host: "idlerpg.xyz", referrer: "https://idlerpg.xyz/"

Я подумал, что проблема в моей установке, так как утром эти файлы были доступны в старой установке, выполненной от root на хосте! Я очистил общую папку и пересобрал систему от пользователя без прав root, но результат был тот же. Затем я попробовал снова, на этот раз от root с теми же настройками, что и утром, но столкнулся с теми же проблемами.
При установке от пользователя без прав root всегда отображается страница «Congratulations, you have installed Discourse!», но после завершения установки я получаю пустую страницу, так как файлы активов отсутствуют.

Есть ли способ исправить проблему с отсутствующими активами?

На случай, если кто-то сомневается, что это действительно сработало сегодня утром, вот скриншот с моего мобильного телефона


Discourse пока не позволяет использовать два изображения в одном сообщении :slight_smile:

Изменил это на баг. Не могу получить версию со всеми ассетами при сборке tests-passed. Пытался зайти в контейнер и выполнить rake assets:precompile, но те же ассеты всё равно отсутствуют.

Кажется, после кучи пересборок это вдруг заработало. Странно.

Привет, Adriany, добро пожаловать на форум!

Насколько мне известно, Docker является обязательным требованием, а не опцией. Где вы увидели это новое руководство по установке?

Я только что заменил Docker на Podman, всё работает отлично. Синтаксис их командной строки совместим.

Хорошо, после некоторых тестов я могу сказать, что после каждой пересборки всегда отображается пустая страница. Если я запускаю RAILS_ENV=production bin/rake assets:precompile, всё работает как надо. Не понимаю почему, ведь при пересборке они должны компилироваться в любом случае?

Вы видели эту тему и, в частности, этот пост о несовместимости Podman с Docker?

Ну, это действительно работает. Podman не должен влиять на то, какие файлы станут результатом начальной компиляции ассетов.

При компиляции ресурсов в процессе пересборки вы видите какие-либо трассировки стека в выводе?

Мы здесь, потому что что-то не работает. «Должно» и «работает» — это разные состояния.

Вы с уверенностью утверждаете, что Podman не имеет отношения к делу. Было бы хорошо доказать это, чтобы четко исключить его как фактор. Насколько я знаю, вы не завершили официальную установку с помощью Docker, чтобы проверить, устранит ли это проблему.

Да, у меня это получается.

I, [2020-01-12T20:58:31.800117 #1]  INFO -- : > cd /var/www/discourse && su discourse -c 'bundle exec rake assets:precompile'
Очистка временных файлов
Сборка ассетов
I, [2020-01-12T20:58:38.208107 #758]  INFO -- : Запись /var/www/discourse/public/assets/vendor-3b0a3ac5e0bc628422d6e99d3563fad4c474398644f70683eff0893b7a241513.js
I, [2020-01-12T20:59:02.428630 #758]  INFO -- : Запись /var/www/discourse/public/assets/admin-91c2a24a61c0ecd0200db1e808dbadafb9f0f1bb5179acea5b2b7dbd4b4cc5f9.js
I, [2020-01-12T20:59:02.447192 #758]  INFO -- : Запись /var/www/discourse/public/assets/preload-store-d32dcf974dddcac742f8a7a6aa7fcd686185920b201029d0ecb2b85527ef9034.js
I, [2020-01-12T20:59:02.707559 #758]  INFO -- : Запись /var/www/discourse/public/assets/browser-update-1741a2ed67a367faeb0a582af064457e8b1b1354e52e6efcf8bf26301166dec8.js
I, [2020-01-12T20:59:02.753632 #758]  INFO -- : Запись /var/www/discourse/public/assets/break_string-cc617154cd957804f2f6a1f3bc68258c9cdca3d4b9a322bf777d145fed04790e.js
I, [2020-01-12T20:59:04.073148 #758]  INFO -- : Запись /var/www/discourse/public/assets/ember_jquery-c2cca4a19fd4c70eabc95b010a6d7643955ec2a2251aeb1d70f625773eebea21.js
I, [2020-01-12T20:59:06.303026 #758]  INFO -- : Запись /var/www/discourse/public/assets/pretty-text-bundle-fa6ea00e2000bf2f9ed3f069be9253477fed5e7290b5d109a3e2d9498ac70e81.js
... [пропущено]
108798.339928812 Сжатие: vendor-3b0a3ac5e0bc628422d6e99d3563fad4c474398644f70683eff0893b7a241513.js
uglifyjs '/var/www/discourse/public/assets/_vendor-3b0a3ac5e0bc628422d6e99d3563fad4c474398644f70683eff0893b7a241513.js' -m -c -o '/var/www/discourse/public/assets/vendor-3b0a3ac5e0bc628422d6e99d3563fad4c474398644f70683eff0893b7a241513.js' --source-map "root='/assets',url='/assets/vendor-3b0a3ac5e0bc628422d6e99d3563fad4c474398644f70683eff0893b7a241513.js.map'" --output '/var/www/discourse/public/assets/vendor-3b0a3ac5e0bc628422d6e99d3563fad4c474398644f70683eff0893b7a241513.js'
gzip -f -c -9 /var/www/discourse/public/assets/vendor-3b0a3ac5e0bc628422d6e99d3563fad4c474398644f70683eff0893b7a241513.js > /var/www/discourse/public/assets/vendor-3b0a3ac5e0bc628422d6e99d3563fad4c474398644f70683eff0893b7a241513.js.gz

brotli -f --quality=11 /var/www/discourse/public/assets/vendor-3b0a3ac5e0bc628422d6e99d3563fad4c474398644f70683eff0893b7a241513.js --output=/var/www/discourse/public/assets/vendor-3b0a3ac5e0bc628422d6e99d3563fad4c474398644f70683eff0893b7a241513.js.br


Сжатие vendor-3b0a3ac5e0bc628422d6e99d3563fad4c474398644f70683eff0893b7a241513.js завершено: 3.33 сек

108801.669283898 Сжатие: admin-91c2a24a61c0ecd0200db1e808dbadafb9f0f1bb5179acea5b2b7dbd4b4cc5f9.js
uglifyjs '/var/www/discourse/public/assets/_admin-91c2a24a61c0ecd0200db1e808dbadafb9f0f1bb5179acea5b2b7dbd4b4cc5f9.js' -m -c -o '/var/www/discourse/public/assets/admin-91c2a24a61c0ecd0200db1e808dbadafb9f0f1bb5179acea5b2b7dbd4b4cc5f9.js' --source-map "root='/assets',url='/assets/admin-91c2a24a61c0ecd0200db1e808dbadafb9f0f1bb5179acea5b2b7dbd4b4cc5f9.js.map'" --output '/var/www/discourse/public/assets/admin-91c2a24a61c0ecd0200db1e808dbadafb9f0f1bb5179acea5b2b7dbd4b4cc5f9.js'
gzip -f -c -9 /var/www/discourse/public/assets/admin-91c2a24a61c0ecd0200db1e808dbadafb9f0f1bb5179acea5b2b7dbd4b4cc5f9.js > /var/www/discourse/public/assets/admin-91c2a24a61c0ecd0200db1e808dbadafb9f0f1bb5179acea5b2b7dbd4b4cc5f9.js.gz
[...]

Они действительно компилируются, но мне всегда приходится запускать процесс снова после сборки, чтобы появились отсутствующие файлы.

Интересно, значит, файлы создаются корректно, но проблема в сохранении данных?

Стоит разобраться, как работает том Podman и какой драйвер его поддерживает. В мире Docker за годы накопилось очень много странных проблем с драйверами хранилища, из-за чего мы даже стали вести список «одобренных» драйверов в нашем скрипте запуска.

Чтобы прояснить ситуацию: мои эксперименты с Podman были направлены на тестирование launcher, а не Discourse. По крайней мере, на момент моих тестов он зависел от деталей вывода Docker, которые Podman не пытается эмулировать.

@Adriany, я предполагаю, что вы используете драйвер хранилища по умолчанию, который также рекомендуется для Discourse и в Docker называется «overlay2», но я не могу утверждать это наверняка.

Я использую overlayfs, который является аналогом overlay2.
Интересно, что после нескольких сборок с отсутствующими ресурсами, когда я пытался добавить плагины, сборка прошла успешно, и никаких отсутствующих ресурсов не было. Когда я пересобрал без плагинов, всё прошло как по маслу. Как так?

Редактирование: У меня это работало, и теперь ресурсы закэшированы здесь. Однако во время работы система перестала работать у других пользователей.

Редактирование 2: Ещё одна пересборка привела к повреждению ресурсов, как и раньше, а решением стало повторение предыдущей пересборки.

Если файлы успешно создаются нашим конвейером ресурсов, а операционная система не сообщает об ошибках, но они исчезают после пересборки (что фактически приводит к перезапуску контейнера), я бы поставил (снова) на драйвер хранения Podman.

Если только кто-то не сможет воспроизвести такое же поведение с использованием Docker (и в таком случае было бы создано несколько тем), боюсь, вам нужно открыть тикет в проекте Podman по этому вопросу.

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

Все файлы возвращают ошибку 404, однако вот пример:

root@idlerpg:/var/www/discourse# find . -type f -name "*discourse-solved*"
./tmp/stylesheet-cache/discourse-solved_9_cb2984706f4402e95fd787160a5588ed0972ccc3.css
./tmp/stylesheet-cache/discourse-solved_9_cb2984706f4402e95fd787160a5588ed0972ccc3.css.map
./public/assets/plugins/_discourse-solved-5b7312e4207059eb2654a46e804b4c899cfc1e2a362d0d60e580943f9eb9d419.js
./public/assets/plugins/discourse-solved-5b7312e4207059eb2654a46e804b4c899cfc1e2a362d0d60e580943f9eb9d419.js.gz
./public/assets/plugins/discourse-solved-5b7312e4207059eb2654a46e804b4c899cfc1e2a362d0d60e580943f9eb9d419.js.br
./public/assets/plugins/discourse-solved-5b7312e4207059eb2654a46e804b4c899cfc1e2a362d0d60e580943f9eb9d419.js.map
./app/assets/javascripts/plugins/discourse-solved.js.erb
./plugins/discourse-solved/test/javascripts/acceptance/discourse-solved-test.js.es6

Они на месте, так что, похоже, это проблема Discourse, а не podman. Я просто не смог правильно найти файлы.

Я думал, что проблема может быть в Cloudflare, но когда я сделал быстрый запрос curl к localhost на сервере, я также получил ошибку 404.

Можете ли вы предоставить воспроизведение этой проблемы в Docker?