Skip to content
Merged
Show file tree
Hide file tree
Changes from 20 commits
Commits
Show all changes
21 commits
Select commit Hold shift + click to select a range
9d0b550
Add basic mqtt mosquitto broker docker compose with test file
nataliakenrick Oct 21, 2025
fa2ad6e
Update README.md
nataliakenrick Oct 21, 2025
f31d97f
remove mosquitto.db file
nataliakenrick Oct 23, 2025
7fb3b4b
Use eclipse-mosquitto:latest in docker file
nataliakenrick Oct 23, 2025
d2e2e2b
restructure so docker-compose is for all of bridgehead
nataliakenrick Oct 23, 2025
14da854
move check_mqtt.sh to mosquitto folder
nataliakenrick Oct 23, 2025
4cb9b69
Merge remote-tracking branch 'origin/Basic-deployment-bundle-stage-on…
nataliakenrick Oct 23, 2025
0200991
Remove mosquitto image from docker compose as this is in the Dockerfi…
nataliakenrick Oct 23, 2025
ea2d408
Merge remote-tracking branch 'origin/Basic-deployment-bundle-stage-on…
nataliakenrick Oct 23, 2025
0237c08
Update bridghead docker compose setup to include core udmi services
nataliakenrick Nov 3, 2025
002bb11
Update mosquitto_ctrl.sh to use env variables for MQTT host and port …
nataliakenrick Nov 3, 2025
482f5b0
Update README, add example outputs
nataliakenrick Nov 5, 2025
82886ed
Fix typo in udmis_output.md
nataliakenrick Nov 10, 2025
0cb1638
Merge branch 'master' into Core-UDMI-Services-Integration-stage-two
nataliakenrick Nov 11, 2025
a1538cd
Remove unused files
nataliakenrick Nov 20, 2025
51a4284
Update README
nataliakenrick Nov 21, 2025
3edd59a
Allow pubber connections from external hosts. Run registrar on startu…
nataliakenrick Nov 21, 2025
5fa88ca
Merge branch 'faucetsdn:master' into Core-UDMI-Services-Integration-s…
nataliakenrick Nov 21, 2025
0f4c257
Merge branch 'Core-UDMI-Services-Integration-stage-two' of https://gi…
nataliakenrick Nov 21, 2025
1d5e65d
update README
nataliakenrick Nov 21, 2025
5ab7eef
remove pubber from compose, update readme
nataliakenrick Nov 26, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 6 additions & 1 deletion bin/keygen
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,12 @@ CA_SRL=$CA_DIR/ca.srl
CA_KEY=$CA_DIR/rsa_private.pem
OPTS_509=/tmp/x509opts.txt

echo "subjectAltName=DNS:${TARGET_HOST}, IP:127.0.0.1, DNS:localhost" > $OPTS_509
if [[ -n "$HOST_IP" ]]; then
echo "subjectAltName=DNS:${TARGET_HOST}, IP:127.0.0.1, IP:${HOST_IP}, DNS:localhost" > $OPTS_509
else
echo "subjectAltName=DNS:${TARGET_HOST}, IP:127.0.0.1, DNS:localhost" > $OPTS_509
fi

x509opts="-days 3650 -extfile $OPTS_509"

if [[ $type == CA ]]; then
Expand Down
62 changes: 49 additions & 13 deletions bridgehead/README.md
Original file line number Diff line number Diff line change
@@ -1,26 +1,62 @@
# MQTT Broker Environment Setup
# Core UDMI Services Environment Set Up

This guide provides instructions for deploying and verifying the **Mosquitto MQTT broker** using Docker Compose.
This guide provides instructions for deploying the core UDMI services bundle. This bundle includes:
- Mosquitto broker
- etcd server
- udmis service
- validator (registrar) tool
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Validator and Registrar, are two different things. Validator is something which can run in the background continuously and validate the messages coming are UDMI compliant or not (so a service), but Registrar is kind of tool which is suppose to run for some time, and after it's work is done, it stops (so, more of a tool) which can be executed from inside the validator container as well.

- pubber tool
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pubber is a tool, we don't need this as a service. For now, any specific reason of having pubber as a service?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

That's a good point. I included it to help users easily test the local setup.

Since it doesn't need to run as a permanent service, I can go ahead and remove the service definition. Let me know if that works for you.

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yeah, let's remove it from the service definition for now as it is more of a tool.


### Broker access details
## Setting up the Docker environment

