30

I need to install a "global" npm applications on an offline server.

It is easy to install a normal application:

npm install

and then pack up the resulting files. Either manually or using npm pack.

However, how can I install global application (that has a install script of some sort) such as forever without Internet?

npm install -g forever
Peter B
  • 25,670
  • 4
  • 22
  • 18

11 Answers11

19

You can install stuff from a tarball file, check out the npm documentation. You can find the URL of the forever tarball with npm view forever dist.tarball and download that. Try something like this:

curl -so forever.tar.gz `npm view forever dist.tarball 2> /dev/null`
npm install ./forever.tar.gz -g

But you might have to do this for all of the dependencies as well. There might be a better way but this is what I've found in my search.

TheHippo
  • 61,720
  • 15
  • 75
  • 100
CodeRarity
  • 532
  • 2
  • 7
  • 1
    Thanks for your answer. However, it immediately tries to pull in the dependencies from Internet. *npm http GET https://registry.npmjs.org/broadway* – Peter B Jul 02 '12 at 14:11
  • 1
    Naturally, you would need to install any dependencies first. – Kato Jul 02 '12 at 14:14
  • You are correct Kato. But how? There are a lot of dependencies for **forever**. – Peter B Jul 02 '12 at 15:03
19

try npmbox, it is the new name of npmzip which will allow you to install offline npm packages by one file

kamil
  • 460
  • 7
  • 20
7

Well.... after a day trying to make it work with above references (npmbox or offline-npm) came up with something way much simpler. Thanks to npmbox I have to say. The idea is the keep the cache from the instance that has online access and then use it in the one offline.

In machine with internet:

1 - clear npm cache: npm cache clear

2 - install package, lets say its x.y.z: npm install -g **package.x.y.z**

3 - copy cache in to a folder... let's call it whatever (I assume npm cache is in root folder, not absolutely sure about that): cp -R /.npm/* **/cache-whatever-folder**

In machine with no internet:

