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

