Skip to content

Geo Nodes API (deprecated)

DETAILS: Tier: Premium, Ultimate Offering: GitLab Self-Managed

WARNING: The Geo Nodes API was deprecated in GitLab 16.0 and is planned for removal in v5 of the API. Use the Geo Sites API instead. This change is a breaking change.

To interact with Geo node endpoints, you must authenticate yourself as an administrator.

Create a new Geo node

Creates a new Geo node.

POST /geo_nodes
curl --header "PRIVATE-TOKEN: <your_access_token>" "https://primary.example.com/api/v4/geo_nodes" \
     --request POST \
     -d "name=himynameissomething" \
     -d "url=https://another-node.example.com/"
Attribute Type Required Description
primary boolean no Specifying whether this node should be primary. Defaults to false.
enabled boolean no Flag indicating if the Geo node is enabled. Defaults to true.
name string yes The unique identifier for the Geo node. Must match geo_node_name if it is set in gitlab.rb, otherwise it must match external_url
url string yes The user-facing URL for the Geo node.
internal_url string no The URL defined on the primary node that secondary nodes should use to contact it. Returns url if not set.
files_max_capacity integer no Control the maximum concurrency of LFS/attachment backfill for this secondary node. Defaults to 10.
repos_max_capacity integer no Control the maximum concurrency of repository backfill for this secondary node. Defaults to 25.
verification_max_capacity integer no Control the maximum concurrency of repository verification for this node. Defaults to 100.
container_repositories_max_capacity integer no Control the maximum concurrency of container repository sync for this node. Defaults to 10.
sync_object_storage boolean no Flag indicating if the secondary Geo node should replicate blobs in Object Storage. Defaults to false.
selective_sync_type string no Limit syncing to only specific groups or shards. Valid values: "namespaces", "shards", or null.
selective_sync_shards array no The repository storage for the projects synced if selective_sync_type == shards.
selective_sync_namespace_ids array no The IDs of groups that should be synced, if selective_sync_type == namespaces.
minimum_reverification_interval integer no The interval (in days) in which the repository verification is valid. Once expired, it is reverified. This has no effect when set on a secondary node.

Example response:

{
  "id": 3,
  "name": "Test Node 1",
  "url": "https://secondary.example.com/",
  "internal_url": "https://secondary.example.com/",
  "primary": false,
  "enabled": true,
  "current": false,
  "files_max_capacity": 10,
  "repos_max_capacity": 25,
  "verification_max_capacity": 100,
  "selective_sync_type": "namespaces",
  "selective_sync_shards": [],
  "selective_sync_namespace_ids": [1, 25],
  "minimum_reverification_interval": 7,
  "container_repositories_max_capacity": 10,
  "sync_object_storage": false,
  "clone_protocol": "http",
  "web_edit_url": "https://primary.example.com/admin/geo/sites/3/edit",
  "web_geo_replication_details_url": "https://secondary.example.com/admin/geo/sites/3/replication/lfs_objects",
  "_links": {
     "self": "https://primary.example.com/api/v4/geo_nodes/3",
     "status": "https://primary.example.com/api/v4/geo_nodes/3/status",
     "repair": "https://primary.example.com/api/v4/geo_nodes/3/repair"
  }
}

Retrieve configuration about all Geo nodes

GET /geo_nodes
curl --header "PRIVATE-TOKEN: <your_access_token>" "https://primary.example.com/api/v4/geo_nodes"

Example response:

[
  {
    "id": 1,
    "name": "us-node",
    "url": "https://primary.example.com/",
    "internal_url": "https://internal.example.com/",
    "primary": true,
    "enabled": true,
    "current": true,
    "files_max_capacity": 10,
    "repos_max_capacity": 25,
    "container_repositories_max_capacity": 10,
    "verification_max_capacity": 100,
    "selective_sync_type": "namespaces",
    "selective_sync_shards": [],
    "selective_sync_namespace_ids": [1, 25],
    "minimum_reverification_interval": 7,
    "clone_protocol": "http",
    "web_edit_url": "https://primary.example.com/admin/geo/sites/1/edit",
    "_links": {
      "self": "https://primary.example.com/api/v4/geo_nodes/1",
      "status":"https://primary.example.com/api/v4/geo_nodes/1/status",
      "repair":"https://primary.example.com/api/v4/geo_nodes/1/repair"
    }
  },
  {
    "id": 2,
    "name": "cn-node",
    "url": "https://secondary.example.com/",
    "internal_url": "https://secondary.example.com/",
    "primary": false,
    "enabled": true,
    "current": false,
    "files_max_capacity": 10,
    "repos_max_capacity": 25,
    "container_repositories_max_capacity": 10,
    "verification_max_capacity": 100,
    "selective_sync_type": "namespaces",
    "selective_sync_shards": [],
    "selective_sync_namespace_ids": [1, 25],
    "minimum_reverification_interval": 7,
    "sync_object_storage": true,
    "clone_protocol": "http",
    "web_edit_url": "https://primary.example.com/admin/geo/sites/2/edit",
    "web_geo_replication_details_url": "https://secondary.example.com/admin/geo/sites/2/replication/lfs_objects",
    "_links": {
      "self":"https://primary.example.com/api/v4/geo_nodes/2",
      "status":"https://primary.example.com/api/v4/geo_nodes/2/status",
      "repair":"https://primary.example.com/api/v4/geo_nodes/2/repair"
    }
  }
]

Retrieve configuration about a specific Geo node