- **Broker address**: The host machine's local IP address (e.g., `localhost` or `127.0.0.1`).
- **Port**: `1883`
1. **Install docker engine:** Ensure Docker is installed and running on your system: `https://docs.docker.com/engine/install/`

The configuration is designed for connections without client credentials.
2. **Navigate to project directory:** Open your terminal and change the directory to the project root containing the `docker-compose.yml` file (`bridgehead/`).

### Setting up the docker environment
3. **Get default site model:** In you terminal, run `sudo git clone https://github.com/faucetsdn/udmi_site_model.git`.

1. **Install docker engine:** Ensure Docker is installed and running on your system: `https://docs.docker.com/engine/install/`
4. **Add your host ip:** Open the docker-compose.yml file and locate the line `HOST_IP: <YOUR_IP>` inside the mosquitto service block. Replace `<YOUR_IP>` with your hosts ip address. You can find this by running `sudo hostname -I`. If you do not plan on using pubber outside of the docker container, you can remove the environment option from the compose file.

2. **Navigate to project directory:** Open your terminal and change the directory to the project root containing the `docker-compose.yml` file (`bridgehead/`).

3. **Deploy the service:** Execute the following command to build the custom image (if needed) and start the Mosquitto container in detached mode.
5. **Deploy the service:** Execute the following command to build the custom images (if needed) and start the containers in detached mode.
* **First time/after changes:** Run `sudo docker compose up -d --build`
* **Standard run:** Run `sudo docker compose up -d`
6. **Confirm all containers are running:** Run `sudo docker ps` in the terminal, you should see the following containers in any order:
- pubber
- validator
- udmis
- mosquitto
- etcd

## Tools

The UDMI tools should only be run after the udmis service has completed setup. You can confirm this by comparing your udmis output to the [sample udmis output](sample_outputs/udmis_output.md). Tools should be run in the same directory as the Docker Compose (`bridgehead/`).

### Registrar (validator)

In your terminal, execute `sudo docker exec validator bin/registrar site_model/ //mqtt/mosquitto`. To confirm a successful execution, take a look at the [sample registrar output](sample_outputs/registrar_output.md)

### Pubber

4. **Run connectivity check:** Confirm the broker is up and running by executing `sudo docker compose exec mosquitto /usr/local/bin/check_mqtt.sh`. This script performs an internal publish/subscribe self-test. A successful output confirms the broker is fully operational and accepting client connections.
The pubber tool will only have a successful output after the registrar tool has been executed. This is done by default in compose setup.

### Shutting down the docker environment
#### Local (docker compose)
- In your terminal, run `sudo docker exec pubber bin/pubber site_model/ //mqtt/mosquitto AHU-1 123456` (`123456` can be replaced with any serial number).

#### Running pubber on separate machine
- On your external computer, clone the udmi site model: `sudo git clone https://github.com/faucetsdn/udmi.git`.
- Export your host ip (the same one we set in the docker compose): `EXPORT HOST_IP=<YOUR_HOST_IP>`
- Pull your udmi site model, the default is the same we used earlier: `sudo git clone https://github.com/faucetsdn/udmi_site_model.git`
- Generate keys: `udmi/bin/keygen CA/<YOUR_HOST_IP> udmi_site_model/reflector` and `udmi/bin/keygen CERT/<YOUR_HOST_IP> udmi_site_model/reflector`.
- Run pubber container: `sudo docker run -d --rm --name externalPubber -v $(realpath udmi_site_model):/root/site_model ghcr.io/faucetsdn/udmi:pubber-latest /bin/bash -c "tail -f /dev/null"`
- Run pubber: `sudo docker exec externalPubber bin/pubber site_model/ //mqtt/<YOUR_HOST_IP> AHU-1 123456`

*Note:* You can name the external pubber container anything, as long as it doesn't match of your other containers. I this case, its assumed you will still have the pubber container in the docker compose file, therefore the new container cannot also be called pubber.

Pubber is running successfully if there are no obvious error messages or retries. An **unsuccessful** run will retry multiple times, will see messages like `Attempt #10 failed`.

A successful run will not end on its own, you can press `Ctrl` + `C` on your keyboard to exit.

## Shutting down the docker environment

To gracefully stop and remove the container, run: `sudo docker compose down`

