ClientSt0r is a Django-based web application designed for self-hosted deployment on Linux infrastructure. This page documents the core components, data flow, and deployment topology.
The stack is chosen for operational familiarity in Linux-focused MSP environments. Nothing exotic — standard Python web stack, proven database, and a well-understood reverse proxy. All components are open source.
| Component | Technology | Purpose |
|---|---|---|
| Web framework | Django 6.0 (Python 3.12) | Application logic, ORM, admin interface, authentication, and request routing. Django's ORM handles all database interactions — no raw SQL in application code. |
| Database | MariaDB / MySQL | Primary data store for all platform data — client organisations, assets, tickets, vault records (encrypted), audit logs, documents, and integrations. Runs locally or on a separate host. |
| Application server | Gunicorn | WSGI process manager. Runs the Django application with multiple worker processes. Binds to localhost only — not exposed externally. Worker count configurable based on server CPU count. |
| Reverse proxy | Nginx | TLS termination, static file serving, request routing to Gunicorn, rate limiting, and secure header injection. The only externally-facing component in a standard deployment. |
| Frontend | Bootstrap 5 | Responsive UI framework. Server-rendered templates with targeted JavaScript for interactive components. No heavy SPA framework — pages load fast on modest server hardware. |
| API | REST + GraphQL | Programmatic access to all major platform functions. REST for standard CRUD operations, GraphQL for flexible querying across related entities. JWT-authenticated with per-key scope controls. |
| Task queue | Celery optional | Background job processing for scheduled scans, email delivery, report generation, and RMM polling. Requires Redis as the message broker. Not required for core platform operation. |
| Cache / broker | Redis optional | Session storage and task broker for Celery. Used when Celery is enabled. Can run on the same server or a dedicated host in larger deployments. Not required for a minimal installation. |
Most deployments run on a single Linux server. The components are well-understood and the operational footprint is small. A multi-server layout is documented for larger environments.
The database is organised around organisations as the top-level tenant. Nearly all platform records are scoped to an organisation — there is no cross-org data leakage by design. The schema is Django ORM-managed and evolves through versioned migrations.
Multi-tenant client org structure. All major records — assets, vault entries, tickets, documents, contacts — are scoped to an organisation. Users are assigned to orgs with a role; platform-wide access requires explicit admin status.
42-level RBAC system. User-to-org membership is a through-model carrying the assigned role. Permissions are checked per request — not cached in a way that survives permission revocation. Admin operations require the global admin flag independently of org roles.
Hardware inventory, network devices, subnets and IPAM, rack layouts, network closets, and patch panels. Assets are typed and linked to their parent org. Network discovery results (via nmap) are reconciled against existing asset records.
AES-256-GCM encrypted credential records with per-org key derivation. Credential fields are encrypted individually — the database stores ciphertext, not plaintext. Access is gated by RBAC and all interactions are audit-logged.
Versioned knowledge base articles, embedded Draw.io network diagrams, MagicPlan floor plans, and attachments. Documents are org-scoped. Version history is stored to support rollback and change review. Search is full-text across document content.
Tickets, SLA rules, queues, contracts, invoices, time entries, and recurring tasks. All records are linked to an org and an optional asset. Ticket workflow rules are stored as configurable rule sets — not hardcoded logic.
Append-only log of all sensitive operations. Records include user identity, timestamp, action type, target object ID, and source IP. Logs are not modifiable through the application interface — only readable and exportable by administrators.
Stored integration configurations for RMM, PSA, distributor, and identity provider connections. API keys and connection credentials for external systems are encrypted at rest using the same vault encryption scheme. Integration state and sync metadata stored per-config.
The API is designed for operational use — automation, integration with existing tooling, and reporting pipelines. REST handles standard operations; GraphQL handles complex querying across related data without multiple round trips.
RESTful endpoints covering organisations, assets, vault (write/metadata only), tickets, documents, users, and integrations. JSON request and response throughout. Consistent pagination and filtering patterns across resources.
GraphQL endpoint for querying across related entities in a single request. Useful for reporting and dashboard integrations that need data from multiple resource types — assets with open tickets, org contacts with recent activity, and similar joined queries.
JWT tokens issued at login with configurable expiry. Refresh token rotation supported. Token lifetime is admin-configurable — short-lived tokens for interactive use, longer-lived for automation accounts where appropriate.
API keys can be scoped to specific resource types and operations. An automation key used for asset sync does not require — and should not have — access to vault or user management endpoints. Scope violations are logged in the audit log.
All API activity is captured in the platform audit log with the API key identifier, endpoint, IP address, and response code. High-volume or anomalous API usage is visible to administrators without external log aggregation.
Swagger UI available in-app for authenticated users. Explore endpoints, review request/response schemas, and test calls directly from the browser. OpenAPI schema exportable for use in external tooling or documentation pipelines.
Integrations are configured per-deployment from the admin interface. Connection credentials are encrypted at rest. Not all integrations are bidirectional — some are read-only ingestion, some support write-back. Integration depth varies by platform.
ClientSt0r is not benchmarked against arbitrary targets. Performance depends on your server hardware, database size, query patterns, and configuration. The notes below reflect what the architecture is designed for and where limits are likely to appear.