Kaloian's Blog - The creation!
So what is going on here?
Since this is the first article on my blog, I thought it would be a good idea to explain how it came to be — how I built it and the hurdles I faced along the way.
The Goal
I wanted to create a website/blog not just to jot down thoughts and experiences, but also to document the services I self-host.
Here were my requirements:
- The platform had to be open-source.
- It had to be easy to use.
- It had to be light on resources.
With those in mind, I narrowed it down to a few options — WordPress, Jekyll, and Hugo.
Most people are familiar with WordPress. For me, though, it was too heavy and never really worked the way I wanted. I gave it several tries, but it always felt convoluted. I ended up wasting more time trying to build an average-looking site than actually writing content.
So I turned to static site generators. Hugo and Jekyll were both new to me, and I didn’t really know how to set them up. Naturally, I went to YouTube.
After watching a few videos, I chose Hugo — not necessarily because it was easier, but because the tutorials I found made more sense. Even so, this was basically me during setup:

So yeah — this is my attempt at building a website/blog.
My Setup
I’m using Hugo as a static site generator, installed on my local machine where I write and build the site.
I also have a GitHub repository where I push all changes. This acts both as a backup and a way to continue working on the site if I switch machines.
The site is hosted on a Proxmox LXC container that runs a basic Python web server serving the public
directory of the site.
Finally, I expose the site to the internet using a Cloudflare Tunnel.
Why?
Good question — and no, it’s not just because YOLO.
This setup is the result of several workarounds that led me here.
Originally, I wanted to keep all files on the Proxmox LXC. But that meant I had to build and maintain everything directly on the server. If I couldn’t access it, I couldn’t write.
I also explored using Git hosting (GitHub/GitLab) combined with Cloudflare Pages.
What went wrong?
The original plan was to store everything in a private GitHub repo and use Cloudflare Pages to serve the site.
But then I found out that CFP1 is being phased out — Cloudflare is moving toward Workers instead.
At first glance, Workers looked similar. I even found a helpful YouTube video (linked below) explaining how to host a Hugo site using CFW2.
Click Here for Video
Unfortunately, no matter how many times I tried, I couldn’t get it to work. I hit issues during the Hugo build step every time.
Then I considered GitHub Pages — but that would mean making the repository public, and I wasn’t comfortable with that either.
What went right?
So, I went for a hybrid approach.
I push my full project to a private GitHub repo to keep everything safe. Then, I rsync
just the public
folder to my Proxmox container, which serves it to the internet.
To automate this, I wrote a simple Bash script:
#!/bin/bash
set -e # Stop on error
# set -x # Print each command (for debugging)
# Colors
GREEN='\033[0;32m'
RED='\033[0;31m'
NC='\033[0m'
# Configuration
LOCAL_DIR="public/"
REMOTE_USER="root"
REMOTE_HOST="192.168.8.112"
REMOTE_DIR="/root/website/blog"
# Git commit with today's date
TODAY=$(date +"%d-%m-%Y")
echo -e "${GREEN}📦 Build website ${NC}"
hugo
echo -e "${GREEN}📦 Committing changes to Git with message: '$TODAY'...${NC}"
git add .
git commit -m "$TODAY" || echo -e "${RED}⚠️ Nothing to commit.${NC}"
git push
echo -e "${GREEN}🔄 Deploying $LOCAL_DIR to $REMOTE_USER@$REMOTE_HOST:$REMOTE_DIR using rsync...${NC}"
# Check if the local directory exists
if [ ! -d "$LOCAL_DIR" ]; then
echo -e "${RED}❌ Local directory '$LOCAL_DIR' not found!${NC}"
exit 1
fi
# Sync files using rsync (only changed/new ones)
rsync -avz --delete "$LOCAL_DIR" "${REMOTE_USER}@${REMOTE_HOST}:${REMOTE_DIR}/"
echo -e "${GREEN}✅ Deployment complete with rsync.${NC}"
The future
I might refine this setup over time — make it more robust, streamline a few parts, or even integrate it with other tools. But for now, this workflow gets the job done, and I’m happy with it.