オフラインサーバにnpmboxでForeverをインストールする
新たに構築する際はいいのですが、運用中の機能追加や構成変更で閉域網にnode moduleを入れたいなーなんてこと、ありませんか?ありますよね?
というわけで、今回はnodeプロセスをデーモン化するのにForeverを使いたくなり、色々と調べて実際に出来た方法を記して行きます。
環境など
必要な資材をオンライン環境のあるマシンで準備し、オフライン環境のマシンに移行してセットアップする流れとなります。
オン/オフ サーバ2台も用意するのは面倒なので、DockerHubでNode用のコンテナイメージを取得して検証してみます。
Dockerのインストールや起動コマンドなどはここでは省略します。
Nodeのコンテナイメージを使うので、npmやnode自体はインストールされているものとします。
オンラインサーバで資材を作成
まずはオンラインで資材を作成するためにnpmboxをグローバルインストールします。
root@a377a7db92f5:/# npm install -g npmbox added 74 packages, and audited 338 packages in 16s
途中でWARNでバージョンが古いやつがいるとかなんとか言われますがここではスルーしておきます。
次はForeverをnpmboxで固めます。
root@a377a7db92f5:/# npmbox forever Boxing forever... Packing /forever.npmbox... root@a377a7db92f5:/# ls -ltr | grep npmbox -rw-r--r-- 1 root root 5057784 Mar 6 01:08 forever.npmbox
途中ズラッとログが流れて、Packing~となれば完了です。forever.npmboxというファイルが出来ています。
次にnpmbox自体の資材をまとめて行くために、グローバルのNode Modulesの場所や、npmboxのコマンドを確認します。
root@a377a7db92f5:/# npm config list | grep location ; node bin location = /usr/local/bin/node root@a377a7db92f5:/# ls -ltr /usr/local/bin/ | grep npm*box lrwxrwxrwx 1 root root 39 Mar 6 01:05 npmunbox -> ../lib/node_modules/npmbox/bin/npmunbox lrwxrwxrwx 1 root root 37 Mar 6 01:05 npmbox -> ../lib/node_modules/npmbox/bin/npmbox
npmのコンフィグから、nodeのバイナリの位置を確認、同フォルダをnpmboxとnpmunboxが対象となるように検索します。
npmboxとunboxはどちらもlib/node_modules/npmboxを参照しているようなので、これを持っていってあげれば良さそう、ということでtarしておきます。
root@a377a7db92f5:~# tar -cvzf npmbox.tgz /usr/local/lib/node_modules/npmbox
ここまでで、npmboxとforeverのインストール用資材は揃いました。
資材の移動
本来であれば、ftpなどか、デバイスを経由して資材を移動しますが、今回はコンテナ間(node_1→node_2)を移動します。
~Documents$ docker cp node_1:/root/forever.npmbox ./ ~Documents$ docker cp node_1:/root/npmbox.tgz ./ ~Documents$ ls -ltr | grep npmbox -rwxrwxrwx 1 user user 5057784 Mar 6 10:08 forever.npmbox -rwxrwxrwx 1 user user 4482734 Mar 6 10:16 npmbox.tgz ~Documents$ docker cp ./forever.npmbox node_2:/root/ ~Documents$ docker cp ./npmbox.tgz node_2:/root/
しました。
というわけでnode_2(オフライン想定のコンテナ)のコンソールに入り、インストール作業をしていきます。
オフラインサーバでの構築
まずはnpmboxのインストール用に、tarした後にnpmのグローバルモジュール置き場にnpmboxフォルダを移動します。
root@44ebad748d6e:~# tar -xvzf npmbox.tgz root@44ebad748d6e:~# ls -ltr total 9324 -rwxrwxrwx 1 node node 5057784 Mar 6 01:08 forever.npmbox -rwxrwxrwx 1 node node 4482734 Mar 6 01:16 npmbox.tgz drwxr-xr-x 3 root root 4096 Mar 6 01:29 usr
解凍時のログは省略しますが、解凍されたフォルダが出来ています。
基本的にディレクトリ構成は同じなので、特に調べ直しませんが、npmのグローバルモジュール置き場に移動させます。
root@44ebad748d6e:~# cd /usr/local/lib/node_modules/ root@44ebad748d6e:/usr/local/lib/node_modules# cp -r /root/usr/local/lib/node_modules/npmbox ./ root@44ebad748d6e:/usr/local/lib/node_modules# ls -ltr total 8 drwxr-xr-x 10 root staff 4096 Mar 3 05:50 npm drwxr-xr-x 4 root root 4096 Mar 6 01:31 npmbox
残るはコマンドを設置するだけです。
今回はlnコマンドで配置したnpmboxを参照するようにリンクを作成します。
root@44ebad748d6e:/usr/local/lib/node_modules# cd /usr/local/bin/ root@44ebad748d6e:/usr/local/bin# ln -s /usr/local/lib/node_modules/npmbox/bin/npmbox npmbox root@44ebad748d6e:/usr/local/bin# ln -s /usr/local/lib/node_modules/npmbox/bin/npmunbox npmunbox root@44ebad748d6e:/usr/local/bin# ls -ltr total 73968 -rwxr-xr-x 1 root staff 75737496 Mar 3 05:50 node lrwxrwxrwx 1 root staff 38 Mar 3 05:50 npx -> ../lib/node_modules/npm/bin/npx-cli.js lrwxrwxrwx 1 root staff 38 Mar 3 05:50 npm -> ../lib/node_modules/npm/bin/npm-cli.js -rwxrwxr-x 1 root root 116 Mar 3 23:28 docker-entrypoint.sh lrwxrwxrwx 1 root root 19 Mar 3 23:28 nodejs -> /usr/local/bin/node lrwxrwxrwx 1 root root 29 Mar 3 23:28 yarnpkg -> /opt/yarn-v1.22.5/bin/yarnpkg lrwxrwxrwx 1 root root 26 Mar 3 23:28 yarn -> /opt/yarn-v1.22.5/bin/yarn lrwxrwxrwx 1 root root 45 Mar 6 01:32 npmbox -> /usr/local/lib/node_modules/npmbox/bin/npmbox lrwxrwxrwx 1 root root 47 Mar 6 01:32 npmunbox -> /usr/local/lib/node_modules/npmbox/bin/npmunbox
ここまで出来たらnpmboxやnpmunboxを実行してみましょう、引数なしで実行すればヘルプが表示されるはずです。
実行されないようであれば、パスの指定やコマンド指定が間違ってなかったか見直してみてください。
npmboxのコマンドがちゃんと反映されているのを確認したら、資材を配置したディレクトリに戻ってforeverのインストールを行います。
npmunboxコマンドをつかってグローバルインストール、インストール後に動作確認してみます。
root@44ebad748d6e:~# npmunbox -g forever.npmbox
Unboxing forever.npmbox...
Unpacking forever.npmbox...
Installing forever...
Done.
root@44ebad748d6e:~# forever list
info: No forever processes running
お疲れさまでした、ここまででforeverのインストールまで完了しました。
終わりに
npmboxは依存関係まで合わせてパッケージ化してくれるので非常に便利ですね、ありがたい限りです。
最近はOpenAPI GeneratorでNode-expressのテンプレソースをいじったりしてたので、その後のデプロイ関係で今回のnpmboxのネタが出来ました。
覚えてるうちに時間があればOpenAPI generator(のNode-express)についてもまとめておきたいですね。