Skip to main content
Version: 12.0

DeskAlerts v12 — On-Prem Docker Deployment (System Administrator)

DeskAlerts 12 - Preview Version

DeskAlerts 12 is currently under active development and is not production-ready.

This version is available for testing purposes only.
To request access, please contact DeskAlerts Support team.


Table of contents​


What you receive​

A typical delivery package looks like this:

deskalerts-server-<VERSION>/
├── MANIFEST.txt
├── CHECKSUMS.sha256
├── images/
│ ├── deskalerts-app.tar[.gz]
│ ├── mssql-2022.tar[.gz] # if in-stack MSSQL
│ └── rabbitmq-4.1.tar[.gz] # if in-stack RabbitMQ
├── deploy/
│ ├── compose.yml
│ ├── compose.mssql.yml # optional
│ ├── compose.rabbitmq.yml # optional
│ └── .env.example
├── sso-gateway/ # optional — AD SSO MSI
└── docs/
└── ON_PREM_DOCKER_DEPLOYMENT_ADMIN.md

Read MANIFEST.txt first — it lists the exact version, included images, and compose overlays for your deployment.


1. Server requirements​

ParameterMinimumRecommended
OSLinux x86_64 (Ubuntu 22.04/24.04, RHEL 8+, Debian 12)Ubuntu LTS
CPU4 vCPU8+ vCPU
RAM16 GB32 GB
Disk50 GB SSD100+ GB SSD
NetworkLAN, DNS name for the serverStatic IP / DNS

Inbound ports:

PortServiceNotes
443nginxPrimary HTTPS access
1433MSSQLOnly if external DB access is needed; can stay internal for in-stack MSSQL

Outbound connections (optional):

  • Customer SMTP server (port 25/587).
  • Active Directory / LDAP (389/636) — audience sync.
  • Cline API (HTTPS) — only if Stats Assistant AI is enabled.
  • Not required for core operation: Docker Hub, npm, public internet.

2. Install Docker​

Follow official Docker documentation to install Docker on your Linux host

3. Place the package on the server​

You should receive a tar.gz archive from DeskAlerts support which contains all necessary Docker required to run DeskAlerts server in Docker, named similar to deskalerts-server-12.1.0.2.tar.gz

sudo mkdir -p /opt/deskalerts
sudo chown "$USER":"$USER" /opt/deskalerts
cd /opt/deskalerts

Verify integrity:

cd deskalerts-server-12.1.0.2
sha256sum -c CHECKSUMS.sha256

4. Load Docker images​

cd /opt/deskalerts/deskalerts-server-12.1.0.2/images

gunzip -k deskalerts-server-12.1.0.2.tar.gz

docker load -i deskalerts-app.tar

# for in-stack infrastructure:
docker load -i mssql-2022.tar
docker load -i rabbitmq-4.1.tar

Verify:

docker images | grep -E 'deskalerts/|mssql/server|rabbitmq'

