In this video, I deploy real applications on a Linux VPS using Coolify and Portainer on RamNode. Starting from a fresh Ubuntu instance, I walk through best practices, install both platforms from scratch, and show how they simplify app and container management.
Along the way, I explore RamNode features like security groups, snapshots, and access control to lock things down properly. If youβre interested in self-hosting, Docker, or getting more out of a VPS, this video is a great place to start.
This video was sponsored by RamNode. Check them out and develop, deploy, and grow your project or business on their OpenStack-based cloud platform. Check them out and use promo code “LEARNLINUXTV” to set up a free trial and get $5 in starter credit!
Relevant Links
Commands used in this Video
To install updates, we’ll first update the package repository index:
apt update
Then, we’ll apply any updates that might be available:
apt dist-upgrade
Edit the /etc/hostname file to set the hostname:
nano /etc/hostname
Also update the /etc/hosts file to reflect the name change:
nano /etc/hosts
Create a standard user account so that way we’re not using root for everything:
adduser jay
Also, we’ll add our user to the sudo group so we can use it for privileged commands:
usermod -aG sudo jay
At this point, we’ve installed updates, set the hostname, and created a user account. While not required, it’s recommended to shut the instance down and create a snapshot, so you won’t have to install as many updates next time if you wish to redeploy the server:
poweroff
Now that the instance is powered down, you can create a snapshot through the cloud control panel.
Once you finish creating the snapshot and then powering on the instance, you can install Coolify with the following command:
curl -fsSL https://cdn.coollabs.io/coolify/install.sh | sudo bash
Once it’s finished running , you should be able to access Coolify by entering the IP address of your instance into a browser tab, specifying port 8000:
http://192.168.1.105:8000
Building Portainer
After deploying a VPS instance for Portainer, you can download the installation script with the following command:
curl -fsSL https://get.docker.com -o get-docker.sh
And now we’ll run it:
sh get-docker.sh
Continuing, the next step is not required but it does make things easier. What we’ll do is add our user account to the docker group, which will make it easier to manage the solution since being a member of that group gives us full access to manage Docker. Basically – we won’t have to use sudo each time:
usermod -aG docker jay
Now that we’ve added our user account to the docker group, we should exit our session and reconnect to make sure the new group membership takes effect:
exit
And now we should have Docker set up and ready to go. To verify that, we’ll first check the version of Docker we have installed:
docker --version
In addition, there’s also a test container we can deploy that will help us ensure that Docker is running. It doesn’t do much of anything, but it does legitimately test the fact that we an deploy a container image:
docker run hello-world
At this point, we’ve installed Docker and have taken care of that requirement. Another thing we’ll do is create a self-signed certificate to enable secure communication. To do that, we’ll first create a new directory for certificates to be stored:
sudo mkdir -p /opt/portainer/certs
Next, we’ll go into that directory:
cd /opt/portainer/certs
And now we’ll generate our key:
sudo openssl genrsa -out portainer.key 2048
And then we’ll generate the certificate itself:
sudo openssl req -new -x509 -key portainer.key -out portainer.crt -days 365
The next thing we’ll need is to create a new volume within Docker, and that volume will serve as storage for Portainer to store its state and application-specific data:
docker volume create portainer_data
Now that we have a volume, we can deploy Portainer itself:
docker run -d \
--name portainer \
--restart unless-stopped \
-p 8000:8000 \
-p 9443:9443 \
-v /var/run/docker.sock:/var/run/docker.sock \
-v portainer_data:/data \
-v /opt/portainer/certs:/certs \
portainer/portainer-ce:latest \
--ssl --sslcert /certs/portainer.crt --sslkey /certs/portainer.key
And now Portainer should be ready for setup. To access the web console and finalize our Portainer implementation, we’ll access the service at https://192.168.1.105:9443


