Components

Last updated

The full third-party inventory shipped or installed by Jabali on a Debian 13 host. Every component listed here is fetched, configured, and started by install.sh; nothing requires manual operator install.

Version pins shown are the values in install.sh at the time of writing. Run jabali --version plus dpkg-query -l for the live values on a deployed host.

Runtime services

ComponentVersionRoleUpstream license
jabali-panelthis repoGo + Gin HTTP panel API; serves the React SPA; the only writer to the panel DBAGPL-3.0
jabali-agentthis repoRoot-privileged process; performs every privileged host operation over /run/jabali/agent.sockAGPL-3.0
Stalwart Mail0.16.24SMTP + IMAP + JMAP + mailbox store (single binary)AGPL-3.0
Bulwark1.19.1 (GitHub release tarball)Node + Next.js standalone JMAP webmail on mail.<domain>, plus autoconfig / autodiscover and the magic-link bridgeown
Ory Kratos26.2.0Identity (login, 2FA, recovery); Unix sockets onlyApache-2.0
nginxDebian nativeReverse-proxy + per-vhost server. Sury-nginx purged defensivelyBSD-2
PHP-FPM (Sury)8.1–8.5One master per panel user (jabali-fpm@<user>), on that user’s version; the distro units are maskedPHP License
MariaDBDebianPanel DB + tenant DBs; socket plus loopback 127.0.0.1:3306 only (loopback TCP because Stalwart’s SQL directory needs it)GPL-2
PostgreSQLDebian 17Tenant DBs only; opt-inPostgreSQL
RedisDebianNotification dispatcher stream + panel cacheBSD-3
PowerDNS AuthoritativeDebianAuthoritative :53 for hosted zones, MariaDB backendGPL-2
pdns-recursorDebianLoopback recursor 127.0.0.1:53 (split-port)GPL-2
CrowdSecpackagecloudIP-trust source + AppSec WAF + bouncersMIT
certbotDebianLet’s Encrypt issuance and renewalApache-2.0

jabali update moves Stalwart up to the version in this table, never down. A server that already runs a newer Stalwart, installed by hand, keeps it, and the update prints a warning. Jabali is tested with the version in the table.

Security stack

ComponentSourceRole
crowdsec + crowdsec-nginx-bouncer + cs-firewall-bouncer + AppSecpackagecloud + hubIP bans, scenarios, WAF
CrowdSec community blocklistCAPIFree community IP blocklist, pulled by the engine; no console enrolment
SnuffleupagusrepoPHP runtime hardening (Zend extension)
AppArmor + apparmor-profiles-extra + apparmor-utilsDebianPer-process MAC; profiles shipped for every Jabali service
AIDE + aide-commonDebianDaily host-integrity scan
auditd + audispd-pluginsDebianLinux audit subsystem
bubblewrapDebianPer-user PHP sandbox + SSH chroot for migrations
UFWDebianPort baseline only (IP decisions live in CrowdSec)
nftablesDebianPer-user egress (cgroup v2 vmap)
Linux Malware Detect (LMD)2.0.1 (GitHub)On-demand malware scanner — native HEX + YARA
YARA-X (yr binary)1.22.1 (GitHub)Pattern matching for LMD + the async mail scanner

Apps / tooling

ComponentVersionRole
phpMyAdmin5.2.3MariaDB web UI with single-use SSO (sso.php)
Adminer6.2.0Lighter DB web UI + jabali-sso-plugin.php
WP-CLI2.12.0WordPress automation
GoAccessDebiannginx log analyzer
resticDebianBackup engine (deduplicated, encrypted, multi-destination)
Go toolchain1.26.10Build agent + panel-api
Node.jsNodeSource current LTSBulwark runtime + UI build

OS plumbing

systemd, systemd-container, systemd-resolved (gated under JABALI_DNS_FORWARDER), auditd, OpenSSH (Match Group jabali-sftp), tar, curl, wget, gnupg, ca-certificates, git, build-essential, libpcre2-dev, acl, jq, socat.

Frontend (panel-ui)

LibraryVersionPurpose
React + react-dom19.3SPA
Ant Design6.6.8Component library
@ant-design/icons6.3Icons
TanStack Query (@tanstack/react-query)5.105API state
react-router7.18Routing
axios1.21HTTP client
CodeMirror (codemirror, @codemirror/*)6.0In-browser code editor (File Manager)
i18next + react-i18next26.6 / 17.1UI strings
xterm.js + addon-fit6.0 / 0.11Web terminal
@dnd-kit/core + sortable + utilities6.3 / 10 / 3.2Drag-and-drop
lucide-react1.66Extra icons
micro-key-producer0.8.6Browser-side key generation
@fontsource/inter5.3Self-hosted font
Vite 6 / TypeScript 5.7 / Vitest 3.2 / Playwright 1.63 / Testing Library—Build + test toolchain

Go libraries (direct dependencies in go.mod)

gin-gonic/gin (HTTP), gorm.io/gorm + gorm.io/driver/mysql (ORM), golang-migrate/migrate/v4 (migrations), redis/go-redis/v9 (Redis), gorilla/websocket (WebSocket), spf13/cobra (CLI), robfig/cron/v3 (schedules), oklog/ulid/v2 (IDs), fxamacker/cbor/v2 (encoding), SherClockHolmes/webpush-go (VAPID Web Push), BurntSushi/toml, google/shlex, golang.org/x/crypto|net|sync|sys|term|time.

Test-only: DATA-DOG/go-sqlmock, alicebob/miniredis/v2, stretchr/testify.

In-house patterns shipped under install/

  • jabali-sso-<43-char-nonce>.php — self-deleting magic SSO file (Installatron / Softaculous style). Used by Bulwark webmail and every application install for one-click admin sign-in. 60 s TTL; 256-bit nonce filename; flock + unlink on first hit.
  • phpMyAdmin sso.php and Adminer jabali-sso-plugin.php — adapt the magic-file pattern to the two DB web UIs.
  • install/snuffleupagus/rules/ — server-wide Snuffleupagus baseline rules.
  • install/wp-cli.sha256 / install/phpmyadmin.sha256 — checksum-pinned upstream tarballs.

Removed

Components that previously shipped but are not present in the current build. See Removed Features for the rationale per item.

ComponentStatusReplacement
Hydra (OIDC provider)Rolled backMagic-file SSO for app sign-in
ModSecurity + libmodsecurity + nginx-modsecurity-connector + OWASP CRSRemovedCrowdSec AppSec WAF
filebrowserReplacedIn-panel AntD File Manager
Tetragon + jabali-tetragon-relayRemoved 2026-04-30(none — eBPF tripwires retired)
ClamAV daemon + freshclam timerRemovedOn-demand clamscan, now itself superseded by LMD-native + YARA-X
@refinedev/*RemovedTanStack Query + AntD + react-router

The installer’s cleanup_* functions actively purge leftover packages and config from these components on every install, so a host that previously ran an older Jabali generation does not carry a footprint forward.

Source-of-truth pointers

If you need the live, currently-installed version of any component on a deployed host:

dpkg-query -W -f='${Package} ${Version}\n' | grep -E 'mariadb|postgresql|redis|nginx|pdns|certbot|crowdsec|stalwart|kratos|auditd|aide|apparmor|nftables|ufw|restic|bubblewrap'
stalwart --version
kratos version
jabali --version

To see exactly which versions are pinned for the next install:

grep -E 'VERSION="|version="|local .+_version=' install.sh | grep -v '^[[:space:]]*#'