Why Your VPS Isn’t Accessible from the Internet (Even When Ports Are Open)

5/5/2026by Emmanuel Oye

I’m pretty new to anything DevOps-related, and this was my first real attempt at deploying an app to a VPS. I expected a few hiccups, but I didn’t expect to spend hours debugging something that wasn’t even in my code, or my server.

And almost immediately, I hit a wall I didn’t even know existed.

  • The app works locally
  • It works inside the server
  • But from the outside? Nothing. Just… silence.

No errors. No logs. No clues.

That was me for days.

The Setup That Should Have Worked

I had:

  • A Go backend running on port 8080
  • A VPS on Oracle Cloud
  • ufw configured to allow traffic
  • The app responding perfectly when I ran:

curl localhost:8080

So naturally, I expected this to work:

curl my-public-ip:8080

It didn’t.

Not a 500.
Not a 404.
Just a request that hung forever like it fell into a black hole.

The Dangerous Assumption

I kept thinking:

“If my server firewall is open, then my app is accessible.”

That assumption is wrong.

And it cost me hours… then days… then a full break from the problem.

The Layer Nobody Mentions

Here’s what I didn’t know:

Your VPS is not the edge of the internet.

There’s another layer before traffic even reaches your server:
the cloud network itself.

In Oracle Cloud, this is called a Security List.

Think of it like this:

  • Your app = your house
  • ufw = your front door
  • Security List = the gate to your entire estate

I had unlocked the front door…

…but the gate outside was still shut.

So every request died before it even touched my server.

Why This Is So Frustrating

Because nothing tells you.

  • Your app logs look fine
  • Your server looks healthy
  • Your firewall looks configured

There’s no error saying:

“Hey, your cloud provider is blocking this.”

It just fails silently.

That silence is what makes it brutal.

The Fix That Felt Like Magic

I logged into the Oracle Cloud dashboard and:

  • Found the VCN (Virtual Cloud Network)
  • Opened the Security List
  • Added an Ingress Rule:
    • Port: 8080
    • Source: 0.0.0.0/0

Saved.

Retried the request.

It worked instantly.

No redeploy. No restart. No code changes.

Just one rule.

What This Changed for Me

Before this, I thought deployment was:

“Make app → run app → done”

Now I see it more like layers:

Is my app running?

Is it listening on the right port?

Is the OS firewall allowing traffic?

Is the cloud network allowing traffic? ← this one got me

Miss one layer, and everything breaks.

If You’re Currently Stuck

If your situation looks like this:

  • Works on localhost
  • Works via SSH into your server
  • Doesn’t work from your browser

Don’t touch your code.

Check your cloud firewall.

Seriously, check it early, not after hours of debugging like I did.

Why I’m Sharing This

I actually gave up on this once.

Closed my laptop. Came back weeks later.

Because when you don’t know this layer exists, the problem feels unsolvable.

Now that I’ve gone through it, I know it’s not “advanced DevOps knowledge.”

It’s just one missing piece no one tells beginners about.

This was one of those lessons that cost me hours (and a bit of sanity), but now I won’t forget it.