How to make my heroku app run on https:// rather than http://? - security

I have an web app running on heroku on a custom domain that seems to be running on http:// by default. Trying to prepend the url with https:// doesn't load the web app. How can I make it so that the app runs on https:// by default?
I tried https://gethttpsforfree.com but I get stuck on step 4 when I try to run the command:
sudo python2 -c "import BaseHTTPServer; \
h = BaseHTTPServer.BaseHTTPRequestHandler; \
h.do_GET = lambda r: r.send_response(200) or r.end_headers() or r.wfile.write('owEJmoAzBgnz0Z01_8U0OYC4cQJ1EGi5XMUlYNiY6V0.5J4dX_XNJIPk6rA_h9DwP8Xe41hXdUx8-4JJwmnXEwo'); \
s = BaseHTTPServer.HTTPServer(('0.0.0.0', 80), h); \
s.serve_forever()"
I run this command by prepending it with heroku run -a appname in the terminal, but I get sudo not found. If I don't use sudo then I get permission denied.

Related

Port problems to access a service inside a container

I'm posting for a friend. He asked my help and we couldn't find out what's going on.
My situation is: my application works perfectly on Ubuntu 18.04 when it’s not inside a container, but the customer required the use of containers so I created a Dockerfile so it could be started by a Docker container.
Here’s the contente of my Dockerfile
FROM node:8.9.4
ENV HOME=/home/backend
RUN apt-get update
RUN apt-get install -y build-essential libssl-dev
RUN apt-get install -y npm
COPY . $HOME/
WORKDIR $HOME/
RUN npm rebuild node-sass
RUN npm install --global babel-cli
USER root
EXPOSE 6543
CMD ["babel-node", "index.js"]
After building the image, I execute the following Docker run command:
sudo docker run --name backend-api -p 6543:6543 -d backend/backendapi1.0
Taking a look at the log output, I can conclude that the application Works properly:
I’ve created a rule in my nginx to redirect from port 90 to 6543 (before using containers it used to work)
server {
listen 90;
listen [::]:90;
access_log /var/log/nginx/reverse-access.log;
error_log /var/log/nginx/reverse-error.log;
location / {
proxy_pass http://localhost:6543;
}
}
P.S.: i’ve tried to change from localhost to the container’s IP and it doesn’t work as well.
The fun fact is that when i try na internal telnet on 6543 it accepts the connection and closes it immediately.
P.S.: all ports are open on the firewall.
The application Works normally outside the container (using port 6543 and redirecting in nginx)
I’d appreciate if someone could help us to find out the reason why it’s happening. We don't have much experience creating containers.
Thanks a lot!
Edit: it's an AWS VM, but this is the return when we run the command curl:
We found the solution!!
It was an internar container router problem...
The following Docker run command solved the problem:
sudo docker run --name my_container_name --network="host" -e MONGODB=my_container_ip -p 6543:6543 my_dockerhub_image_name
Thanks a lot!!

linux: supervisor net-snmp mibs

I'm setting up a Flask RESTapi for NET-SNMP because i'm doing most development in Windows.
The problem is that Supervisor does not find my installed mibs.
Everything works if i run the flask app manually with Gunicorn.
But with supervisor i get exceptions saying it cannot locate mibs-files.
Installed mibs are in /home/web/.snmp
supervisor conf
[program:app]
command = /home/web/www/venv/bin/python3.6 /home/web/www/venv/bin/gunicorn app:app -b localhost:8000
directory = /home/web/www/app
user = web
Solved.
added environment to the config
[program:app]
command = /home/web/www/venv/bin/python3.6 /home/web/www/venv/bin/gunicorn
app:app -b localhost:8000
directory = /home/web/www/app
user = web
environment=HOME="/home/web",USER="web"

AWS Linux (Ubuntu) hosted application is not accessible from public ip