All deskalerts/* images must be tagged with the version from MANIFEST.txt.

5. Configure .env​

cd /opt/deskalerts/deskalerts-server-12.1.0.2/deploy
cp .env.example .env
chmod 600 .env
nano .env # or vim

Required parameters​

VariableDescriptionExample
DESKALERTS_VERSIONImage tag (from MANIFEST)12.1.0.2
DESKALERTS_SERVER_URLPublic server URLhttps://alerts.company.local
DESKALERTS_DB_SERVERSQL hostmssql (in-stack) or sql01.company.local
DESKALERTS_DB_NAMEDatabase nameDeskAlerts
DESKALERTS_DB_USERSQL loginsa or dedicated user
DESKALERTS_DB_PASSWORD_64DB password in Base64see below
DESKALERTS_DB_PASSWORD_RAWPlain SA password (MSSQL overlay)in-stack only
DESKALERTS_DB_VERSIONVersion string stored in DB12.1.0.2 (on-prem)
DESKALERTS_MS_MOUNT_FOLDER_SOURCEHost path for media/opt/deskalerts/data/media
DESKALERTS_MS_MOUNT_FOLDER_TARGETPath inside container/app/wwwroot

Encode the DB password:

echo -n 'YourStrong!Passw0rd' | base64 -w0
# output → DESKALERTS_DB_PASSWORD_64

Secrets (change defaults)​

VariablePurpose
DESKALERTS_JWT_KEYJWT for Workflows (≥ 32 characters)
DESKALERTS_SSO_INTERNAL_SECRETSSO Gateway ↔ Auth shared secret
DESKALERTS_SETTINGS_API_KEYInter-service key for Settings
DESKALERTS_RABBITMQ_PASSWORDRabbitMQ password (if overlay is enabled)
# generate a password
RABBIT_PASS="$(openssl rand -base64 24)"

# in .env:
DESKALERTS_RABBITMQ_USER=deskalerts
DESKALERTS_RABBITMQ_PASSWORD=<RABBIT_PASS>
DESKALERTS_RABBITMQ_VHOST=deskalerts
DESKALERTS_RABBITMQ_URI=amqp://deskalerts:<RABBIT_PASS>@rabbitmq:5672/deskalerts
DESKALERTS_RABBITMQ_MGMT_URI=http://deskalerts:<RABBIT_PASS>@rabbitmq:15672

In-stack MSSQL​

DESKALERTS_DB_MOUNT_FOLDER=/opt/deskalerts/data/mssql

DESKALERTS_DB_PASSWORD_RAW must match the value encoded in DESKALERTS_DB_PASSWORD_64.

External MSSQL / Azure SQL​

  • Do not use compose.mssql.yml.
  • Set DESKALERTS_DB_SERVER=your-sql-host.
  • Set DESKALERTS_DB_AZURE_SQL=true for Azure SQL.
  • Ensure port 1433 is reachable from containers.

SMTP​

DESKALERTS_SMTP_SERVER=smtp.company.local
DESKALERTS_SMTP_PORT=587
DESKALERTS_SMTP_SSL=true
DESKALERTS_SMTP_AUTH=true
DESKALERTS_SMTP_USER=alerts@company.local
DESKALERTS_SMTP_PASSWORD=...

Stats Assistant (optional)​

Leave DESKALERTS_ASSISTANT_CLINE_API_KEY empty if outbound internet is unavailable — the rest of the system works normally.

AD SSO (Windows)​

  1. Install the SSO Gateway MSI on a domain-joined Windows Server (see sso-gateway/INSTALLER.md in the package).
  2. In .env:
    DESKALERTS_SSO_GATEWAY_URL=http://<sso-host>:58009
    DESKALERTS_SSO_INTERNAL_SECRET=<shared-secret>
  3. DESKALERTS_SSO_INTERNAL_SECRET in .env must equal INTERNAL_SECRET in the MSI configuration.

6. Host data directories​

export DA_ROOT=/opt/deskalerts/data
mkdir -p "$DA_ROOT/media/wwwroot/admin/"{images,upload,csv,xlsx,shared-assets,digital-signage-assets}
mkdir -p "$DA_ROOT/media/wwwroot/images/upload_image"
mkdir -p "$DA_ROOT/media/wwwroot/brand"
mkdir -p "$DA_ROOT/media/logs/SyncLog"
mkdir -p "$DA_ROOT/mssql" # if in-stack MSSQL

# main runs as non-root; MSSQL overlay uses root (user 0:0)
sudo chown -R 1000:1000 "$DA_ROOT/media" || true
sudo chown -R 10001:0 "$DA_ROOT/mssql" || true

In .env:

DESKALERTS_MS_MOUNT_FOLDER_SOURCE=/opt/deskalerts/data/media
DESKALERTS_MS_MOUNT_FOLDER_TARGET=/app/wwwroot
DESKALERTS_DB_MOUNT_FOLDER=/opt/deskalerts/data/mssql

7. TLS certificates​

By default nginx generates a self-signed certificate on first start.

Production — custom certificate​

Uncomment the volumes section for the nginx service in compose.yml and mount a Let's Encrypt or corporate certificate:

volumes:
- type: bind
source: /opt/deskalerts/ssl/live/alerts.company.local
target: /opt/letsencrypt/live/alerts.company.local
- type: bind
source: /opt/deskalerts/ssl/archive/alerts.company.local
target: /opt/letsencrypt/archive/alerts.company.local

Directory layout follows Certbot conventions (fullchain.pem, privkey.pem).

DESKALERTS_SERVER_URL must match the certificate CN/SAN.

8. Start the stack​

cd /opt/deskalerts/deskalerts-server-12.1.0.2/deploy
export DESKALERTS_VERSION=12.1.0.2 # from MANIFEST

In-stack MSSQL + RabbitMQ​

docker compose \
--env-file .env \
-f compose.yml \
-f compose.mssql.yml \
-f compose.rabbitmq.yml \
up -d --no-build --wait --wait-timeout 300

External database, no RabbitMQ​

docker compose --env-file .env -f compose.yml up -d --no-build --wait --wait-timeout 300

--no-build is critical on an isolated server: it prevents Compose from trying to build images from source.

Startup order (automatic)​

  1. logs-init — prepares the shared log volume (container exits with code 0); db-manager — runs migrations (exits with code 0).
  2. main, auth, connection, workflows, settings, smtp, reports, ai — after both one-shots have completed.
  3. nginx — after the services it proxies are healthy (pwa starts on its own).

First startup may take 5–15 minutes (MSSQL initialization + migrations).

9. Post-installation verification​

docker compose --env-file .env -f compose.yml -f compose.mssql.yml -f compose.rabbitmq.yml ps

Expected state:

  • db-manager — exited (0)
  • all other app services — running (healthy)
curl -k -I "https://localhost/"
curl -k "https://localhost/auth/health"

From a client browser: https://<DESKALERTS_SERVER_URL>/ — login page.

Change the admin password immediately after first login.

Logs when troubleshooting​

docker compose logs logs-init
docker compose logs db-manager
docker compose logs main --tail 100
docker compose logs nginx --tail 50

Besides the container output, every application service writes file logs into the shared volume deskalerts-logs, mounted at /var/log/deskalerts/<service>/ (an errors stream and a 48-hour info stream per service). The logs-init one-shot makes the volume writable before anything starts; a service folder missing there means that service is not writing, not a filter.

The same tree is what the diagnostics bundle is built from: an administrator downloads it in the admin UI under Settings → Logging Configuration (da-diagnostics-<timestamp>.zip) — a plain ZIP with the server logs of all services and the browser's own diagnostics, passed through a sanitizer (secrets removed, user names, e-mails, addresses and host names replaced by stable pseudonyms). It can be opened with any archiver before it is sent to DeskAlerts support; the bundle is also what the AI assistant attaches to a bug report. How support reads it: docs/DIAGNOSTICS_SUPPORT_GUIDE.md (in the DeskAlerts repository).

10. Autostart after reboot​

Containers with restart: unless-stopped / on-failure start automatically when the Docker systemd unit is enabled:

sudo systemctl enable docker

11. Backup​

DataPath / object
MSSQL database/opt/deskalerts/data/mssql (in-stack) or standard SQL Server backup
Media and exports/opt/deskalerts/data/media
Configuration/opt/deskalerts/.../deploy/.env (store encrypted)
RabbitMQvolume rabbitmq-data → docker volume inspect
Server file logsvolume deskalerts-logs (/var/log/deskalerts/<service>/) — optional; keep it when a support case is open, the diagnostics bundle reads from it

12. Version upgrade​

  1. Obtain a new package from DeskAlerts support (delta or full).
  2. docker compose down (without -v to keep volumes).
  3. docker load new images.
  4. Update DESKALERTS_VERSION and DESKALERTS_DB_VERSION in .env.
  5. docker compose ... up -d --no-build --wait.
  6. db-manager applies migrations on startup.

Back up the database and media before upgrading.

13. Troubleshooting​

SymptomLikely causeAction
db-manager exited non-zeroWrong password / SQL unreachableCheck DESKALERTS_DB_*, db-manager logs
main unhealthyDatabase not readyWait for MSSQL; docker compose logs mssql
502 from nginxService still startingdocker compose ps, wait for healthcheck
pull access deniedImage not loadeddocker load, verify DESKALERTS_VERSION tag
Compose tries to buildMissing --no-buildAdd --no-build
SSO not workingSPN / gateway URLMSI logs, DESKALERTS_SSO_GATEWAY_URL
Email not sentSMTP or RabbitMQCheck SMTP env; for outbox — DESKALERTS_RABBITMQ_URI
Stats Assistant emptyNo Cline API key / no internetExpected in air-gap; disable or allow HTTPS

Appendix A — import-images.sh​

#!/usr/bin/env bash
set -euo pipefail
IMG_DIR="${1:?Usage: import-images.sh /path/to/images}"

for tar in deskalerts-app mssql-2022 rabbitmq-4.1; do
file="${IMG_DIR}/${tar}.tar"
[ -f "${file}.gz" ] && gunzip -dk "${file}.gz"
[ -f "$file" ] && docker load -i "$file" && echo "Loaded $file"
done

docker images | grep -E 'deskalerts/|mssql/server|rabbitmq'
  • compose.yml, compose.mssql.yml, compose.rabbitmq.yml — in the deploy/ folder
  • docs/RABBITMQ_GUIDE.md — message bus (in DeskAlerts repository)
  • apps/servers/dotnet/DeskAlerts.SsoGateway/deploy/INSTALLER.md — AD SSO Gateway
  • docs/DIAGNOSTICS_SUPPORT_GUIDE.md — diagnostics bundle (server logs of all services + browser diagnostics, sanitized) and the support-side inspector tool