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
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
).
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.
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://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://localhost:6379" --addr=":8000"
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
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
To build docker image use
$ docker build -f Dockerfile -t skycoin/service-discovery:test .
This prints the help menu and exits.
go run ./cmd/service-discovery/service-discovery.go --help
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)
}
}
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"
}
]
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
}
}
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.