4 - take this cache-whatever-folder to the instance with no internet and after that, clean cache and install with it (I won't indicate how to copy the folder :)

npm cache clear

npm install --global --cache **/cache-whatever-folder** --optional --cache-min 99999999999 --shrinkwrap false **package.x.y.z**

Done

  • npm-cache makes no guarantees that the cache will be complete or not corrupted. How this could happen could be due to auto cache cleanup, or hash collisions. The npm-cache docs say this "npm makes *no guarantee* that a previously-cached piece of data will be available later" – Cardin Aug 21 '19 at 23:57
  • do i just copy the npm-cache folder and replace in other machine? I am using windows not sure how u used the cp command. If you could elaborate the file path it would be awesome. – Murtaza Haji Nov 30 '19 at 03:32
  • Yes, @MurtazaHaji, get the data from `%AppData%/npm-cache` in the machine with internet access and copy it to the one the hasn't. – Francisco López-Sancho Nov 30 '19 at 07:21
5

INSTALL PM2 OFFLINE:-

Tested on Node-v6.10.3 and Npm-3.10.10 on RHEL-7

Go to machine with internet connection:-

#npm install -g npmbox
#npmbox npmbox
#scp npmbox.npmbox root@offline-server-ip:.

Go to machine without internet connection :-

#ssh  root@offline-server-ip 
#tar --no-same-owner --no-same-permissions -xvzf npmbox.npmbox
#npm install --global --cache ./.npmbox.cache --optional --cache-min 99999999999 --shrinkwrap false npmbox

Go to machine with internet connection:-

#npm install pm2 -g
#npmbox pm2
#scp pm2.npmbox root@offline-server-ip:.

Go to machine without internet connection :-

#npmunbox pm2.npmbox --global
#pm2 ls
Pramod Kumar
  • 102
  • 1
  • 2
4

I created offline-npm for getting all the dependencies installed in a clean way. For modules without the use of node-gyp everything should work as described.

If you require node-gyp (which is usually installed online) consider copying ~/.node-gyp to that offline machine.

commenthol
  • 41
  • 1
3

Try npmzip

npm install -g npmzip
npmzip <package>

You will get the tarball in the current directory This may be moved to the target machine and :

npmunzip <tarball>
gkns
  • 697
  • 2
  • 12
  • 32
  • 1
    npm can handel tar.gz zip git svn by default [manual](https://www.npmjs.org/doc/files/package.json.html#dependencies) – yellowsir Oct 08 '14 at 09:29
3

Using Yarn:

  1. On the internet machine (configure local cache location):

    yarn config set yarn-offline-mirror ~/yarn-offline-mirror/
    
  2. On the offline machine (configure local cache location):

    yarn config set yarn-offline-mirror ~/yarn-offline-mirror/
    
  3. On the offline machine, Find out where is the global installation location:

    yarn global bin
    

    (Or set it with yarn config set prefix <file_path>)

  4. On the offline machine, add it to your path. E.g.:

    echo 'export PATH=$PATH:'"$(yarn global bin)" >> ~/.bashrc  
    source ~/.bashrc # reload
    
  5. On the internet machine, download forever's dependencies:

    mkdir new-cli-forever/
    cd new-cli-forever/
    yarn add forever
    

    Then copy new-cli-forever/yarn.lock and ~/yarn-offline-mirror/ to the offline machine. (rm -rf new-cli-forever/ is ok now.)

  6. On the offline machine, install forever from local cache:

    cp /path/to/imported/yarn.lock .
    cp -n /path/to/imported/yarn-offline-mirror/* ~/yarn-offline-mirror/
    yarn global add --offline forever
    rm -f ./yarn.lock
    

For more info, see my post here: https://assafmo.github.io/2018/04/11/yarn-offline.html

assafmo
  • 1,047
  • 3
  • 15
  • 32
  • How do you get yarn to the offline machine in the first place? – Codepunkt Feb 25 '19 at 08:32
  • Thanks a lot, this is the only solution of this thread that worked for me. My only remark is that in my case, I had to run yarn --offline to create the project before yarn global add --offline dep. Otherwise, it did not work – Matthieu.V Sep 29 '20 at 15:36
  • Oh, and also, you can force engine versions with this option : --ignore-engines. For instance, yarn add --ignore-engines dep In my case, this came helpful to install pm2 – Matthieu.V Sep 29 '20 at 15:40
  • Umm. How to get `yarn` on the offline server? – ksed Sep 14 '21 at 12:18
2

List the dependencies in bundledDependencies in your package.json, and then run npm pack to create a tarball. Get that over to the other machine, and either npm install <tarball>, or just crack it open manually.

https://github.com/npm/npm/issues/1349

f0ster
  • 549
  • 3
  • 12
2

npmbox is outdated

Use npm pack command (npm docs), no need to install anything.

Single package

If you want only one package (for example, forever), you can run:

npm pack forever

this command will fetch it to the cache, and then copy the tarball to the current working directory as -.tgz

Then, from the folder you created the package, you install it with:

npm install -g ./forever-x.y.z.tgz

Whole project

If you want a whole project to be installed offline, include a poperty in your package.json named bundleDependencies and list all dependecies you need in this field.

// package.json

"dependencies": {
  "archiver": "^2.1.1",
  "axios": "^0.16.2",
  "body-parser": "^1.18.3"
},
"bundleDependencies": {
  "archiver": "^2.1.1",
  "axios": "^0.16.2",
  "body-parser": "^1.18.3"
}

Then run npm pack.

It will create a .tgz file of your whole project and dependencias.

You just have to copy it to the offline server and untar.

Community
  • 1
  • 1
jpenna
  • 8,426
  • 5
  • 28
  • 36
0

On your local machine or any machine that has internet connection, do

npm install npm-bundle -g
npm install forever -g

Now, go to cd /usr/local/lib/node_modules/forever and do

npm-bundle

It will create a .tgz file. Now scp/ftp that .tgz file to the offline server and do

npm install forever -g

Reference: This blog

Sandeep Kanabar
  • 1,264
  • 17
  • 33
  • Followed all steps , still npm install timesout because its trying to connect to registry.npmjs.org which isnt allowed in my production machine – Murtaza Haji Nov 30 '19 at 02:38
0

On an online machine do:

# change to desired packages
packages="pm2 yarn"
for pkg in $packages; do
    mkdir "$pkg"
    curl "$(npm view "$pkg" dist.tarball)" |
    tar -xzC "$pkg" --strip-components 1
    (cd "$pkg" && npm install)
done
tar -czf packages.tar.gz $packages

On the offline server do:

npm config set offline
tar -xzf packages.tar.gz
npm install -g pm2 yarn
mohd.akram
  • 121
  • 2
  • 3