{"id":18830267,"url":"https://github.com/gravitee-io/gravitee-node","last_synced_at":"2026-04-02T14:54:30.438Z","repository":{"id":38198260,"uuid":"142580119","full_name":"gravitee-io/gravitee-node","owner":"gravitee-io","description":"Gravitee.io - Node","archived":false,"fork":false,"pushed_at":"2026-04-01T15:26:17.000Z","size":4400,"stargazers_count":7,"open_issues_count":8,"forks_count":10,"subscribers_count":23,"default_branch":"master","last_synced_at":"2026-04-01T16:18:51.234Z","etag":null,"topics":["security-scan"],"latest_commit_sha":null,"homepage":"","language":"Java","has_issues":false,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/gravitee-io.png","metadata":{"files":{"readme":"README.adoc","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.adoc","funding":null,"license":"LICENSE.txt","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":".github/CODEOWNERS","security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2018-07-27T13:23:58.000Z","updated_at":"2026-04-01T15:26:20.000Z","dependencies_parsed_at":"2023-10-17T04:50:24.135Z","dependency_job_id":"f68067d6-f301-43b6-bc48-3fc5c6013970","html_url":"https://github.com/gravitee-io/gravitee-node","commit_stats":null,"previous_names":[],"tags_count":398,"template":false,"template_full_name":null,"purl":"pkg:github/gravitee-io/gravitee-node","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gravitee-io%2Fgravitee-node","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gravitee-io%2Fgravitee-node/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gravitee-io%2Fgravitee-node/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gravitee-io%2Fgravitee-node/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/gravitee-io","download_url":"https://codeload.github.com/gravitee-io/gravitee-node/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gravitee-io%2Fgravitee-node/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31308447,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-02T12:59:32.332Z","status":"ssl_error","status_checked_at":"2026-04-02T12:54:48.875Z","response_time":89,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["security-scan"],"created_at":"2024-11-08T01:48:19.349Z","updated_at":"2026-04-02T14:54:30.403Z","avatar_url":"https://github.com/gravitee-io.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"= Gravitee-io - Node\n\nimage:https://img.shields.io/badge/License-Apache%202.0-blue.svg[\"License\",link=\"https://github.com/gravitee-io/graviteeio-node/blob/master/LICENSE.txt\"]\nimage:https://img.shields.io/badge/semantic--release-conventional%20commits-e10079?logo=semantic-release[\"Releases\",link=\"https://github.com/gravitee-io/graviteeio-node/releases\"]\nimage:https://circleci.com/gh/gravitee-io/gravitee-node.svg?style=svg[\"CircleCI\",link=\"https://circleci.com/gh/gravitee-io/gravitee-node\"]\nimage:https://f.hubspotusercontent40.net/hubfs/7600448/gravitee-github-button.jpg[\"Join the community forum\",link=\"https://community.gravitee.io?utm_source=readme\", height=20]\n\n== Description\n\nThe Gravitee.io node project is the cornerstone of every Gravitee.io product.\nIt offers a piece of functionalities that can be selectively used out-of-the-box in a standard way.\n\n== Modules\n\n=== Api\n\nThe Gravitee Node Api module regroups all the interfaces that are implemented in the other modules.\n\n=== Cache\n\nThe Gravitee Node Cache module regroups all the classes related to cache management plugins, and two plugins implementations: standalone and hazelcast.\n\n=== Certificates\n\nThe Gravitee Node Certificates module defines implementations useful to deal with SSL.\nFor example, it provides based implementations allowing to load keystore from the file system or initialize a keystore with a self-signed certificate.\nOther node modules depend on it.\n\n=== Cluster\n\nThe Gravitee Node Cluster module regroups all the classes related to cluster management plugins, and two plugins implementations: standalone and hazelcast.\n\n=== Jetty\n\nThe Gravitee Node Jetty module gives an easy way to configure and start a Jetty server.\nMost of the Gravitee products rely on the node jetty module to set up and start an HTTP server and expose a REST api.\n\n=== Kubernetes\n\nThe Gravitee Node Kubernetes module offers useful implementations that work natively with k8s such as loading a keystore from a Kubernetes secret or resolving configuration entries from configmap.\n\n=== License\n\nThe Gravitee Node License module provides an out-of-the-box feature allowing the detection and loading of a license key.\nIt offers common access to license information.\nMany enterprise plugins are relying on it.\n\n=== Logging\n\nThe Gravitee Node Logging module provides a specialized logging infrastructure, including the `NodeAwareLogger` which enriches logs with node-specific contextual information.\nIt also supports configuring MDC filtering and log pattern overrides via `gravitee.yml` or environment variables.\nFor more information, see the module link:gravitee-node-logging/README.adoc[README].\n\n=== Management\n\nThe Gravitee Node Management module allows exposing a management HTTP server that exposes product information (ex: node info, Prometheus metrics, …).\nIt is also extensible as each product can expose its own set of endpoints.\nFor more information about this module and the endpoints available, have a look at the module link:gravitee-node-management/README.adoc[README].\n\n=== Monitoring\n\nThe Gravitee Node Monitoring module is responsible to set up a background task to collect monitoring information regularly.\nIt also relies on the management module to expose an health HTTP endpoint that can be used in a common way to detect the unavailability of a node instance.\n\n=== Notifier\n\nThe Gravitee Node Monitoring module offers a notification service that can be used by the different products to build an advanced notification system (ex: notify that a certificate is about to expire).\nIt seamlessly works with any notifier plugin (slack, email, …).\n\n=== Plugins\n\nThe Gravitee Node Plugins module contains internal code used to load and register services during the node startup phase.\n\n=== Reporter\n\nThe Gravitee Node Monitoring module is in charge of detecting and registering all reporter plugins.\nIt exposes a reporter service that can be used as a single point-of-report by the Gravitee products.\nInternally, all events reported are propagated to each registered reporter.\n\n=== Services\n\nThe Gravitee Node Services module provides different services such as upgrader and initializer services.\nThey are particularly useful to ensure data migration during product upgrades or data initialization during the startup phase.\n\n=== Secrets\n\nThe Gravitee Node Secrets module is about accessing secret managers.\nIt is able to resolve secrets and certificates/private key.\nIt use `secret-provider` plugins and manages their lifecycles as well as bundles a service to access secret using URL-like syntax: `secret://kubernetes...` used in gravitee.yml or equivalent environment variable.\n\n=== Tracing\n\nThe Gravitee Node Services module gives an easy and common way to set up tracing (aka open telemetry) on a given product.\nIt is able to automatically load and configure tracing plugin.\n\n=== Vertx\n\nThe Gravitee Node Vertx module is a common piece of Gravitee products that offers the capabilities to set up vertx and instantiate vertx http servers easily.\n\n== Releases\n\n=== 6.0.x\n\nThe following has been implemented on v6.0.x\n\n==== Changelog\n\n* BREAKING CHANGE: fix switch cache rxPut and rxCompute methods to Maybe instead of Single\n\n=== 5.3.x\n\nThe following has been implemented on v5.3.x\n\n==== Changelog\n\n* Add support for boot plugins\n\n===== Migrating to node v5.3.0\n\n* Update `gravitee-node` to 5.3.0 and `gravitee-plugin` to 3.0.0\n* Remove Spring imports related to the plugin's configuration.\nUsually, the plugin configuration classes are named `XXXPluginConfiguration`.\nThey are not necessary anymore as they are now directly added by the plugin handler.\n* `SpringBasedContainer` requires the node implementation class to be passed to the constructor.\nEx:\n\n```java\npublic class GatewayContainer extends SpringBasedContainer {\n\n    public GatewayContainer() {\n        super(GatewayNode.class);\n    }\n    ...\n}\n```\n\n* Add `@Lazy` on any application bean required by the Node implementation class.\nEx:\n\n```java\npublic class GatewayNode extends AbstractNode {\n\n    @Lazy\n    @Autowired\n    private NodeMetadataResolver nodeMetadataResolver;\n    ...\n}\n```\n\n* Remove `EventManager` bean because it is now created by default.\n* Remove `ClusterManager` bean because it is now created by default.\n\nIMPORTANT: `gravitee-node` previous behavior was to just log and continue the startup in case of an error during plugin initialization. *The new behavior is to rethrow the error and stop the startup*.\nIt makes it clearer and helps in debugging.\n\n=== 5.0.x\n\nThe following has been implemented on v5.0.x\n\n==== Changelog\n\n* Add support for organization license\n* Update keystore loading internal and support for truststore hot reload\n\n==== LicenseManager migration\n\nFramework now offers support for both platform and organization licenses.\nHere are some highlights of the main changes:\n\n* No more `Node.license()` → use LicenseManager.getPlatformLicense() instead\n* Platform license is never null.\nIf no license key is specified by the user, an OSS license with no feature and no expiry will be considered.\n* Any product that needs to support the license at the organization level can implement the repository layer implementing the `LicenseRepository` interface and the appropriate synchronizer.\n* `LicenseService` no longer exists.\nLoading the platform license is now achieved by `NodeLicenseLoader`.\nCustomers who have changed the log level on `io.gravitee.node.license.LicenseService` to avoid logging license information must adapt their `logback.xml` configuration to use `io.gravitee.node.license.LicenseLoaderService` instead.\n* Technical API allows access to the platform license which previously ended with a 404 if the license key is not specified → OSS License will now be returned instead.\n\n==== Truststore hot reload\n\nAny kind of truststore JKS (deprecated format), PKCS12, pem files and pem-folder (new see below) are now hot-reloadable.\n\n* One keystore/truststore is now per server ID instead of one per Verticle\n* Truststore file can be replaced by simple copy override\n* Same for pem certificates in the list (type: pem with a list file as an array)\n\nNew type of truststore: `pem-folder` allow users to specify via `path: /path/to/certs` a directory that will be watched for new pem certificates files.\nThose certificates will be added to the truststore.\nUpdates and removal are also supported.\nNote that recursive sub-directory listing will not occur.\n\n=== 4.0.x\n\nThe following has been implemented on v4.0.x\n\n==== Changelog\n\n* Add support for multi-servers\n* Move cluster concept into plugins\n* Move cache concept into plugins\n* Add support for Secret Managers via new secret-provider plugin type\n\n==== Vertx Http Server migration\n\nThe readme provides all details regarding the usage of the VertxServerFactory.\nHere are some highlights of the main changes:\n\n* The package has changed for the `VertxHttpServerFactory` use `io.gravitee.node.vertx.server.http.VertxHttpServerFactory`\n* `HttpServerConfiguration` has been replaced with `io.gravitee.node.vertx.server.http.HttpServerOptions` which now provides a regular `builder()` method allowing configuring the server.\n* `HttpServerOptions` builder can be initialized using the environment configuration.\nThen, any configuration can be overridden.\n\n==== New cluster manager migration\n\nCluster Managers are now available via plugins.\nDefault distribution contains a Standalone Cluster Manager which was and still is the default one.\n\nTwo plugins are available :\n\n* Standalone Cluster Manager which is the default plugin.\nThis plugin is used when no cluster is configured, i.e. each node is alone in its own cluster.\n* Hazelcast Cluster Manager which has to be added to the distribution and enable by setting `cluster.type` to _hazelcast_.\n\nInterfaces have slightly changed, here are the details for each:\n\n__ClusterManager__\n\n* Methods changed\n- `getMembers()` has been renamed to `members()`\n- `getLocalMember()` has been renamed to `localMember()`\n- `isMasterNode()` has been renamed to `isPrimaryNode()`\n* Method added\n- `removeMemberListener(MemberListener)`  allows to remove a previously registered listener\n- `topic(String)` replace the old `MessageProducer` bean which has been removed and allows retrieval of a topic from its name\n\n__MemberListener__\n\n* `memberAdded(Member)` has been renamed to `onMemberAdded(Member)`\n* `memberRemoved(Member)` has been renamed to `onMemberRemoved(Member)`\n* `memberChanged(Member)` has been renamed to `onMemberChanged(Member)`\n\n__Member__\n\n* Methods changed\n- `uuid()` has been renamed to `id()`\n- `master()` has been renamed to primary()`\n* Method added\n- `local` which returns true if the associated member is the local one\n\n__MessageProducer__\n\n* Has been removed and replaced by topic method in ClusterManager.\n\n__Topic__\n\n* Has been moved from `io.gravitee.node.api.message to io.gravitee.node.api.cluster.messaging`.\n* The use of UUID has been replaced by `String`\n\n__Message__\n\n* Has been moved from `io.gravitee.node.api.message to io.gravitee.node.api.cluster.messaging`.\n\n__MessageConsumer__\n\n* Has been renamed to `MessageListener` and moved to `io.gravitee.node.api.cluster.messaging`.\n\n==== New cache manager migration\n\nCache Managers are now available via plugins.\nDefault distribution contains a Standalone Cache Manager which was and still is the default one.\n\nTwo plugins are available :\n\n* Standalone Cache Manager which is the default plugin.\nThe cache will not be distributed and will always remain local to the node (in-memory).\n* Hazelcast Cache Manager which has to be added to the distribution and enable by setting `cache.type` to `hazelcast`.\nWith this plugin the cache could be either local (in-memory) or distributed (Hazelcast IMap).\n\nFollowing changes have been introduced:\n\n* Ability to define the scope of the cache (local or distributed) by using new `CacheConfiguration#distributed` attribute\n* Replace Guava Cache by Caffeine\n\n==== Support for Secret Managers\n\nSecret Mangers can be used in Gravitee Gateways using gravitee-node.\nSecret providers plugins can pull or watch secrets from Secret Managers (eg.\nKubernetes, HC Vault...) using associated plugins.\n\n`gravitee.yml` contains configuration to set up secret managers, note that they can be configured using env variables.\nThis is an example with community bundle plugin `kubernetes-secret-provider`:\n\n[source,YAML]\n----\nsecrets:\n  kubernetes:\n    enabled: true\n    namespace: my-app\n\n# then you can use it to fetch secrets\nratelimit:\n  type: redis\n  redis:\n    password: secret://kubernetes/redis-secret:password\n    # ...\n----\n\n`GRAVITEEIO_SECRETS_KUBERNETES_ENABLED=true` would be enough to resolve secrets within the same namespace where gravitee is deployed.\n\nYou can also use a secret provider to configure another secret provider:\n\n[source,YAML]\n----\nsecrets:\n  loadFirst: kubernetes\n  kubernetes:\n    enabled: true\n  vault:\n    enabled: true\n    # [...]\n    auth:\n      method: token\n      config:\n        token: secret://kubernetes/vault-creds:token?namespace=vault-ns\n----\n\nYou can refer to Gravitee documentation for more examples and in-depth configuration tutorials on Secret Managers.\n\nNote that usage of `kubernetes://secrets` is discouraged as it will be deprecated in future versions.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgravitee-io%2Fgravitee-node","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fgravitee-io%2Fgravitee-node","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgravitee-io%2Fgravitee-node/lists"}