Skip to content

Service-Business ERP

Job orders, quotations, inventory and roles with idempotent stock deduction and PDF quotes.

2026Angular, Node.js, Express, MongoDB, Docker

Problem

The client relied on scattered spreadsheets and manual workflows for job tracking, quotations, and inventory. They needed a unified system with real-time dashboards, access control, and automated workflows.

Constraints

  • Must run on a single VPS (4-8GB RAM) with Docker Compose
  • Real-time updates for job order status changes across users (WebSocket)
  • Role-based access: admin, manager, staff with granular permissions
  • Automated weekly database backups with restore capability
  • Rate limiting: 100 req/min general, 5 login attempts per 15 min

Key Decisions

  1. MongoDB over SQL for this use case

    ERP data (job orders, quotations, products) has variable schemas across clients and flexible document structures.

    Chose MongoDB with Mongoose ODM for flexible schemas and fast iteration on changing business requirements.

    Trade-off: Lost relational integrity guarantees, mitigated with application-level validation and Mongoose schema enforcement.
  2. Socket.IO for real-time updates

    Job order status changes need to reflect immediately across multiple users viewing the dashboard.

    Added Socket.IO for real-time event broadcasting when job orders, quotations, or inventory items are modified.

    Trade-off: Added WebSocket server complexity, but eliminated manual refresh patterns and improved team coordination.
  3. Single VPS with Docker Compose over cloud-managed services

    Client has a fixed budget and wants predictable costs without pay-per-use cloud pricing.

    Dockerized everything (frontend, backend, database) on a single VPS with automated backup scripts and Cloudflare for SSL/CDN.

    Trade-off: Manual infrastructure management vs managed cloud, but predictable $20-40/mo cost with full control.
Role
Sole engineer
Timeline
Jan 2026 - May 2026
Stack
Angular, Node.js, Express, MongoDB, Docker, Nginx, Socket.IO, JWT