I hosted a nodejs(express hello world app) application on AWS Linux(Ubuntu 16.04) on free-tier. When i do wget http://localhost:8080 it runs successfully and saved the output in index.html file.
But when i do the same thing with the public ip (wget http://35.154.40.189:8080) of my instance, it says
Connecting to 35.154.40.189:8080... failed: No route to host.
I also used the steps given in http://www.lauradhamilton.com/how-to-set-up-a-nodejs-web-server-on-amazon-ec2 to forward all ipv4 traffic to my application but it doesn't work.
I also enabled port 8080 from aws console.
netstat -atn says
netstate -ntlp says
I tried everything which i get on internet but unable to resolve the issue. Now i'm too much frustrated. Any help would be highly appreciable.
MAke Your Instance in AWS first
Enable inbound rule as u mention in picutre
Enable user group after ssh connection with AWS ubuntu instance
once instance start running then Install node properly
sudu apt-get update
sudo apt-get install libssl-dev g++ make
download source code of node from web node.tar.gz wih command wget link
https://nodejs.org/dist/v6.9.1/node-v6.9.1.tar.gz
tar -xvf node -v0.10.32.tar.gz
now goto node after unzip .gz
./configure && make && sudo make && sudo make install
boom your node server is ready on new AWS instances
or watch this https://www.youtube.com/watch?v=WxhFq64FQzA&t=1693s

How to map ports with - Express + Docker + Azure

I am completely stuck on the following.
Trying to setup a express app in docker on an Azure VM.
1) VM is all good after using docker-machine create -driver azure ...
2) Build image all good after:
//Dockerfile
FROM iojs:onbuild
ADD package.json package.json
ADD src src
RUN npm install
EXPOSE 8080
CMD ["node", "src/server.js"]
Here's where I'm stuck:
I have tried all of the following plus many more:
• docker run -P (Then adding end points in azure)
• docker run -p 80:8080
• docker run -p 80:2756 (2756, the port created during docker-machine create)
• docker run -p 8080:80
If someone could explain azure's setup with VIP vs internal vs docker expose.
So at the end of all this, every port that I try to hit with Azure's:
AzureVirtualIP:ALL_THE_PORT
I just always get back a ERR_CONNECTION_REFUSED
For sure the express app is running because I get the console log info.
Any ideas?
Thanks
Starting from the outside and working your way in, debugging:
Outside Azure
<start your container on the Azure VM, then>
$ curl $yourhost:80
On the VM
$ docker run -p 80:8080 -d laslo
882a5e774d7004183ab264237aa5e217972ace19ac2d8dd9e9d02a94b221f236
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
64f4d98b9c75 laslo:latest node src/server.js 5 seconds ago up 5 seconds 0.0.0.0:80->8080 something_funny
$ curl localhost:80
That 0.0.0.0:80->8080 shows you that your port forwarding is in effect. If you run other containers, don't have the right privileges or have other networking problems, Docker might give you a container without forwarding the ports.
If this works but the first test didn't, then you didn't open the ports to your VM correctly. It could be that you need to set up the Azure endpoint, or that you've got a firewall running on the VM.
In the container
$ docker run -p 80:8080 --name=test -d laslo
882a5e774d7004183ab264237aa5e217972ace19ac2d8dd9e9d02a94b221f236
$ docker exec it test bash
# curl localhost:8080
In this last one, we get inside the container itself. Curl might not be installed, so maybe you have to apt-get install curl first.
If this doesn't work, then your Express server isn't listening on port 80, and you need to check the setup.

How to setup a private dedicated Node.js Ubuntu Server?

