It is official — not only I have a virtual private server (VPS), but also I have started self-hosting things on a VPS, including all my websites.
I had heard of the concept of self-hosting even before making my first website from scratch in 2022. When I became more aware of digital privacy, I had learned that people can host alternatives to mainstream tech services, but while I learned to switch to using more privacy-friendly software as much as possible, I did not have enough tech proficiently to self-host yet.
As I started to code my own website and learn web development, I have found myself enjoying being able to control my stuff and the tools I use more and more, so I finally started to take the step to learn self-hosting, and here I am, with my slice of a computer on the internet up and running.
Before VPS: From Static Hosting to Shared Hosting
Permalink to section 'Before VPS: From Static Hosting to Shared Hosting'My journey of web hosting began with static web hosting services, with the ones I have used included Neocities, where I hosted Leilukin's Hub, the very first website that I coded from scratch with HTML and CSS, GitHub Pages, and Netlify.
However, as I worked on my websites and learned more about web development< I started to feel the limitations of static web hosting. In particular, learning PHP for my fanlisting collective was the major push for me to look for alternative hosting options beyond static web hosting. My next step was shared hosting, and after comparing various shared hosting services, I settled for Hostinger, and migrated all my websites, including Leilukin's Hub, to it in July 2024.
For months, Hostinger has served my needs well: it checked all the boxes of my needs for hosting my websites, including creating multiple websites with custom domain support, PHP and MySQL support, and more, with an affordable price available in my country's currency. Shared hosting is a good middle ground between static web hosting and VPS hosting when I wanted more features and control over my websites than static web hosting, while not confident enough to use a VPS yet.
That said, I still hoped to use a VPS to host my websites and some web applications I intend to use regularly. I began by reading RAISO's guide "VPS101: Renting A Slice of A Computer on the Internet".
Renting My First VPS
Permalink to section 'Renting My First VPS'My opportunity to dip my toes in a VPS finally came in November 2024, when I was introduced to Chunkserve and their LowEndTalk offer. I ordered the 20.99 euro yearly package, which means the price is similar to the Premium Shared Hosting plan I ordered from Hostinger.
20.99 euro per year is an amazing value for a VPS with 4 vCore E5-2695v4, 8 GB RAM, 50 GB SSD Enterprise Disk, and 20TB of traffic. While my Hostinger shared hosting plan offered more storage (100 GB SSD), the upside of a VPS giving you root access to the server more than makes up for it.
With my first VPS rented, I could finally start tinkering a server myself.
Unlocking the Power of SSH Access
Permalink to section 'Unlocking the Power of SSH Access'Confession: Prior to renting my first VPS, I never touched a Secure Shell (SSH) before. Fortunately, I already had a decent amount of experience with Linux, including having set up Windows Subsystem for Linux (WSL) in my local machine, so I was already comfortable using command lines and the terminal.
I referred to basement blog's post "everything i personally do when hosting a website on a new server" to learn how to set up my VPS, including generating an SSH key to log in to the server.
Getting a taste of SSH allowed me with my first VPS made me fully realise that Hostinger's Premium shared hosting plan also supports SSH access. Before learning what SSH was, I transfer files between my local machine and some of my websites with FTP, with WinSCP as my FTP client. Enabling SSH access to my websites hosted on Hostinger, on the other hand, allowed me to navigate my websites' files in the terminal, and since Hostinger's server already had rsync installed, I can use rsync (via WSL) to transfer files from my local machine to the remote server via a terminal. With the power of SSH access unlocked, I switched from FTP to SSH to work with the servers I am using, and uninstalled WinSCP.
At the same time, I had also switched from Visual Studio Code to Neovim as my main code editor, as part of my effort to make my development workflow more focused on the terminal. Learning to access a VPS via SSH, and eventually self-host, certainly added more reasons for me to develop a terminal-based workflow.
Looking into Self-Hosting Applications
Permalink to section 'Looking into Self-Hosting Applications'As I was learning the ropes of VPS, I checked out the documentations of some applications I was interested in hosting myself one day, such as FreshRSS and Gitea.
Meanwhile, I came across Yunohost and Coolify, which are meant to make installing and managing applications on a server more simple. I briefly tried out both, and I appreciate their existence, though eventually I decided that I wanted to get my hands dirty to set up individual with the officially supported methods myself.
Learning self-hosting also made me learn to use Docker. While I do not intend to install and set up everything in my VPS via Docker, it is a commonly supported method for self-hosting applications, so it would not hurt to learn to use it.
Plans for Migrating My Websites to VPS
Permalink to section 'Plans for Migrating My Websites to VPS'My process of planning to migrate my websites to my VPS involved choosing which web server to use. Hostinger uses LiteSpeed, which is a drop-in replacement for Apache, so it supports the .htaccess
file, and Nginx is another popular option, though recently I also discovered Caddy and heard good things about it.
After trying out Caddy in my VPS, I was impressed, as Caddy not only all sites over HTTPS by default, but also has a configuration syntax that is easy to read and write.
Starting to Use My VPS for Real
Permalink to section 'Starting to Use My VPS for Real'After tinkering with my VPS for months, I finally had a good idea for how I want to use my VPS for real: Debian as the Linux distribution, with Caddy as the web server and reverse proxy. When I ordered my VPS, I chose Ubuntu as the operating system, but later switched to Debian on both my VPS and WSL because I wanted a more lightweight distro to save some disk storage.
After completing 42 the computer science school's 26-day bootcamp, where I also learned more shell commands, while waiting for news about if I passed the bootcamp and was qualified for 42's core curriculum (which turned out to be the case), I worked on my VPS so I can start using it for my stuff for real.
I began with installing FreshRSS, specifically with Docker, and succeed in setting up in a few minutes. Then, I installed Gitea from binary, run it as a Linux service, install the Gitea Action runner with Docker and run the act runner's Docker container with the --restart unless stopped
argument to keep the runner going in the background unless I stop its Docker container. I created subdomains to use with my own FreshRSS and Gitea instances, which are served through Caddy as a reverse proxy.
After migrating Git repositories of my websites to Gitea (with some of them mirrored to GitHub), it was time to migrate my websites from Hostinger to my first VPS. Creating file directories for each of my websites, configuring Caddy to serve my websites' files, converting individual website's configuration from Apache's .htaccess
to Caddy's Caddyfile
, preparing a MariaDB database via command line and installing required PHP extensions for my tumbleblog which is powered by Chyrp Lite, changing my domains' DNS records, and voilà, the migration of my websites was officially completed on 14 May 2025!
On May 16, just hours before my results of the 42 bootcamp was announced, I also successfully set up my own instance of The Lounge, the web-based IRC client. Previously I used IRCCloud, but I was interested in The Lounge and hosting my own instance of it after trying out its demo.
Making Use of Shell Scripting
Permalink to section 'Making Use of Shell Scripting'Another benefit of my journey of learning to self-host on a VPS was making good use of shell scripting, especially to use rsync and the secure copy protocol (SCP) to transfer files between my local machine and my VPS. Attending 42's bootcamp made me learn and enjoy shell scripting more, and by creating my own shell scripts allows me to make the machines I am administrating work for me in ways I want.
Wrapping Up
Permalink to section 'Wrapping Up'By self-hosting some applications and migrating my websites to a VPS, I can proclaim that my VPS arc has officially begun. Learning to work on a VPS and self-host has been an incredible learning experience that I am grateful to experience, and cannot recommend enough.
Update, 28 May 2025: A New VPS
Permalink to section 'Update, 28 May 2025: A New VPS'After starting to self-host on the first VPS I rented, I started to consider renting another VPS, as I foresaw the possibility of me wanting another server to self-host more stuff. Therefore, after scouting the recent offers from VPS providers on LowEndTalk, I chose to rent a new VPS from DeluxHost.
For 15 euro per year, this new VPS has 2 vCPU cores, which is fewer than my VPS from Chunkserve of 4 vCPU cores, but same amount of RAM in 8 GB, and more SSD storage space with 80 GB while my Chunkserve VPS has 50 GB. I placed the order on my new VPS on May 26 evening in Malaysia time, then the server product was ready around 7 hours later on May 27 early morning in Malaysia time. I spent the day in setting up my new VPS, as well as migrating my websites and my instances of FreshRSS, Gitea and The Lounge to the new server. The migration is now officially completed on May 28.
The main change I made to my new VPS is that I currently decide to not set up Gitea Actions for my Gitea instance, and instead use rsync to upload all my websites, including ones built with the static site generator Eleventy, to their respective directories on my server.
Previously, I used the ssh-deploy GitHub Action (for those who are not familiar with Gitea, Gitea Actions are designed to be compatible with GitHub Actions) to deploy my Eleventy websites, but I after starting to learn about SSH, I also began to use rsync to transfer files from my local machine to the remote servers I have SSH access to. Furthermore, since I have been making use of shell scripting to utilise rsync (and SCP) as mentioned above, I realised that I could deploy my websites to my servers faster through my local machine than using a GitHub or Gitea Action. Therefore, I decided that I do not really need GitHub or Gitea Actions for my personal projects any more. Not to mention, the ssh-deploy GitHub Action itself already utilises rsync, so using an Action that utilises rsync when I can do it myself is sort of redundant.
As for the VPS I rented from Chunkserve, I have rebuilt the server and am still keeping it to tinker with. An extra VPS separate gives me more room to experiment with stuff without the risk of interfering with my public-facing main server.