======================================================================
DEPRECATION NOTICE
This repository has been deprecated and its code has been merged into the Skywire repository.
All future development and maintenance will continue within the Skywire repository.
This repository will be archived and no longer receive updates.
======================================================================
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.