Skip to content
Home
← All work
2024·archived· React· Express· Docker· Azure· Kubernetes

ThirdUpload

A self-hosted online drive, built twice: on-prem and on Azure Kubernetes. A school module that ended up being a real lesson in infrastructure trade-offs.

Context

M300 school module project. The brief: build a working file-hosting service with authentication, encryption, and monitoring, and ship it on two different infrastructures. One on-prem on a laptop, one on Azure. Both run the same application; the point is to see the trade-offs side-by-side.

Approach

Same app, two stacks. React frontend, Express REST API, PostgreSQL for files & metadata, Redis as cache, JWT for auth, a dedicated en-/decryption service. On-prem: Docker plus Harbor for the image registry, Portainer for infra, Prometheus + Alertmanager → Grafana, TimescaleDB for metrics, Mailhog for notifications. Cloud: the same app on Azure Kubernetes Service behind Cloudflare, deployed via Azure DevOps Pipelines from Azure Repos through Azure Container Registry, with managed Postgres, managed Prometheus / Grafana, and Azure Monitor for the alerting.

Outcome

Both deployments fully working. The cloud version uses managed services exactly where the on-prem version uses self-hosted equivalents. A direct, honest comparison of operational trade-offs in a single project. Documentation is private (school).

Stack

App
  • React
  • Express
  • Node.js
  • REST
Data
  • PostgreSQL
  • Redis
  • TimescaleDB
On-prem ops
  • Docker
  • Harbor
  • Portainer
  • Prometheus
  • Grafana
  • Mailhog
Cloud ops
  • Azure AKS
  • Cloudflare
  • Azure DevOps
  • ACR
  • Managed Postgres
  • Azure Monitor
Cloud: Azure Kubernetes architecture
Cloud: Azure Kubernetes architecture
On-prem: microservices stack
On-prem: microservices stack