Skip to content

Latest commit

 

History

History
175 lines (127 loc) · 4.6 KB

README.md

File metadata and controls

175 lines (127 loc) · 4.6 KB

Skycoin Service Discovery

The Skycoin service discovery allows registering services to be discovered by other participants in the Skywire network. Currently it allows registration and discovery of

  • VPNs
  • Socks proxies
  • public visors

Dependencies

service-discovery is written in golang and uses redis and postgres as databases (both required).

  • Golang (version 1.19 or higher is required).
  • Redis (only version 5.0.8 is tested with service-discovery).

Run tests

You can run integration tests of the service discovery with the following command:

make test

This requires docker to be installed on the system and runnable from the user invoking the command.

Run

Ensure redis-server is running. If it is installed locally, one can just run:

redis-server

Alternatively, you can run redis in a docker container:

docker run -d -p 6379:6379 --name redis redis

Ensure postgresql is running with postgres as username, password and database. You can run it by docker as follow:

docker run --name postgres -e POSTGRES_USERNAME=postgres -e POSTGRES_PASSWORD=postgres -e POSTGRES_DATABASE=postgres -p 5432:5432 -d postgres

Assuming redis is bound to redis:https://localhost:6379, we can run service-discovery to serve on :8000 with:

PG_USER=postgres PG_PASSWORD=postgres PG_DATABASE=postgres go run ./cmd/service-discovery/service-discovery.go --redis="redis:https://localhost:6379" --addr=":8000"

Running in test mode

The proxy service registration and de-registration endpoints require us to use specialised html header fields for authentication/authorization. When testing, this can be a pain. To disable auth completely, run proxy-server with the --test flag:

go run ./cmd/service-discovery/service-discovery.go --test

Running with metrics on

To expose a Victoria Metrics endpoint for skycoin-service-discovery un it with the -m or --metrics flag.

PG_USER=postgres PG_PASSWORD=postgres PG_DATABASE=postgres go run ./cmd/service-discovery/service-discovery.go -m localhost:9099

Build Docker Image

To build docker image use

$ docker build -f Dockerfile -t skycoin/service-discovery:test .

Help

This prints the help menu and exits.

go run ./cmd/service-discovery/service-discovery.go --help

HTTP API

Data structures

All HTTP request and response bodies uses the JSON data format.

Here is the JSON representation of a proxy service entry:

{
  // 'addr' is the skywire address of the proxy service.
  // The format is <public-key>:<uint16-port>
  "addr": "02263cf7f643a6e6e59484e13723e654b8921aa3da3626e7a58bd1d3d08e3b60e9:1234",

  // 'geo' contains the geolocation of the proxy service.
  // It will be omitted if empty.
  "geo": {
    "lat": 37.4224764, // latitude
    "lon": -122.0842499, // longitude
    "country": "NZ", // 2 letter country code (ISO 3166-1 alpha-2) (omitted if empty)
    "region": "" // Region/state short code (FIPS or ISO) (omitted if empty)
  }
}

GET /api/services

Obtains a JSON array of all proxy service entries.

Example:

Request: GET /api/services

Response body:

[
  {
    "address": "02263cf7f643a6e6e59484e13723e654b8921aa3da3626e7a58bd1d3d08e3b60e9:6001",
    "geo": {
      "lat": 37.4224764,
      "lon": -122.0842499
    }    
  },
  {
    "address": "02263cf7f643a6e6e59484e13723e654b8921aa3da3626e7a58bd1d3d08e3b60e9:6002"
  },
  {
    "address": "02263cf7f643a6e6e59484e13723e654b8921aa3da3626e7a58bd1d3d08e3b60e9:6003"
  }
]

GET /api/services/{skywire-address}

Obtains a single proxy service entry.
{skywire-address} is of format: <public-key>:<uint16-port>

Example:

Request: GET /api/services/02263cf7f643a6e6e59484e13723e654b8921aa3da3626e7a58bd1d3d08e3b60e9:6001

Response body:

{
  "address": "02263cf7f643a6e6e59484e13723e654b8921aa3da3626e7a58bd1d3d08e3b60e9:6001",
  "geo": {
    "lat": 37.4224764,
    "lon": -122.0842499
  }    
}

POST /api/services/{skywire-address}

Registers/updates a proxy service entry.
{skywire-address} is of format: <public-key>:<uint16-port>

Example:

Request: POST /api/services/02263cf7f643a6e6e59484e13723e654b8921aa3da3626e7a58bd1d3d08e3b60e9:6001

Request body:

{
  "address": "02263cf7f643a6e6e59484e13723e654b8921aa3da3626e7a58bd1d3d08e3b60e9:6001",
  "geo": {
    "lat": 37.4224764,
    "lon": -122.0842499
  }    
}

Response body:

The server will return the saved proxy service entry.

If the request has no "geo" field, the server may fill the field using the requester's IP address.