How to start verdaccio by pm2? - pm2

pm2 start verdaccio failed, the status is stopped.
$ npm i -g pm2 verdaccio
$ pm2 start verdaccio

I've have been running verdaccio in pm2 for 1 year by know and I use this after installing it globally via npm.
Start
pm2 start `which verdaccio`
Restart
pm2 restart verdaccio
And that works pretty well for me.

The problem is pm2 finding verdaccio in the first place. That's why using which solves it, but that is not always possible in Windows.
I've managed to run verdaccio in pm2 on Windows, without even installing it globally (so that I could commit my configs, plugin packages, etc), with this:
// ecosystem.config.js
module.exports = {
apps : [{
name: 'verdaccio',
script: './node_modules/verdaccio/build/lib/cli', // local package, that pm2 can run with "node <script>"
args : '--config ./config.yaml', // local confis
node_args: '-r esm', // verdaccio's package didn't contain "type": "module"
exec_mode: 'fork' // verdaccio does not currently support PM2's cluster mode
}]
}
PS.: these are my dependencies:
// package.json
"dependencies": {
"esm": "^3.2.25",
"verdaccio": "^5.10.2",
"verdaccio-activedirectory": "^1.0.2",
"verdaccio-simplegroup": "^1.0.2"
},

for someone still stumbling upon this problem. you can try deleting the process then starting it again. I solved it this way.

Related

Is there a way to get PM2 to run npm install when package.json updates?

I set up pm2 with a watch, so each time a git pull is done, it auto reloads the app.
This works, unless the app dependencies have changed, then it needs to run npm install first. This causes pm2 to restart and crash over and over until the install is done.
Is there a way to have pm2 watch automatically run npm install before restarting?
there is no way but, you can add script in package.json
...
scripts: {
....
"postinstall" "pm2 restart (your process id from pm2)"
}
...
Run pm2 start (your entry file server) and get process id.
Always run npm install and then pm2 will restart process after that
Note that you need to install pm2 globally using "npm i -g pm2" on the machine

babel-node is not recognized as an internal or external command, operable program or batch file

