This tool is a Key Value database usable as a webhook server.
Originally build as "Secrets" storage for External Secrets in Kubernetes.
Docker image can be fetched from ghcr.io simonstiil/kvdb
Can be build with go build .
Will also be available as a release in releases in the future
Is done in config.yaml following the structure
Example can be seen in example-config.yaml
| Option | Description |
|---|---|
| -debug | Enable debugging output (developer focused) |
| -generate=[value] | Returns base64 encoded and encrypted password for [value] |
| -test=[output] | Used with -generate=[value] to see if a the generated password matches a the password in [output] |
| -config=[value] | Use an alternate config filename then config.yaml (only write prefix as .yaml will be appended ) |
| Option | Description ( Defaults ) |
|---|---|
| logging.level | Log level Debug, (Info), Warn, Error |
| logging.format | (text), yaml |
| databaseType | Type of backend Database (mysql), redis or yaml |
| users | List of Users |
| users.username | Username of user for login |
| users.password | Password for user, get hash from -generate (see commandline options) |
| users.hosts | List of host user can login from ip, CIDR, dns |
| users.permissionsset | List of namespace permissions |
| users.permissionsset.namespaces | List of namespaces covered by permission |
| users.permissionsset.permissions.read | Has read permission if from valid host |
| users.permissionsset.permissions.write | Has write permission if from valid host |
| users.permissionsset.permissions.list | Has list permission if from valid host |
| trustedProxies | List of proxy ipes to trust headders from |
| publicReadableNamespaces | List of namespaces that are public readable |
| prometheus | Prometheus settings |
| prometheus.enabled | Prometheus enabled (true) |
| prometheus.endpoint | Prometheus endpoint (/system/metrics) |
| redis | Redis settings |
| redis.address | Host address of prometheus server with port (127.0.0.1:6379) |
| redis.envVariableName | Environment value to use for redis password (KVDB_REDIS_PASSWORD) |
| mysql | MySQL settings |
| mysql.address | Host address of prometheus server with port (127.0.0.1:3306) |
| mysql.username | Username to connect to mysql (kvdb) |
| mysql.databaseName | database to connecto to (mysql.username) |
| mysql.tableName | Table to use in database (kvdb) |
| mysql.keyName | Column to use for key (kvdb) |
| mysql.valueName | Column to use for value (kvdb) |
| mysql.envVariableName | Environment value to use for redis password (KVDB_MYSQL_PASSWORD) |
All configuration options can be set using Environment Values use uppercase and replace . with _ and append KVDB_ prefix.
Example:
| Option | Description |
|---|---|
| KVDB_DEBUG | Enable debugging output (developer focused) |
| KVDB_REDIS_ADDRESS | Hostname for a redis database in format 127.0.0.1:6379 |
| KVDB_REDIS_PASSWORD | Password for Redis database backend |
Create test namespace [Requires write permission]
curl -u test:test http://localhost:8080/v1 -XPOST -d "test"
201 CreatedCreate Delete namespace [Requires write permission]
curl -u test:test http://localhost:8080/v1/test -XDELETE
200 OKList namespace [Requires list permission]
curl -u test:test http://localhost:8080/v1/
["kvdb","test"]Set key hello with value world to db.
Supports POST.
[Requires write permission]
curl -u test:test http://localhost:8080/v1/test/hello -XPOST -d "world"
201 CreatedSet key hello with value world to db using "value".
Supports POST.
[Requires write permission]
curl -u test:test http://localhost:8080/v1/test/hello -XPOST -d "value=world"
201 CreatedSet key hello with value world in json format to db.
Supports POST.
[Requires write permission]
curl -u test:test http://localhost:8080/v1/test/hello -XPOST -d '{"type": "Key", "value": "world"}' -H 'Content-Type: application/json'
201 CreatedPut file content of world.txt to key hello in db.
Supports PUT.
[Requires write permission]
curl -u test:test http://localhost:8080/v1/test/hello -T world.txt
201 CreatedNote, When writing a complex stucture with Base64 encoding or special charachers use PUT or Post with the pure content.
If data contains value= be sure to use put. Otherwise the application/x-www-form-urlencoded decoding will fail.
Get key hello from test [Requires read permission]
curl -u test:test http://localhost:8080/v1/test/hello
{"key":"hello","namespace":"test","value":"world"}List keys in test namespace
[Requires list permission]
curl -u test:test http://localhost:8080/v1/test
["hello"]Delete key hello from db.
[Requires write permission]
curl -u test:test http://localhost:8080/v1/test/hello -XDELETE
200 OKGenerate random 32 character value for key in json format (Only works if key does not Exists)
Supports both UPDATE and PATCH for json. Only PATCH for www-form-data.
[Requires write permission]
curl -u test:test http://localhost:8080/v1/test/hello -XUPDATE -d '{"type": "generate"}' -H 'Content-Type: application/json'
{"key":"hello","namespace":"test","value":"4wBZ3VhV9ZoxVjkOz87fQFpnoEe0jCCh"}curl -u test:test http://localhost:8080/v1/test/hello -XPATCH -d "type=generate"
{"key":"hello","namespace":"test","value":"4wBZ3VhV9ZoxVjkOz87fQFpnoEe0jCCh"}Roll data stored in key to random 32 character value in json format (Only works if key Exists)
Supports both UPDATE and PATCH for json. Only PATCH for www-form-data.
[Requires write permission]
curl -u test:test http://localhost:8080/v1/test/hello -XUPDATE -d '{"type": "roll"}' -H 'Content-Type: application/json'
{"key":"hello","namespace":"test","value":"4wBZ3VhV9ZoxVjkOz87fQFpnoEe0jCCh"}curl -u test:test http://localhost:8080/v1/test/hello -XPATCH -d "type=roll"
{"key":"hello","namespace":"test","value":"4wBZ3VhV9ZoxVjkOz87fQFpnoEe0jCCh"}Health endpoint
curl localhost:8080/system/health
{"status":"UP","requests":87}##Public access
config option publicReadableNamespaces: allows for a list of namespaces you can read from but not write or list publicly
curl -u test:test http://localhost:8080/v1/public/hello -XPOST -d "world"
201 Createdcurl http://localhost:8080/v1/public/hello
{"key":"hello","namespace":"public","value":"world"}