Spanish Version (README_es.md) | French Version (README_fr.md)
Live Demo: http://194.26.100.91
Role Username Password URL Admin admine54HBfxhf4CXrozOl2u6http://194.26.100.91/admin Kitchen (KDS) cocinerococinerohttp://194.26.100.91/kds Tables (TAS) camarerocamarerohttp://194.26.100.91/tas Cashier (POS) cajerocajerohttp://194.26.100.91/pos Self-service totem (Table 1 demo): Scan the QR to place an order from the table — no login required.
![]()
Step-by-step walkthroughs live in the User Guide.
| Control Panel | Menu | Totems |
|---|---|---|
![]() |
![]() |
![]() |
| Order board | Stock control | Sessions | Payment |
|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
| Tables | Session detail | Pending cart |
|---|---|---|
![]() |
![]() |
![]() |
| Welcome | Menu | My order |
|---|---|---|
![]() |
![]() |
![]() |
DisherIo is an integrated restaurant management platform providing solutions for self-service ordering, table assistance, kitchen display systems (KDS), and point-of-sale (POS) operations.
- Documentation Index
- Gallery
- Core Modules
- Technology Stack
- Quick Start
- Service Architecture
- Administration
- License
Full index with Architecture Decision Records: docs/README.md
| Document | Description |
|---|---|
| User Guide | Annotated walkthrough of every module with screenshots |
| Document | Description |
|---|---|
| Installation Guide | System requirements, guided installer, deployment procedures |
| Configuration and Maintenance | Script usage, hot-reconfiguration, backups, and local resource checks |
| Deployment and Infrastructure Guide | Deployment modes, infrastructure topology, security, operation, and scaling |
| HTTPS and TLS Setup | TLS modes, certificates, security headers, verification, and troubleshooting |
| Troubleshooting | Error codes, diagnostic procedures, log inspection |
| Uninstallation Guide | Full decommissioning procedures |
| Document | Description |
|---|---|
| Development Guide | Local setup, verification commands, frontend build/test standards |
| Frontend review | All-profile responsive review and repeatable browser checks |
| Architecture and Technology Stack | Service topology, design patterns, security model |
| Socket.IO reliability review | Authorization, reconnect reconciliation, failure tests, guarantees, and limits |
| API Reference | HTTP routes and Socket.IO event contracts |
| Error Codes Reference | Complete ErrorCode enum with HTTP status mapping |
| Database Migrations | Versioned migration runner and authoring rules |
| Security Model and Audit Guide | Enforced controls, trust boundaries, accepted limitations, audit classification |
Customer-facing interface for order placement through a rate-limited QR flow. Enables autonomous ordering without staff intervention. Public Socket.IO connections validate the totem QR token at handshake ({ publicTotem: true, qr: '<token>' }) and do not require a staff JWT.
Real-time order lifecycle management for kitchen operations. Socket.IO channel kds:* with KTS permission required. Normal flow is ORDERED → ON_PREPARE → SERVED; cancellation is a terminal transition from an active state.
Transaction, ticket splitting, payment history, order processing, and session archiving. Closing keeps a session available for payment; archiving settles every ticket, removes it from active POS/TAS views, and preserves it in payment history. Socket.IO channel pos:* with POS permission required.
Digital waiter tools for table management, service requests, and customer communication. Socket.IO channel tas:* with TAS permission required.
Closing or reopening the selected session preserves its displayed bill details.
Switching tables clears the previous table's details while the new selection loads.
Centralized analytics, staff administration, menu configuration, and business intelligence reporting. Protected by ADMIN CASL permission (can('manage', 'all')).
| Layer | Technologies |
|---|---|
| Frontend | Angular 21.2, TailwindCSS 3.4, Socket.IO Client 4.8, CASL Ability 6.8 |
| Backend | Node.js 24, Express 5.2, Socket.IO 4.8, Mongoose 9.3 |
| Database | MongoDB 7 (replica set rs0 for transactions) |
| Cache | Redis 7-alpine (cache + Socket.IO adapter + token blocklist) |
| Reverse Proxy | Caddy 2-alpine (automatic HTTPS via Let's Encrypt) |
| Observability | Pino logs, health checks, and an internal Prometheus-format endpoint |
| Image Processing | Sharp 0.35 (WebP conversion, resize, EXIF orientation) |
| Validation | Zod 4.3 (shared schemas between frontend and backend) |
| Authorization | CASL 6.8 (Attribute-Based Access Control) |
| Logging | Pino 10.3 with redaction of secrets |
| Language | TypeScript 5.9 (frontend, backend, and shared) |
DisherIo does not bundle Grafana, a Prometheus server, Alertmanager, or any
exporter containers. The backend still exposes /metrics in Prometheus
exposition format for optional operator-provided tooling, but Caddy does not
publish that endpoint and the default Compose topology does not scrape it.
The universal installer (scripts/install.sh) handles Docker installation,
secret generation, image builds, ordered service startup, and database seeding.
It requests five deployment values and then offers one optional example-data
confirmation.
# Clone the repository
git clone https://github.com/ismailhaddouche/disherio.git
cd disherio
# Run the universal installer (requires root)
sudo ./scripts/install.shThe installer will ask:
- Deployment type: domain (HTTPS) / trusted local IP (HTTP) / public IP (HTTP, unencrypted)
- Domain: only if domain mode was selected
- Language: es / en / fr
- Restaurant name: default
DisherIO Restaurant - Currency: EUR / USD / GBP
- Example data: optional categories, dishes, and an example table; fixed-credential demo staff are created only outside production
All sensitive values are generated with cryptographic randomness. Runtime
secrets are written as mode-0600 files under config/secrets/; only the
initial administrator access details are written to .credentials (also
mode 0600). Neither installation summaries nor status print the password.
For development or advanced deployment modes (local, local-ip, public-ip with Cloudflare/ngrok, domain):
./infrastructure/scripts/configure.sh./quickstart.sh # configure + verify + start- Linux (Ubuntu 22.04 LTS / Debian 12 / Google Cloud Compute Engine recommended)
- Root/sudo access
- Outbound internet access
Docker and Docker Compose v2 are auto-installed by install.sh if missing.
Internet
│
┌───────┴───────┐
│ Caddy :80/:443 │ ← TLS termination and reverse proxy
└───────┬───────┘
│
┌────────────┼────────────┐
│ │ │
Frontend Backend /uploads/*
Angular 21 Express 5 (static files
Caddy :4200 Node :3000 from volume)
│ │
│ ┌──────┴──────┐
│ │ │
│ MongoDB Redis
│ Mongo :27017 Redis :6379
│ (rs0 replica) (cache+adapter
│ +blocklist)
- MongoDB (creates app user + indexes via
init-mongo.js) - Replica set initialization (
mongo-init-replicaone-shot) - App user verification (force-create if volume pre-exists)
- Redis
- Backend (waits for mongo + replica + redis healthy)
- Frontend
- Seed (creates restaurant, 4 roles, admin user, and optional examples)
- Caddy (waits for backend + frontend healthy)
- HTTP API: client → Caddy
/api/*→ Backend (Express) - WebSocket: client → Caddy
/socket.io/*→ Backend (Socket.IO + Redis adapter) - Static uploads: client → Caddy
/uploads/*→ volume (served by Caddy, written by backend) - Diagnostics:
/health/*, structured logs, and the backend-only/metricsendpoint
| Command | Description |
|---|---|
sudo ./scripts/install.sh |
Full guided installation (five deployment values plus optional example data) |
sudo ./scripts/install.sh start |
Start all services |
sudo ./scripts/install.sh stop |
Stop all services |
sudo ./scripts/install.sh restart |
Restart all services |
sudo ./scripts/install.sh status |
Show service status and access URLs without printing secrets |
sudo ./scripts/install.sh logs [service] |
Live logs (backend/frontend/mongo/redis/caddy) |
sudo ./scripts/install.sh backup |
Protected backup of MongoDB, uploads, and deployment configuration |
sudo ./scripts/install.sh restore FILE |
Verify and restore a supported backup archive |
sudo ./scripts/install.sh update |
Pull + rebuild + restart |
sudo ./scripts/install.sh uninstall |
Full removal (containers, volumes, images, config) |
sudo ./scripts/install.sh help |
Show help |
| Script | Location | Purpose |
|---|---|---|
configure.sh |
scripts/ |
Hot-reconfiguration: network, port, admin password, language |
check-resources.sh |
scripts/ |
On-demand or terminal-based CPU/RAM checks; it is not a monitoring service |
info.sh |
scripts/ |
Alias for install.sh status |
backup.sh |
scripts/ |
Alias for install.sh backup |
restore.sh |
scripts/ |
Alias for install.sh restore |
restart.sh |
scripts/ |
Alias for install.sh restart |
After installation, administrator access details are saved to .credentials
(mode 0600):
- Access URL, admin username, admin password
- Restaurant name, language, currency
MongoDB, Redis, JWT, administrator, and tunnel secrets live only in
config/secrets/ for the generated deployment. .env contains non-secret
runtime settings and usernames. Containers receive *_FILE paths or a
secret-backed provider configuration, so secret values are not exposed by
docker inspect environment metadata.
DisherIo is open-source software licensed under the GNU Affero General Public License v3.0 (AGPL-3.0-only). You may use, copy, modify, and distribute it under the terms of that license.
Modified versions and works based on DisherIo must remain under the same license, preserve the license and copyright notices, state significant changes, and make their complete corresponding source code available. This source-availability requirement also applies when a modified version is offered to users over a network.
Copyright (C) Ismail Haddouche Rhali.
For support or inquiries, please refer to the documentation or contact the development team.













