A simplistic, opinionated remote update server implementing hawkBit™'s DDI API.
The Docker Compose demo docker/demo/docker-compose.yml may serve as inspiration for a containerized (cloud) deployment. It uses PostgreSQL as the database and NGINX as a reverse proxy.
Warning
Do not use the demo (as-is) in production!
Make sure you have Docker (and Docker Compose) installed. Then run:
docker compose -f docker/demo/docker-compose.yml upVisit gooseBit at: https://localhost
gooseBit can be configured through a configuration file (/etc/goosebit.yaml) or by setting environment variables.
For the available options and their defaults, see goosebit.yaml.
The environment variable corresponding to e.g. the poll_time YAML setting would be GOOSEBIT_POLL_TIME.
Environment variables for nested settings are constructed using __ as the separator:
GOOSEBIT_DEVICE_AUTH__ENABLE=trueAlternatively, a JSON string can be assigned:
GOOSEBIT_DEVICE_AUTH='{"enable": true}'By default, SQLite is used as the database. For more sophisticated setups, PostgreSQL is supported.
To use PostgreSQL, set db_uri or the GOSSEBIT_DB_URI environment variable to something like:
postgres://user:password@host:5432/db_nameThe software packages managed by gooseBit are either stored on the local filesystem (artifacts_dir setting) or an S3-compatible object storage.
- Devices use SWUpdate or RAUC + RAUC hawkBit Updater for managing software updates.
- Devices send certain attributes (
sw_version,hw_boardname,hw_revision). - Semantic versions are used.
- With RAUC and multiple hardware revisions,
compatibleinmanifest.raucmis set to something likemy-board-rev4.2orSome Board 2b.
When a device connects to gooseBit for the first time, it is automatically added to the device registry. The server will then request the device's configuration data, including:
hw_boardnameandhw_revision: Used to match compatible software.sw_version: Indicates the currently installed software version.
The registry tracks each device's status, including the last online timestamp, installed software version, update state, and more.
Software packages (*.swu/*.raucb files) can be hosted directly on the gooseBit server or on an external server. gooseBit parses the software metadata to determine compatibility with specific hardware models and revisions.
Devices can be configured with different update modes. The default mode is Rollout.
Assign specific software to a device manually. Once installed, no further updates will be triggered.
Automatically updates the device to the latest compatible software, based on the reported hw_boardname and hw_revision. Note: versions are interpreted as SemVer versions.
Rollouts target all devices with a specified "feed" value, ensuring that the assigned software is installed on all matching devices. Rollouts also track success and error rates, with future plans for automatic aborts. If multiple rollouts exist for the same feed, the most recent rollout takes precedence.
Devices can be pinned to their current software version, preventing any updates from being applied.
While updates are in progress, gooseBit captures real-time logs, which are accessible through the device repository.
Install Poetry as described here.
Then, to install gooseBit's dependencies, run:
poetry installInitialize the database:
poetry run aerich upgradeLaunch gooseBit:
poetry run python -m goosebitThe service is now available at: http://localhost:60053
Initialize or migrate database:
poetry run aerich upgradeAfter a model change create the migration:
poetry run aerich migrateTo seed some sample data (attention: drops all current data) use:
poetry run generate-sample-dataCode is formatted using different tools
- black and isort for
*.py - biomejs for
*.js,*.json - prettier for
*.html,*.md,*.yml,*.yaml
Code is linted using different tools as well
- flake8 for
*.py - biomejs for
*.js
Best to have pre-commit install git hooks that run all those tools before a commit:
poetry run pre-commit installTo manually apply the hooks to all files use:
poetry run pre-commit run --all-filesTests are implemented using pytest. You can run all the tests with:
poetry run pytestTo run only the unit tests:
poetry run pytest tests/unitTo run only the end-to-end tests:
poetry run pytest tests/e2edocker compose -f docker/docker-compose-dev.yml up --builddocker exec goosebit-dev python -m aerich upgradeYou might need rlwrap to fix readline support.
Place breakpoint() before the code you want to debug. The server will reload automatically.
Then, connect to remote PDB (when the breakpoint has been hit):
rlwrap telnet localhost 4444To exit the debugger, press Ctrl + ] and then q.
The structure of gooseBit is as follows:
api: Files for the API.ui: Files for the UI.bff: Backend for frontend API.static: Static files.templates: Jinja2 formatted templates.nav: Navbar handler.
updater: DDI API handler and device update manager.updates: SWUpdate/RAUC file parsing.auth: Authentication functions and permission handling.models: Database models.db: Database config and initialization.schema: Pydantic models used for API type hinting.settings: Settings loader and handler.storage: Storage for software artifacts.telemetry: Telemetry data handlers.routes: Routes for a giving endpoint, including the router.
