DriversRecommendedOutdated drivers can make a good PC feel brokenScan driver issues before chasing fixes manually.Scan NowOctober DealsAmazon USOctober deal check: compare before you payAmazon US: current deals, useful picks and tech finds.Check DealsClean PCRecommendedOne scan can reveal what keeps slowing WindowsLook for cleanup and repair opportunities.Run Scan×
Skip to content
VGSources
Blog

How to Deploy a Socket.IO Node.js App With Dokku on a VPS

A practical Dokku deployment guide for Socket.IO: prepare the Node server, declare the web process, verify Dokku port mapping, configure nginx upgrades and diagnose failed connections.
Length8 min Posted Quest giverVGSources Team
Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

A Socket.IO app deploys successfully on Dokku when three pieces agree: your Node process runs as a web process, it listens on the port Dokku assigns, and nginx forwards the WebSocket upgrade on the /socket.io/ path. Miss any one of those and ordinary HTTP may work while real-time connections fail.

What you are deploying

Dokku runs your Node.js application behind its nginx reverse proxy. A browser first reaches nginx, nginx routes the request to the Dokku process, and Socket.IO then negotiates either a WebSocket connection or its HTTP long-polling fallback. The reverse proxy must preserve that negotiation; a normal HTTP proxy configuration is not sufficient.

As an Amazon Associate I earn from qualifying purchases.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

This guide assumes a VPS with Dokku already installed, a Node.js application that already runs locally, and DNS pointing your intended hostname at the server. VPS provisioning, DNS setup, TLS issuance and the exact deploy workflow vary by Dokku release and were not established in the available documentation, so verify those parts against the documentation installed with your version.

Prepare the Node.js application

Create one HTTP server for Express and Socket.IO

Attach Socket.IO to the same HTTP server that serves your application. The important deployment detail is that the listener uses Dokku’s supplied port and binds to an externally reachable interface:

#1 Best Overall
Sale
Gaoye Blue Light Blocking Glasses
  • BLUE LIGHT BLOCKING GLASSES: Our blue light glasses for women boast UV400 protection, blocking harmful blue rays from computer screens. With these bluelight glasses women, you can enjoy gaming, reading, or watching TV with no worries of eye strain.
  • EYE RELIEF: Our blue light glasses are engineered to reduce blurry vision or strain caused by prolonged screen time. These womens blue light glasses aid in better sleep by preventing blue light from disrupting your natural sleep cycle, helping you fall asleep faster and enjoy a more restful night's sleep, making them the perfect christmas present.
  • COMFORTABLE: Crafted from durable material, our trendy blue light glasses for woman or blue light glasses men ensure long-lasting comfort. The high-transmittance lenses accessories, gamer gifts for men, help keep your eyes relaxed. Perfect stocking stuffers, gifts for gamers men, christmas gifts for men, halloween costumes.
  • LIGHTWEIGHT: These clear blue light glasses feature a lightweight frame, meaning they’ll stay comfy for long-term wear. Perfect as blue blockers glasses for women or mens blue light glasses, these non-prescription fake glasses for men can be worn throughout the day. The blue light blocking glasses women feature polycarbonate HD lenses, which are anti-reflective and restore true color.
  • WORRY-FREE PURCHASE: If you experience any issues, our support team is ready to assist you quickly. These are the perfect costume glasses for cosplay dressing up.
const http = require('http');
const express = require('express');
const { Server } = require('socket.io');

const app = express();
app.get('/', (_req, res) => res.send('ok'));

const server = http.createServer(app);
const io = new Server(server, {
  // Match this path in the nginx configuration.
  path: '/socket.io/'
});

io.on('connection', (socket) => {
  socket.emit('ready', { id: socket.id });
});

const port = process.env.PORT;
if (!port) throw new Error('PORT was not provided');
server.listen(port, '0.0.0.0', () => {
  console.log(`listening on ${port}`);
});

