Self-hosted service
edgexfoundry/edgex-go avatar
edgexfoundry/edgex-go

edgex-go: Go microservices for the EdgeX Foundry IoT platform

EdgeX Golang Services Monorepo | Owner: Core/Support WG

1,548 stars521 forksGoApache-2.0

At a glance

What is it?
edgex-go contains the Go services, build definitions, container recipes, and bootstrap code used to assemble EdgeX Foundry deployments. It fits teams that want source-level control over an IoT edge platform, but its main branch is explicitly marked as unstable work in progress.
Who is it for?
Adopt a tagged edgex-go release or matching edgex-compose setup when the team needs EdgeX's microservice platform and can operate its containers, networking, security components, and external infrastructure dependencies. Do not adopt the main branch as a stable production baseline because its README explicitly warns that it may not work.
Can I use it commercially?
Yes. Apache-2.0 is a permissive licence: you can use, modify and sell software built on it, as long as you keep its copyright and licence notices.
Is it still maintained?
Yes. The repository last received commits 2 days ago.
What is it written in?
Mainly Go, according to GitHub's language statistics.

Answers come from the project's GitHub data, last synced on October 22, 2026, and from our analysis. They are not legal advice.

Editorial analysis

What edgex-go contributes to an EdgeX deployment

edgex-go solves a platform-level problem rather than a single device-integration problem. It contains the Go implementation of EdgeX Foundry microservices, along with files for building those services, placing them in containers, and bootstrapping them. The intended users are engineers assembling an IoT edge platform that needs common service boundaries rather than a standalone collector tied to one hardware family or operating system.

The repository's Makefile identifies concrete service programs including `core-data`, `core-metadata`, `core-command`, `core-common-config-bootstrapper`, `core-keeper`, `support-notifications`, and `support-scheduler`. It also defines container targets for the core and support services and for security components such as `security_proxy_setup`, `security_secretstore_setup`, `security_bootstrapper`, and the SPIRE services. Based on this layout, edgex-go is the service implementation behind an assembled EdgeX system rather than a library that an application imports directly.

This distinction affects adoption. A team looking for a device gateway for one protocol may prefer a smaller service. A team deploying several device connections, metadata, scheduling, notification, and security workflows can use edgex-go as the central set of independently buildable Go programs.

Microservice boundaries, messaging, and configuration flow

The visible architecture is service oriented. The `cmd/` tree holds executable entry points, while `internal/` contains supporting implementation code. The Makefile's `MICROSERVICES` list separates core functions from support functions. `core-data`, `core-metadata`, and `core-command` cover data, metadata, and command concerns. Support services include notifications and scheduling. Bootstrap and security executables handle setup rather than ordinary application traffic.

The Go module adds context to that design. It depends on `go-mod-bootstrap/v4`, `go-mod-core-contracts/v4`, `go-mod-messaging/v4`, and `go-mod-secrets/v4`. Their names indicate that the services use shared EdgeX bootstrap, contract, messaging, and secrets components. The module also includes MQTT, ZeroMQ, Redis, PostgreSQL, scheduling, metrics, Echo, SPIFFE, and cryptographic dependencies. The repository therefore deals with more than HTTP handlers. It also contains service startup, messaging, persistence, identity, and operational integration.

Message-bus selection has a build-time boundary. The README says NATS is opt-in and that published Docker images do not include NATS messaging. A local build can instead include it:

makefile
make build-nats
make docker-nats

The first target builds local binaries, while the second builds local Docker images with NATS support for Core and Support services. The README says those images can replace published images in a Compose file, using the `nat-bus` option in Compose Builder. This is a meaningful deployment constraint because enabling NATS is not merely a runtime environment variable in the documented workflow.

Starting edgex-go with the documented Compose flow

The shortest documented first use is to run the published EdgeX containers rather than compile the repository. The README directs users to the EdgeX organization's Docker Hub and gives a Compose-based startup sequence. This exact command selects `main` or `jakarta` and downloads that branch's `docker-compose.yml`:

sh
release="main" # or "jakarta" for latest
wget https://raw.githubusercontent.com/edgexfoundry/edgex-compose/${release}/docker-compose.yml
docker-compose up -d

