バージョンアップ後に起動しない場合(sentryによる存在しないglibc呼び出し)¶
特に少し古いOSでバージョンアップ後に怒りやすい事例。ビルドまでは成功しているとする。
「起動スクリプト(systemctl)上では起動しているのに、一向に起動してこない」というケースの一つ。
エラー内容¶
エラーログなどではわかりにくいため、misskeyユーザによる下記のコマンドで直接起動する。
# cd misskey # NODE_ENV=production pnpm run start
この際、次のようなエラーで起動に失敗している。
Error: /lib64/libstdc++.so.6: version `GLIBCXX_3.4.29' not found (required by /home/misskey/misskey/node_modules/.pnpm/ @sentry-internal+node-cpu-profiler@2.2.0/node_modules/ @sentry-internal/node-cpu-profiler/lib/sentry_cpu_profiler-linux-x64-glibc-127.node)
これはlibstdc++.so.6が存在しないgccのバージョンを指定されてエラーを吐いたというもの。
原因¶
エラーを吐く原因になった「sentry-internal」は「package.json」で次のように指定されている。
# vi package.json
----------------------------------------
"ignoredBuiltDependencies": [
"@sentry-internal/node-cpu-profiler",
"exifreader"
]
「ignoredBuiltDependencies」はビルドの効率化のために、ローカルビルドをせずバイナリを
直接ダウンロードしてくることを指す。
つまり、このビルド済バイナリが「導入先のOSでは対応していないgccでビルドした」ため
起動時に「存在しないgccライブラリを使おうとして起動に失敗した」ということになる。
解決策¶
つまり自前のgccでビルドし直せば問題は起きないはずである。
まずpackage.jsonを次のように編集し、「sentry-internal」をビルド除外から外す。(ビルドするようにする)
# vi package.json
----------------------------------------
"ignoredBuiltDependencies": [
"exifreader"
]
次に、この状態でビルド済リソースを使わないようにnodeモジュールを削除する。
# rm -rf node_modules
以降は通常のアップグレードビルドと同じ手順を行う。
git submodule update --init NODE_ENV=production pnpm install --frozen-lockfile
ここで除外すべきものを除外していないことに対しての警告が出るので、メッセージ通りに解決させる。
Warning ───────────────────────────────────────────────────────────────────────────────────╮ │ │ │ Ignored build scripts: @sentry-internal/node-cpu-profiler. │ │ Run "pnpm approve-builds" to pick which dependencies should be allowed to run scripts. │ │ │ ╰────────────────────────────────────────────────────────────────────────────────────────────╯ pnpm approve-builds 確認が出るのでYesで応答
残りは通常の手順と同じ。
NODE_ENV=production pnpm run build pnpm run migrate
念のため手動で起動出来ることを確認する。
NODE_ENV=production pnpm run start
以上で問題なければ手動起動を中断し、misskeyサービスを再起動してよい。