Do not hard-code a public port in application code. Dokku’s port-management documentation advises letting Dokku derive the value from its port mapping rather than manually setting PORT. Because behavior can differ between Dokku releases and deployment methods, confirm the effective value in your installed version and log the port at startup.

Make the start command explicit

Declare a production start script in package.json:

{
  "scripts": {
    "start": "node server.js"
  }
}

Then add a Procfile at the repository root:

web: npm start

Dokku routes web traffic to the process type named web. On a first deploy, that process type is normally scaled to one instance; without it, Dokku has no web process to send requests to. If your entry file or package-manager command differs, change only the command after web:.

What’s actually slowing this PC down?

Pick the symptom - the matching free tool is one click away.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Create the Dokku app and deploy it

Use a unique app name

On the VPS, create an app name that matches the name you will use in the Dokku Git remote. The exact command syntax should be checked against your Dokku release:

Rank #2
Windex Gaming Cleaning Wipes, Pre-Moistened Wipes to Instantly Clean all Gaming Gear and Electronics, Resealable Packaging for a Freshness Lock, 25 count (Pack of 1)
  • WINDEX GAMING WIPES: effortlessly clean all your gaming gear and gaming electronics in one easy step with our new Windex Gaming Wipes
  • AMMONIA FREE: our ammonia-free formula is safe to use on all of your favorite gaming equipment like consoles, headsets, controllers, screens, keyboards, and more
  • PRE-MOISTENED WIPES: each wipe instantly removes dust, dirt, and stubborn smudges and fingerprints leaving a streak-free shine
  • ANTI-STATIC: great for cleaning and wiping down your gaming gear and electronics leaving behind no visible residue
  • COMPACT RESEALABLE PACKAGE: store your pack of Windex Gaming Wipes anywhere in your home for whenever a quick and easy wipedown is needed
dokku apps:create my-socket-app

From your local project, add the Dokku remote in the form used by your server and push the branch you deploy:

git remote add dokku dokku@your-vps-host:my-socket-app
git push dokku main

These commands are the conventional Dokku Git deployment form; if your installation uses a different SSH account, branch policy or remote name, use the values configured by that installation. Watch the build and release output for confirmation that dependencies installed, the web process started and a port was assigned.

Confirm the process and mapping before debugging nginx

Inspect the app’s process and proxy information with the reporting commands provided by your Dokku version. You want to see a running web process and a proxy mapping to the port on which the Node process is listening:

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.
Rank #3
Sale
LISEN Cell Phone Stand Phone Holder for Desk, Office Decor Gadgets for Men
  • Ergonomic & Adjustable Design: Fight "text neck" and improve your posture. Designed for comfort, it offers an adjustable height (7.1in-8.5in) (1.4in adjustable range) and angle (5°-85°) Please note: cell phone stand is only 9 inches tall—the length of a standard pencil
  • Without blocking subtitles Perfect for office desk Tiktok Face Time Zoom video—this is the ultimate kitchen desk essential for phones! Perfect viewing experience while reducing neck back strain, A must-have for gamers streamers desk, and anyone who values both style and support!
  • Sleek & Stable Design fits Otterbox Case: Say goodbye to bent cables, tangles, and tip-overs! LISEN’s stylish adjustable desk phone holder features a built-in charging hole and smart cable management, keeping your phone secure and your workspace clutter-free cool gadgets for men
  • ANTI-SLIP DESIGN free hands: The under 10.00 items easy gadgets back and the bottom of this kitchen essentials for women are fully covered by anti-skid silicone, which LISEN stand up desk decor can provide maximum protection device from any scratches and slides
  • Your Perfect Viewing Companion:If your product arrives damaged or breaks within 365 days, reach out to LISEN for a quick and hassle-free solution. Struggling with assembly, like tightening the screw? We’ve got your back! Your experience matters to us. (Product including: phone Holder stand*1, screw*1, hexagon screwdriver*1, specification*1)
dokku ps:report my-socket-app
dokku apps:report my-socket-app

