v2.7.0.beta1からv2.7.0.beta2へのアップグレードに失敗しました

この Gist をご覧ください:gist:86508bebb133a06f79fadaeba345e3d6 · GitHub

これは標準的なスタンドアロンの Discourse インストールで、v2.7.0.beta1 から v2.7.0.beta2 へのアップグレードを試みています。

エラーは以下の通りです:

uglifyjs '/var/www/discourse/public/assets/_vendor-b631d4ab0775fdbe453aa2158e18dc41826d0ba619e5f2731e5b9fa4c458af99.js' -m -c -o '/var/www/discourse/public/assets/vendor-b631d4ab0775fdbe453aa2158e18dc41826d0ba619e5f2731e5b9fa4c458af99.js' --source-map "base='/var/www/discourse/public/assets',root='/assets',url='/assets/vendor-b631d4ab0775fdbe453aa2158e18dc41826d0ba619e5f2731e5b9fa4c458af99.js.map'"
Parse error at _vendor-b631d4ab0775fdbe453aa2158e18dc41826d0ba619e5f2731e5b9fa4c458af99.js:1850,34
        return Handlebars.compile(...arguments);
                                  ^
ERROR: Unexpected token: punc «.»
    at JS_Parse_Error.get (eval at <anonymous> (/usr/lib/node_modules/uglify-js/tools/node.js:18:1), <anonymous>:71:23)
    at fatal (/usr/lib/node_modules/uglify-js/bin/uglifyjs:394:27)
    at run (/usr/lib/node_modules/uglify-js/bin/uglifyjs:343:9)
    at Object.<anonymous> (/usr/lib/node_modules/uglify-js/bin/uglifyjs:259:5)
    at Module._compile (internal/modules/cjs/loader.js:778:30)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:789:10)
    at Module.load (internal/modules/cjs/loader.js:653:32)
    at tryModuleLoad (internal/modules/cjs/loader.js:593:12)
    at Function.Module._load (internal/modules/cjs/loader.js:585:3)
    at Function.Module.runMain (internal/modules/cjs/loader.js:831:12)
rake aborted!
Errno::ENOENT: No such file or directory @ rb_file_s_size - /var/www/discourse/public/assets/vendor-b631d4ab0775fdbe453aa2158e18dc41826d0ba619e5f2731e5b9fa4c458af99.js
/var/www/discourse/lib/tasks/assets.rake:287:in `size'
/var/www/discourse/lib/tasks/assets.rake:287:in `block (4 levels) in <main>'
/var/www/discourse/lib/tasks/assets.rake:178:in `block in concurrent?'
/var/www/discourse/lib/tasks/assets.rake:278:in `block (3 levels) in <main>'
/var/www/discourse/lib/tasks/assets.rake:269:in `each'
/var/www/discourse/lib/tasks/assets.rake:269:in `block (2 levels) in <main>'
/var/www/discourse/lib/tasks/assets.rake:178:in `concurrent?'
/var/www/discourse/lib/tasks/assets.rake:266:in `block in <main>'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/rake-13.0.3/exe/rake:27:in `<top (required)>'
/usr/local/bin/bundle:23:in `load'
/usr/local/bin/bundle:23:in `<main>'
Tasks: TOP => assets:precompile
(See full trace by running task with --trace)
Docker Manager: FAILED TO UPGRADE

何か心当たりはありますか?その結果、サイトはオフラインになっています。よろしくお願いいたします。

それは少し気になりますね。ディスク容量不足や、それに類する問題はありませんか?

こんにちは、いいえ、ホスト側では 70GB の空き容量があり、inode の使用率は 1% だけです。

「ファイルまたはディレクトリが見つかりません」というエラーは、おそらく以下の現象の副作用だと思っていました。

Parse error at _vendor-b631d4ab0775fdbe453aa2158e18dc41826d0ba619e5f2731e5b9fa4c458af99.js:1850,34
        return Handlebars.compile(...arguments);
                                  ^
ERROR: Unexpected token: punc «.»

そのファイルは確かに存在します。

root@redmine:/var/discourse# ./launcher enter app
ls -al ls -al root@xxxxx-app:/var/www/discourse# ls -al /var/www/discourse/public/assets/vendor-b631d4ab0775fdbe453aa2158e18dc41826d0ba619e5f2731e5b9fa4c458af99.js
-rw-r--r-- 1 discourse www-data 659907 Jan 22 04:55 /var/www/discourse/public/assets/vendor-b631d4ab0775fdbe453aa2158e18dc41826d0ba619e5f2731e5b9fa4c458af99.js

わかりません。私自身、2つのセルフホストインスタンスを問題なくアップグレードしました。

不審なプラグイン、サードパーティ製のプラグイン、あるいは大規模なカスタマイズはありますか?

ありがとうございます。プラグインや大規模なカスタマイズは全くなく、2020 年末にほぼ新規インストールの状態でした。モデレーターの権限設定など、管理画面からごく minor な調整をしただけです。非常に奇妙ですね。

