npm global install on elastic beanstalk - node.js

I am running into an issue installing pm2 globally on aws elastic beanstalk. I created the following script for installing pm2:
option_settings:
- option_name: NODE_ENV
value: production
container_commands:
01_enable_rootaccess:
command: echo Defaults:root \!requiretty >> /etc/sudoers
02_install_imagemagic:
command: yum install -y ImageMagick
03_download_new_relic:
command: rpm -Uvh http://download.newrelic.com/pub/newrelic/el5/i386/newrelic-repo-5-3.noarch.rpm
ignoreErrors: true
04_install_new_relic:
command: yum install -y newrelic-sysmond
ignoreErrors: true
05_add_license_key:
command: /usr/sbin/nrsysmond-config --set license_key=xxxxxxx
ignoreErrors: true
06_start_new_relic:
command: /etc/init.d/newrelic-sysmond start
ignoreErrors: true
07_install_pm2:
command: sudo /opt/elasticbeanstalk/node-install/node-v0.10.26-linux-x64/bin/npm install pm2 -g
ignoreErrors: true
08_stop_old_pm2_processes:
command: sudo /opt/elasticbeanstalk/node-install/node-v0.10.26-linux-x64/bin/pm2 delete all
ignoreErrors: true
09_start_pm2:
command: sudo /opt/elasticbeanstalk/node-install/node-v0.10.26-linux-x64/bin/pm2 startup -u ec2-user
ignoreErrors: true
I have tried using just 'pm2 delete all' and 'pm2 startup' for commands 8 & 9 put i just get command not found. when i give the specific path to pm2(i logged on to the ec2 and verified) i get "line 4: exec: : not found". any idea what i am doing wrong here? Thanks in advance for your help!

I managed to install pm2 globally on elastic beanstalk with the following code snippet embedded in an .ebextensions/your_file_name.config file
container_commands:
01_node_symlink:
command: "ln -sf `ls -td /opt/elasticbeanstalk/node-install/node-* | head -1`/bin/node /bin/node"
02_npm_symlink:
command: "ln -sf `ls -td /opt/elasticbeanstalk/node-install/node-* | head -1`/bin/npm /bin/npm"
03_pm2_install:
command: "if [ ! -e /bin/pm2 ]; then npm install pm2 -g; fi"
ignoreErrors: true

You may need to ensure that the nodejs-legacy module is installed. If pm2 is depending on the executable named node, that will fail when the system installs it globally as nodejs as some Linux systems (Ubuntu, Debian) often do.

Related

How ro run sudo su - in Dockerfile

I am trying to RUN sudo su - inside the Dockerfile and I get this error
/bin/sh: 1: sudo: not found
This is how my Dockerfile looks like:
FROM ubuntu:18.04
RUN sudo su -
RUN apt update && install openjdk-8-jdk
RUN wget -q -O - https://pkg.jenkins.io/debian/jenkins.io.key | sudo apt-key add - && sudo sh -c 'echo deb http://pkg.jenkins.io/debian-stable binary/ > /etc/apt/sources.list.d/kenkins.list'
RUN apt update && apt install jenkins
RUN curl -fsSL get.docker.com | /bin/bash
RUN usermod -aG docker jenkins && systemctl restart jenkins
This error comes when I try to build it.
docker build -t jenkins .
Can someone help me?
The dockerfile will run as a virtual "root" user by default, so there is no need to include any sudo command.
Since the example script contains no "-y" defaults it seems that you have simply typed the description for a manual installation into a script. This will never work. And well, in a container the application does also need to be on PID-1 which systemctl will not do.
After going through a basic tutorial on docker you will find out why.
This command seems not to be doing anything except for creating an extra layer without any useful effect.
$ cat Dockerfile
FROM ubuntu:18.04
RUN apt-get update && apt-get install openjdk-8-jdk -y
If You want to change the use privilege use USER flag in Dockerfile

Install packages with Yarn on Elastic Beanstalk