If the process exits immediately, read the application log first. Typical causes are a missing production dependency, a start script that points at the wrong file, or code that calls listen with an undefined or hard-coded port.

Handle the port correctly

Port configuration is the part of this deployment that most often differs between tutorials. Dokku’s current port-management guidance says not to set PORT manually; Dokku obtains the internal port from its proxy mapping. A third-party example instead sets PORT=3000, but that approach is lower-confidence and may conflict with the installed release.

Situation What to do Why
Application reads process.env.PORT Prefer Dokku’s generated port and verify it with the app report. Dokku can keep the process and proxy mapping consistent.
Application hard-codes 3000 or another port Change the code to read process.env.PORT. A hard-coded listener may not match Dokku’s routing target.
You are following an older port-map example Treat DOKKU_PROXY_PORT_MAP=http:80:5000 as a dated example, not a universal default. Port mappings and defaults can change between Dokku versions.
A tutorial tells you to run dokku config:set APP PORT=3000 Do not apply it blindly; check the installed Dokku port-management documentation first. Manual PORT settings can override or contradict Dokku’s mapping.

The reliable test is agreement among three values: the port printed by your Node process, the internal target shown by Dokku, and the upstream target in nginx. If any two differ, fix that mismatch before changing Socket.IO settings.

Rank #4
Ledagic IC+RGBW USB Powered Led Light Bar with App & Remote Control, 2 Pack
  • Easy Installation: Our gaming lights have been designed to enhance your entertainment experience. Simply position the led light bar next to your TV or game console to create a game room environment with ease. They come with USB power and a 60 inch cord for direct mounting and mobility
  • Audio Syncing & Extensive Mode: The built-in high-sensitivity music sensor allows you to sync the TV led lights to your favorite music. Lights react and move to the beat of music, film and game audio, creating an incredible immersive sound and light experience – and all without the need for an additional hub. You can choose from 64+ patterns, including strobe, illusion, jump, energy, gradient, running, chasing, fluttering mode etc. Each mode can be applied to different scenes
  • 64+ Chasing IC+RGB & W Effect: The independent control design of IC+RGB and white all-in-one multifunctional rgbw led bar lights monitor backlight allows you to easily switch the led lights for desk between IC+RGB and white to enjoy a variety of lighting effects, you can choose white lighting mode with high brightness for better illumination when working, etc. Choose IC+RGB lighting mode when you need to create an entertaining atmosphere for the light show, 16 million colours of Color changing rgb light bar let you dance to the beat and create a dynamic party atmosphere
  • Dynamic and Dimmable Lights: 1%-full brightness free brightness adjustment gives you the flexibility to adjust dimmable led light bar for room decorations or a variety of occasions
  • USB Powered: USB light bars for room can be powered by powernank, usb charger, TV, Monitor, laptop PC mainframe, making behind TV led lighting bar easy to install in any location.TV led lights are powered by the TV usb interface / PC mainframe, can be turned on/off synchronously with TV / PC

Configure nginx to pass the WebSocket upgrade

Required headers for a dedicated Socket.IO location

Socket.IO’s reverse-proxy guidance and Dokku’s WebSocket tutorial both require HTTP/1.1 plus the WebSocket upgrade headers. Dokku’s example also disables proxy buffering for the WebSocket location. A representative location is:

location /socket.io/ {
    proxy_pass http://YOUR_DOKKU_UPSTREAM;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_buffering off;
    proxy_read_timeout 600s;
}

YOUR_DOKKU_UPSTREAM is illustrative: use the upstream name or mapped backend generated by your Dokku installation. Do not assume that a backend port such as 5000 is correct for your app. Keep the /socket.io/ path aligned with the path option in your Socket.IO server and client.

Dokku’s tutorial uses a dedicated WebSocket upstream/location (often named with a -ws suffix). That arrangement makes the upgrade headers explicit while leaving ordinary HTTP handling separate. Apply the change through the nginx customization mechanism supported by your Dokku version rather than editing a generated file that Dokku will overwrite on the next deploy.

