I wrote about how to create a SSH Tunnel with ngrok on Ubuntu Server (aka ssh access to your local server in local network with dynamic ip) in another article. If you haven’t installed ngrok yet, please read that guide first.
After I had access to my Ubuntu Server through SSH, the next logical step (at least for me) was to enable Jupyter Notebooks running inside TORUS (Docker) to be reachable from a remote browser. That way I’m able to run python code on the server while using my browser as if it was locally installed. To run ngrok for a http port forward is fast and easy, even remotely through SSH, but before that let’s talk about screen
What is screen?
GNU Screen is a terminal multiplexer, a software application that can be used to multiplex several virtual consoles, allowing a user to access multiple separate login sessions inside a single terminal window, or detach and reattach sessions from a terminal. -Wikipedia
It is one of those tools you will love once you know them. screen lets you “open multiple windows” in your terminal (SSH included). You can run multiple commands and, if connected through SSH, keep running and get back to them even if the connection gets down. To install screen just open a terminal and type
sudo apt-get install screen -y
ngrok and screen
Once you have screen installed lets use ngrok to open a tunnel to your Jupyter instance inside TORUS.
1. SSH into your server 2. Open screen and assign a name
screen -S ngrok_jupyter`
3. Identify on which port is Jupyter Notebooks running
4. Start ngrok on that port
ngrok http 32768
This will open ngrok with information on that connection, and you will see the following on your screen. If you access the URL you will open Jupyter Notebooks from anywhere.
5. Now lets use screen
Now you can press crtl + a and then d to leave (detach) screen.
ngrok will still be running. If your SSH connection goes down, ngrok will still be running.
6. To reconnect to (attach) screen and stop ngrok type
screen -r ngrok_jupyter
and press ctrl + c. This will interrupt ngrok
You should also know that
- If the server connection gets down, you won’t be able to access it unless you are in front of it (physically).
You can use the same steps to forward any port from your local server to a public ngrok url. For example, a web server (apache2 or nginx), a custom app, a python server and so on. You only need to know the port on which you can access it locally and then write in when running ngrok
ngrok http PORT
If you don’t want to use screen, you can append & at the end of the command to run it in the background.
- If you don’t use screen nor append & your ngrok forward will stop if your SSH connection goes down.
- You can also run ngrok locally. No need to use SSH if you are in front of the server.