さくらのクラウドのNode-REDスタートアップスクリプトでパスワード設定も出来るようにしたメモ
さくらのクラウドのNode-REDスタートアップスクリプトでログインID・パスワード設定も出来るようにしたメモです。
まず、パスワード入力欄をつくった
スタートアップスクリプトで以下を参考に、Node-REDのログインID/パスワードを入力フォームから入れれるようにしました。
スタートアップスクリプトとは | さくらのクラウド ドキュメント

このように、従来のポート番号に加えて、Node-REDログイン時のID/PASSを入れれるようにしています。
ハッシュ値の情報を把握
つづいて、パスワードは0.17.5現在では、ハッシュ値に変える必要があります。
node-red-admin/hash.js at master · node-red/node-red-admin
こちらを参考にしつつ、公式を探しました。

もろもろバッチ化
上記のハッシュ化も合わせてバッチ化しました。
ざっと挙げると、
- ハッシュにするためのbcryptjsが入ってないので入れてみたり
- bcryptjsのインストール権限をどうするのがいいのか悩んでみたり
- スタートアップの全処理の完了が時間がかかるのでNode-REDの起動タイミング調整してみたり
- とはいえ一度起動しないと設定ファイルが生成されないので最初一度起動して設定中は終了してみたり
- ハッシュ生成時にスラッシュが入ると区切る文字起因でコケる模様。区切り文字をアスタリスクに。
- 実行結果を踏まえて変数に代入してみたり
- フィルタを活用してうまくテキスト置換してみたり
- ファイル書き出しを知らなかったのでcat覚えてみたり
あたり、やりました。いろいろ勉強になった・・・。
できあがったスタートアップスクリプト
試行錯誤の末、できあがったスタートアップスクリプトがこちらです。
#!/bin/sh
# @sacloud-once
# @sacloud-desc NVM/Node.js/Node-REDのインストールを実行します。
# @sacloud-desc このスクリプトは、CentOS 7.xでのみ動作します。
# @sacloud-desc nodesourceリポジトリを追加登録します。
# @sacloud-desc 完了後「http://<IPアドレス>:1880/」にWebブラウザからアクセスできます。
# @sacloud-desc UIポート番号を指定した場合は、指定したポート番号でアクセスできます。
# @sacloud-desc Node-Redのログを確認するには「 pm2 logs node-red」コマンドを実行します。
# @sacloud-require-archive distro-centos distro-ver-7.*
# @sacloud-text shellarg maxlen=5 ex=1880 integer min=80 max=65535 ui_port "Node-REDのWeb UIポート番号"
UI_PORT=@@@ui_port@@@
${UI_PORT:=1880}
# @sacloud-text shellarg minlen=5 maxlen=65535 ex=username nodered_id "Node-REDのログインID"
UI_NODERED_ID=@@@nodered_id@@@
# @sacloud-password shellarg minlen=8 maxlen=65535 ex=password nodered_password "Node-REDのログインパスワード"
UI_NODERED_PASSWORD=@@@nodered_password@@@
export HOME=/root/ && export PM2_HOME="/root/.pm2"
# yum update
echo "# yum update"
yum -y update || exit 1
### nano
echo "# ADD nano"
sudo yum install -y nano || exit 1
# リポジトリ登録
echo "# add nodesource"
curl -sL https://rpm.nodesource.com/setup_8.x | bash - || exit 1
# Node.jsとNode-Redのセットアップ
echo "# nodejs / node-red install"
yum install -y nodejs || exit 1
npm install -g --unsafe-perm node-red || exit 1
# Node-Red自動起動設定
echo "# nodered setting"
npm install -g pm2 || exit 1
pm2 start /usr/bin/node-red -- -v -u root -p $UI_PORT || exit 1
pm2 save || exit 1
pm2 startup systemd -u root || exit 1
### 一旦ストップ
echo "# nodered stop"
pm2 stop node-red || exit 1
# ポート公開
echo "# firewalld setting"
firewall-cmd --add-port=$UI_PORT/tcp --permanent || exit 1
### ADD MQTT
firewall-cmd --add-port=1883/tcp --permanent || exit 1
firewall-cmd --reload || exit 1
### ノード追加
echo "# add nodered node"
cd /root/.sacloud-api/notes/root || exit 1
sudo npm install node-red-dashboard node-red-contrib-os node-red-contrib-mqtt-broker --unsafe-perm || exit 1
# パスワード抽出
echo "# nodered password crypt make"
npm install bcryptjs || exit 1
UI_NODERED_PASSWORD_CRYPT=`node -e "console.log(require('bcryptjs').hashSync(process.argv[1], 8));" ${UI_NODERED_PASSWORD}` || exit 1
# パスワード変更 事前置き換え
echo "# nodered password template push"
sed -i -e "s/\/\/adminAuth:/adminAuth:{\n\
type: \"credentials\",\n\
users: [{\n\
username: \"admin\",\n\
password: \"SACLOUD_NODERED_PASSWORD\",\n\
permissions: \"*\"\n\
}]\n\
},\n\
\/\/adminAuth:/" /root/.sacloud-api/notes/root/settings.js || exit 1
# パスワード変更
echo "# nodered password crypt change"
sed -i -e "s*SACLOUD_NODERED_PASSWORD*$UI_NODERED_PASSWORD_CRYPT*" /root/.sacloud-api/notes/root/settings.js || exit 1
### restart
echo "# nodered restart"
pm2 start node-red || exit 1
exit 0
まとめ
ということで、いったん出来上がりまして、こちら、少なくとも私の手元では便利に使わさせていただいています。
気になる点としては、
- ハッシュ値の作り方が変わったら直さないといけなそう
- setting.jsの仕様が変わったら直さないといけなそう
- 行数狙いの置換は避けたがそれでも「//adminAuth:」を狙っているので内容変わったら直さないといけなそう
- 変なパスワードを作ったときにハッシュ値がちゃんと作られる未知数
といったところはありますが、しばらくやってみて考えたいと思います。うまく落ち着いたら、ナレッジ展開してみたいですねー。
それでは、よきNode-RED x さくらのクラウド Life を!