Overview
IT Ticket System is a dockerized, multi-tenant, self-hosted ticket system built for internal IT support. It offers a passwordless public portal for requesters and a role-based admin panel for the IT team, and it runs Turkish / English bilingual end to end.
The system is designed to run on-prem (on your internal network): nothing ever leaves your server. The public portal intentionally performs no authentication — access relies on unguessable link tokens. It runs behind a VPN / internal network by default, but can also be exposed externally via a reverse proxy + authentication when needed.
Who is it for?
The system is built around three main personas:
👤 Requester (public, no login)
- Creates a ticket — picks company / location / category, fills per-company dynamic fields, attaches files.
- Tracks status live through an access link, posts replies, sends attachments.
- Looks up a past ticket with its number + email.
🛠️ IT team (admin panel)
- Dashboard — open/closed stats, SLA status, work assigned to you.
- Ticket management — list / filter / search, detail, status & assignment, internal notes (hidden from the requester) + public replies, bulk actions.
- On-site support calendar — create appointments, pick durations, calendar view.
- Tasks — work independent of tickets, multi-assignee, comments.
- Reports — distribution, staff performance, category breakdown, SLA trend, CSV export.
🔐 Administrator (role-based)
admin+it_manager— company / location / category / custom fields, per-company SMTP, email & SMS templates, canned responses.admin— staff management and a credential vault (AES-256-GCM, every reveal is audited).
Feature highlights
- Multi-tenant — each company is managed with its own locations, categories, custom fields, and SMTP settings.
- Async notifications — email / SMS notifications run in the background via BullMQ (3 retries, exponential backoff).
- SLA tracking — SLA checks every 5 minutes; per-category response/resolution targets.
- Live updates — realtime panel updates over SSE; per-domain company branding (logo + theme).
- Bilingual — the UI follows the browser language and switches instantly; API messages by
Accept-Language, notifications in the recipient's language.
This system runs on your internal network — data never crosses the server boundary. For external access there are three safe paths: a VPN, an IP allowlist, or an authenticating reverse proxy. Plain (unauthenticated) internet exposure is not recommended. See Security and Installation for deployment options.
Tech stack
| Layer | Technology |
|---|---|
| Backend | Node.js 22 · Fastify 5 · TypeScript (ESM) · Prisma 6 · Zod |
| Frontend | React 18 · Vite 6 · TailwindCSS 3 · TanStack Query 5 · Zustand 5 |
| Database | PostgreSQL 16 |
| Queue / Cache | Redis 7 + BullMQ |
| Realtime | SSE (Server-Sent Events) |
| i18n | react-i18next · Accept-Language-based API messages |
| Deploy | Docker Compose (Coolify + Nginx Proxy Manager compatible) |
Next steps
- Head to Quick Start to get the system running.
- See the Architecture page for design details.