No description
  • Elixir 91%
  • JavaScript 7.2%
  • Python 0.8%
  • CSS 0.5%
  • Shell 0.2%
  • Other 0.2%
Find a file
wuast94 844ba956ec
All checks were successful
Release / Compute release version (push) Successful in 8s
Release / Build (push) Successful in 55s
Release / Release (push) Successful in 4s
Merge pull request 'chore: update python digest' (#72) from updatarr/python-ac2bd8b1ce into main
2026-08-12 22:30:50 +02:00
.devcontainer chore: update elixir digest 2026-08-05 13:47:25 +02:00
.forgejo/workflows chore: update elixir digest 2026-08-05 14:27:27 +02:00
config feat(devcontainer): add kubectl and Kubernetes tooling support 2026-05-26 22:29:32 +00:00
deploy/k8s chore: update python digest 2026-08-12 22:28:02 +02:00
docs fix: authorize mixed subscribe filters independently 2026-06-13 04:35:25 +02:00
lib/oxidemq fix(cluster): bound stuck Ra command calls 2026-08-10 13:37:27 +00:00
priv/admin_web fix: stabilize admin live lists and sessions 2026-06-04 19:07:00 +02:00
scripts chore: remove dependency-track sbom tooling 2026-07-08 19:32:35 +02:00
test fix(cluster): bound stuck Ra command calls 2026-08-10 13:37:27 +00:00
tools fix: clean up failed browser QA starts 2026-07-21 15:04:25 +02:00
.dockerignore feat: add local Kubernetes e2e harness 2026-05-21 20:11:19 +02:00
.editorconfig test: add Elixir MQTT conformance walls 2026-05-19 03:05:25 +00:00
.formatter.exs ci: add forgejo release and sbom pipelines 2026-05-31 00:05:16 +00:00
.gitignore ci: add forgejo release and sbom pipelines 2026-05-31 00:05:16 +00:00
.pre-commit-config.yaml test: add Elixir MQTT conformance walls 2026-05-19 03:05:25 +00:00
.updatarr.yaml refactor: remove redundant dependency extractors 2026-07-21 14:26:42 +02:00
AGENT.md docs: add Elixir engineering guide 2026-05-19 03:13:42 +00:00
AGENTS.md bootstrap 2026-05-18 16:57:10 +02:00
cliff.toml ci: add forgejo release and sbom pipelines 2026-05-31 00:05:16 +00:00
Dockerfile chore: update elixir digest 2026-08-05 13:47:25 +02:00
Justfile fix: clean up failed browser QA starts 2026-07-21 15:04:25 +02:00
mix.exs chore: update mix dependencies 2026-07-28 10:15:29 +02:00
mix.lock chore: lock file maintenance 2026-07-27 17:54:43 +02:00
README.md feat: expose mqtt tls and websocket listeners 2026-06-02 19:35:31 +02:00
renovate.json ci: add forgejo release and sbom pipelines 2026-05-31 00:05:16 +00:00

OxideMQ

OxideMQ is an Elixir/OTP MQTT broker for MQTT 3.1.1, MQTT 5.0, and MQTT-aware high availability. The project treats the OASIS MQTT specifications as the source of truth and keeps broker behavior behind tests that exercise the actual protocol, session, storage, transport, and cluster boundaries.

Current State

The repository contains a working broker baseline with:

  • MQTT packet parsing, encoding, and validation for MQTT 3.1.1 and MQTT 5.0.
  • TCP, TLS, WebSocket, and WSS listener support.
  • Session lifecycle, duplicate-client fencing, QoS 1 and QoS 2 state, retained messages, will handling, expiry handling, shared subscriptions, user authentication, and ACL authorization.
  • Ra-backed distributed state for sessions, retained messages, shared subscriptions, users, and ACLs.
  • Kubernetes-native HA manifests for a StatefulSet deployment, Prometheus monitoring, and disaster-recovery backup export.
  • An unauthenticated admin HTTP API intended for a private control plane behind the deployment's edge authentication layer.

Repository Map

lib/oxidemq/application.ex      OTP application and supervision tree
lib/oxidemq/protocol            MQTT packet structs, parser, encoder, validation
lib/oxidemq/session             MQTT session and QoS state machines
lib/oxidemq/broker              Broker runtime, listeners, routing, auth
lib/oxidemq/store               Durable store boundaries and implementations
lib/oxidemq/transport           TCP, TLS, WebSocket, and WSS transports
lib/oxidemq/cluster             Discovery, shard ownership, Ra-backed state
lib/oxidemq/admin               Admin HTTP API and web UI assets
deploy/k8s/production/base      Production Kubernetes base manifests
deploy/k8s/monitoring           ServiceMonitor, PrometheusRule, Grafana dashboard
docs/specs/mqtt                 Local MQTT specification archive
docs/testing                    Conformance and interoperability coverage
test                            Unit, conformance, integration, and artifact tests
tools                           Repository maintenance and interop tooling

Development

Use the dev container for Elixir, Erlang, Node, Python, Docker-backed interop tooling, and repository checks:

devcontainer exec --workspace-folder . just fmt-check
devcontainer exec --workspace-folder . just lint
devcontainer exec --workspace-folder . just test
devcontainer exec --workspace-folder . just everything

Focused recipes are available for protocol, conformance, runtime, E2E artifact, and external MQTT interoperability work:

devcontainer exec --workspace-folder . just conformance
devcontainer exec --workspace-folder . just e2e
devcontainer exec --workspace-folder . just interop-fetch
devcontainer exec --workspace-folder . just interop

AGENT.md is the authoritative project workflow for agent-assisted work.

Configuration

Runtime release configuration is parsed by OxideMQ.Config and documented in docs/configuration.md. Kubernetes HA mode is intentionally low-knob: a StatefulSet deployment normally sets only the release identity, cookie, MQTT port, admin port, and OXIDEMQ_DISCOVERY_MODE=statefulset_dns; Ra storage, distributed stores, MQTT password authentication, ACL authorization, backpressure defaults, shard ownership, and membership are derived from the StatefulSet and the node identity.

Connecting

Connection options for the shared deployment:

Use case URL / Host Port Transport TLS WebSocket path Status
MQTT TCP mqtt.wuastbude.de 1883 MQTT over TCP No n/a Exposed
MQTT TLS mqtt.wuastbude.de 8883 MQTT over TLS Yes n/a Exposed
MQTT WebSocket mqtt.wuastbude.de 8083 MQTT over WebSocket No /mqtt Exposed
MQTT WSS mqtt.wuastbude.de 8084 MQTT over secure WebSocket Yes /mqtt Exposed
Admin UI https://oxidemq.wuastbude.de 443 HTTPS through Traefik Yes n/a Exposed

MQTT clients must authenticate with username and password. Client IDs may be any non-empty unique value unless the configured user restricts allowed client IDs.

For MQTT Explorer over plain TCP, select mqtt://, set the host to mqtt.wuastbude.de, set the port to 1883, disable SSL/TLS, and enter the user credentials. For MQTT over TLS, select mqtts:// or enable SSL/TLS, use port 8883, and keep the same username/password authentication. A client configured for TLS or client certificates will not connect to 1883, because that listener expects raw MQTT packets and does not perform a TLS handshake.

Kubernetes

The production base lives in deploy/k8s/production/base and is designed for a three-pod StatefulSet with stable network identity, persistent Ra data, health probes, a PodDisruptionBudget, NetworkPolicy boundaries, and a backup CronJob.

Monitoring artifacts live in deploy/k8s/monitoring:

  • oxidemq-service-monitor.yaml
  • oxidemq-prometheus-rules.yaml
  • grafana-dashboard-oxidemq.json

Operational procedures are in docs/operations/ha-runbook.md.

Docker Image

The Dockerfile builds an Elixir release in a builder stage and runs it on a distroless Debian 13 runtime image with only the runtime package set copied in. The image exposes MQTT on 1883 and the admin HTTP API on 8080.

Documentation

  • Configuration reference: docs/configuration.md
  • MQTT conformance manifest: docs/testing/mqtt-conformance-coverage.toml
  • External interop suites: docs/testing/external-suites.md
  • Ra-backed shard state ADR: docs/architecture/ra-backed-shard-state.md
  • Custom discovery ADR: docs/architecture/custom-discovery.md
  • HA operations runbook: docs/operations/ha-runbook.md