Added production quality docker compose file with environment vars set in the docker compose file, without using env vars, updated docs, separated out run-single and run-multiple

This commit is contained in:
Emran Billah 2024-09-04 14:26:59 -03:00
parent d5adc2c7db
commit 23b30416b5
14 changed files with 95 additions and 62 deletions

13
.env
View File

@ -1,14 +1,15 @@
# Base params
XBNET_BASE_SUBNET=3.3.3
XBNET_BASE_SUBNET=2.2.2
XBEE_INDEX=1
XBNET_PROTO=tap
# Default params
XBNET_DEFAULT_GATEWAY=3.3.3.1
XBNET_DEFAULT_IPVLAN_IP=3.3.3.20 # Required only when running ipvlan net (look in docker compose)
XBNET_DEFAULT_MACVLAN_IP=3.3.3.30 # Required only when running macvlan net (look in docker compose)
XBNET_DEFAULT_GATEWAY=2.2.2.1
XBNET_DEFAULT_IPVLAN_IP=2.2.2.20 # Required only when running ipvlan net (look in docker compose)
XBNET_DEFAULT_MACVLAN_IP=2.2.2.30 # Required only when running macvlan net (look in docker compose)
# Configuration for xbnet
XBEE_PORT=/dev/ttyUSB0
XBEE_BAUDRATE=230400
XBNET_IP=3.3.3.201 # Set based on interface type
XBNET_INTERFACE_NAME=xbnet_router_1 # Set based on interface type
XBNET_IP=2.2.2.201 # Set based on interface type
XBNET_INTERFACE_NAME=xbnet_router_1 # Set based on interface type

View File

@ -35,8 +35,8 @@ COPY ./scripts/set-env-vars.sh /set-env-vars.sh
RUN chmod +x /set-env-vars.sh
# Copy the health check script
COPY ./scripts/health_check.sh /health_check.sh
RUN chmod +x /health_check.sh
COPY ./scripts/health-check.sh /health-check.sh
RUN chmod +x /health-check.sh
# Add healthcheck
HEALTHCHECK CMD /health_check.sh || exit 1
HEALTHCHECK CMD /health-check.sh || exit 1

View File

