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
- 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. - 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. - 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