Tech 4 Mine :-) 忘れぬ先のテックメモ

ゆるエンジニアな私が、多少なり役に立ったひらめきやらTipsを忘れる前に書いていくブログです。

オフラインサーバに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)についてもまとめておきたいですね。