GET /geo_nodes/:id
curl --header "PRIVATE-TOKEN: <your_access_token>" "https://primary.example.com/api/v4/geo_nodes/1"

Example response:

{
  "id": 1,
  "name": "us-node",
  "url": "https://primary.example.com/",
  "internal_url": "https://primary.example.com/",
  "primary": true,
  "enabled": true,
  "current": true,
  "files_max_capacity": 10,
  "repos_max_capacity": 25,
  "container_repositories_max_capacity": 10,
  "verification_max_capacity": 100,
  "selective_sync_type": "namespaces",
  "selective_sync_shards": [],
  "selective_sync_namespace_ids": [1, 25],
  "minimum_reverification_interval": 7,
  "clone_protocol": "http",
  "web_edit_url": "https://primary.example.com/admin/geo/sites/1/edit",
  "_links": {
    "self": "https://primary.example.com/api/v4/geo_nodes/1",
    "status":"https://primary.example.com/api/v4/geo_nodes/1/status",
    "repair":"https://primary.example.com/api/v4/geo_nodes/1/repair"
  }
}

Edit a Geo node

Updates settings of an existing Geo node.

PUT /geo_nodes/:id
Attribute Type Required Description
id integer yes The ID of the Geo node.
enabled boolean no Flag indicating if the Geo node is enabled.
name string no The unique identifier for the Geo node. Must match geo_node_name if it is set in gitlab.rb, otherwise it must match external_url.
url string no The user-facing URL of the Geo node.
internal_url string no The URL defined on the primary node that secondary nodes should use to contact it. Returns url if not set.
files_max_capacity integer no Control the maximum concurrency of LFS/attachment backfill for this secondary node.
repos_max_capacity integer no Control the maximum concurrency of repository backfill for this secondary node.
verification_max_capacity integer no Control the maximum concurrency of verification for this node.
container_repositories_max_capacity integer no Control the maximum concurrency of container repository sync for this node.
sync_object_storage boolean no Flag indicating if the secondary Geo node should replicate blobs in Object Storage.
selective_sync_type string no Limit syncing to only specific groups or shards. Valid values: "namespaces", "shards", or null.
selective_sync_shards array no The repository storage for the projects synced if selective_sync_type == shards.
selective_sync_namespace_ids array no The IDs of groups that should be synced, if selective_sync_type == namespaces.
minimum_reverification_interval integer no The interval (in days) in which the repository verification is valid. Once expired, it is reverified. This has no effect when set on a secondary node.

Example response:

curl --header "PRIVATE-TOKEN: <your_access_token>" "https://primary.example.com/api/v4/geo_nodes" \
     --request POST \
     -d "name=himynameissomething" \
     -d "url=https://another-node.example.com/"
```0

## Delete a Geo node

Removes the Geo node.

```shell
curl --header "PRIVATE-TOKEN: <your_access_token>" "https://primary.example.com/api/v4/geo_nodes" \
     --request POST \
     -d "name=himynameissomething" \
     -d "url=https://another-node.example.com/"
```1

| Attribute | Type    | Required | Description             |
|-----------|---------|----------|-------------------------|
| `id`      | integer | yes      | The ID of the Geo node. |

## Repair a Geo node

To repair the OAuth authentication of a Geo node.

_This can only be run against a primary Geo node._

```shell
curl --header "PRIVATE-TOKEN: <your_access_token>" "https://primary.example.com/api/v4/geo_nodes" \
     --request POST \
     -d "name=himynameissomething" \
     -d "url=https://another-node.example.com/"
```2

Example response:

```shell
curl --header "PRIVATE-TOKEN: <your_access_token>" "https://primary.example.com/api/v4/geo_nodes" \
     --request POST \
     -d "name=himynameissomething" \
     -d "url=https://another-node.example.com/"
```3

## Retrieve status about all Geo nodes

```shell
curl --header "PRIVATE-TOKEN: <your_access_token>" "https://primary.example.com/api/v4/geo_nodes" \
     --request POST \
     -d "name=himynameissomething" \
     -d "url=https://another-node.example.com/"
```4

```shell
curl --header "PRIVATE-TOKEN: <your_access_token>" "https://primary.example.com/api/v4/geo_nodes" \
     --request POST \
     -d "name=himynameissomething" \
     -d "url=https://another-node.example.com/"
```5

Example response:

```shell
curl --header "PRIVATE-TOKEN: <your_access_token>" "https://primary.example.com/api/v4/geo_nodes" \
     --request POST \
     -d "name=himynameissomething" \
     -d "url=https://another-node.example.com/"
```6

## Retrieve status about a specific Geo node

```shell
curl --header "PRIVATE-TOKEN: <your_access_token>" "https://primary.example.com/api/v4/geo_nodes" \
     --request POST \
     -d "name=himynameissomething" \
     -d "url=https://another-node.example.com/"
```7

```shell
curl --header "PRIVATE-TOKEN: <your_access_token>" "https://primary.example.com/api/v4/geo_nodes" \
     --request POST \
     -d "name=himynameissomething" \
     -d "url=https://another-node.example.com/"
```8

Example response:

```shell
curl --header "PRIVATE-TOKEN: <your_access_token>" "https://primary.example.com/api/v4/geo_nodes" \
     --request POST \
     -d "name=himynameissomething" \
     -d "url=https://another-node.example.com/"
```9

NOTE:
The `health_status` parameter can only be in an "Healthy" or "Unhealthy" state, while the `health` parameter can be empty, "Healthy", or contain the actual error message.