Best Value
Sale
HUANUO FlowLift™ Dual Monitor Stand, Fully Adjustable Gaming Monitor Desk Mount for 13–32″ Computer Screens, Full Motion VESA 75x75/100x100 with C-Clamp & Grommet Base, Each Arm Holds 4.4 to 19.8 lbs
  • Compatible with Wide Screens - To ensure compatibility with the dual monitor mount, your each monitor must meet three conditions at the same time: First, computer screens size range: 13 to 32 inches. Second, screen weight range: 4.4 to 19.8 lbs. Third, the back of the monitor screen must have VESA mounting holes with a pitch of 75x75mm or 100x100mm.
  • Regarding the compatibility with desks - Your desk must meet three conditions at the same time: First, desk material: Only wooden desks are recommended, plastic or glass desks cannot be used. Second, desk thickness range: 0.59" - 3.54". Third, the bottom of the desk should not have any cross beams or panels, as this will interfere with installation. We recommend carefully checking that your desk and monitors meets all above conditions before purchasing.
  • Dual C-Clamp Hold - Worried your dual monitors might wobble or slip? Our upgraded base uses a larger platform plus a dual C-clamp structure to lock the dual monitor arm firmly to your desk. Each arm safely keeps your screens steady while you type, click and game—no shaking, no sliding, just a clean and secure setup you can trust every day. It also provides Grommet Mounting installation choice, both options ensure stable and secure fixation for your 0.59" - 3.54" desk.
  • Full-Motion Adjustment For Comfortable View - Pull the screen closer when you’re deep in a spreadsheet, push it back to watch videos, or rotate to portrait for coding — moving everything smoothly with just one hand. The monitor stand offers +85°/-50° tilt, ±90° swivel and 360° rotation. Raise your monitor up to 15.75″ to support a healthy sitting posture. Whether you’re working from home, gaming through the night, or switching between video calls and documents, getting the screens to your natural line of sight helps relieve neck, shoulder and back strain so you can stay focused longer with less fatigue.
  • Keep Your Desk Organized: By lifting both screens off the desktop, this dual monitor stand opens up valuable space for your keyboard, notebook, docking station or a simple, clutter-free work area. Built-in cable management guides wires along the arms, keeping cords out of sight and out of the way. Enjoy a tidy, modern workstation that looks as good as it feels to use.

Serve HTTP and WebSocket traffic in one location

If you want one location to handle both normal requests and upgrade requests, nginx can select the connection header from $http_upgrade:

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.
map $http_upgrade $connection_upgrade {
    default upgrade;
    ''      close;
}

location / {
    proxy_pass http://YOUR_DOKKU_UPSTREAM;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection $connection_upgrade;
    proxy_set_header Host $host;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_read_timeout 600s;
}

The map directive belongs in nginx’s http context, not inside a location. A dedicated /socket.io/ location is easier to audit; the mapped single-location form is useful when your application intentionally handles both traffic types through one route.

Independent reader supportYour contribution helps us test, update, and keep practical guides available for everyone.Support on Ko-Fi

Set a timeout for long-lived connections

Reverse proxies may close an idle upstream connection after roughly 60 seconds by default. A Socket.IO connection can legitimately remain quiet for longer, so raise proxy_read_timeout for the WebSocket route (the examples use 600 seconds) and choose a value compatible with your application’s heartbeat interval. A timeout only controls how long nginx waits for upstream activity; it does not repair a missing upgrade header or an incorrect port.

Test the deployment in the right order

  1. Test ordinary HTTP. Open the app’s public URL and confirm that the route served by Express responds. If it fails, fix the process, domain or port mapping before testing WebSockets.
  2. Inspect the browser handshake. In browser developer tools, open the Network panel, filter for socket.io, and reload the page. A successful WebSocket transport shows an upgrade request; polling requests may appear first while Socket.IO negotiates transports.
  3. Check the response path. The client and server must use the same Socket.IO path, normally /socket.io/. A client pointed at /ws will not reach a location configured for /socket.io/.
  4. Read both logs. A 502 from nginx usually indicates an unavailable process or wrong upstream. A 400/404 on the Socket.IO endpoint commonly indicates a path, host or upgrade-routing mismatch. Application logs reveal whether the connection callback runs.
  5. Retest after every configuration change. Reload the supported nginx/Dokku configuration, reconnect the client, and verify that the generated configuration still contains the upgrade headers after a redeploy.

