Server Configuration
- Basic settings
- Rate limiting
- Authentication
- Multi-threading
- Tagging
- WebstrateIds and niceWebstrateId
- God API
Webstrates ships with a sample server configuration file
(config-sample.json)
that gets copied over to config.json if no config.json file is present when Webstrates starts.
Basic settings
| Property | Description | Default | 
|---|---|---|
| listeningAddress | IP address to listen on. | 0.0.0.0(all addresses) | 
| listeningPort | Port to listen on. | 7777 | 
| db | MongoDB connection url. | mongodb://127.0.0.1:27017/webstrate | 
| maxAssetSize | Max file size for assets in MB. | 20 | 
| maxAge | How long static files should be cached (not assets). Defined in milliseconds or using ms format. | 1d(24 hours) | 
| rateLimit | Configuration object for rate limiting | See config-sample.json. | 
| basicAuth | Configuration object for basic auth | See config-sample.json. | 
| pubsub | Reddis connection url (multithreading). | unset | 
| threads | Number of threads to use (multihtreading). | unset | 
| niceWebstrateIds | Whether to use random strings as webstrateIds or more human readable random names. | false | 
| loggedInToCreateWebstrates | Require login to create/copy | false | 
| loggedInToWrite | Similar to setting default permissions for anonymous to ‘r’ | false | 
| disableSessionLog | Disables session logging, so the server no longer keeps track of op origin (neither IP nor userID will be saved). | false | 
Rate limiting
To avoid having clients DoS’ing the server unintentionally by having faulty Webstrates application code, sending thousands of messages to the server per second, Webstrates allows for rate limiting the number of requests.
Operations are generally a lot heavier on the server than other kinds of messages (keep alive, signals, cookie changes, user messages), so these can be configured separately.
- opsPerIntervaldefines the number of operations allowed within the defined interval.
- signalsPerIntervaldefines the number of signals (and other kind of messages) allowed within the defined interval.
- intervalLengthdefines the interval i milliseconds.
- banDurationdefines the ban duration in milliseconds.
A decent configuration may be something like below, which allows 500 operations and 2000 signals over a 15 second period:
"rateLimit": {
  "opsPerInterval": 500,
  "signalsPerInterval": 2000,
  "intervalLength": 15000,
  "banDuration": 30000
}
With the above, the server will disconnect and ban any client (by IP) for 30 seconds if they exceed the limitation.
Authentication
Server level basic authentication
To enable basic HTTP authentication on the Webstrates server, add the following to config.json:
"basicAuth": {
  "realm": "Webstrates",
  "username": "some_username",
  "password": "some_password"
}
Read-write and read-only permissions per webstrate
To setup read only permissions to specific webstrates or users, OAuth is required. We recommend using GitHub as authentication provider as Webstrates already ships with the required NPM packages.
To get started, register an OAuth application with GitHub.
On the register page, Homepage URL should be set to http://localhost:7007/, assuming the system is running locally on port 7007 (as per default). If other users need to be able to use the OAuth authentication system as well, the Homepage URL should be set to the external address.
Auhtorization callback URL should be set to http://localhost:7007/auth/github/callback.
After clicking Register Application, you’ll be presented with a Client ID and Client Secret, which needs to be added (along with other information) to your server config.json file:
"auth": {
  "providers": {
    "github": {
      "node_module": "passport-github",
      "config": {
        "clientID": "<github client id>",
        "clientSecret": "<github secret>",
        "callbackURL": "http://<hostname>/auth/github/callback"
      }
    }
  }
}
Logging in with OAuth/GitHub
To log in to the webstrates server, navigate to http://localhost:7007/auth/github, sign in and authorize. After successful login, you’ll be redirected to http://localhost:7007/frontpage. To confirm you’ve actually been logged in, writing webstrate.user in the browser console should yield a user object with your username (among other information).
Managing permissions
Access rights are added to a webstrate as a data-auth attribute on the <html> tag in JSON format:
<html data-auth='[{"username": "cklokmose", "provider": "github", "permissions": "rw"},
  {"username": "anonymous", "provider": "", "permissions": "r"}]'>
...
</html>
The above example provides the user with GitHub username cklokmose permissions to read and write (rw), while users who are not logged in (anonymous) only have read (r) access.
For more information on the usage of permissions, see Permissions.
Default permissions
It is also possible to set default permissions. Adding the following under the auth section in config.json will apply the same permissions as above to all webstrates without a data-auth property.
"defaultPermissions": [
  {"username": "cklokmose", "provider": "github", "permissions": "rw"},
  {"username": "anonymous", "provider": "", "permissions": "r"}
]
Permission timeout
To increase performance, permissions are cached in the system. When the data-auth property of a
webstrate is modified, the cache is invalidated. However, as a failsafe, permissions also time out
after a set period of time. This can be configured with auth.permissionTimeout, which defines the
number of seconds permissions can be remain cached before they need to be revalidated. (default
300 seconds).
Cookie
Webstrates uses cookies to save the user’s credentials.
The cookie’s encryption key (secret) and lifetime (duration) are both configurable.
A random encryption key will automatically be generated when the config.json file is created by the Webstrates server.
While it is possible to later change the encryption key by modifying config.json, this is not necessary and will also invalidate all existing cookies.
The duration is defined in milliseconds and defaults to 31536000000 (365 days).
"cookie": {
  "secret": "This is a secret!",
  "duration": 31536000000
}
The cookie name (“session”) is non-configurable.
Multi-threading
To enable multithreading, Redis must be installed (to be used for publish/subscribe between threads) and the config must contain to properties, namely:
- pubsubwhich must be set to the Redis connection url, and
- threadswhich must contain the number of desired threads.
For example:
  "pubsub": "redis://localhost:6379/",
  "threads": 4
If threads is set to 0, Webstrates will automatically create one thread for each CPU core.
Tagging
Auto-tagging can also be configured. Currently, only very basic configuration is possible, namely:
- autoTagIntervalwhich defines how long a webstrate must have been “inactive” (without ops) for it to become autotagged on next action (default 3600 seconds (60 minutes)).
- tagPrefixdefines the prefix of the tag that’ll be created (default “Session of “).
"tagging": {
  "autotagInterval": 3600,
  "tagPrefix": "Session of "
},
Tags are postfixed with the current date time, so a tag might look something like: “Session of Thu Jun 29 2017 14:03:30 GMT+0200 (CEST)”.
WebstrateIds and niceWebstrateId
When navigating to /new to create a new webstrate, when using ?copy to copy a new webstrate, or
when prototyping a new webstrate, Webstrate automatically generates a random webstrateId, unless one
has been specified.
By default, this webstrateId will be a random string betweeen 7-14 characters using
A-Z, a-z, 0-9, _-, such as S1KeySFzM. When niceWebstrateId is set to true, webstrateIds
that are easier to share will instead be used. These will be on the form
<verb>-<animal>-<number>, e.g. old-kangaroo-26.
God API
To use the God API, a godApi object with a key containing an access key must be defind in
the config file:
"godApi": {
  "key": "<key goes here>"
}
Anybody with access to the key can monitor almost all activity on the server, so be sure to use hard-to-guess string, preferably something lengthy and random.