残念ながら、アップグレードを実行する前にバックアップを取得していませんでした。数日前に自動バックアップがいくつか残っていますので、それが今のところ唯一の解決策でしょうか。Ruby に詳しくないため、そのエラーの原因を特定する方法がわかりません。

ああ、データベーススキーマの更新が実行されたにもかかわらず、./launcher restart app を実行したおかげで、少なくともオンラインに戻ったようです。それ以前は、500 エラーを返していました。よかった。

プラグインディレクトリには以下のようなものが含まれています。これらはコアインストールに同梱されたものだと推測しています。自分で手動で追加した覚えはありません。

root@redmine-app:/var/www/discourse# ls -al plugins/
total 12
drwxr-xr-x 22 discourse discourse 4096 Nov  4 04:54 .
drwxr-xr-x 56 discourse discourse 4096 Jan 22 04:55 ..
drwxr-xr-x 13 discourse discourse   43 Nov  4 04:54 discourse-details
drwxr-xr-x 16 discourse discourse   54 Nov  4 04:54 discourse-local-dates
drwxr-xr-x 20 discourse discourse   69 Jan 22 04:55 discourse-narrative-bot
drwxr-xr-x 11 discourse discourse   59 Nov  4 04:54 discourse-presence
drwxr-xr-x 19 discourse root      4096 Jan 22 04:43 docker_manager
drwxr-xr-x  4 discourse discourse   51 Sep 28 05:11 lazy-yt
drwxr-xr-x 25 discourse discourse   99 Nov  4 04:54 poll
drwxr-xr-x  8 discourse www-data   129 Nov  4 04:54 styleguide

再起動後、サイトのテーマが少し壊れてしまっています。アセットのコンパイルが完了していなかったためかもしれません。手動で完了させる方法があるか気になります。

vendor.js ファイルで問題が指摘されている該当セクションは以下の通りです。

// allow us to import this as a module
if (typeof define !== "undefined") {
  define("handlebars", ["exports"], function (__exports__) {
    // It might not be defined server side, which is OK for pretty-text
    if (typeof Handlebars !== "undefined") {
      // eslint-disable-next-line
      __exports__.default = Handlebars;
      __exports__.compile = function () {
        // eslint-disable-next-line
        return Handlebars.compile(...arguments);
      };
    }
  });

  define("handlebars-compiler", ["exports"], function (__exports__) {
    // eslint-disable-next-line
    __exports__.default = Handlebars.compile;
  });
}
;

エラーが発生している 1850 行目はこの部分です。

        return Handlebars.compile(...arguments);

ここを回避するための一時的なハックなどはありますでしょうか?それとも、アップグレードを試すたびにこのファイルは生成されてしまうのでしょうか?(余談ですが、再起動後には「アップグレードが完了した」と認識されてしまうようです。しかし、テーマが壊れています。このステップを何らかの形で乗り越えられるか、あるいはバックアップから復元しなければならないのか、基本的にはそのあたりが知りたいです。)

そのコードの全体は、このファイルから来ています:

app/assets/javascripts/handlebars-shim.js

uglify-js が return Handlebars.compile(...arguments); を構文エラーとみなしているのでしょう。

理解できないのは、これがなぜ私のインストールに固有の問題なのかということです。これらはすべて Docker コンテナ内にあるはずです。

このコミットから反映されたものだと思いますか?DEV: Sync up more Ember CLI features (#11790) · discourse/discourse@83347ac · GitHub

OK — 理由はわかりませんが、手動アップグレード手順(git pull; ./launcher rebuild app)を実行したら問題なく動作しました。

その手動アップグレードの一部として、Postgres のアップグレードなど多くの他の処理も実行されました。

私の推測では、上記のコミットに含まれる何かが、元のコンテナ上の uglify-js や Rails のバージョンなどと互換性がなかったのでしょう。基本的には「手動」アップグレード手順を必要とするアップグレードだったようです。

Web 管理インターフェースで docker_manager と Discourse アプリ自体をアップグレードできたため、手動手順は不要だと考えていました(Web 管理からのアップグレードが不可能で手動で行う必要があると表示される場合もありますが、今回はそのような表示が出ませんでした。本来は出るべきだったかもしれません)。

いずれにせよ、ご支援いただきありがとうございます。

私も同じ現象が発生しました。Web アップグレードは「Unexpected token: punc」エラーで失敗しましたが、手動でのプルとビルドは正常に動作しました。

このアップデート(Web アップグレード)を実行しても同様の問題が発生しました :frowning:
以下のコマンドを実行後:
cd /var/discourse
git pull
./launcher rebuild app
Discourse は動作しますが、管理パネル(/admin)へのアクセスができません。

Ubuntu の更新により動作が復旧しました。

発表では、コマンドラインでの再ビルドが必要だとされていました。なぜ Web インターフェースがそれを強制する必要があることを認識しなかったのか、私はわかりません。

面白いことに、私も開発環境でその機能を使おうとしたのですが、うまく動作しませんでした… Handlebars オブジェクトには create() はありますが compile() はないようです。もしかしたら方向性が違うのかもしれませんが… こちらで質問を投稿しました:Adding a bespoke raw template