solid-server lets you run a Solid server on top of the file-system. You can use it as a command-line tool (easy) or as a library (advanced).
- Linked Data Platform
- Web Access Control
- WebID+TLS Authentication
- Real-time live updates (using WebSockets)
- Identity provider for WebID
- Proxy for cross-site data access
- Group members in ACL
- Email account recovery
To install, first install Node and then run the following
$ npm install -g solid-serverThe easiest way to setup solid-server is by running the wizard. This will create a config.json in your current folder
$ solid initNote: If prompted for an SSL key and certificate, follow the instructions below.
To run your server, simply run solid start:
$ solid start # Solid server (solid v0.2.24) running on https://localhost:8443/If you prefer to use flags instead, the following would be the equivalent
$ solid start --port 8443 --ssl-key path/to/ssl-key.pem --ssl-cert path/to/ssl-cert.pem # Solid server (solid v0.2.24) running on https://localhost:8443/If you want to run solid on a particular folder (different from the one you are in, e.g. path/to/folder):
$ solid start --root path/to/folder --port 8443 --ssl-key path/to/ssl-key.pem --ssl-cert path/to/ssl-cert.pem # Solid server (solid v0.2.24) running on https://localhost:8443/You need an SSL certificate you get this from your domain provider or for free from Let's Encrypt!.
If you don't have one yet, or you just want to test solid, generate a certificate (DO NOT USE IN PRODUCTION):
$ openssl genrsa 2048 > ../localhost.key $ openssl req -new -x509 -nodes -sha256 -days 3650 -key ../localhost.key -subj '/CN=*.localhost' > ../localhost.cert You can run solid so that new users can sign up, in other words, get their WebIDs username.yourdomain.com.
Pre-requisites:
- Get a Wildcard Certificate
- Add a Wildcard DNS record in your DNS zone (e.g.
*.yourdomain.com) - (If you are running locally) Add the line
127.0.0.1 *.localhostto/etc/hosts
$ solid init .. ? Allow users to register their WebID (y/N) # write `y` here .. $ solid startOtherwise, if you want to use flags, this would be the equivalent
$ solid --idp --port 8443 --cert /path/to/cert --key /path/to/key --root ./accountsYour users will have a dedicated folder under ./accounts. Also, your root domain's website will be in ./accounts/yourdomain.tld. New users can create accounts on /api/accounts/new and create new certificates on /api/accounts/cert. An easy-to-use sign-up tool is found on /api/accounts.
To use Gmail you may need to configure "Allow Less Secure Apps" in your Gmail account unless you are using 2FA in which case you would have to create an Application Specific password. You also may need to unlock your account with "Allow access to your Google account" to use SMTP.
If you don't want WebID Authentication and Web Access Control, you can run a simple Linked Data Platform.
# over HTTP $ solid start --port 8080 --no-webid # over HTTPS $ solid start --port 8080 --ssl-key key.pem --ssl-cert cert.pem --no-webidNote: if you want to run on HTTP, do not pass the --ssl-* flags, but keep --no-webid
The command line tool has the following options
$ solid Usage: solid [options] [command] Commands: init [options] create solid server configurations start [options] run the Solid server Options: -h, --help output usage information -V, --version output the version number $ solid init --help Usage: init [options] Create solid server configurations Options: -h, --help output usage information --advanced Ask for all the settings $ solid start --help Usage: start [options] run the Solid server Options: -h, --help output usage information --root [value] Root folder to serve (defaut: './') --port [value] Port to use (default: '8443') --serverUri [value] Solid server uri (default: 'https://localhost:8443') --webid Enable WebID authentication and access control (uses HTTPS. default: true) --owner [value] Set the owner of the storage (overwrites the root ACL file) --ssl-key [value] Path to the SSL private key in PEM format --ssl-cert [value] Path to the SSL certificate key in PEM format --idp Enable multi-user mode (users can sign up for accounts) --proxy [value] Serve proxy on path (default: '/proxy') --file-browser [value] Url to file browser app (uses Warp by default) --data-browser Enable viewing RDF resources using a default data browser application (e.g. mashlib) --suffix-acl [value] Suffix for acl files (default: '.acl') --suffix-meta [value] Suffix for metadata files (default: '.meta') --secret [value] Secret used to sign the session ID cookie (e.g. "your secret phrase") --error-pages [value] Folder from which to look for custom error pages files (files must be named <error-code>.html -- eg. 500.html) --mount [value] Serve on a specific URL path (default: '/') --force-user [value] Force a WebID to always be logged in (useful when offline) --strict-origin Enforce same origin policy in the ACL -v, --verbose Print the logs to console npm install The library provides two APIs:
solid.createServer(settings): starts a ready to use Express app.lnode(settings): creates an Express that you can mount in your existing express app.
In case the settings is not passed, then it will start with the following default settings.
{cache: 0,// Set cache time (in seconds), 0 for no cachelive: true,// Enable live support through WebSocketsroot: './',// Root location on the filesystem to serve resourcessecret: 'node-ldp',// Express Session secret keycert: false,// Path to the ssl certkey: false,// Path to the ssl keymount: '/',// Where to mount Linked Data Platformwebid: false,// Enable WebID+TLS authenticationsuffixAcl: '.acl',// Suffix for acl filesproxy: false,// Where to mount the proxyerrorHandler: false,// function(err, req, res, next) to have a custom error handlererrorPages: false// specify a path where the error pages are}Have a look at the following examples or in the examples/ folder for more complex ones
You can create an solid server ready to use using solid.createServer(opts)
varsolid=require('solid-server')varldp=solid.createServer({key: '/path/to/sslKey.pem',cert: '/path/to/sslCert.pem',webid: true})ldp.listen(3000,function(){// Started Linked Data Platform})You can integrate solid in your existing Express app, by mounting the solid app on a specific path using lnode(opts).
varsolid=require('solid-server')varapp=require('express')()app.use('/test',solid(yourSettings))app.listen(3000,function(){// Started Express app with ldp on '/test'})...Run your app with the DEBUG variable set:
$ DEBUG="solid:*" node app.jsIn order to really get a feel for the Solid platform, and to test out solid, you will need the following:
A WebID profile and browser certificate from one of the Solid-compliant identity providers, such as databox.me.
A server-side SSL certificate for
solidto use (see the section below on creating a self-signed certificate for testing).
While these steps are technically optional (since you could launch it in HTTP/LDP-only mode), you will not be able to use any actual Solid features without them.
When deploying solid in production, we recommend that you go the usual Certificate Authority route to generate your SSL certificate (as you would with any website that supports HTTPS). However, for testing it locally, you can easily generate a self-signed certificate for whatever domain you're working with.
For example, here is how to generate a self-signed certificate for localhost using the openssl library:
solid --webid --port 8443 --cert ../localhost.cert --key ../localhost.key -vNote that this example creates the localhost.cert and localhost.key files in a directory one level higher from the current, so that you don't accidentally commit your certificates to solid while you're developing.
If you started your solid server locally on port 8443 as in the example above, you would then be able to visit https://localhost:8443 in the browser (ignoring the Untrusted Connection browser warnings as usual), where your solid server would redirect you to the default viewer app (see the --file-browser server config parameter), which is usually the github.io/warp file browser.
Accessing most Solid apps (such as Warp) will prompt you to select your browser side certificate which contains a WebID from a Solid storage provider (see the pre-requisites discussion above).
To test certificates and account creation on subdomains, solid's test suite uses the following localhost domains: nic.localhost, tim.localhost, and nicola.localhost. You will need to create host file entries for these, in order for the tests to pass.
Edit your /etc/hosts file, and append:
# Used for unit testing solid 127.0.0.1 nic.localhost, tim.localhost, nicola.localhost $ npm test# running the tests with logs $ DEBUG="solid:*" npm testIn order to test a single component, you can run
npmruntest-(acl|formats|params|patch)solid is only possible due to the excellent work of the following contributors:
| Tim Berners-Lee | GitHub/timbl | Twitter/@timberners_lee | webid |
|---|---|---|---|
| Nicola Greco | GitHub/nicola | Twitter/@nicolagreco | webid |
| Martin Martinez Rivera | GitHub/martinmr | ||
| Andrei Sambra | GitHub/deiu | Twitter/@deiu | webid |
- Join us in Gitter to help with development or to hang out with us :)
- Create a new issue to report bugs
- Fix an issue
Have a look at CONTRIBUTING.md.
MIT