After startup, the README says to open `http://localhost:8500/` to check service status. It then points to the EdgeX API Walkthrough for a real interaction flow. The cited startup instructions do not give a concrete device payload or API request. The status endpoint and linked walkthrough are the first documented checkpoints.

There is an important warning attached to this procedure. The edgex-go README says `main` contains work-in-progress code for an upcoming release, is not guaranteed to be stable or working, and is compatible only with the `main` branch of `edgex-compose`. As a result, the command above is a faithful reproduction of the README, but it should not be treated as a production pinning strategy. For a fixed deployment, select a release source from the repository's Releases page and pair it with a compatible Compose definition.

The Compose route also shows where responsibility lies. edgex-go supplies service code and build recipes, while `edgex-compose` supplies the multi-container arrangement. Replacing only one side with an unrelated branch can violate the compatibility condition stated in the README.

Building native binaries from the Go monorepo

Source builds are documented for teams that need local binaries. Clone the repository, enter its directory, and invoke the Makefile:

sh
git clone [email protected]:edgexfoundry/edgex-go.git
cd edgex-go
make build

The README describes the project as a Go Modules repository and says it does not require GOPATH layout or the `GO111MODULE` environment variable. However, the current `go.mod` declares `go 1.27`, while the README's native-binary prerequisite section still states v1.18.x for release artifacts and as the minimum supported version. That mismatch is a source-build risk. The actual local Go toolchain must satisfy the checked-in module declaration, and the release documentation should be checked against the selected tag before building.

The Makefile also exposes security and hardening choices. It sets `ENABLE_FULL_RELRO=true` and `ENABLE_PIE=true`, with comments tying them to Linux ELF relocation protections and ASLR. Most core services default to excluding delayed-start libraries because `INCLUDE_DELAYED_START_BUILD_CORE` is set to `"false"`, while support services set `INCLUDE_DELAYED_START_BUILD_SUPPORT` to `"true"`. Those defaults explain why replacing one service binary is not equivalent to rebuilding the entire platform.

OpenZiti is an opt-out capability. Published images include it, according to the README, but local variants can omit it:

makefile
make build-noziti
make docker-noziti

These commands produce binaries or Docker images without OpenZiti zerotrust for Core and Support services. Selecting a variant changes the security capability set, so the build choice belongs in deployment review rather than routine build customization.

Security proxy, token handling, and external ports

The documented security architecture inserts access control between clients and EdgeX services. `security-secretstore-setup` and `security-proxy-setup` are identified as major security components. When these features are enabled, clients must create an access token and associate it with every REST request. The README also says exported external ports such as 59880 and 59881 are inaccessible, while requests are routed through the proxy to the relevant microservices.

That design has an operational consequence. A port-forwarding habit or an unmodified REST client may work with an unsecured development arrangement and fail in the security-enabled arrangement. Proxy behavior, token acquisition, and service-specific endpoints must be configured as a group. The README refers readers to `SECURITY.md` for sample token creation and access steps.

The Makefile's security container list also shows that edgex-go includes setup and identity infrastructure beyond the Core and Support services. It defines images for `security_proxy_auth`, `security_proxy_setup`, `security_secretstore_setup`, `security_bootstrapper`, `security_spire_server`, `security_spire_agent`, `security_spire_config`, and `security_spiffe_token_provider`. The dependency list includes SPIFFE libraries, which is consistent with that identity-oriented component set.

OpenZiti and the proxy are not interchangeable choices in the documentation. One is an optional zerotrust capability included in published images by default, while the other is part of the enhanced security features enabled by default from the Fuji release according to the README. A deployment that disables OpenZiti still needs to account for token and proxy requirements unless its broader composition explicitly changes that arrangement.

edgex-go versus native service and platform alternatives

The clearest documented alternative is not a competing IoT project. It is changing the deployment approach: build selected edgex-go services as native binaries, or use the separate `edgex-compose` repository to orchestrate published or locally built images. These approaches have different operating costs.

Native binaries suit development and focused debugging. The README says a team can stop the Docker container for one service and run that service from a command line or debugger. This gives direct process control and shorter edit-build-run cycles for one component. The trade-off is that the developer still needs compatible configuration, dependencies, ports, and access to whatever databases, brokers, secret stores, and security services the service expects.

