# entourage-server
Server for environment bootstrapping
See repository page chriskalmar/entourage for more information.
# Profiles
Create a profiles
folder that will be shared with docker container.
# Profile template
At the root of profiles
, create a yml | yaml template like demo-profile.yaml.
You can use defaults
->params
to declare default params that will be used to fill out template files declared in renderTemplates
.
Still at the root, create a folder that will contain your templates (sourcePath
) and another one called demo-profile
that will contain the files rendered (targetPath
).
These templates will be parsed and variables will be replaced by your default params and those that will be passed to entourage-server API.
.
+-- demo-profile
| +-- init-db.sh *
| +-- stop-db.sh *
| +-- docker-compose.yaml *
| +-- env *
+-- templates
| +-- demo-profile.init-db.sh
| +-- demo-profile.stop-db.sh
| +-- demo-profile.docker-compose.yaml
| +-- demo-profile.env
+-- demo-profile.yaml
* created after rendering
# Profile hooks
prepare
beforeDestroy
These hooks allows you to declare a script
that will be executed before the environment will be started / destroyed.
Optionally fill the timeout
field that will allow the entourage-server to kill the process after duration has passed.
# Docker
docker
field allows to declare the path of your composeFile
.
# GraphQL API
# createProfile
mutation createProfile($version: String!, $profile: String!, $params: JSON!) {
initProfile(version: $version, profile: $profile, params: $params) {
profile
version
ready
ports
}
}
{
"version" : "1",
"profile": "demo-profile",
"params": {
"NODE_ENV": "development",
"HOST": "mqtt-api",
"MQTT_PORT": "1883",
"WS_PORT": "3000"
}
}
# profileCreated
subscription watchProfileCreated($version: String!, $profile: String!) {
profileCreated(version: $version, profile: $profile) {
profile
version
ports
ready
}
}
{
"version" : "1",
"profile": "demo-profile"
}
# getProfileStats
query getProfileStats($version: String!, $profile: String!) {
getProfileStats(version: $version, profile: $profile) {
version
ready
profile
ports
}
}
{
"version" : "1",
"profile": "demo-profile"
}
# destroyProfile
mutation destroyProfile($version: String!, $profile: String!, $params: JSON!) {
destroyProfile(version: $version, profile: $profile, params: $params) {
profile
version
ready
ports
}
}
{
"version" : "1",
"profile": "demo-profile",
"params": {
"NODE_ENV": "development",
"HOST": "mqtt-api",
"MQTT_PORT": "1883",
"WS_PORT": "3000"
}
}
# profileDestroyed
subscription watchProfileDestroyed($version: String!, $profile: String!) {
profileDestroyed(version: $version, profile: $profile) {
profile
version
ports
ready
}
}
{
"version" : "1",
"profile": "demo-profile"
}
# Setup
Run entourage server as a privileged docker container and provide a profiles folder and a work folder as volume mounts:
# Via docker
docker run -d --name entourage \
-v /var/run/docker.sock:/var/run/docker.sock \
-v $PWD/profiles:/app/profiles \
-v $PWD/work:/app/work \
-p 5858:5858 \
-p 4242:4242 \
chriskalmar/entourage:latest
# Via docker-compose
create a file named docker-compose.yml
:
version: '3'
services:
entourage:
image: chriskalmar/entourage:latest
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- ./profiles:/app/profiles
- ./work:/app/work
ports:
- '5858:5858'
- '4242:4242'
and run it with:
docker-compose up -d
# Modules
# Broker
- Broker
- ~initBroker() ⇒
Aedes
- ~Aedes
- ~initBroker() ⇒
# Broker~initBroker() ⇒ Aedes
Start MQTT broker
Kind: inner method of Broker
# Broker~Aedes
Kind: inner typedef of Broker
# Docker
- Docker
- ~checkDockerComposeFileExists(filePath)
- ~validateDockerComposeFile(cwd, filePath)
- ~adjustDockerComposeFile(workVersionFolder, filePath) ⇒
object
- ~updateDockerComposeFilesWithPorts(version, config, portRegistry)
- ~processDockerTask(version, config) ⇒
object
- ~processDockerTask(version, config)
- ~runDockerComposeFile(cwd, filePath)
- ~runWorkVersionDockerComposeFile(version, config) ⇒
Promise.<function()>
- ~downDockerComposeFile(cwd, filePath, clean)
- ~downWorkVersionDockerComposeFile(version, config, clean) ⇒
Promise.<function()>
- ~getDockerComposeStats(cwd, filePath) ⇒
Promise.<function()>
- ~getWorkFolderMountSource() ⇒
string
# Docker~checkDockerComposeFileExists(filePath)
Check docker-compose file presence
Kind: inner method of Docker
Throws:
- Docker compose file x not found
Param | Type |
---|---|
filePath | string |
# Docker~validateDockerComposeFile(cwd, filePath)
Check docker-compose file validity
Kind: inner method of Docker
Throws:
- Docker compose error
Param | Type |
---|---|
cwd | string |
filePath | string |
# Docker~adjustDockerComposeFile(workVersionFolder, filePath) ⇒ object
Update docker-compose file network and ports mapping and generate portRegistry
Kind: inner method of Docker
Returns: object
- portRegistry
Throws:
- At least one service needs to expose a port
Param | Type |
---|---|
workVersionFolder | string |
filePath | string |
# Docker~updateDockerComposeFilesWithPorts(version, config, portRegistry)
Update docker-compose file
Kind: inner method of Docker
Param | Type |
---|---|
version | string |
config | object |
portRegistry | object |
# Docker~processDockerTask(version, config) ⇒ object
Validate compose-file
Convert generated port to random ports
Update docker-compose file
Kind: inner method of Docker
Returns: object
- portRegistry
Param | Type |
---|---|
version | string |
config | object |
# Docker~processDockerTask(version, config)
Pull docker-compose file sources
Kind: inner method of Docker
Throws:
- Docker compose error
Param | Type |
---|---|
version | string |
config | object |
# Docker~runDockerComposeFile(cwd, filePath)
Start docker-compose file
Kind: inner method of Docker
Throws:
- Docker compose error
Param | Type |
---|---|
cwd | string |
filePath | string |
# Docker~runWorkVersionDockerComposeFile(version, config) ⇒ Promise.<function()>
Start docker-compose file from a work subfolder
Kind: inner method of Docker
Returns: Promise.<function()>
- Docker~runDockerComposeFile
Param | Type |
---|---|
version | string |
config | object |
# Docker~downDockerComposeFile(cwd, filePath, clean)
Stop docker-compose file
Optionally clean volumes, images and orphans
Kind: inner method of Docker
Throws:
- Docker compose error
Param | Type |
---|---|
cwd | string |
filePath | string |
clean | boolean |
# Docker~downWorkVersionDockerComposeFile(version, config, clean) ⇒ Promise.<function()>
Start docker-compose file from a work subfolder
Optionally clean volumes, images and orphans
Kind: inner method of Docker
Returns: Promise.<function()>
- Docker~downDockerComposeFile
Param | Type |
---|---|
version | string |
config | object |
clean | boolean |
# Docker~getDockerComposeStats(cwd, filePath) ⇒ Promise.<function()>
Get docker-compose stats
Kind: inner method of Docker
Returns: Promise.<function()>
- compose.ps
Throws:
- Docker compose error
Param | Type |
---|---|
cwd | string |
filePath | string |
# Docker~getWorkFolderMountSource() ⇒ string
Get docker-compose mountpoint
Kind: inner method of Docker
Throws:
- Cannot detect work folder mount point. Are you running Entourage server via docker?
# GraphQL
- GraphQL
- ~ProfileState :
GraphQLType
- ~Query :
GraphQLType
- ~getProfileStats ⇒
GraphQLType
- ~Mutation :
GraphQLType
- ~initProfile ⇒
GraphQLType
- ~destroyProfile ⇒
GraphQLType
- ~Subscriptions :
GraphQLType
- ~profileCreated ⇒
GraphQLType
- ~profileDestroyed ⇒
GraphQLType
- ~ProfileState :
# GraphQL~ProfileState : GraphQLType
Kind: inner constant of GraphQL
Properties
Name | Type |
---|---|
timestamp | string |
version | string |
profile | string |
params | object |
docker | object |
ready | boolean |
healthy | boolean |
ports | object |
stats | object |
# GraphQL~Query : GraphQLType
Kind: inner constant of GraphQL
Properties
Name | Type |
---|---|
getProfileStats | GraphQLQuery |
# GraphQL~getProfileStats ⇒ GraphQLType
Kind: inner constant of GraphQL
Returns: GraphQLType
- ProfileState
Properties
Name | Type |
---|---|
version | string |
profile | string |
# GraphQL~Mutation : GraphQLType
Kind: inner constant of GraphQL
Properties
Name | Type |
---|---|
initProfile | GraphQLMutation |
destroyProfile | GraphQLMutation |
# GraphQL~initProfile ⇒ GraphQLType
Kind: inner constant of GraphQL
Returns: GraphQLType
- ProfileState
Properties
Name | Type |
---|---|
version | string |
profile | string |
params | object |
[asyncMode] | boolean |
# GraphQL~destroyProfile ⇒ GraphQLType
Kind: inner constant of GraphQL
Returns: GraphQLType
- ProfileState
Properties
Name | Type |
---|---|
version | string |
profile | string |
params | object |
[asyncMode] | boolean |
# GraphQL~Subscriptions : GraphQLType
Kind: inner constant of GraphQL
Properties
Name | Type |
---|---|
profileCreated | GraphQLSubscription |
profileDestroyed | GraphQLSubscription |
# GraphQL~profileCreated ⇒ GraphQLType
Kind: inner constant of GraphQL
Returns: GraphQLType
- ProfileState
Properties
Name | Type |
---|---|
version | string |
profile | string |
# GraphQL~profileDestroyed ⇒ GraphQLType
Kind: inner constant of GraphQL
Returns: GraphQLType
- ProfileState
Properties
Name | Type |
---|---|
version | string |
profile | string |
# Template
# Template~renderTemplate(templateFilename, templateParams) ⇒ function
Load a templateFilename and renders it from templateParams
Kind: inner method of Template
Returns: function
- Render~renderFile
Throws:
- Template x not found
Param | Type |
---|---|
templateFilename | string |
templateParams | object |
# Template~renderTemplateToFile(templateFilename, templateParams, version, outputFilename)
Load a templateFilename and renders it from templateParams,
then save it as file in a work subfolder
Kind: inner method of Template
Param | Type |
---|---|
templateFilename | string |
templateParams | object |
version | string |
outputFilename | string |
# Proxy
# Proxy~updateProxyConfig()
Update HAproxy configuration from the registry
Populate haproxy.cfg and haproxy.docker-compose.yaml templates
Save them at the root of WORK_PATH
Kind: inner method of Proxy
# Proxy~restartProxy()
Restart HAproxy docker container
Kind: inner method of Proxy
# Registry
# Registry~addWorkVersionConfig(config)
Save a profile configuration in the registry
Kind: inner method of Registry
Param | Type |
---|---|
config | object |
# Registry~getWorkVersionConfig(config) ⇒ object
Find a profile configuration in the registry
Kind: inner method of Registry
Param | Type |
---|---|
config | object |
# Registry~removeWorkVersionConfig(config)
Remove a profile configuration in the registry
Kind: inner method of Registry
Param | Type |
---|---|
config | object |
# Registry~initRegistry()
Initialize the registry from existing work subfolder
Kind: inner method of Registry
# Render
# Render~render(content, templateParams, escapePatterns) ⇒ object
Render a template file by replacing variables
Kind: inner method of Render
Param | Type |
---|---|
content | string |
templateParams | object |
escapePatterns | array |
# Render~renderFile(content, templateParams, escapePatterns) ⇒ function
Find a template file and render it by replacing variables
Kind: inner method of Render
Returns: function
- Render~render
Param | Type |
---|---|
content | string |
templateParams | object |
escapePatterns | array |
# Script
# Script~executeScript(version, script, params, [timeout]) ⇒ Promise.<number>
Execute a bash script from a work subfolder
Optional timeout to kill the process
Kind: inner method of Script
Returns: Promise.<number>
- exitCode
Throws:
- Script timed out: x.
Param | Type |
---|---|
version | string |
script | string |
params | string |
[timeout] | number |
# Script~executeScript(version, scripts, params, [timeout])
Execute a series of bash scripts from a work subfolder
Optional timeout to kill the process
Kind: inner method of Script
Throws:
- Script execution failed with exit code x.
Param | Type |
---|---|
version | string |
scripts | object |
params | string |
[timeout] | number |
# Server
- Server
- ~initServer() ⇒
GraphQLServer
- ~GraphQLServer
- ~initServer() ⇒
# Server~initServer() ⇒ GraphQLServer
Start GraphQL HTTP/WS server
Kind: inner method of Server
# Server~GraphQLServer
Kind: inner typedef of Server
# Stats
- Stats
- ~getProfileConfig(profile, version) ⇒
Promise.<object>
- ~getProfileStats(profile, version) ⇒
Promise.<object>
- ~getProfileConfig(profile, version) ⇒
# Stats~getProfileConfig(profile, version) ⇒ Promise.<object>
Retrieve a profile config from the registry
Kind: inner method of Stats
Throws:
- Unknown profile
Param | Type |
---|---|
profile | string |
version | string |
# Stats~getProfileStats(profile, version) ⇒ Promise.<object>
Retrieve profile stats from docker compose
Kind: inner method of Stats
Throws:
- Unknown profile
Param | Type |
---|---|
profile | string |
version | string |
# Template
# Template~renderTemplate(templateFilename, templateParams) ⇒ function
Load a templateFilename and renders it from templateParams
Kind: inner method of Template
Returns: function
- Render~renderFile
Throws:
- Template x not found
Param | Type |
---|---|
templateFilename | string |
templateParams | object |
# Template~renderTemplateToFile(templateFilename, templateParams, version, outputFilename)
Load a templateFilename and renders it from templateParams,
then save it as file in a work subfolder
Kind: inner method of Template
Param | Type |
---|---|
templateFilename | string |
templateParams | object |
version | string |
outputFilename | string |
# Utils
- Utils
- ~log(msg) ⇒
function
- ~createWorkPathFolder(version)
- ~getWorkVersionFolder(version) ⇒
function
- ~checkVersionPathBreakout(version)
- ~writeFileSync(filename, content) ⇒
function
- ~deleteWorkVersionFolder(version)
- ~createOrResetWorkVersionFolder(version)
- ~createOrResetWorkVersionFolder(task) ⇒
function
- ~getRandomPort(minPort, maxPort) ⇒
Promise.<function()>
- ~getRandomPorts(count, minPort, maxPort, exclude) ⇒
Promise.<array>
- ~storeWorkVersionConfig(version, config) ⇒
Promise.<function()>
- ~isEnvFlagSet() ⇒
boolean
- ~log(msg) ⇒
# Utils~log(msg) ⇒ function
Log a message
Kind: inner method of Utils
Returns: function
- console.log
Param | Type |
---|---|
msg | any |
# Utils~createWorkPathFolder(version)
Create a work folder from WORK_PATH environement variable
Kind: inner method of Utils
Param | Type |
---|---|
version | string |
# Utils~getWorkVersionFolder(version) ⇒ function
Get a work sub folder name from the version and WORK_PATH environement variable
Kind: inner method of Utils
Returns: function
- path.normalize
Param | Type |
---|---|
version | string |
# Utils~checkVersionPathBreakout(version)
Check that a work sub folder name is disposed under WORK_PATH
Kind: inner method of Utils
Throws:
- Version x needs to be a child of WORK_PATH
Param | Type |
---|---|
version | string |
# Utils~writeFileSync(filename, content) ⇒ function
Write a file
Kind: inner method of Utils
Returns: function
- fs.writeFileSync
Param | Type |
---|---|
filename | string |
content | any |
# Utils~deleteWorkVersionFolder(version)
Delete a work sub folder by version
Kind: inner method of Utils
Param | Type |
---|---|
version | string |
# Utils~createOrResetWorkVersionFolder(version)
Create or reset a work sub folder by version
Kind: inner method of Utils
Throws:
- Version x is already in use
Param | Type |
---|---|
version | string |
# Utils~createOrResetWorkVersionFolder(task) ⇒ function
Log a task
Kind: inner method of Utils
Returns: function
- Utils~log
Param | Type |
---|---|
task | string |
# Utils~getRandomPort(minPort, maxPort) ⇒ Promise.<function()>
Generate a random port within a declared range
Kind: inner method of Utils
Returns: Promise.<function()>
- portfinder.getPortPromise
Param | Type |
---|---|
minPort | number |
maxPort | number |
# Utils~getRandomPorts(count, minPort, maxPort, exclude) ⇒ Promise.<array>
Generate an array of count
random ports within a declared range
Kind: inner method of Utils
Throws:
- Too many tries to find an open port
Param | Type |
---|---|
count | number |
minPort | number |
maxPort | number |
exclude | Array.<number> |
# Utils~storeWorkVersionConfig(version, config) ⇒ Promise.<function()>
Write profile configuration into the work folder
Kind: inner method of Utils
Returns: Promise.<function()>
- Utils~writeFileSync
Param | Type |
---|---|
version | string |
config | object |
# Utils~isEnvFlagSet() ⇒ boolean
Check if an environment flag is set to TRUE
Kind: inner method of Utils
Param | Type |
---|---|
process.env[name | string |
# Yaml
- Yaml
- ~parseYaml(content) ⇒
function
- ~parseYamlFile(filePath) ⇒
function
- ~serializeYaml(content) ⇒
function
- ~serializeYamlFile(content, filePath) ⇒
function
- ~parseYaml(content) ⇒
# Yaml~parseYaml(content) ⇒ function
Parse a yaml file content
Kind: inner method of Yaml
Returns: function
- yaml.safeLoad
Param | Type |
---|---|
content | string |
# Yaml~parseYamlFile(filePath) ⇒ function
Parse a yaml file
Kind: inner method of Yaml
Returns: function
- Yaml~parseYaml
Param | Type |
---|---|
filePath | string |
# Yaml~serializeYaml(content) ⇒ function
Serialize some content to yaml format
Kind: inner method of Yaml
Returns: function
- yaml.safeDump
Param | Type |
---|---|
content | any |
# Yaml~serializeYamlFile(content, filePath) ⇒ function
Serialize some content to yaml format and save it as a file
Kind: inner method of Yaml
Returns: function
- fs.writeFileSync
Param | Type |
---|---|
content | any |
filePath | string |