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インストール
- root昇格
※growiをroot権限で実行するため
sudo su -
- growiサービス停止
systemctl stop growi.service
- growiサービス停止確認
systemctl status growi.service
inactive(dead)
を確認
- nvmインストールスクリプトの実行
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash
- nvm環境の有効化と確認
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です)
- nvm経由でNode.jsをインストール
npm@11.4.0
と互換性があるNode.jsをインストールします。
nvm install v20.19.2
- Node.jsバージョンの使用とデフォルト設定
nvm use v20.19.2
nvm alias default v20.19.2
- Node.jsバージョン確認
node -v
v20.19.2
を確認
npm -v
10.7.0
を確認
- npmのインストール
npm install -g npm@11.4.0
- npmバージョン確認
npm -v
11.4.0
を確認
- 事前にインストールされているpnpmの削除
rm -rf /root/.local/share/pnpm
- コマンドパスのキャッシュクリア
hash -r
- pnpmインストール
npm install -g pnpm
- pnpmバージョン確認
pnpm -v
10.11.0
を確認
- rootから抜ける
exit
Growiとのバージョン不一致と原因確認
- growi起動
sudo systemctl start growi.service
- growi起動確認
systemctl status growi.service
とし、Growiの管理画面にアクセスしましたが、バージョンは変わらず。
システム上は確かにバージョンアップされているにもかかわらず、です。
そこで、
pgrep growi
で原因を探し、
ls -l /proc/<PID>/exe
を確認したところ、systemdから起動されたGrowiのNode.jsプロセスが、バージョンアップ前の
/usr/local/bin/node
を利用していることを確認。
これは、上述したリンク先のsystemdサービスの実行環境が、nvmの環境変数(PATH
)を正しく引き継いでいなかったからです。
起動スクリプトの修正
- growiサービス停止
sudo systemctl stop growi.service
- growiサービス停止確認
systemctl status growi.service
inactive(dead)
を確認
- Growi起動ディレクトリに移動
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によるバックアップ確認
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の起動コマンド
修正確認
- growi起動
sudo systemctl start growi.service
- growi起動確認
systemctl status growi.service
この後、Growiに管理者権限でアクセスし、管理画面に移動します。
項目 | 値 |
---|---|
GROWI | 7.2.4 |
node.js | 20.19.2 |
npm | 11.4.0 |
pnpm | 10.11.0 |
となっていたため、正しく参照できています。