@ -65,19 +65,30 @@ git clone https://git.spirirobotics.com/Spiri/services-xbee_net
cd services-xbee_net
```
#### 2. Run a single xbnet node using the following cmd:
#### 2. To run the project in `PRODUCTION` mode, use the following cmd:
- `docker-compose -f docker-compose.yml up --build`
- Configure the project for user specs, modify the `docker-compose.yml` file for the following parameters:
```bash
environment:
- XBEE_INDEX=1
- XBEE_BAUDRATE=230400
- XBEE_PORT=/dev/ttyUSB0
- XBNET_BASE_SUBNET=2.2.2
- XBNET_INTERFACE_TYPE=router # ["router" | "gateway"]
- XBNET_PROTO=tap # ["tap" | "tun"]
```
#### 3. To run a single xbnet node in `DEVELOPEMENT` mode, use the following cmd:
- Router mode: `sh ./run-single.sh --subnet=7.7.7 --serial-speed=230400 --port=/dev/ttyUSB0 --interface-type=router`
- Gateway mode: `sh ./run-single.sh --subnet=7.7.7 --serial-speed=230400 --port=/dev/ttyUSB0 --interface-type=gateway`
##### NOTE: This setup assumes that you have an XBee device connected to port: /dev/ttyUSB0
#### OR Manually build and Start the Docker Container
NOTE: This will require the config `.env` to be manually modified, based on user needs.
#### 3. OR Manually build and Start the Docker Container
##### NOTE: This will require the config `.env` to be manually modified, based on user needs.
---
- Configure a single xbnet net service using:
```bash
@ -91,6 +102,14 @@ cd services-xbee_net
DEFAULT_GATEWAY=192.168.1.1
```
#### 4. To run a multiple xbnet nodes in `DEVELOPEMENT` mode, use the following cmd:
- Router 1: `sh ./run-multiple.sh --index=1 --subnet=7.7.7 --serial-speed=230400 --port=/dev/ttyUSB0 --interface-type=router`
- Router 2: `sh ./run-multiple.sh --index=2 --subnet=7.7.7 --serial-speed=230400 --port=/dev/ttyUSB0 --interface-type=router`
- Gateway: `sh ./run-multiple.sh --subnet=7.7.7 --serial-speed=230400 --port=/dev/ttyUSB0 --interface-type=gateway`
NOTE: This will require the config `.env` to be manually modified, based on user needs.
- Configure multiple xbnet net services using:
```bash
@ -109,22 +128,15 @@ cd services-xbee_net
# Default Gateway (REQUIRED: part of minimum concifg to run a single xbnet node)
DEFAULT_GATEWAY=192.168.1.1
```
---
To build the Docker image and start the container, run:
```bash
docker-compose -f docker-compose.yml up --build
```
This will build the Docker image and start the container with the XBee network and the required setup.
#### 4. Health Check and Container Management
#### 5. Health Check and Container Management
The container includes a health check that pings the XBee network interface to ensure it is functioning properly. \
The container is configured to restart automatically if the health check fails.
#### 5. Troubleshooting
#### 6. Troubleshooting
Ensure the XBee devices are connected to the correct serial ports.\
Verify the network interfaces using ip a inside the container.\

View File

@ -67,13 +67,8 @@ services:
build: .
container_name: xbnet_node
privileged: true
# env_file: .env
environment:
- XBEE_INDEX=1
- XBEE_BAUDRATE=230400
- XBEE_PORT=/dev/ttyUSB0
- XBNET_BASE_SUBNET=7.7.7
- XBNET_INTERFACE_TYPE=router
env_file:
- .env
command: bash /entrypoint.sh
# network_mode: "host"

15
docker-compose.yml Normal file
View File

@ -0,0 +1,15 @@
version: '3.8'
services:
xbnet-node:
build: .
container_name: xbnet_node
privileged: true
environment:
- XBEE_INDEX=1
- XBEE_BAUDRATE=230400
- XBEE_PORT=/dev/ttyUSB0
- XBNET_BASE_SUBNET=2.2.2
- XBNET_INTERFACE_TYPE=router
- XBNET_PROTO=tap
command: bash /entrypoint.sh

View File

@ -14,10 +14,11 @@ echo "Starting entrypoint.sh"
# Set associated env vars
echo "Setting associated environment variables. Calling /set-env-vars.sh"
sh /set-env-vars.sh
source /set-env-vars.sh
# Main loop
loop() {
echo "Starting loop"
while true; do
# Check if the XBee device is connected
check_device_port
@ -26,7 +27,6 @@ loop() {
cleanup
continue
fi
sleep 0.5
# Check if the network interface is up
check_network_state
@ -34,7 +34,6 @@ loop() {
echo "Network interface $XBNET_INTERFACE_NAME not found. Creating TAP interface..."
create_tap_interface
fi
sleep 0.5
# Log messages sent and received over xbnet
# log_xbnet_messages
@ -64,7 +63,8 @@ check_network_state() {
# Create a TAP network interface
create_tap_interface() {
# Start xbnet and run it in the background
xbnet -d --serial-speed ${XBEE_BAUDRATE} ${XBEE_PORT} tap --iface-name ${XBNET_INTERFACE_NAME} &
# - eg. xbnet -d --serial-speed 230400 /dev/ttyUSB0 tap --iface-name=xbnet_router_1
xbnet -d --serial-speed ${XBEE_BAUDRATE} ${XBEE_PORT} ${XBNET_PROTO} --iface-name ${XBNET_INTERFACE_NAME} &
# Wait until the interface is created
while ! check_network_state; do
@ -75,15 +75,19 @@ create_tap_interface() {
ip addr add $XBNET_IP/24 dev $XBNET_INTERFACE_NAME
ip link set $XBNET_INTERFACE_NAME up
echo "-------------------------------------------"
echo "********** Tap interface created **********"
echo "-------------------------------------------"
echo "Name: ${XBNET_INTERFACE_NAME}"
echo "Gateway: ${DEFAULT_GATEWAY}"
echo "IP: ${XBNET_IP}"
echo "Device port: ${XBEE_PORT}"
echo "Device baudrate: ${XBEE_BAUDRATE}"
echo "-------------------------------------------"
echo "---------------------------------------------------------"
echo "***************** Tap interface created *****************"
echo "---------------------------------------------------------"
echo "XBEE_INDEX : ${XBEE_INDEX}"
echo "XBEE_BAUDRATE : ${XBEE_BAUDRATE}"
echo "XBEE_PORT : ${XBEE_PORT}"
echo "XBNET_BASE_SUBNET : ${XBNET_BASE_SUBNET}"
echo "XBNET_IP : ${XBNET_IP}"
echo "XBNET_INTERFACE_NAME : ${XBNET_INTERFACE_NAME}"
echo "XBNET_DEFAULT_GATEWAY : ${XBNET_DEFAULT_GATEWAY}"
echo "XBNET_DEFAULT_IPVLAN_IP : ${XBNET_DEFAULT_IPVLAN_IP}"
echo "XBNET_DEFAULT_MACVLAN_IP : ${XBNET_DEFAULT_MACVLAN_IP}"
echo "---------------------------------------------------------"
return 0
}
@ -107,7 +111,7 @@ log_xbnet_messages() {
RX_PACKETS_BEFORE=$(cat /sys/class/net/$XBNET_INTERFACE_NAME/statistics/rx_packets)
TX_PACKETS_BEFORE=$(cat /sys/class/net/$XBNET_INTERFACE_NAME/statistics/tx_packets)
sleep 1
sleep 0.5
RX_PACKETS_AFTER=$(cat /sys/class/net/$XBNET_INTERFACE_NAME/statistics/rx_packets)
TX_PACKETS_AFTER=$(cat /sys/class/net/$XBNET_INTERFACE_NAME/statistics/tx_packets)

View File

@ -9,7 +9,8 @@ export XBEE_INDEX=${XBEE_INDEX}
export XBEE_BAUDRATE=${XBEE_BAUDRATE}
export XBEE_PORT=${XBEE_PORT}
export XBNET_BASE_SUBNET=${XBNET_BASE_SUBNET}
export XBNET_INTERFACE_TYPE=${XBNET_INTERFACE_TYPE} # Options: ["gateway", "router"]
export XBNET_INTERFACE_TYPE=${XBNET_INTERFACE_TYPE} # Options: ["gateway", "router"]
export XBNET_PROTO=tap # Options: ["tap", "tun"]
# Determine the source IP based on interface type
if [ "$XBNET_INTERFACE_TYPE" = "gateway" ]; then
@ -27,16 +28,21 @@ export XBNET_DEFAULT_MACVLAN_IP="${XBNET_BASE_SUBNET}.30"
export XBNET_IP
export XBNET_INTERFACE_NAME
# Print out values of environment variables
echo "***********************************************************"
echo "Environment variables set. "
echo "XBEE_INDEX : ${XBEE_INDEX}"
echo "XBEE_BAUDRATE : ${XBEE_BAUDRATE}"
echo "XBEE_PORT : ${XBEE_PORT}"
echo "XBNET_BASE_SUBNET : ${XBNET_BASE_SUBNET}"
echo "XBNET_IP : ${XBNET_IP}"
echo "XBNET_INTERFACE_NAME : ${XBNET_INTERFACE_NAME}"
echo "XBNET_DEFAULT_IPVLAN_IP : ${XBNET_DEFAULT_IPVLAN_IP}"
echo "XBNET_DEFAULT_MACVLAN_IP : ${XBNET_DEFAULT_MACVLAN_IP}"
echo "***********************************************************"
# Print out environment variables
print_env_vars() {
echo "***********************************************************"
echo "Environment variables set. "
echo "XBEE_INDEX : ${XBEE_INDEX}"
echo "XBEE_BAUDRATE : ${XBEE_BAUDRATE}"
echo "XBEE_PORT : ${XBEE_PORT}"
echo "XBNET_BASE_SUBNET : ${XBNET_BASE_SUBNET}"
echo "XBNET_IP : ${XBNET_IP}"
echo "XBNET_INTERFACE_NAME : ${XBNET_INTERFACE_NAME}"
echo "XBNET_DEFAULT_IPVLAN_IP : ${XBNET_DEFAULT_IPVLAN_IP}"
echo "XBNET_DEFAULT_MACVLAN_IP : ${XBNET_DEFAULT_MACVLAN_IP}"
echo "***********************************************************"
}
# print_env_vars