Growiサーバのメンテナンス中、「新しいnpmのバージョンが出ている」ということで、
以下のコマンドを実施。
sudo npm install -g npm@11.4.0
しかし、以下のエラーが出てきました。
npm error code EBADENGINE
npm error engine Unsupported engine
npm error engine Not compatible with your version of node/npm: npm@11.4.0
npm error notsup Not compatible with your version of node/npm: npm@11.4.0
npm error notsup Required: {"node":"^20.17.0 || >=22.9.0"}
npm error notsup Actual: {"npm":"10.9.0","node":"v20.15.1"}
npm error A complete log of this run can be found in: /root/.npm/_logs/2025-05-20T01_02_55_477Z-debug-0.log
これを解決するため、結構なハマり案件があったのでメモを残します。(実施日:2025/05/20)
動作前環境
Ubuntu 22.04
Growi v7.2.4
node.js 20.15.1
npm 10.9.0
pnpm 9.12.3
MongoDB/Apacheによるリバースプロキシーは割愛します。
以下を参考にインストールしています。
https://barrel.reisalin.com/books/growi/page/ubuntu2404growi-v7v710-ImY
(盛大にハマったものの)最終的に解決した手順
nvm (Node Version Manager)のインストールと環境設定
Growiサービス(systemd 経由)起動時でのバージョン不一致の特定
起動スクリプトの修正
nvmインストール
※growiをroot権限で実行するため
sudo su -
systemctl stop growi.service
systemctl status growi.service
inactive(dead)
を確認
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash
export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"
[ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion"
一度セッションを切り、再度sudoを行いました。
nvm --version
0.39.7
と表示されることを確認。
(まだrootです)
npm@11.4.0
と互換性があるNode.jsをインストールします。
nvm install v20.19.2
nvm use v20.19.2
nvm alias default v20.19.2
node -v
v20.19.2
を確認
npm -v
10.7.0
を確認
npm install -g npm@11.4.0
npm -v
11.4.0
を確認
rm -rf /root/.local/share/pnpm
hash -r
npm install -g pnpm
pnpm -v
10.11.0
を確認
exit
Growiとのバージョン不一致と原因確認
sudo systemctl start growi.service
systemctl status growi.service
とし、Growiの管理画面にアクセスしましたが、バージョンは変わらず。
システム上は確かにバージョンアップされているにもかかわらず、です。
そこで、
pgrep growi
で原因を探し、
ls -l /proc/<PID>/exe
を確認したところ、systemdから起動されたGrowiのNode.jsプロセスが、バージョンアップ前の
/usr/local/bin/node
を利用していることを確認。
これは、上述したリンク先のsystemdサービスの実行環境が、nvmの環境変数(PATH
)を正しく引き継いでいなかったからです。
起動スクリプトの修正
sudo systemctl stop growi.service
systemctl status growi.service
inactive(dead)
を確認
cd /path/to/growi/root/directory && pwd
筆者環境/home/www-data/growi
sudo cp -pi growi-start.sh /path/to/backup/diretory/growi-start.sh.$(date +%Y%m%d)
任意のバックアップディレクトリを指定します。
diff -u /path/to/backup/diretory/growi-start.sh.$(date +%Y%m%d) growi-start.sh
差分が無いことを確認します。
growi-start.sh
を、任意の手段で修正します。
#!/bin/bash
の直下、起動スクリプトの直上に以下のように記載します。
# NVM environmentをロード (NVM_DIRを直接指定)
export NVM_DIR="/root/.nvm" # $HOMEの代わりに直接パスを指定
if [ -s "$NVM_DIR/nvm.sh" ]; then
\. "$NVM_DIR/nvm.sh" # nvmをロード
# 次の行でスクリプト実行時のnodeとnpmのバージョンをログに出力
echo "NVM for GROWI startup script loaded. Using Node version: $(node -v), npm version: $(npm -v)" > /tmp/growi_nvm_load.log
else
# NVMが見つからない場合もログに出力
echo "NVM_DIR ($NVM_DIR) not found or nvm.sh not found for GROWI startup script." > /tmp/growi_nvm_load.log
fi
# GROWIの起動コマンド
diff -u /path/to/backup/diretory/growi-start.sh.$(date +%Y%m%d) growi-start.sh
+
+# NVM environmentをロード (NVM_DIRを直接指定)
+export NVM_DIR="/root/.nvm" # $HOMEの代わりに直接パスを指定
+if [ -s "$NVM_DIR/nvm.sh" ]; then
+ \. "$NVM_DIR/nvm.sh" # nvmをロード
+ # 次の行でスクリプト実行時のnodeとnpmのバージョンをログに出力
+ echo "NVM for GROWI startup script loaded. Using Node version: $(node -v), npm version: $(npm -v)" > /tmp/growi_nvm_load.log
+else
+ # NVMが見つからない場合もログに出力
+ echo "NVM_DIR ($NVM_DIR) not found or nvm.sh not found for GROWI startup script." > /tmp/growi_nvm_load.log
+fi
+
+# GROWIの起動コマンド
修正確認
sudo systemctl start growi.service
systemctl status growi.service
この後、Growiに管理者権限でアクセスし、管理画面に移動します。
項目 値 GROWI 7.2.4 node.js 20.19.2 npm 11.4.0 pnpm 10.11.0
となっていたため、正しく参照できています。