How to Self-Host a Blog on a Linux VPS (Step by Step)
A practical, step-by-step walkthrough for self-hosting a blog on a Linux VPS — from choosing a server to running Inkwell behind nginx with HTTPS.
If you can rent a small server and copy a few commands, you can self-host a blog. This tutorial takes you from an empty Linux VPS to a live, HTTPS-secured blog running Inkwell, the free ASP.NET Core engine. The same shape applies to most self-hosted platforms, so the skills transfer.
Step 1: Pick a VPS
Any mainstream provider works — Hetzner, DigitalOcean, Linode, or Vultr. For a personal blog, the smallest plan with 1 GB of RAM is plenty; bump to 2 GB if you run SQL Server alongside the app. Choose a recent Ubuntu LTS image and a region close to your readers. Create the server, then log in over SSH as a non-root user with sudo.
Step 2: Point your domain
In your domain registrar's DNS panel, create an A record for your domain (and a www record) pointing at your server's IP address. DNS can take anywhere from minutes to a few hours to propagate. While you wait, you can keep working on the server.
Step 3: Install the .NET runtime
Inkwell runs on .NET 10. Install the ASP.NET Core runtime from Microsoft's package feed:
sudo apt-get update
sudo apt-get install -y aspnetcore-runtime-10.0
Verify it with dotnet --info. If you plan to build from source rather than use a published binary, install the full SDK instead.
Step 4: Get Inkwell and run it
Clone the repository, restore, and run. The full install reference lives at the install docs.
git clone https://github.com/marutisoftwaresolutions/inkwell
cd inkwell
dotnet run --urls http://localhost:5000
For production, point Inkwell at SQL Server (SQL Server 2019+) via its connection string and run it as a systemd service so it restarts on reboot and on crash. SQL Server LocalDB is fine for development if you prefer a lighter local setup.
Step 5: Put nginx or Caddy in front
You want a reverse proxy in front of the app so it can serve port 80 and 443 and terminate TLS. Here is a minimal nginx server block that forwards traffic to Inkwell on port 5000:
server {
listen 80;
server_name example.com www.example.com;
location / {
proxy_pass http://localhost:5000;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
Caddy is an even simpler option — a two-line Caddyfile gives you automatic HTTPS with no certbot step. We cover that path in depth in deploying a .NET blog with Docker and Caddy.
Step 6: Enable HTTPS
With nginx, the easiest route to a free certificate is Certbot:
sudo apt-get install -y certbot python3-certbot-nginx
sudo certbot --nginx -d example.com -d www.example.com
Certbot rewrites your nginx config to redirect HTTP to HTTPS and sets up automatic renewal. Reload nginx and visit your domain — you should see your blog served securely.
A self-hosted blog is just a small app behind a reverse proxy with a certificate. Everything else is detail.
Keeping it healthy
Once you are live, set up three habits:
- Backups — dump your database and back up uploads on a schedule.
- Updates — pull new releases and apply OS security patches.
- Monitoring — a simple uptime check tells you fast if the site goes down.
That's it. For deeper configuration, themes, and tenants, head to the documentation or compare your options in our platform guide.
Frequently asked questions
How much does it cost to self-host a blog on a VPS?
A budget VPS suitable for a personal blog costs roughly three to six US dollars a month, with equivalent pricing in EUR, GBP, or INR depending on your provider. A free TLS certificate from Let's Encrypt and an open-source engine like Inkwell keep software costs at zero.
Do I need to know Linux to self-host a blog?
You need to be comfortable copying commands into an SSH session, but you do not need to be a sysadmin. Following a tutorial like this one, plus using Caddy for automatic HTTPS, removes most of the hard parts.
Should I use nginx or Caddy as the reverse proxy?
Both work well. nginx is the most widely documented choice, while Caddy provisions and renews HTTPS certificates automatically with a far simpler config, which makes it ideal for beginners.
Which database does Inkwell use for a self-hosted blog?
Inkwell uses SQL Server. Run SQL Server 2019 or newer in production because it handles concurrency and growth well, and use SQL Server LocalDB for development when you want a lighter local setup.
Ready to host your own blog?
Inkwell is free, open-source, and self-hosted — your content, your server, your rules. Deploy in minutes on .NET 10.