I found an old PC and i want to use it as a dedicated Node.js test machine.
Basically i wanna write my apps on a win machine then copy them over samba to the node folder and launch them via ssh. Later, I would add an upstart script and copy it with samba to the server so that when i reboot the app starts automatically every time.
What do I need to install in order to properly run Node.js apps on my network on a dedicated Ubuntu server? Here is the list I came up with, please correct me if I'm wrong. Is there anything else?
ssh
samba (ftp or sftp should be the way to go but as it's a closed internal network and i have to access it from various os's samba is the simplest way to share files not considering security issues..most of the time i use a simple text editor)
"basic ubuntu server" files?
"LAMP" (?)
node.js
node package manager.
how do i install the latest Node.js, npm, and the init files on Ubuntu server. I saw that there was no simple sudo apt-get install nodejs npm.
What kind of script do I need to launch my apps and where do i put them (prefer native scripts)?
EDIT
After some testing i'm at a good point now, and here is what i did:
I installed ubuntu from a minimal CD
when it comes to choose the packages i selected ONLY ssh & samba
update the system
install the dependencies that u need to run node.js
install latest node from git
setup samba in my case i created the folder /var/nodejs for the scripts
put your testApp.js in the nodejs folder
start your testApp.js from ssh. *it won't work
3-update the system
sudo apt-get update && sudo apt-get upgrade
4-dependancies
sudo apt-get install g++ curl libssl-dev apache2-utils git-core make
5-install node
git clone git://github.com/ry/node.git
cd node
./configure
make
sudo make install
6-setup samba sudo nano /etc/samba/smb.conf
[nodejs]
comment = nodejs
workgroup = WG
security = USER
path = /var/nodejs
server string =Node JS
browsable = yes
read only = no
writeable = yes
create mask = 0777
7-testApp.js
var http = require('http');
http.createServer(function (req, res) {
res.writeHead(200, {'Content-Type': 'text/plain'});
res.end('Hello Node.js\n');
}).listen(80, "192.168.0.1");
console.log('Server running at http://192.168.0.1:80/');
8-Now everything should run...but:
You can run nodejs only as administrator appending "sudo" in front of the launch command
else as a normal user u don't have access to most of the ports under 1000.
A. How can i lauch my app on port 80 without using sudo?
And obviously if u launch you app with the command sudo node /var/nodejs/testApp.js
if u close the terminal the app will stop.
For that we use a init script.
After some reading i found that upstart is natively installed in ubuntu server and it's probably the best way to launch your apps.
B. I know u need to put the script into /etc/init/ with your appname and .conf extension.but how does that work?
what do i need to install to properly run node.js apps on my network on a dedicated ubuntu server?
You just need to install nodejs. nodejs can run on any port, so you don't need Apache or anything else.
how do i install the latest nodejs,npm,and the init files on ubuntu
server
Try to follow the steps outlined in this guide: http://howtonode.org/how-to-install-nodejs . Use the instructions for Ubuntu.
when i reboot the app starts automatically every time
One way to do this is to write a small script that will run on boot. The script would contain the instruction:
nodejs /path/to/app/app.js
Check out this SO answer on how to run a script on boot: https://stackoverflow.com/questions/3036/files-and-scripts-that-execute-on-boot
By your question, you sound about as lazy and impatient as I am, therefore use PPAs instead of building from the source. Just follow the node.js ubuntu directions.
In-fact I'm so lazy, I refuse to type in port numbers, hence I proxy all my node.js applications with nginx. (This is also the best way, and only way I can tell to have multiple servers "listening" on port 80). [Nginx's install guide.] Once you get nginx up, follow Chris Lea's guide.(http://wiki.nginx.org/Install) for the proxy.
BTW if you installed apache, make sure you purge it sudo apt-get purge apache*. This will most likely break your php apps, but that's why you're running node right? Just google how to run php with nignx.
Now for upstart & monit. Just follow this guide. NOTE: The guide has a typo so read the comments carefully.
As for samaba, you're on your own there.
TL;DR
Answer A: guide
Answer B: sudo cp my-node-app.conf /etc/init; sudo service my-node-app start
Edit 1
Upstart is Ubuntu's native utiltiy for starting background processes. Read all about it here.
#!upstart
description "node-app"
author "me"
env PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
respawn
start on runlevel [23]
script
#set enviroment vars here
export NODE_ENV=production
#Uncommit if you need a pid file for monit
#echo $$ > /var/run/node-app.pid
exec /usr/bin/node /path/to/app.js 2>&1 >> /path/to/log/file/app.log
end script
#Logs start and stop time timestamps to the file
pre-start script
echo "[`date -u +%Y-%m-%dT%T.%3NZ`] (sys) Starting" >> /path/to/log/file/app.log
end script
pre-stop script
#Uncomment if you need a pid file for monit
#rm /var/run/yourprogram.pid
echo "[`date -u +%Y-%m-%dT%T.%3NZ`] (sys) Stopping" >> /path/to/log/file/app.log
end script
Now start and stop your process by using service:
sudo service node-app start
Switch start with stop or status if needed.
If you are not using monit, just remove the pid lines. I really recommend using monit because you can configure it to give you email alert if your process dies or an error occurs in the log file.
What i would do:
install ubuntu
install apache and SVN, with svn repos accessible via http://
create a svn for each project
create a svn commit hook to autodeploy scripts to a folder
/svn//hooks/post-commit
REPOS="$1"
REV="$2"
cd /var/target/path
svn cleanup /var/target/path/
svn checkout -q --force file:///svn/ /var/target/path
svn cleanup /var/target/path/
exit 0
/svn//hooks/post_commit.sh
#!/bin/bash
REPOS="$1"
REV="$2"
# Files and directories can be distinguished, as directory paths are displayed with a trailing "/" character.
LOOK=/usr/bin/svnlook
SVN=/svn/
DEV=/var/target/path/
#mkdir /var/tmp/svn
cd /var/tmp/svn
for changes in `$LOOK changed $REPOS | awk '{print $1 "=" $2;}'`;
do
len=${#changes}
idx=`expr index "$changes" =`;
directory=${changes:$idx};
action=${changes:0:$idx-1};
if [ ${changes:len-1} = '/' ]
then
case "$action" in
"A" ) \
mkdir --mode=775 -p $DEV/$directory;
chown nobody:nobody $DEV/$directory;
chmod 775 $DEV/$directory;
;;
"D" ) \
rmdir $DEV/$directory;
;;
esac
else
case "$action" in
"A"|"U"|"UU" ) \
$SVN export --force --non-interactive -r HEAD -q file://$REPOS/$directory;
BASE=`basename $directory`;
DIR=`dirname $directory`;
chown nobody:nobody $BASE;
chmod 775 $BASE;
mkdir --mode=775 -p $DEV/$DIR;
cp -f --preserve=ownership $BASE $DEV/$DIR;
unlink $BASE;
;;
"D" ) \
rm -f $DEV/$directory;
;;
esac
fi
done
echo Updated dev subdomain
exit 1
install nodejs
install nodemon with npm install -g nodemon (out of my head - please check the manual)
create an upstart file for the node js script in /etc/init
description "nodejs with nodemonn"
author "etc"
start on startup
respawn
script
cd /var/target/project/dir/
exec nodemon /var/target/project/dir/main.js
end script
now all you have to do is work on the code and commit
when you commit the code is updated and the nodejs script is restarted
have fun coding !
I don't think samba is required, unless you want to develop on the server via samba. If you want to do that just skip the svn part and install samba, but setup nodemon upstart scripts - it will save you alot of hassle os ssh-ing.
I work this way because it allows me to write and test locally and then comit code to dev/test/prod servers quick and easy.
To solve the port 80 issue, just setup a firewall rule to redirect incoming tcp/80 to tcp/8080 (for instance) and listen in your nodejs script on that port.
More information here: https://serverfault.com/questions/112795/how-can-i-run-a-server-on-linux-on-port-80-as-a-normal-user
p.s. i did not add a complete step-by-step instruction for each item because there are plenty of guides out there that would a much better job than i can
on Ubuntu: startup booting Nodejs + socket.io by ubuntu user:
more /etc/init/noded.conf
# Ubuntu upstart file at /etc/init/noded.conf
description "noded.conf"
author "Nguyen Thanh Binh"
start on runlevel [2345]
stop on runlevel [06]
respawn
script
su - ubuntu -c "NODE_ENV=test exec sudo /usr/bin/node /home/ubuntu/server.js" >> /home/ubuntu/log.log &
end script
You can use forvere module to start a nodejs application in the background.
for full info see this http://blog.nodejitsu.com/keep-a-nodejs-server-up-with-forever.
and I am just running an Ubuntu dedicated server with nodejs and it's working without a problem

Resources