This is an overview of Edgehog's architecture.
The following sections will detail the interactions between Edgehog and the other components represented in the architecture diagram.
Edgehog exposes two ways to interact with it: a frontend that can be used by users and a GraphQL API which can be used by third party applications to programmatically perform all actions that can be performed in the frontend. As a matter of fact, the frontend itself uses the GraphQL API to perform its tasks.
Edgehog uses PostgreSQL to store its data. The database schema supports multiple tenants which are isolated at the database level. This makes it possible to use a single Edgehog instance with multiple tenants (e.g. in a SaaS scenario).
To interact with the other side of the domain (i.e. devices), Edgehog is built upon Astarte and it exchanges data with it using two of its mechanisms: its REST API and Astarte Triggers. Each Edgehog tenant is mapped to an Astarte Realm, and it owns the credentials to interact with all the Realm APIs for that specific Realm.
The interaction between Edgehog and Astarte is defined by a set of interfaces that define which data is sent both from Edgehog to the Devices and from the Devices towards Edgehog. Additionally, connection and disconnection triggers ar installed in the Astarte Realm, and point to the triggers endpoint of the Edgehog tenant.
The REST API is called every time Edgehog needs to retrieve data contained in
an Astarte interface or when it needs to send data to the Devices. In the first case, Edgehog issues
GET HTTP request to retrieve the data from AppEngine API, which reads the data from the Astarte
database. When Edgehog needs to send data towards a Device instead, it sends a
POST HTTP to
AppEngine API, which takes care of delivering data via MQTT to the device.
Astarte Triggers are used to update the online state of the device. Each time a Device connects or
disconnects from Astarte, Astarte Trigger Engine sends an HTTP
POST request to the Edgehog
backend, which in turn updates the Device online status in its own database.