Toggle provides service for feature-flag/parameters based applications. Toggly API allows organizing your project configuration as standalone flexible and reliable service.
See GitHub repository for source code.
- Multiple projects
- Multiple environments for each project
- Multiple transports applicable (REST API implemented)
- Different parameter types (bool, int, string)
- Flags/Properties inheritance
- MongoDB as a storage
- In-memory cache
- Redis cache
See Docker Store for details.
See docker-compose.yml file for details
docker-compose up -d# Start MongoDB server
docker run -d -v mongo:/data --network toggly --name mongo mongo
# Start Redis server
docker run -d -v redis:/data --network toggly --name redis redis
# Start Toggly server
docker run -it -d --network toggly \
-p 8080:8080 \
--name toggly-server \
toggly/toggly-server \
--store.mongo.url=mongodb://mongo:27017/toggly \
--cache.type=redis \
--cache.redis.url=redis://redis:6379| Short | Long | Environment | Default | Description |
|---|---|---|---|---|
| -v | --version | Show version | ||
| -p | --port | TOGGLY_API_PORT |
8080 |
Port |
| --base-path | TOGGLY_API_BASE_PATH |
/api |
Base API Path | |
| --no-logo | false |
Do not show application logo | ||
| --store.mongo.url | TOGGLY_STORE_MONGO_URL |
Mongo connection url | ||
| --cache.type | TOGGLY_CACHE_TYPE |
Cache type [memory|redis] | ||
| --cache.redis.url | TOGGLY_CACHE_REDIS_URL |
Redis connection url | ||
| -h | --help | Show help message |
cd cmd/toggly-server && go installtoggly-server --versiondocker build -t toggly/toggly-server .See public OpenAPI specification.
{
"owner": "owner1",
"code": "project1",
"description": "Project description",
"status": "active",
"reg_date": "2018-10-12T23:47:18.967Z"
}Where:
statuscan be active or disabledreg_dateis date in ISO 8601 format
{
"owner": "owner1",
"project_code": "project1",
"code": "dev",
"description": "Development environment",
"protected": false,
"reg_date": "2018-10-12T23:47:18.967Z"
}Where:
reg_dateis date in ISO 8601 format
{
"code": "user",
"owner": "owner1",
"project_code": "project1",
"env_code": "env1",
"description": "Object 1 description",
"inherits": {
"project_code": "project1",
"env_code": "env1",
"object_code": "obj0"
},
"parameters": [
{
"code": "parameter1",
"description": "Parameter 1",
"type": "bool",
"value": false
}
]
}Where:
parameters.typecan be boot, int or stringparameters.valuedepends on type
Each request has to specify followed headers:
| Name | Required | Description |
|---|---|---|
| X-Toggly-Request-Id | No | Request ID for request tracking. Automatically generated If not specified |
| X-Toggly-Owner-Id | Yes | Owner identifier |
Response:
[
{
"owner": "owner1",
"code": "project1",
"description": "Project description",
"status": "active",
"reg_date": "2018-10-12T23:47:18.967Z"
}
]Request:
{
"code": "project1",
"description": "Project description",
"status": "active"
}Response:
{
"owner": "owner1",
"code": "project1",
"description": "Project description",
"status": "active",
"reg_date": "2018-10-12T23:47:18.967Z"
}Request:
{
"code": "project1",
"description": "Project description",
"status": "active"
}Response:
{
"owner": "owner1",
"code": "project1",
"description": "Project description",
"status": "active",
"reg_date": "2018-10-12T23:47:18.967Z"
}Response:
{
"owner": "owner1",
"code": "project1",
"description": "Project description",
"status": "active",
"reg_date": "2018-10-12T23:47:18.967Z"
}Response:
{
"environments": [
{
"owner": "owner1",
"project_code": "project1",
"code": "dev",
"description": "Development environment",
"protected": false,
"reg_date": "2018-10-12T23:47:18.967Z"
}
]
}Request:
{
"code": "dev",
"description": "Development environment",
"protected": false
}Response:
{
"owner": "owner1",
"project_code": "project1",
"code": "dev",
"description": "Development environment",
"protected": false,
"reg_date": "2018-10-12T23:47:18.967Z"
}Request:
{
"code": "dev",
"description": "Development environment",
"protected": false
}Response:
{
"owner": "owner1",
"project_code": "project1",
"code": "dev",
"description": "Development environment",
"protected": false,
"reg_date": "2018-10-12T23:47:18.967Z"
}Response:
{
"owner": "owner1",
"project_code": "project1",
"code": "dev",
"description": "Development environment",
"protected": false,
"reg_date": "2018-10-12T23:47:18.967Z"
}Response:
[
{
"code": "user",
"owner": "owner1",
"project_code": "project1",
"env_code": "env1",
"description": "Object 1 description",
"inherits": {
"project_code": "project1",
"env_code": "env1",
"object_code": "obj0"
},
"parameters": [
{
"code": "parameter1",
"description": "Parameter 1",
"type": "bool",
"value": false
}
]
}
]Request:
{
"code": "obj1",
"description": "Object 1 description",
"inherits": {
"project_code": "project1",
"env_code": "env1",
"object_code": "obj0"
},
"parameters": [
{
"code": "parameter1",
"description": "Parameter 1",
"type": "bool",
"value": false
}
]
}Response:
{
"code": "user",
"owner": "owner1",
"project_code": "project1",
"env_code": "env1",
"description": "Object 1 description",
"inherits": {
"project_code": "project1",
"env_code": "env1",
"object_code": "obj0"
},
"parameters": [
{
"code": "parameter1",
"description": "Parameter 1",
"type": "bool",
"value": false
}
]
}
Request:
{
"code": "obj1",
"description": "Object 1 description",
"inherits": {
"project_code": "project1",
"env_code": "env1",
"object_code": "obj0"
},
"parameters": [
{
"code": "parameter1",
"description": "Parameter 1",
"type": "bool",
"value": false
}
]
}Response:
{
"code": "user",
"owner": "owner1",
"project_code": "project1",
"env_code": "env1",
"description": "Object 1 description",
"inherits": {
"project_code": "project1",
"env_code": "env1",
"object_code": "obj0"
},
"parameters": [
{
"code": "parameter1",
"description": "Parameter 1",
"type": "bool",
"value": false
}
]
}Response:
{
"code": "user",
"owner": "owner1",
"project_code": "project1",
"env_code": "env1",
"description": "Object 1 description",
"inherits": {
"project_code": "project1",
"env_code": "env1",
"object_code": "obj0"
},
"parameters": [
{
"code": "parameter1",
"description": "Parameter 1",
"type": "bool",
"value": false
}
]
}GET /project/{project_code}/env/{env_code}/object/{obj_code}/inheritors - get all object inheritors as flat list
Response:
[
{
"code": "user",
"owner": "owner1",
"project_code": "project1",
"env_code": "env1",
"description": "Object 1 description",
"inherits": {
"project_code": "project1",
"env_code": "env1",
"object_code": "obj0"
},
"parameters": [
{
"code": "parameter1",
"description": "Parameter 1",
"type": "bool",
"value": false
}
]
}
]