How I Built My Blog
Introduction
On a whim, I decided to create this blog for myself. Since this is the very first post, I wanted to document how everything behind this website is put together — partly for future reference, and partly in case someone else finds it helpful.
Even though this is just a small personal side project, I still wanted the architecture to be clean, maintainable, and capable of growing over time.
Building the Foundation: Ubuntu on Amazon Lightsail
The system is hosted on Amazon Lightsail, running an Ubuntu instance. Amazon Lightsail uses a predictable monthly pricing model, which makes cost control much easier compared to AWS EC2. It’s also more beginner-friendly and requires less infrastructure setup, making it a practical starting point for personal websites like this one.
┌──────────┐
│ Ubuntu │ ← Foundation layer
└─────┬────┘
Why Lightsail?
- Predictable monthly pricing — no surprise billing spikes
- Simpler than EC2 — no need to configure complex VPC or networking rules early on
- Built-in static IP and DNS management
- Perfect for personal projects and self-hosted experiments
With this foundation in place, the next step is to build the service layer that handles requests and security.
Service Layer: Nginx + Certbot — Routing and HTTPS
At the network entry point, I use Nginx as a reverse proxy to handle incoming HTTP/HTTPS requests and route them to the appropriate application behind the scenes.
To secure the website, I use Certbot with Let’s Encrypt to automatically issue and renew HTTPS certificates — ensuring encrypted traffic with minimal maintenance effort.
┌───────┴───────┐
│ │
┌────┴────┐ ┌────┴────┐
│ Certbot │ │ Nginx │ ← Routing + HTTPS security
└─────────┘ └─────────┘
This layer allows me to:
- Route multiple services or subdomains cleanly
- Force HTTP → HTTPS for security
- Avoid manual SSL renewal tasks
Application Layer: Containerizing with Docker
To ensure different applications do not interfere with each other, everything is deployed using Docker. Each service runs inside its own container, whether it’s the blog, an API service, or future experimental features.
┌────┴────┐
│ Docker │ ← Container runtime
└────┬────┘
│
┌────────┴────────┐
│ Containerized │
│ Applications │
│ ┌────┐ ┌────┐ │
│ │Blog│ │API │ │
│ └────┘ └────┘ │
└─────────────────┘
Why containerization?
- Each app has its own isolated environment
- Deployment and updates are consistent and reproducible
- Adding new services (App3, App4, etc.) in the future is straightforward
Closing Thoughts
Even though this is a small personal website, the architecture is clean, maintainable, and ready to grow:
- Lightsail provides a stable and cost-efficient base
- Nginx + Certbot ensures secure and organized request handling
- Docker allows applications to evolve independently without conflicts
If traffic grows or I decide to introduce new services, the system can expand naturally — without needing to redesign everything from scratch.
Even small projects deserve thoughtful architecture.
Full Architecture Overview
┌──────────┐
│ Ubuntu │ ← Hosted on Amazon Lightsail
└─────┬────┘
│
┌───────┴───────┐
│ │
┌────┴────┐ ┌────┴────┐
│ Certbot │ │ Nginx │ ← Routing + HTTPS Security
└────┬────┘ └────┬────┘
│ │
└───────┬───────┘
│
┌────┴────┐
│ Docker │ ← Container Runtime
└────┬────┘
│
┌────────┴────────┐
│ Containerized │
│ Applications │
│ │
│ ┌────┐ ┌────┐ │
│ │App1│ │App2│ │
│ └────┘ └────┘ │
│ ┌────┐ ┌────┐ │
│ │App3│ │App4│ │
│ └────┘ └────┘ │
└─────────────────┘