Пересборка лаунчера завершается ошибкой на этапе «bundle exec rake themes:update assets:precompile»

Я пытаюсь собрать новый образ Docker для Discourse, но, похоже, процесс завершается ошибкой на этапе миграции.

    I, [2020-12-15T15:02:28.688540 #1] INFO -- : > cd /var/www/discourse && su discourse -c 'bundle exec rake db:migrate'

    I, [2020-12-15T15:04:19.530701 #1] INFO -- :

    I, [2020-12-15T15:04:19.530966 #1] INFO -- : > cd /var/www/discourse && su discourse -c 'bundle exec rake themes:update assets:precompile'

    Очистка временных файлов

    Сборка ресурсов

    I, [2020-12-15T15:04:36.448680 #374] INFO -- : Запись /var/www/discourse/public/assets/vendor-bdb3fefe8aefde7bf6aef331a6edd24482502b370ed9f6f299836c72ee6a843c.js

    I, [2020-12-15T15:04:43.818563 #374] INFO -- : Запись /var/www/discourse/public/assets/admin-073db5e5695d9f3834b9ad41d66ef30a02b9ca85fc9c95f272257ea9c7a67f21.js

    I, [2020-12-15T15:04:43.822864 #374] INFO -- : Запись /var/www/discourse/public/assets/browser-detect-115ab5953de1b5bb122bfb26b757f5391dd8d1d2aef2b81baf7b59aee99d9f34.js
.
.
.
.
.
.
.
.
.
.
.

    35:M 15 Dec 2020 15:06:27.009 * 10 изменений за 300 секунд. Сохранение...

    35:M 15 Dec 2020 15:06:27.010 * Фоновое сохранение запущено процессом с pid 1066

    1066:C 15 Dec 2020 15:06:27.010 # Не удалось открыть файл RDB dump.rdb (в корневой директории сервера /pups) для сохранения: Отказано в доступе

    35:M 15 Dec 2020 15:06:27.110 # Ошибка фонового сохранения

    35:M 15 Dec 2020 15:06:33.020 * 10 изменений за 300 секунд. Сохранение...

    35:M 15 Dec 2020 15:06:33.020 * Фоновое сохранение запущено процессом с pid 1067

    1067:C 15 Dec 2020 15:06:33.020 # Не удалось открыть файл RDB dump.rdb (в корневой директории сервера /pups) для сохранения: Отказано в доступе

    35:M 15 Dec 2020 15:06:33.121 # Ошибка фонового сохранения

    35:M 15 Dec 2020 15:06:39.030 * 10 изменений за 300 секунд. Сохранение...

    35:M 15 Dec 2020 15:06:39.031 * Фоновое сохранение запущено процессом с pid 1068

    1068:C 15 Dec 2020 15:06:39.031 # Не удалось открыть файл RDB dump.rdb (в корневой директории сервера /pups) для сохранения: Отказано в доступе

    35:M 15 Dec 2020 15:06:39.131 # Ошибка фонового сохранения

    gzip -f -c -9 /var/www/discourse/public/assets/application-42d4413fabab7a4b12e0c25fb01f736af560aa283089071a8493f37c9b042a4a.js > /var/www/discourse/public/assets/application-42d4413fabab7a4b12e0c25fb01f736af560aa283089071a8493f37c9b042a4a.js.gz

    brotli -f --quality=11 /var/www/discourse/public/assets/application-42d4413fabab7a4b12e0c25fb01f736af560aa283089071a8493f37c9b042a4a.js --output=/var/www/discourse/public/assets/application-42d4413fabab7a4b12e0c25fb01f736af560aa283089071a8493f37c9b042a4a.js.br

    35:M 15 Dec 2020 15:06:45.041 * 10 изменений за 300 секунд. Сохранение...

    35:M 15 Dec 2020 15:06:45.042 * Фоновое сохранение запущено процессом с pid 1072

    1072:C 15 Dec 2020 15:06:45.042 # Не удалось открыть файл RDB dump.rdb (в корневой директории сервера /pups) для сохранения: Отказано в доступе

    35:M 15 Dec 2020 15:06:45.142 # Ошибка фонового сохранения

    Сжатие файла application-42d4413fabab7a4b12e0c25fb01f736af560aa283089071a8493f37c9b042a4a.js завершено: 25.87 сек

    Сжатие всех JS-файлов завершено: 83.62 сек

    Начало компиляции CSS: 2020-12-15 15:06:49 UTC

    Компиляция CSS для темы по умолчанию 2020-12-15 15:06:49 UTC

    Цель precompile: Desktop Dark

    35:M 15 Dec 2020 15:06:51.051 * 10 изменений за 300 секунд. Сохранение...

    35:M 15 Dec 2020 15:06:51.051 * Фоновое сохранение запущено процессом с pid 1074

    1074:C 15 Dec 2020 15:06:51.051 # Не удалось открыть файл RDB dump.rdb (в корневой директории сервера /pups) для сохранения: Отказано в доступе

    35:M 15 Dec 2020 15:06:51.151 # Ошибка фонового сохранения

    rake aborted!

    Redis::CommandError: ERR Error running script (call to f_45fe64238f6598e6c505af0aad74b4e178e891f4): @user_script:14: @user_script: 14: -MISCONF Redis is configured to save RDB snapshots, but it is currently not able to persist on disk. Commands that may modify the data set are disabled, because this instance is configured to report errors during writes if RDB snapshotting fails (stop-writes-on-bgsave-error option). Please check the Redis logs for details about the RDB error.

    /var/www/discourse/vendor/bundle/ruby/2.7.0/gems/redis-4.2.5/lib/redis/client.rb:132:in `call'

    /var/www/discourse/vendor/bundle/ruby/2.7.0/gems/rack-mini-profiler-2.2.0/lib/mini_profiler/profiling_methods.rb:85:in `block in profile_method'

    /var/www/discourse/vendor/bundle/ruby/2.7.0/gems/redis-4.2.5/lib/redis.rb:2585:in `block in _eval'

    /var/www/discourse/vendor/bundle/ruby/2.7.0/gems/redis-4.2.5/lib/redis.rb:69:in `block in synchronize'

    /var/www/discourse/vendor/bundle/ruby/2.7.0/gems/redis-4.2.5/lib/redis.rb:69:in `synchronize'

    /var/www/discourse/vendor/bundle/ruby/2.7.0/gems/redis-4.2.5/lib/redis.rb:2584:in `_eval'

    /var/www/discourse/vendor/bundle/ruby/2.7.0/gems/redis-4.2.5/lib/redis.rb:2636:in `evalsha'

    /var/www/discourse/vendor/bundle/ruby/2.7.0/gems/message_bus-3.3.4/lib/message_bus/backends/redis.rb:425:in `cached_eval'

    /var/www/discourse/vendor/bundle/ruby/2.7.0/gems/message_bus-3.3.4/lib/message_bus/backends/redis.rb:144:in `publish'

    /var/www/discourse/vendor/bundle/ruby/2.7.0/gems/message_bus-3.3.4/lib/message_bus.rb:382:in `publish'

    /var/www/discourse/vendor/bundle/ruby/2.7.0/gems/message_bus-3.3.4/lib/message_bus/distributed_cache.rb:80:in `publish'

    /var/www/discourse/vendor/bundle/ruby/2.7.0/gems/message_bus-3.3.4/lib/message_bus/distributed_cache.rb:90:in `set'

    /var/www/discourse/vendor/bundle/ruby/2.7.0/gems/message_bus-3.3.4/lib/message_bus/distributed_cache.rb:135:in `[]='

    /var/www/discourse/app/models/theme.rb:142:in `get_set_cache'

    /var/www/discourse/app/models/theme.rb:158:in `components_for'

    /var/www/discourse/app/models/theme.rb:185:in `block in transform_ids'

    /var/www/discourse/app/models/theme.rb:142:in `get_set_cache'

    /var/www/discourse/app/models/theme.rb:177:in `transform_ids'

    /var/www/discourse/app/models/theme.rb:371:in `list_baked_fields'

    /var/www/discourse/app/models/theme.rb:367:in `resolve_baked_field'

    /var/www/discourse/lib/stylesheet/manager.rb:423:in `color_scheme_digest'

    /var/www/discourse/lib/stylesheet/manager.rb:361:in `digest'

    /var/www/discourse/lib/stylesheet/manager.rb:339:in `stylesheet_filename'

    /var/www/discourse/lib/stylesheet/manager.rb:300:in `source_map_filename'

    /var/www/discourse/lib/stylesheet/manager.rb:251:in `compile'

    /var/www/discourse/lib/stylesheet/manager.rb:169:in `block (2 levels) in precompile_css'

    /var/www/discourse/lib/stylesheet/manager.rb:162:in `each'

    /var/www/discourse/lib/stylesheet/manager.rb:162:in `block in precompile_css'

    /var/www/discourse/lib/stylesheet/manager.rb:161:in `each'

    /var/www/discourse/lib/stylesheet/manager.rb:161:in `precompile_css'

    /var/www/discourse/lib/tasks/assets.rake:54:in `block (2 levels) in <main>'

    /var/www/discourse/vendor/bundle/ruby/2.7.0/gems/rails_multisite-2.5.0/lib/rails_multisite/connection_management.rb:76:in `with_connection'

    /var/www/discourse/vendor/bundle/ruby/2.7.0/gems/rails_multisite-2.5.0/lib/rails_multisite/connection_management.rb:86:in `each_connection'

    /var/www/discourse/lib/tasks/assets.rake:47:in `block in <main>'

    /var/www/discourse/lib/tasks/assets.rake:331:in `block in <main>'

    /var/www/discourse/vendor/bundle/ruby/2.7.0/gems/rake-13.0.1/exe/rake:27:in `<top (required)>'

    /usr/local/bin/bundle:23:in `load'

    /usr/local/bin/bundle:23:in `<main>'

    Задачи: TOP => assets:precompile:css

    (Полный трассировочный отчет можно получить, запустив задачу с флагом --trace)

    I, [2020-12-15T15:06:53.012968 #1] INFO -- : Загрузка MaxMindDB...

    Сжатие JavaScript и генерация карт исходного кода

    I, [2020-12-15T15:06:53.013385 #1] INFO -- : Завершение асинхронных процессов

    I, [2020-12-15T15:06:53.013424 #1] INFO -- : Отправка сигнала TERM процессу exec chpst -u redis -U redis /usr/bin/redis-server /etc/redis/redis.conf pid: 35

    35:signal-handler (1608044813) Получен сигнал SIGTERM, планирование завершения работы...

    35:M 15 Dec 2020 15:06:53.054 # Пользователь запросил завершение работы...

    35:M 15 Dec 2020 15:06:53.054 * Сохранение финального снимка RDB перед выходом.

    35:M 15 Dec 2020 15:06:53.054 # Не удалось открыть файл RDB dump.rdb (в корневой директории сервера /pups) для сохранения: Отказано в доступе

    35:M 15 Dec 2020 15:06:53.054 # Ошибка при попытке сохранения базы данных, выход невозможен.

    35:M 15 Dec 2020 15:06:53.054 # Получен сигнал SIGTERM, но при попытке завершения работы сервера возникли ошибки; проверьте логи для получения дополнительной информации

    35:M 15 Dec 2020 15:06:57.060 * 10 изменений за 300 секунд. Сохранение...

    35:M 15 Dec 2020 15:06:57.060 * Фоновое сохранение запущено процессом с pid 1078

    1078:C 15 Dec 2020 15:06:57.061 # Не удалось открыть файл RDB dump.rdb (в корневой директории сервера /pups) для сохранения: Отказано в доступе

    35:M 15 Dec 2020 15:06:57.161 # Ошибка фонового сохранения

    I, [2020-12-15T15:07:03.014092 #1] INFO -- : exec chpst -u redis -U redis /usr/bin/redis-server /etc/redis/redis.conf pid:35 не завершился корректно, принудительное завершение!

    НЕ УДАЛОСЬ

    --------------------

    Pups::ExecError: cd /var/www/discourse && su discourse -c 'bundle exec rake themes:update assets:precompile' завершился с ошибкой, код возврата #<Process::Status: pid 372 exit 1>

    Место возникновения ошибки: /pups/lib/pups/exec_command.rb:112:in `spawn'

    exec завершился с ошибкой с параметрами {"cd"=>"$home", "hook"=>"assets_precompile", "cmd"=>["su discourse -c 'bundle exec rake themes:update assets:precompile'"]}

    be9c92f00a4814e5e9ebcdb06f25232b03f7522390b97c157085c2f7ef7f3387

    ** СБОЙ ПРИ ЗАПУСКЕ ** Пожалуйста, прокрутите вверх и поищите более ранние сообщения об ошибках; их может быть несколько.

    Кратко: я вижу следующую ошибку

    68:C 15 Dec 2020 15:06:39.031 # Не удалось открыть файл RDB dump.rdb (в корневой директории сервера /pups) для сохранения: Отказано в доступе

    35:M 15 Dec 2020 15:06:39.131 # Ошибка фонового сохранения

    35:M 15 Dec 2020 15:06:51.051 * Фоновое сохранение запущено процессом с pid 1074

    1074:C 15 Dec 2020 15:06:51.051 # Не удалось открыть файл RDB dump.rdb (в корневой директории сервера /pups) для сохранения: Отказано в доступе

    35:M 15 Dec 2020 15:06:51.151 # Ошибка фонового сохранения

    rake aborted!

    Redis::CommandError: ERR Error running script (call to f_45fe64238f6598e6c505af0aad74b4e178e891f4): @user_script:14: @user_script: 14: -MISCONF Redis is configured to save RDB snapshots, but it is currently not able to persist on disk. Commands that may modify the data set are disabled, because this instance is configured to report errors during writes if RDB snapshotting fails (stop-writes-on-bgsave-error option). Please check the Redis logs for details about the RDB error.

Мой файл app.yaml выглядит следующим образом:

templates:
  - "templates/web.template.yml"
  - "templates/web.ratelimited.template.yml"
  - "templates/redis.template.yml"
env:
  LANG: en_US.UTF-8
  UNICORN_WORKERS: 8
  DISCOURSE_DB_USERNAME: discourse
  DISCOURSE_DB_PASSWORD: "xxxxx"
  DISCOURSE_DB_HOST: "xxxxx"
  DISCOURSE_REDIS_HOST: 127.0.0.1
  DISCOURSE_REDIS_PORT: "6379"
  DISCOURSE_DB_NAME:  discourse_prod_2
  DISCOURSE_DEVELOPER_EMAILS: 'xxxxxxx'
  DISCOURSE_HOSTNAME: 'localhost'
  DISCOURSE_DB_PORT: "5301"  
hooks:
  after_code:
    - exec:
        cd: $home/plugins
        cmd:
          - mkdir -p plugins
          - git clone https://github.com/discourse/docker_manager.git
          - git clone https://github.com/discourse/discourse-solved.git
          - git clone https://github.com/discourse/discourse-voting.git
          - git clone https://github.com/discourse/discourse-slack-official.git
          - git clone https://github.com/discourse/discourse-assign.git
run:
  - exec:
      cd: /var/www/discourse
      cmd:
        - sed -i 's/GlobalSetting.serve_static_assets/true/' config/environments/production.rb

Я скрыл пароль, имя хоста и адрес электронной почты в целях безопасности. Для Redis я запускаю отдельный контейнер Docker. Я могу подключиться к нему на localhost и указанном порту.

Пожалуйста, подскажите, чего мне не хватает.

Если вы запускаете его в отдельном контейнере, вам следует удалить строку

- "templates/redis.template.yml"

из вашего файла app.yml.

Ваш внешний Redis либо настроен неправильно, либо испытывает сильную нагрузку по ожиданию ввода-вывода, что и вызывает эту проблему. Вам необходимо устранить эту неполадку.

@Falco Даже когда я использую Redis по умолчанию, удалив из файла хост и порт Redis, я получаю ту же ошибку:

sets',url='/assets/application-42d4413fabab7a4b12e0c25fb01f736af560aa283089071a8493f37c9b042a4a.js.map'"

35:M 15 Dec 2020 16:43:25.078 * 10 изменений за 300 секунд. Сохранение...

35:M 15 Dec 2020 16:43:25.079 * Фоновое сохранение начато процессом с pid 1064

1064:C 15 Dec 2020 16:43:25.079 # Не удалось открыть файл RDB dump.rdb (в корневой директории сервера /pups) для сохранения: Отказано в доступе

35:M 15 Dec 2020 16:43:25.179 # Ошибка фонового сохранения

Pups::ExecError: cd /var/www/discourse && su discourse -c 'bundle exec rake themes:update assets:precompile' завершилась с ошибкой, код возврата #<Process::Status: pid 371 exit 1>

Место ошибки: /pups/lib/pups/exec_command.rb:112:in `spawn'

exec завершился с ошибкой с параметрами {"cd"=>"$home", "hook"=>"assets_precompile", "cmd"=>["su discourse -c 'bundle exec rake themes:update assets:precompile'"]}

d514879d2a044425c1e7d833dafb8196ae0a3026aa75119512349188531b2a5d

У вас нарушены права доступа к файлам. Redis не может открыть свой собственный дамп-файл.

@Falco, но это происходит внутри Docker-контейнера Discourse во время сборки образа. Как я могу это изменить?

Вы вернули шаблон Redis в файл app.yml?

Этот файл находится по пути /var/discourse/shared/standalone/redis_data/dump.rdb, имеет права доступа 644 и принадлежит пользователю с UID 106 и группой с GID 110.

Похоже, вы вручную изменили права доступа к этому файлу и, возможно, к другим файлам.

Я еще даже не собрал образ, поэтому до сих пор не понимаю, как он может измениться. Я добавил файл redis.template.yml в свой конфигурационный файл.

templates:
  - "templates/web.template.yml"
  - "templates/web.ratelimited.template.yml"
  - "templates/redis.template.yml"
env:
  LANG: en_US.UTF-8
  UNICORN_WORKERS: 8
  DISCOURSE_DB_USERNAME: discourse
  DISCOURSE_DB_PASSWORD: "xxxxx"
  DISCOURSE_DB_HOST: "xxxxx"
  DISCOURSE_DB_NAME:  discourse_prod_2
  DISCOURSE_DEVELOPER_EMAILS: 'xxxxxxx'
  DISCOURSE_HOSTNAME: 'localhost'
  DISCOURSE_DB_PORT: "5301"  
hooks:
  after_code:
    - exec:
        cd: $home/plugins
        cmd:
          - mkdir -p plugins
          - git clone https://github.com/discourse/docker_manager.git
          - git clone https://github.com/discourse/discourse-solved.git
          - git clone https://github.com/discourse/discourse-voting.git
          - git clone https://github.com/discourse/discourse-slack-official.git
          - git clone https://github.com/discourse/discourse-assign.git
run:
  - exec:
      cd: /var/www/discourse
      cmd:
        - sed -i 's/GlobalSetting.serve_static_assets/true/' config/environments/production.rb

Однако я запускаю ./launcher rebuild от имени root-пользователя. Может ли это как-то повлиять на ситуацию?

Теперь вам нужно вручную исправить разрешения для затронутого файла.

Проблема решена после сборки с использованием отдельных контейнеров для PostgreSQL и Redis и удаления строки "templates/redis.template.yml" из app.yml