NetGrid Host

Launch a website on a VPS in 30 minutes — domain, Cloudflare, free SSL & DDoS

The cheapest fast path from zero to a live HTTPS website in 2026: a domain at GoDaddy (or any registrar), DNS + free SSL + free DDoS protection through Cloudflare, the actual server on a NetGrid Host VPS. Step-by-step with the ready commands for HTML, PHP, Python and Node.js.

12 min read·Last updated 2026-05-03

The fastest, cheapest way to put a website online in 2026 is a three-piece stack that anyone can put together in about thirty minutes: register a domain at any reputable registrar (we use GoDaddy as the example here, but Namecheap, Porkbun or Gandi work the same way), point its DNS at Cloudflare's free plan to get DNS, free SSL and free DDoS protection in one place, and run the actual web server on a small VPS. This article walks through every step, including the commands for the four most common stacks (static HTML, PHP, Python, Node.js).

What you need (and what it costs)

Domain registrar (GoDaddy, Namecheap, Porkbun, Gandi …)~$10–15 / year for a .com
DNS + CDN + SSL + DDoS — Cloudflare Free planFree, no credit card required
VPS — NetGrid Host Starter plan€2.98 / month, deploys in ~60 seconds
Total monthly cost~€2/mo for the server, ~$1/mo amortised for the domain
Why this exact stack
Each piece does one thing well, and there's no overlap. The registrar only owns the domain — they're not in the request path. Cloudflare sits in front of the server and gives you a CDN, free TLS certificate, and L3/L4 DDoS scrubbing — all on the free plan. The VPS just runs your application. Everything is decoupled, so if you want to switch any one component later, the other two don't care.

Step 1 — register a domain

Sign up at GoDaddy (or any other ICANN-accredited registrar), search for the name you want, pay. The basic registration is all you need.

Skip the upsells
Domain registrars try to upsell privacy protection, email hosting, web hosting, SSL certificates and SEO services. You don't need any of them: WHOIS privacy is now free for individuals under ICANN's RDDS rules, and the rest is replaced by Cloudflare + your VPS for less money. Pay for the domain, nothing else.

Step 2 — sign up at Cloudflare and add the site