I'd like to install packages on Elastic Beanstalk using Yarn as an alternative to NPM. I've tried all sorts of solutions I've found online, but they all appear to be outdated and no longer work. Here's what I have right now, as described in this gist.
files:
'/opt/elasticbeanstalk/hooks/appdeploy/pre/49yarn.sh' :
mode: '000755'
owner: root
group: root
content: |
#!/usr/bin/env bash
set -euxo pipefail
EB_APP_STAGING_DIR=$(/opt/elasticbeanstalk/bin/get-config container -k app_staging_dir)
if node -v; then
echo 'Node already installed.'
else
echo 'Installing node...'
curl --silent --location https://rpm.nodesource.com/setup_6.x | sudo bash -
yum -y install nodejs
fi
if yarn -v; then
echo 'Yarn already installed.'
else
echo 'Installing yarn...'
wget https://dl.yarnpkg.com/rpm/yarn.repo -O /etc/yum.repos.d/yarn.repo
yum -y install yarn
fi
'/opt/elasticbeanstalk/hooks/appdeploy/pre/50npm.sh' :
mode: '000755'
owner: root
group: root
content: |
#!/usr/bin/env bash
set -euxo pipefail
yarn install --ignore-engines
The above answer works only on Amazon Linux (AMI) 1 version. If you are using AMI version 2 you can do the following:
Create a .platform/hooks/prebuild/yarn.sh file with the following content:
#!/bin/bash
# need to install node first to be able to install yarn (as at prebuild no node is present yet)
sudo curl --silent --location https://rpm.nodesource.com/setup_14.x | sudo bash -
sudo yum -y install nodejs
# install yarn
sudo wget https://dl.yarnpkg.com/rpm/yarn.repo -O /etc/yum.repos.d/yarn.repo
sudo yum -y install yarn
# install
cd /var/app/staging/
# debugging..
ls -lah
yarn install --prod
chown -R webapp:webapp node_modules/ || true # allow to fail
Be sure to chmod +x this file (it needs to be executable)
https://gist.github.com/cooperka/0960c0652353923883db15b4b8fc8ba5#gistcomment-3390935
This is what I use to run Yarn on Beanstalk :
commands:
01_install_node:
command: |
sudo curl --silent --location https://rpm.nodesource.com/setup_8.x | sudo bash -
sudo yum -y install nodejs
02_install_yarn:
test: '[ ! -f /usr/bin/yarn ] && echo "Yarn not found, installing..."'
command: |
sudo wget https://dl.yarnpkg.com/rpm/yarn.repo -O /etc/yum.repos.d/yarn.repo
sudo yum -y install yarn
container_commands:
01_run_yarn:
command: |
yarn install
yarn run encore production

Can't run Node after install on EC2 Instance

I followed the instructions here: https://codeforgeek.com/2015/05/setup-node-development-environment-amazon-ec2/ - Everything seems to have installed properly. When I run 'node --version' I get -bash: node: command not found. I have run sudo ln -fs out/Release/node /usr/bin/node and still the same issue. When I run 'whereis node' I get node: /usr/bin/node /usr/local/bin/node. When I navigate to either of these directories 'node' is in red.
I am a front end guy so all this infrastructure stuff is new to me so please excuse my ignorance. I would like to avoid smashing my machine!
Thanks
Use the NodeSource packages.
The setup script is https://rpm.nodesource.com/setup_6.x
If you just want it to work, as root run
sudo su - root
curl --silent --location https://rpm.nodesource.com/setup_6.x | bash -
yum -y install nodejs gcc-c++ make

Node Apps on Ubuntu using pm2: Is my planned configuration correct?

im currently planning to run node.js applications on my ubuntu virtual-server.
I'll show you my planned workflow to install, and you may say if there could be any problems or improvements.
Okay, here we go:
# Install Node.js as root
# Install the pm2 package:
$ sudo npm install -g pm2
# Add a user which will run all the node apps
$ sudo useradd node-user
$ sudo passwd node-user
$ sudo mkhomedir_helper node-user
$ sudo chsh -s /bin/bash node-user
# Create a dir where all node apps are located
$ sudo mkdir /var/node-apps
$ sudo chown node-user:node-user /var/node-apps
$ sudo ln -s /var/node-apps /home/node-user/node-apps
# Install auto-start script
$ sudo pm2 startup ubuntu
# From now on, don't use root! Execute the following as "node-user"
$ cd ~/node-apps
$ git clone https://github.com/bahuma/shop.git
$ cd shop
$ npm install
$ bower install
# Start an app with environment variables
$ IP=127.0.0.1 PORT=55443 DATABASE=[dburl] SESSION_SECRET=[secret] pm2 start server.js --name bahuma-shop
# Connect the pm2 to Keymetrics.io
$ pm2 link [KEY] [SECRET] bahuma-server
So this is my planned workflow. Would this work? Are there any problems?
Thank you in advance
Max

On EC2: sudo node command not found, but node without sudo is ok