Troubleshoot the common failure modes

Symptom Likely cause Correction
HTTP works, but the browser stays on polling or reports a failed upgrade Missing HTTP/1.1, Upgrade or Connection header. Add all three directives to the Socket.IO location and reload the supported nginx configuration.
502 Bad Gateway The web process is stopped, listening on another port, or the upstream target is wrong. Check process status, startup logs, Dokku’s reported mapping and the nginx upstream.
404 on /socket.io/ The client path and server path differ, or a more specific route intercepts the request. Use the same path on both Socket.IO instances and route that path explicitly.
Connections drop after about one minute of inactivity nginx’s idle upstream timeout is too short. Increase proxy_read_timeout for the long-lived route and ensure Socket.IO heartbeats are functioning.
It works locally but not through the hostname The local process is healthy, but DNS, Dokku routing or nginx is not forwarding the public request. Verify the hostname reaches this VPS, then test HTTP, the reported port mapping and the upgrade request separately.
The process starts and then exits The start command, production dependency installation or environment validation failed. Run the exact production start command, inspect Dokku logs and ensure process.env.PORT is present at startup.

Scaling beyond one instance

A single web process is the simplest topology and avoids cross-instance coordination. Socket.IO’s long-polling fallback is commonly associated with a need for sticky sessions when clients can move between instances, but the available Dokku material does not confirm how session affinity is configured for a particular Dokku release. Do not scale this app out solely by increasing the process count until you have verified Dokku’s routing behavior and Socket.IO’s adapter/session requirements for your version.

If you do test multiple instances, monitor both transports rather than testing only upgraded WebSocket connections. A setup that appears healthy for clients that remain on one upgraded connection can still fail for polling clients that make repeated HTTP requests.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Production checklist

  • The application creates one HTTP server and attaches Socket.IO to it.
  • The listener reads process.env.PORT and binds to 0.0.0.0.
  • package.json has a working production start script.
  • The root Procfile declares web: npm start (or your equivalent command).
  • Dokku reports a running web process and a matching proxy mapping.
  • You have verified the installed Dokku release’s port-management behavior instead of copying an unversioned PORT setting.
  • The nginx Socket.IO route uses HTTP/1.1, Upgrade, Connection and disabled buffering.
  • The client and server agree on /socket.io/ (or another explicitly configured path).
  • proxy_read_timeout is long enough for your heartbeat and idle-connection policy.
  • You have tested both the public HTTP response and the browser’s Socket.IO network handshake after deployment.

Product prices and availability are accurate as of the date/time indicated and are subject to change. Any price and availability information displayed on Amazon at the time of purchase will apply.

Leave a Reply

Your email address will not be published. Required fields are marked *

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

More quests from Patch Notes

  1. How to Set Up a RedM (RDR2) Server in 2026: License Key, txAdmin and server.cfg, Step by StepBlog11min
  2. Best RedM (RDR2) Server Hosting in 2026: Comparing Four Hosts on Slots, Memory and PriceBlog10min
  3. How to Host a Mindustry Server in 2026: server-release.jar, Port 6567 and the Commands That MatterBlog7min
Recommended PC Tool
Recommended PC Tool
Windows Errors? Fix Them Before They SpreadFree repair scan
Outdated Drivers Are Slowing You DownFree scan - exact matches

Two free Windows tools

One Free Minute Could Fix That PC

Before you go - each of these free tools takes about a minute and tackles what quietly slows a Windows PC down.

Special offer. View Outbyte info, uninstall instructions, EULA, and Privacy Policy.