Discourse のアップグレード問題

こんにちは、

Discourse のバージョンを v2.3.0.beta8 +212 から 2.4.0.beta1 にアップグレードしようとしています。

まず、Web UI から Docker マネージャーをアップグレードしました。その後、Web UI からコマンドラインでのアップグレードが必要との指示が出たため、それを実行しました。

アップグレード中に繰り返しエラーが発生しています。以下のコマンドを実行しています。

cd /var/discourse
./launcher rebuild app

数分間実行されますが、データベースのアップグレードで失敗します。サーバーを再起動すると Discourse は立ち上がりますが(アップグレードは完了せず)、再度試みましたが同じエラーが発生しました。

進行方法についてご助言いただけないでしょうか。

以下は、rebuild を実行した際の最後のログ出力です。

Optimizing site icons...
I, [2019-07-09T01:22:18.589503 #13]  INFO -- : Terminating async processes
I, [2019-07-09T01:22:18.589624 #13]  INFO -- : Sending INT to HOME=/var/lib/postgresql USER=postgres exec chpst -u postgres:postgres:ssl-cert -U postgres:postgres:ssl-cert /usr/lib/postgresql/10/bin/postmaster -D /etc/postgresql/10/main pid: 67
I, [2019-07-09T01:22:18.589816 #13]  INFO -- : Sending TERM to exec chpst -u redis -U redis /usr/bin/redis-server /etc/redis/redis.conf pid: 183
2019-07-09 01:22:18.589 UTC [67] LOG:  received fast shutdown request
183:signal-handler (1562635338) Received SIGTERM scheduling shutdown...
2019-07-09 01:22:18.593 UTC [67] LOG:  aborting any active transactions
2019-07-09 01:22:18.599 UTC [67] LOG:  worker process: logical replication launcher (PID 76) exited with exit code 1
2019-07-09 01:22:18.599 UTC [71] LOG:  shutting down
2019-07-09 01:22:18.629 UTC [67] LOG:  database system is shut down
183:M 09 Jul 2019 01:22:18.645 # User requested shutdown...
183:M 09 Jul 2019 01:22:18.645 * Saving the final RDB snapshot before exiting.
183:M 09 Jul 2019 01:22:18.672 * DB saved on disk
183:M 09 Jul 2019 01:22:18.672 # Redis is now ready to exit, bye bye...


FAILED
--------------------
Pups::ExecError: cd /var/www/discourse && su discourse -c 'bundle exec rake db:migrate' failed with return #<Process::Status: pid 366 exit 1>
Location of failure: /pups/lib/pups/exec_command.rb:112:in `spawn'
exec failed with the params {"cd"=>"$home", "hook"=>"db_migrate", "cmd"=>["su discourse -c 'bundle exec rake db:migrate'"]}
cbaaf74d12f5c22faf7f054d391f3570b5e7d8dd3b8bce421c57ef17c4b43c55
** FAILED TO BOOTSTRAP ** please scroll up and look for earlier error messages, there may be more than one

追記:フルログに含まれるエラーは以下のものだけです。

I, [2019-07-09T01:21:35.162142 #13]  INFO -- : > su postgres -c 'createdb discourse' || true
2019-07-09 01:21:35.330 UTC [80] postgres@postgres ERROR:  database "discourse" already exists
2019-07-09 01:21:35.330 UTC [80] postgres@postgres STATEMENT:  CREATE DATABASE discourse;
createdb: database creation failed: ERROR:  database "discourse" already exists
I, [2019-07-09T01:21:35.332706 #13]  INFO -- :
I, [2019-07-09T01:21:35.333101 #13]  INFO -- : > su postgres -c 'psql discourse -c "create user discourse;"' || true
2019-07-09 01:21:35.444 UTC [91] postgres@discourse ERROR:  role "discourse" already exists
2019-07-09 01:21:35.444 UTC [91] postgres@discourse STATEMENT:  create user discourse;
ERROR:  role "discourse" already exists

「Optimizing Site Icons…」の直後に処理が停止しているようですが、ここに問題があるのでしょうか?

"エラーロールディスコースはすでに存在します"と検索してみてください

その用語で検索しましたが、役立つ情報は見つかりませんでした。

  • いくつかの投稿でプラグインについて言及されていたため、app.yml でプラグインを無効化しました
  • Docker の非推奨バージョンに関するメッセージが表示されたため、Docker をアップグレードしました
  • discourse doctor を実行しました

同じエラーが発生します。

以下に、launch rebuild の出力を添付します。

次のステップについてご提案はありますか?

rebuild script.txt (140.9 KB)

私の app.xml には相対 URL ルートが設定されている点に注意が必要です。これがアップグレードを妨げている可能性があります。

env:
  DISCOURSE_RELATIVE_URL_ROOT: /epicenter/support

run:
  - exec: echo "カスタムコマンドの開始"

  - exec:
        cd: $home
        cmd:
          - mkdir -p public/epicenter/support
          - cd public/epicenter/support && ln -s ../../uploads && ln -s ../../backups
          - rm public/uploads
          - rm public/backups
  - replace:
       global: true
       filename: /etc/nginx/conf.d/discourse.conf
       from: proxy_pass http://discourse;
       to: |
          rewrite ^/(.*)$ /epicenter/support/$1 break;
          proxy_pass http://discourse;
  - replace:
       filename: /etc/nginx/conf.d/discourse.conf
       from: etag off;
       to: |
          etag off;
          location /epicenter/support {
             rewrite ^/epicenter/support/?(.*)$ /$1;
          }
  - replace:
         filename: /etc/nginx/conf.d/discourse.conf
         from: $proxy_add_x_forwarded_for
         to: $http_fastly_client_ip
         global: true

ついに、3 回目か 4 回目の作業セッションで動作させることができました。問題は「uploads」フォルダ内の画像が欠落していたことに起因しているように見えました。解決策は、新しいインストールを行い、同じ「app.yml」ファイルを使用し、欠落している画像のダミーファイルを含めてバックアップから復元することでした。

元の問題と並行して、以前のアップグレード後にさまざまなアイコンや画像が消失していることに気づきました。再構築を試みたところ、ログには「site images の最適化」の後にプロセスが終了したと表示されていました。おそらく、見逃された画像で処理が停止し、その特定のエラーを記録せずに終了してしまったのだと思います(欠落した画像が問題であることや、どの画像ファイルが欠落しているかを示す表示はありませんでした)。

最終的に、最新バージョンの新しい Discourse インストールを作成しました。バックアップから復元する際は、こちらの指示に従いました。3 回の試行で成功しました。

まず、バックアップスクリプトがアップロードされたファイルを探している際にエラーが発生したため、以前のバックアップファイルから「uploads/default」フォルダをコピーしました。

次に、復元スクリプトを再度実行しました。今回は、特定の画像ファイルが見つからないというエラーが表示されました。そのため、偽の画像ファイルを作成し、同じ名前で指定された場所に配置しました。

3 回目に復元スクリプトを実行すると、無事に完了しました!サイトはバックアップから復元され、最新バージョンで動作しています。