When I try to run a JS file by babel command it is showing:
"babel-node is not recognized as an internal or external command, operable program or batch file".
I had created 1.js file in this written "console.log("hello world")";
and tried to run with babel-node command but it is showing the above-mentioned error.
you can try install babel's global version
npm install -g babel-cli
Tried many suggestions and finally, I had to explicitly provide the absolute path to babel-node to get it working in scripts definition section in package.json file.
"start": "nodemon --exec ./node_modules/.bin/babel-node src/index.js"
node - v15.5.1
nodemon - v2.0.7
#babel/node - v7.12.10
Make sure that you have got the babel module so that it can be used.
For example by using npm install babel-cli to get a node_modules folder.
Then you can find the runnable in node_module/.bin.
a combination of above solutions worked for me:
npm install #babel/node
npm install #babel/cli
npm install #babel/core
and then I ran npm start and it worked.
Adding npx to the command might help, so exact binary will be executed
nodemon --exec npx babel-node src/index.js
For me the issue was solved by installing 'babel-node' globally by running this command:
npm install #babel/node -g
If your project is based on babel 7, you should run this
npm install #babel/cli #babel/core
install #babel/node , i came across the same problem and by installing this solved my problem
To intall babel packages worked for me
npm i #babel/cli #babel/core #babel/node #babel/preset-env --save-dev
"nodemon --exec ./node_modules/.bin/babel-node src/index.js"
What is currently missing is part of #babel/node. Depending on your project dependency you can install:
npm install #babel/cli
npm install #babel/node
My issue solved by running this command
> npx babel-watch .
you can also use
"start": "babel-node backend/server.js"
For those who struggle making it work for node + nodemon, what helped me was:
Install these deps:
"#babel/cli": "^7.14.5",
"#babel/core": "^7.14.6",
"#babel/node": "^7.14.7",
"#babel/preset-env": "^7.14.7",
"nodemon": "^2.0.12"
You can leave path to babel-node to be relative.
"dev": "nodemon src/index.js --exec babel-node",
This fixed it for me:
npm ci
(npm clean install removes node modules and then installs them again)
After trying everything here, it still didn't work. Eventually I got it working by removing the folders containing the executable (which for me was node_modules/.bin/).
Before:
"scripts": {
"babel": "node_modules/.bin/babel src/index.js -o dist/assets/bundle.js"
}
After:
"scripts": {
"babel": "babel src/index.js -o dist/assets/bundle.js"
}
yes i also get this error
it was resolved do check 👇
$ npm run dev
server#1.0.0 dev
nodemon --exec babel-node index
[nodemon] 2.0.15
[nodemon] to restart at any time, enter rs
[nodemon] watching path(s): .
[nodemon] watching extensions: js,mjs,json
[nodemon] starting babel-node index.js
'babel-node' is not recognized as an internal or external command,
operable program or batch file.
[nodemon] app crashed - waiting for file changes before starting...
after that I
install nodemon globally then it was resolved.
$ npm install -g nodemon
added 2 packages, removed 85 packages, changed 30 packages, and audited 33 packages in 9s
3 packages are looking for funding
run npm fund for details
found 0 vulnerabilities
result was ✅🔥
👇👍✅
$ npm run dev
server#1.0.0 dev
nodemon --exec babel-node index
[nodemon] 2.0.19
[nodemon] to restart at any time, enter rs
[nodemon] watching path(s): .
[nodemon] watching extensions: js,mjs,json
[nodemon] starting babel-node index.js
Server is runing 🔥
Confirm that you have these dependencies at a minimum in your package.json:
"dependencies": {
"#babel/core": "7.13.10",
"#babel/node": "7.13.12",
"#babel/preset-env": "7.13.12",
..
},
"devDependencies": {
"nodemon": "2.0.7",
...
}
Then check what script you are running. If you see the problem when running npm run dev and you have something like:
"scripts": {
"dev": "nodemon --exec babel-node ./src/server.js",
..
},
Update your scripts to the following (assuming you don't already have a "start"):
"scripts": {
"start": "babel-node ./src/server.js",
"dev": "nodemon --exec npm start",
...
},
Basically, nodeman is used during dev to hot reload code changes. babel-node itself runs the server, but the issue being faced occurs when installed package is not detected by nodeman.
Although installing #babel/cli globally, might appear to resolve the issue, it's not needed (and frowned upon: https://babeljs.io/docs/en/babel-cli)

Why does pm2 start my ghost blog in developement?

I am not able to understand why pm2 starts my ghost blog in developement instead of production.
I can run this
npm start --production and everything is fine like I want it. But if I try to use pm2
pm2 start index.js it starts my blog in developement which I don't want to. I must be blind but can not see in the docs how I can force pm2 to start in production mode.
I only have success starting the app with npm like this:
npm start --production
I tried with a config file ecosystem.config.js and to start it like this:
pm2 start ecosystem.config.js or
pm2 start ecosystem.config.js --env production but it seems to start in developement. Here is my config file.
module.exports = {
apps : [
{
name : "asle",
script : "index.js",
env: {
COMMON_VARIABLE: "true"
},
env_production : {
NODE_ENV: "production"
}
}
]
}
Because ghost blog always runs in development mode by default. If you want to run it with pm2 in production use following command
NODE_ENV=production pm2 start index.js
You can also read in my blog post: https://drifts.io/how-to-setup-ghost-blog-on-vps/#step5installpm2processmanager
Also dont forget to use pm2 startup and save to make sure it persistent over reboots.
Have you tried to create an ecosystem file to declare how you want to launch in production ?
http://pm2.keymetrics.io/docs/usage/application-declaration/
If yes can you show it ?

Heroku does not read node version

I have a Node project that I want to host on Heroku. I have explicitly defined node and npm versions in my package.json (located in the root directory), which looks like this:
{
"name": "*********",
"version": "0.0.0",
"private": true,
"engines": {
"node": "0.12.x",
"npm": "2.5.x"
},
"scripts": {
"start": "node ./bin/www"
},
"dependencies": {
"body-parser": "^1.13.3",
...
}
However, when I try to push the app to heroku
git push heroku master
Heroku tries to build the app, but it seems like it's not able to read the node and npm versions. Here is the response I get.
remote: -----> Installing binaries
remote: engines.node (package.json): unspecified
remote: engines.npm (package.json): unspecified (use default)
remote:
remote: Resolving node version (latest stable) via semver.io...
remote: Downloading and installing node 4.2.1...
remote: Using default npm version: 2.14.7
Why does heroku not read the node and npm version from package.json?
#rdegges was right that the package.json wasn't correctly committed to Heroku. So just following the Heroku instructions didn't work for me for some reason. Here is what I had to do in order to make it work.
git clone <my git project>
heroku create <app name>
#remove package.json
mv package.json tmp_package.json
git add package.json
git commit -m "removed package.json"
#re-add package.json
mv tmp_package.json package.json
git add package.json
git commit -m "re-added package.json"
git push heroku master
This works for me -- make sure you've actually committed these changes to Git, and pushed the repository to Heroku. You may also want to specify exact Node and NPM release numbers for your Heroku app.
While this WILL WORK with the variable releases you've got specified, it's not recommended, as small changes in releases might cause issues for you.
For reference, here are the Heroku docs on specifying a Node.js runtime as well: https://devcenter.heroku.com/articles/nodejs-support#node-js-runtimes
I added the version to the package.json as others mentioned and it worked for me. These versions were referenced from the defaults that Heroku uses during the build if none are specified:
"engines": {
"node": "14.18.3",
"npm": "6.14.15"
},
Also, I'd recommend adding this setting to your app via the CLI for more output, which really helps:
heroku config:set NPM_CONFIG_LOGLEVEL=verbose --app=<your_app_name>
👍🏼
In an easy way
1- check your node version, let say it is like this: "node": "17.3.0"
2- Go inside the the package.json, at the very top below name and version add this
"engines": {
"node": "17.3.0",}
3- Delete package-lock.json then reinstall it by npm install.
After 3 hours working this mechanism helped me, I wanted to share with you all :) I hope it works for you too
Maybe your master branch is not the branch is not updated, try merging the branch that you want to deploy into master in order to use:
git push heroku master
Don't give 'x' on the version
"node": "0.12.x",
"npm": "2.5.x"
write complete version.
Ex.
"node": "0.12.0",
"npm": "2.5.0"
I tried the other solutions, but it didn't work for me. However, by changing the name field in package.json, it worked:
From:
{
...
"name": "foo"
...
}
To:
{
...
"name": "bar"
...
}
Alternative 2:
When I had to do the same on my other computer, it didn't work, but I tried removing package.json, recreating it from scratch, and then it worked for some odd reason (file metadata?):
$ rm package.json
$ npm init
Make sure the lockfile is up to date
In order to update the package-lock.json, run npm install and check in the changes to the file to git.
Then, git add . && git commit -m "update pkg-lock" && git push heroku master
I added the node version to package.json, but it would only accept it in the format
<major version>.x
i.e.
"name": "myapp",
"version": "1.0.0",
"engine": {
"node": "16.x"
}
I got that info from the heroku docs here - no other way of specifying it worked except that 16.x.
In my case the issue was with package.json, it was missed up due to some manual changes, so reverting to old version of repo solved my issue.

NPM doesn't install module dependencies when deploying a Grunt app to heroku

I'v made a static single page site using grunt. I'm now trying to deploy it to heroku using the heroku-buildpack-nodejs-grunt for node grunt.
Below is a pic of my root directory:
Here's my Gruntfile package.json:
Procfile:
web: node index.html
When I run $ git push heroku master it gets to the Gruntfile and fails:
-----> Found Gruntfile, running grunt heroku:production task
>> Local Npm module "grunt-contrib-uglify" not found. Is it installed?
The above errors proceed to list all local NPM modules as not found. If I list all loadNpmTasks instead of using "load-grunt-tasks", I get the exact same error.
When I $ heroku logs I get:
Starting process with command `node web.js`
Error: Cannot find module '/app/web.js'
Can anyone see where I've gone wrong?
For anyone passing by here, I wasn't able to solve the problem. This is where I got to:
In my Gruntfile, I moved npm modules from devDependencies to dependencies. Heroku was then able to install these dependencies.
However, when Heroku ran the tasks, it stops at the haml task w/ error "You need to have Ruby and Haml installed and in your PATH for this task to work". Adding ruby & haml to the Gruntfile as engines did not work.
The only thing I can think of is that maybe Heroku installs your devDependencies first, tries to run Grunt, but since it didn't install load-grunt-tasks yet, you don't get the grunt.loadNpmTasks( 'grunt-contrib-uglify' ); line (which load-grunt-tasks does for you), and thus Grunt can't find the package.
Can you try changing your Gruntfile to explicitly list out all npm modules using the grunt.loadNpmTasks() method?
EDIT:
Just remembered another thing I had to do:
heroku labs:enable user-env-compile -a myapp
heroku config:set NODE_ENV=production
(Obviously replacing myapp with your Heroku app name.)
This makes Heroku allow user set environment variables and then sets your server to production. Try that, and set your dependencies and devDependencies as you had them originally (just to see if it works).
I am coming pretty late to the game here but I have used a couple methods and thought I would share.
Option 1: Get Heroku to Build
This is not my favorite method because it can take a long time but here it is anyway.
Heroku runs npm install --production when it receives your pushed changes. This only installs the production dependencies.
You don't have to change your environment variables to install your dev dependencies. npm install has a --dev switch to allow you to do that.
npm install --dev
Heroku provides an article on how you can customize your build. Essentially, you can run the above command as a postinstall script in your package.json.
"scripts": {
"start": "node index.js",
"postinstall": "npm install --dev && grunt build"
}
I think this is cleaner than putting dev dependencies in my production section or changing the environment variables back and forth to get my dependencies to build.
Also, I don't use a Procfile. Heroku can run your application by calling npm start (at least it can now almost two years after the OP). So as long as you provide that script (as seen above) Heroku should be able to start your app.
As far as your ruby dependency, I haven't attempted to install a ruby gem in my node apps on Heroku but this SO answer suggests that you use multi buildpack.
Option 2: Deploy Your Dependencies
Some argue that having Heroku build your application is bad form. They suggest that you should push up all of your dependencies. If you are like me and hate the idea of checking in your node_modules directory then you could create a new branch where you force add the node_modules directory and then deploy that branch. In git this looks like:
git checkout -b deploy
git add -f node_modules/
git commit -m "heroku deploy"
git push heroku --force deploy:master
git checkout master
git branch -D deploy
You could obviously make this into a script so that you don't have to type that every time.
Option 3: Do It All Yourself
This is my new favorite way to deploy. Heroku has added support for slug deploys. The previous link is a good read and I highly recommend it. I do this in my automated build from Travis-CI. I have some custom scripts to tar my app and push the slug to Heroku and its fast.
I faced a similar problem with Heroku not installing all of my dependencies, while I had no issue locally. I fixed it by running
heroku config:set USE_NPM_INSTALL=true
into the path, where I deployed my project from. This instructs Heroku to install your dependencies using npm install instead of npm ci, which is the default! From Heroku dev center:
"Heroku uses the lockfiles, either the package-lock.json or yarn.lock, to install the expected dependency tree, so be sure to check those files into git to ensure the same dependency versions across environments. If you are using npm, Heroku will use npm ci to set up the build environment."