Create a free account at cloudflare.com, then:

  1. Click Add a site in the dashboard.
  2. Enter your domain (e.g. `example.com`) without https:// or www.
  3. Pick the Free plan (it's the bottom option, you may need to scroll).
  4. Cloudflare scans existing DNS records (usually finds nothing for a brand-new domain) and gives you two nameservers that look like `marek.ns.cloudflare.com` and `tessa.ns.cloudflare.com`. The exact pair is unique to your account — write them down.

Step 3 — point GoDaddy at Cloudflare's nameservers

  1. GoDaddy → My Products → next to your domain click DNS → scroll to Nameservers → Change.
  2. Choose I'll use my own nameservers.
  3. Delete GoDaddy's defaults, paste the two Cloudflare nameservers from Step 2.
  4. Save. GoDaddy may ask you to confirm by email.
  5. Back in Cloudflare, click Done, check nameservers.
DNS propagation: typically 1–4 hours, can be up to 24h
After you save, the change has to propagate through the global DNS system. Cloudflare emails you the moment they detect the switch (usually within an hour). You can keep working in parallel — Steps 4–8 don't depend on the propagation finishing.

Step 4 — order a VPS at NetGrid Host

On netgrid.host pick a plan (the Starter at €2.98/mo is enough for the vast majority of small websites), pick a location close to your audience, pick an OS — we recommend Ubuntu 24.04 LTS for web servers (long-term support, every guide on the internet works on it). The VPS is built and powered on in roughly 60 seconds. You'll receive an email with the public IP, the root password, and the SSH port.

Step 5 — point Cloudflare at your VPS (the A record)

  1. Cloudflare → your domain → DNS → Records → Add record.
  2. Type: A.
  3. Name: `@` (this represents the bare domain, e.g. `example.com`).
  4. IPv4 address: the public IP from your NetGrid Host welcome email.
  5. Proxy status: Proxied (the orange cloud). This is the magic — it routes traffic through Cloudflare's network, which gives you the free SSL and DDoS protection. If you set this to DNS only (grey cloud), Cloudflare just resolves DNS and gets out of the way — you lose the CDN, SSL and DDoS features.
  6. TTL: Auto.
  7. Save.

Then add a record for `www` so both `example.com` and `www.example.com` work:

  1. Add record → Type CNAME.
  2. Name: `www`.
  3. Target: `example.com` (your bare domain).
  4. Proxy status: Proxied.
  5. Save.
What the orange cloud actually does
When DNS is Proxied, Cloudflare returns its OWN IPs (typically 104.x.x.x or 172.x.x.x) instead of your VPS IP when anyone looks up your domain. Visitors connect to Cloudflare; Cloudflare connects to your VPS in the background. Your real IP is hidden, traffic is filtered for attacks, static content is cached at edge POPs in 300+ cities. None of this works on DNS only mode.

Step 6 — turn on free SSL (HTTPS)

Cloudflare → SSL/TLS → Overview → choose an SSL/TLS encryption mode:

OffDisables HTTPS entirely. Don't use.
FlexibleHTTPS between visitor and Cloudflare; HTTP between Cloudflare and your VPS. Quickest to get working but the back-half is unencrypted. OK for the first 10 minutes, then move up.
FullHTTPS end-to-end, but Cloudflare doesn't validate the cert on your VPS — a self-signed cert is accepted. Good middle ground.
Full (strict) ★HTTPS end-to-end, Cloudflare validates the cert on your VPS. The recommended target. Use Cloudflare's free Origin Certificate (see Step 9) to get there in 5 minutes.
Without HTTPS your site is effectively broken in 2026
Modern browsers display a 'Not Secure' badge on HTTP. Google Search treats HTTPS as a positive ranking signal and demotes plain HTTP. Many web platform features (geolocation, camera, microphone, push notifications, service workers, PWA install) silently refuse to work on HTTP. Mixed-content blocking breaks the page if HTTPS-loaded resources reference HTTP assets. Free TLS via Cloudflare or Let's Encrypt has been a baseline expectation since ~2018; in 2026 it's table stakes.

Step 7 — free DDoS protection (already on)

There is no "enable DDoS" button — it's automatically active the moment your DNS is Proxied through Cloudflare. The free plan absorbs L3/L4 volumetric attacks on the order of tens of Gbps without you doing anything. Sustained large-scale L7 attacks may need a paid plan, but for typical small/medium sites the free tier is genuinely enough.

Step 8 — set up the actual web server on the VPS

SSH in (use the IP, port and root password from the welcome email):

ssh -p <PORT> root@<YOUR-VPS-IP>

From here it depends on what kind of site you're hosting. Pick the tab that matches your stack — install commands and a working nginx config for each:

Static HTML / JS / CSS site

sudo apt update && sudo apt install -y nginx
sudo rm /etc/nginx/sites-enabled/default

# Put your site files here:
sudo mkdir -p /var/www/example.com
echo '<h1>It works!</h1>' | sudo tee /var/www/example.com/index.html
sudo chown -R www-data:www-data /var/www/example.com

Minimal nginx config — save as `/etc/nginx/sites-available/example.com.conf` (Debian) or `/etc/nginx/conf.d/example.com.conf` (RHEL):

server {
    listen 80 default_server;
    listen [::]:80 default_server;
    server_name example.com www.example.com;
    root /var/www/example.com;
    index index.html;

    location / {
        try_files $uri $uri/ =404;
    }
}
# Debian/Ubuntu only — enable the site:
sudo ln -s /etc/nginx/sites-available/example.com.conf /etc/nginx/sites-enabled/

# Both — test and reload:
sudo nginx -t && sudo systemctl reload nginx

PHP site (LEMP stack)

sudo apt install -y nginx php-fpm php-mysql mariadb-server
sudo systemctl enable --now nginx php8.3-fpm mariadb
sudo mkdir -p /var/www/example.com
echo '<?php phpinfo();' | sudo tee /var/www/example.com/index.php
sudo chown -R www-data:www-data /var/www/example.com

nginx config that hands `.php` files to PHP-FPM:

server {
    listen 80;
    server_name example.com www.example.com;
    root /var/www/example.com;
    index index.php index.html;

    location / { try_files $uri $uri/ /index.php?$args; }

    location ~ \.php$ {
        include fastcgi_params;
        # Adjust socket path if your distro/PHP version differs:
        fastcgi_pass unix:/run/php/php8.3-fpm.sock;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    }
}

Python site (gunicorn + nginx reverse proxy)

sudo apt install -y nginx python3-venv python3-pip
sudo mkdir -p /var/www/example.com
sudo chown -R $USER:$USER /var/www/example.com
cd /var/www/example.com
python3 -m venv venv
source venv/bin/activate
pip install gunicorn flask    # or django, fastapi, etc.

Run gunicorn under systemd. Save as `/etc/systemd/system/example.service`:

[Unit]
Description=example.com gunicorn
After=network.target

[Service]
User=www-data
Group=www-data
WorkingDirectory=/var/www/example.com
Environment="PATH=/var/www/example.com/venv/bin"
ExecStart=/var/www/example.com/venv/bin/gunicorn --workers 3 --bind 127.0.0.1:8000 app:app
Restart=always

[Install]
WantedBy=multi-user.target
sudo systemctl daemon-reload
sudo systemctl enable --now example
sudo systemctl status example

nginx as reverse proxy in front of gunicorn:

server {
    listen 80;
    server_name example.com www.example.com;

    location / {
        proxy_pass http://127.0.0.1:8000;
        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;
    }
}

Node.js site (pm2 + nginx reverse proxy)

# Install Node.js 22 LTS via NodeSource:
curl -fsSL https://deb.nodesource.com/setup_22.x | sudo bash -
sudo apt install -y nodejs nginx
sudo npm install -g pm2
# In your project directory:
cd /var/www/example.com
npm install
pm2 start npm --name example -- start    # or: pm2 start server.js --name example
pm2 save
pm2 startup                              # follow the printed command to autostart on boot

nginx config — same reverse-proxy pattern, just point at the port your Node app listens on (commonly 3000):

server {
    listen 80;
    server_name example.com www.example.com;

    location / {
        proxy_pass http://127.0.0.1:3000;
        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;
    }
}

Step 9 — close the loop with Cloudflare Origin SSL (Full strict)

Once the site loads over plain HTTP through Cloudflare, upgrade the connection between Cloudflare and your VPS to encrypted-and-validated:

  1. Cloudflare → SSL/TLS → Origin Server → Create Certificate. Defaults are fine. Cloudflare gives you a public certificate and a private key.
  2. On the VPS: save the cert as `/etc/ssl/cloudflare-origin.pem` and the key as `/etc/ssl/cloudflare-origin.key`. `chmod 600` the key.
  3. In your nginx server block, add: `listen 443 ssl;` plus `ssl_certificate /etc/ssl/cloudflare-origin.pem;` and `ssl_certificate_key /etc/ssl/cloudflare-origin.key;`. Reload nginx: `sudo nginx -t && sudo systemctl reload nginx`.
  4. Cloudflare → SSL/TLS → Overview → switch encryption mode to Full (strict).
  5. Cloudflare → SSL/TLS → Edge Certificates → enable Always Use HTTPS so Cloudflare auto-redirects HTTP requests to HTTPS.

Step 10 — verify it actually works

# DNS now returns Cloudflare IPs (104.x.x.x / 172.x.x.x), not your VPS IP:
dig +short example.com

# HTTPS responds with 200:
curl -sI https://example.com | head -1

# Origin reachable from Cloudflare (test from VPS):
curl -sI -H 'Host: example.com' http://127.0.0.1

# Browser test: open https://example.com — should see green padlock + your content.
# Public TLS audit: https://www.ssllabs.com/ssltest/analyze.html?d=example.com
Common pitfalls when something doesn't work
1) DNS propagation isn't done — wait an hour, retry. 2) SSL Mode 'Full (strict)' but the VPS has no cert → you'll see Cloudflare error 525/526 in the browser. Fix by completing Step 9 or temporarily switching back to 'Full'. 3) DNS record set to DNS only (grey cloud) instead of Proxied — no SSL, no DDoS, no CDN. 4) Cloudflare cache shows old content after you redeploy → Caching → Purge Cache → Purge Everything. 5) Site works without `www` but not with — you forgot the CNAME in Step 5. 6) Service didn't start on the VPS → `sudo systemctl status nginx php-fpm` (whatever applies) and `sudo journalctl -u nginx -e`.

If something on the VPS itself is misbehaving, the diagnostic command cheatsheet is at Essential Linux server diagnostics, and the deeper port/firewall guide is at Open ports, firewalls and 'why my port shows closed'.

Bottom line
About thirty minutes of clicking and SSH'ing gets you a real production site: a domain you own, a global CDN, free TLS end-to-end, free DDoS scrubbing, and a small VPS running your actual code. Total ongoing cost is around €2 per month plus the domain renewal once a year. For the vast majority of projects — landing pages, small SaaS, blogs, hobby projects, side businesses — this stack is enough for years.

NetGrid Host

VPS from€1.99/ month

Unlimited traffic, a 1 Gbps port and NVMe storage. 12 locations across Europe & the US.

Unlimited traffic·1 Gbps port·12 locations