86 changes: 82 additions & 4 deletions bridgehead/docker-compose.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,86 @@ services:
context: ./mosquitto
container_name: mosquitto
volumes:
- ./mosquitto/config:/mosquitto/config
- ./mosquitto/data:/mosquitto/data
- ./mosquitto/log:/mosquitto/log
- ./udmi_site_model:/site_model
- ./var/mosquitto:/etc/mosquitto
- ./var/mosquitto/data:/mosquitto/data
- ./var/mosquitto/log:/var/log/mosquitto/
ports:
- 1883:1883
- "8883:8883"
restart: always
networks:
- udminet
environment:
HOST_IP: <YOUR_IP>

etcd:
image: quay.io/coreos/etcd:v3.5.13
container_name: etcd
volumes:
- ./var/etcd:/var/etcd
ports:
- "2379:2379"
networks:
- udminet
restart: always
command: ["etcd", "-listen-client-urls=http://0.0.0.0:2379", "-advertise-client-urls=http://etcd:2379", "--data-dir", "/var/etcd"]

udmis:
build:
context: ./udmis
container_name: udmis
volumes:
- ./udmi_site_model:/root/site_model
- ./var/tmp:/tmp
- ./var/etcd:/root/udmi/var/etcd
- ./var/mosquitto/log:/var/log/mosquitto
- ./var/mosquitto/certs:/etc/mosquitto/certs
depends_on:
etcd:
condition: service_started
mosquitto:
condition: service_started
restart: always
networks:
- udminet
environment:
ETCD_CLUSTER: etcd
MQTT_HOST: mosquitto
MQTT_PORT: 8883

validator:
build:
context: ./validator
container_name: validator
volumes:
- ./udmi_site_model:/root/site_model
- ./var/mosquitto/log:/var/log/mosquitto
- ./var/mosquitto/certs:/etc/mosquitto/certs
- ./var/tmp:/usr/local/bin/udmis
depends_on:
udmis:
condition: service_started
restart: always
networks:
- udminet

pubber:
image: ghcr.io/faucetsdn/udmi:pubber-latest
container_name: pubber
volumes:
- ./udmi_site_model:/root/site_model
depends_on:
udmis:
condition: service_started
command: ["tail", "-f", "/dev/null"]
restart: always
networks:
- udminet

networks:
udminet:
name: udminet
driver: bridge
ipam:
config:
- subnet: 192.168.99.0/24
13 changes: 11 additions & 2 deletions bridgehead/mosquitto/Dockerfile
Original file line number Diff line number Diff line change
@@ -1,4 +1,13 @@
FROM ghcr.io/faucetsdn/udmi:udmis-latest AS udmi
FROM eclipse-mosquitto:latest

COPY check_mqtt.sh /usr/local/bin/
RUN chmod +x /usr/local/bin/check_mqtt.sh
RUN apk add --no-cache bash jq sudo git mosquitto mosquitto-clients openssl sed

COPY --from=udmi /root/udmi/bin /root/udmi/bin
COPY --from=udmi /root/udmi/etc /root/udmi/etc

COPY mosquitto_startup.sh /usr/local/bin/
RUN chmod +x /usr/local/bin/mosquitto_startup.sh

CMD ["/usr/local/bin/mosquitto_startup.sh"]

28 changes: 0 additions & 28 deletions bridgehead/mosquitto/check_mqtt.sh

This file was deleted.

7 changes: 0 additions & 7 deletions bridgehead/mosquitto/config/mosquitto.conf

This file was deleted.

38 changes: 38 additions & 0 deletions bridgehead/mosquitto/mosquitto_startup.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
#!/bin/sh
UDMI_ROOT=/root/udmi

function fail {
echo error: $*
false
}

echo "persistence true
persistence_file mosquitto.db
persistence_location /mosquitto/data/

include_dir /etc/mosquitto/conf.d" > /etc/mosquitto/mosquitto.conf

cd $UDMI_ROOT

site_model=$(realpath /site_model)
site_config=$site_model/cloud_iot_config.json
registry_id=$(jq -r .registry_id $site_config)

source $UDMI_ROOT/etc/mosquitto_ctrl.sh
mkdir -p $CERT_DIR

if [[ -n "$HOST_IP" ]]; then
sed -i -e "s|IP:127.0.0.1,|IP:127.0.0.1, IP:${HOST_IP},|" bin/keygen
fi

bin/setup_ca $site_model mosquitto
bin/start_mosquitto

$MOSQUITTO_CTRL deleteClient $SERV_USER
$MOSQUITTO_CTRL createClient $SERV_USER -p $SERV_PASS
$MOSQUITTO_CTRL addClientRole $SERV_USER service

echo Starting initializing site $site_model | tee -a $UDMIS_LOG
bin/mosquctl_site $site_model

sleep infinity
Loading