The Compose approach treats EdgeX as a multi-service deployment. It starts the service set together and is the README's recommended deployment method. It also gives the team a place to combine published images with locally built variants such as NATS or no-OpenZiti images. Its cost is coordination across a larger set of containers and external ports.

For a team needing only one narrow ingestion task, the full edgex-go service collection may be excessive because it brings metadata, commands, scheduling, notifications, configuration bootstrap, security setup, and identity components into scope. For an IoT platform team that needs those service boundaries, avoiding the platform in favor of unrelated point services would replace the shared contracts and bootstrap mechanisms documented by this repository with custom integration work. The appropriate comparison is therefore platform scope versus local operational control, not simply Go versus Docker.

Maintenance, release selection, and Apache-2.0 obligations

The repository is not archived, and its last push was on 2026-10-15. That is recent, but recent activity does not erase the README's stability warning. The listed release history includes `v4.0.2` from 2026-05-29, `v4.0.1` from 2025-11-25, and `v4.0.0` from 2025-03-13. The source for a released deployment is identified in the README as the repository's Releases page.

Maintenance cost includes more than rebuilding binaries. Operators must track compatibility between edgex-go and edgex-compose, decide whether NATS is required, determine whether OpenZiti should be present, configure security tokens and proxy access, and coordinate service containers with external infrastructure. Builds can also differ between Core and Support because delayed-start libraries are included or excluded through separate Makefile variables.

The project uses the Apache-2.0 license. The Makefile carries an `SPDX-License-Identifier: Apache-2.0` marking. The license permits broad use under its terms, but redistribution and modification still require attention to the actual license text, notices, attribution, and applicable conditions. This review does not replace legal advice.

The stale v1.18.x statement beside `go 1.27` in `go.mod` also raises upgrade verification work. Maintainers and adopters should check the README and toolchain requirement for the exact selected tag rather than applying release-era instructions to current development code.

Editorial conclusion

Adopt a tagged edgex-go release or matching edgex-compose setup when the team needs EdgeX's microservice platform and can operate its containers, networking, security components, and external infrastructure dependencies. Do not adopt the main branch as a stable production baseline because its README explicitly warns that it may not work. Before deployment, verify the chosen tag, compatible edgex-compose release, required security configuration, and service interfaces. For a fixed operating platform, v4.0.2 released on 2026-05-29 is the newest listed release, and the repository received its last push on 2026-10-15.

Frequently asked questions

How do I start EdgeX Foundry using edgex-go?

The README documents downloading a `docker-compose.yml` from `edgex-compose` and starting it with `docker-compose up -d`. It then directs users to `http://localhost:8500/` for status.

Can I build edgex-go with NATS messaging?

Yes. NATS is opt-in at build time, and the README documents `make build-nats` for local binaries and `make docker-nats` for local images. Published Docker images do not include this capability.

Is the edgex-go main branch suitable for production?

The README explicitly says `main` contains work-in-progress code, is not guaranteed to be stable or working, and should be used with the `main` branch of `edgex-compose`. It points released users to the Releases page.

How do I access EdgeX services when security is enabled?

Clients must create an access token and include it with every REST request. Requests go through the security proxy rather than directly to exported service ports such as 59880 and 59881.

Can edgex-go be built without OpenZiti zerotrust?

Yes. OpenZiti is opt-out, and the README documents `make build-noziti` and `make docker-noziti` to produce Core and Support variants without that capability.

Official sources

  1. edgexfoundry/edgex-go on GitHub
  2. Issues
  3. License: Apache-2.0
  4. README
  5. Releases
Add this badge to your README

If you maintain this project, the badge below links readers to this analysis and shows its maintenance status from the daily GitHub snapshot. Paste the markdown into your README; add ?metric=license or ?metric=stars to the image URL for a different field.

Add this badge to your README

markdown
[![Hysen Labs](https://hysenlabs.com/badge/edgexfoundry-edgex-go.svg)](https://hysenlabs.com/projects/edgexfoundry-edgex-go)

Was this useful?