I have just installed nodejs on a new EC2 micro instance.
I installed it normally, ./configure -> make -> sudo make install.
Problem: When I run "node" under ec2-user, it runs perfectly. When I run "sudo node", it fails.
I found out that node is in:
[ec2-user#XXXX ~]$ whereis node
node: /usr/local/bin/node /usr/local/lib/node
and the current path is
[ec2-user#XXXX ~]$ echo $PATH
/usr/local/bin:/bin:/usr/bin:/opt/aws/bin:/home/ec2-user/bin
but, the sudo path is
[root#ip-10-112-222-32 ~]# echo $PATH
/usr/local/sbin:/sbin:/bin:/usr/sbin:/usr/bin:/opt/aws/bin:/root/bin
then I tried to edit the root PATH to include the paths to node, so "node" runs when I'm logged in as root - but it still won't work when I log in as ec2-user and run "sudo node".
I need this to install npm properfly. Any idea on how to include the node path while running "sudo node"?
Yes, it is a bit annoying but you can fix it with some links:
sudo ln -s /usr/local/bin/node /usr/bin/node
sudo ln -s /usr/local/lib/node /usr/lib/node
sudo ln -s /usr/local/bin/npm /usr/bin/npm
sudo ln -s /usr/local/bin/node-waf /usr/bin/node-waf
There might be more but that is all I have run across so far. Lack of node-waf will cause some npm installs to fail with a rather cryptic error message.
I added /usr/local/bin to secure_path in /etc/sudoers
$ sudo visudo
Then change this line:
Defaults secure_path = /sbin:/bin:/usr/sbin:/usr/bin
To:
Defaults secure_path = /sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin
it happens because the node executable is not found in /usr/bin. So follow the steps:
find node:
whereis node
in my case: node: /home/<my_user>/.nvm/versions/node/v8.9.4/bin/node
make a symbolic link for node:
sudo ln -s /home/<my_user>/.nvm/versions/node/v8.9.4/bin/node /usr/bin/node
It's done!
Why not use the absolute path to node? If you planning to use an upstart script it is going to need an absolute path anyways.
sudo /usr/local/bin/node server.js
try the following:
export PATH=$PATH:/usr/local/bin
sudo node --version
You could pass full path to node executable from parent (non-sudo shell) using which command.
sudo `which node`
For me, it worked to just change ownership of node folder from root to ec2-user (logged in as ec2-user).
(Note: I created my node folder in /var/lib/)
sudo chown -R ec2-user /var/lib/node/
Then
npm install mongojs
should work fine (provided you have installed npm ok of course!)
How about using "sudo $(which node)" instead of "sudo node" ?
Here's an approach that doesn't use symlinks, or require root:
$ git clone https://github.com/joyent/node.git
$ cd node
$ mkdir ~/opt
$ export PREFIX=~/opt; ./configure
$ make
$ make install
$ echo 'export PATH=~/opt/bin:${PATH}' >> ~/.bashrc
Then I did:
$ git clone https://github.com/isaacs/npm.git
$ cd npm
$ make install
The benefits of not running node as root are discussed here:
http://increaseyourgeek.wordpress.com/2010/08/18/install-node-js-without-using-sudo/
Its inline with:
https://github.com/joyent/node/wiki/Installation
In my case, Node was installed without sudo prefix. So node was unavailable for the superuser that why it is not working sudo node server
Enter as root with
sudo su
and then do standard steps
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.34.0/install.sh | bash
. ~/.nvm/nvm.sh
nvm install node
node -e "console.log('Running Node.js ' + process.version)"
This is what I did to solve a similar issue. Note: I had installed node via snap.
Step 1: Install node via snap
sudo snap install node --classic
Step 2: Find where node has been installed
whereis node
In my case
/snap/bin/node.npm
/snap/bin/node.npx
/snap/bin/node.yarn
/snap/bin/node
/snap/bin/node.yarnpkg
Step 3: Create symbolic links to node, npm, npx and yarn
sudo ln -s /snap/bin/yarn /usr/bin/yarn
sudo ln -s /snap/bin/node /usr/bin/node
sudo ln -s /snap/bin/npm /usr/bin/npm
Finally node is accessible for all users, even sudo group
sudo node
I tried everything mentioned in the above answers but nothing worked. Probably because of my lack of understanding of concepts related to sym links. I fixed the issue by not using nvm.
I just created a new ec2 instance and didn't install nvm. Instead I installed node and npm like so:
sudo apt update
sudo apt install nodejs npm
And this did it for me.
If you have installed node environment already, paste these command in you r instance and it'll link your node to your user directory. And you will be able to use node with sudo.
sudo ln -s "$(which node)" "/usr/local/bin/node"
sudo ln -s "$(which npm)" "/usr/local/bin/npm"
I don't know if this is the right way, but this is what i did...
sudo su
export PATH=$PATH:/home/ec2-user/local/node/bin
curl http://npmjs.org/install.sh | sh
chown -R ec2-user /home/ec2-user/local/node
exit
This installed npm, and I can now install any packages I want.

Resources