2015-11-28 07:40:33 +00:00
|
|
|
walnut
|
|
|
|
======
|
|
|
|
|
|
|
|
Small, light, and secure iot application framework.
|
|
|
|
|
2017-05-05 20:03:02 +00:00
|
|
|
```bash
|
|
|
|
curl https://git.daplie.com/Daplie/daplie-snippets/raw/master/install.sh | bash
|
|
|
|
|
|
|
|
daplie-install-cloud
|
|
|
|
```
|
|
|
|
|
2015-11-28 07:40:33 +00:00
|
|
|
Features
|
|
|
|
------
|
|
|
|
|
2017-05-19 05:20:09 +00:00
|
|
|
* Works with Goldilocks for secure, Let's Encrypt maneged, https-only serving
|
|
|
|
|
2015-11-28 07:40:33 +00:00
|
|
|
* IOT Application server written in [Node.js](https://nodejs.org)
|
2017-05-19 05:20:09 +00:00
|
|
|
* Small memory footprint (for a node app)
|
2015-11-28 07:40:33 +00:00
|
|
|
* Secure
|
|
|
|
* Uses JWT, not Cookies\*
|
2017-05-19 05:20:09 +00:00
|
|
|
* HTTPS-only (checks for X-Forwarded-For)
|
2015-11-28 07:40:33 +00:00
|
|
|
* AES, RSA, and ECDSA encryption and signing
|
|
|
|
* Safe against CSRF, XSS, and SQL injection
|
|
|
|
* Safe against Compression attacks
|
|
|
|
* Multi-Tentated Application Management
|
|
|
|
* Built-in OAuth2 & OAuth3 support
|
|
|
|
|
|
|
|
\*Cookies are used only for GETs and only where using a token would be less secure
|
|
|
|
such as images which would otherwise require the token to be passed into the img src.
|
|
|
|
They are also scoped such that CSRF attacks are not possible.
|
|
|
|
|
|
|
|
In Progress
|
|
|
|
-----------
|
|
|
|
|
|
|
|
* HTTPS Key Pinning
|
|
|
|
* Heroku (pending completion of PostgreSQL support)
|
|
|
|
* [GunDB](https://gundb.io) Support
|
|
|
|
* OpenID support
|
|
|
|
|
|
|
|
Structure
|
|
|
|
=====
|
|
|
|
|
|
|
|
Currently being tested with Ubuntu, Raspbian, and Debian on Digital Ocean, Raspberry Pi, and Heroku.
|
|
|
|
|
|
|
|
```
|
|
|
|
/srv/walnut/
|
|
|
|
├── setup.sh (in-progress)
|
|
|
|
├── core
|
2017-05-19 05:20:09 +00:00
|
|
|
│ ├── bin
|
|
|
|
│ ├── boot
|
|
|
|
│ ├── holepunch
|
|
|
|
│ └── lib
|
2015-11-28 07:40:33 +00:00
|
|
|
├── node_modules
|
|
|
|
├── packages
|
2017-05-19 05:20:09 +00:00
|
|
|
│ ├── apis
|
|
|
|
│ ├── pages
|
|
|
|
│ └── services
|
2015-11-28 07:40:33 +00:00
|
|
|
└── var
|
|
|
|
```
|
|
|
|
|
|
|
|
* `core` contains all walnut code
|
|
|
|
* `node_modules` is a flat installation of all dependencies
|
|
|
|
* `certs` is a directory for Let's Encrypt (or custom) certificates
|
|
|
|
* `var` is a directory for database files and such
|
|
|
|
* `packages` contains 3 types of packages
|
|
|
|
|
2017-05-19 05:20:09 +00:00
|
|
|
Will install to
|
|
|
|
---------------
|
|
|
|
|
|
|
|
```
|
|
|
|
/srv/walnut/core/
|
|
|
|
/etc/walnut
|
|
|
|
/opt/walnut
|
|
|
|
/var/log/walnut
|
|
|
|
/etc/systemd/system/walnut.service
|
|
|
|
/etc/tmpfiles.d/walnut.conf
|
|
|
|
```
|
|
|
|
|
|
|
|
Implementation details
|
|
|
|
----------------
|
|
|
|
|
|
|
|
Initialization
|
|
|
|
--------------
|
2015-11-28 07:40:33 +00:00
|
|
|
|
2017-05-19 05:20:09 +00:00
|
|
|
needs to know its primary domain
|
|
|
|
|
|
|
|
```
|
|
|
|
POST https://api.<domain.tld>/api/com.daplie.walnut.init
|
|
|
|
|
|
|
|
{ "domain": "<domain.tld>" }
|
|
|
|
```
|
|
|
|
|
|
|
|
Resetting the Initialization
|
|
|
|
----------------------------
|
|
|
|
|
|
|
|
Once you run the app the initialization files will appear in these locations
|
|
|
|
|
|
|
|
```
|
|
|
|
/srv/walnut/var/com.daplie.walnut.config.sqlite3
|
|
|
|
/srv/walnut/config/<domain.tld>.json
|
|
|
|
```
|
2015-11-28 07:40:33 +00:00
|
|
|
|
2017-05-19 05:20:09 +00:00
|
|
|
Deleting those files will rese
|
2017-05-19 07:45:41 +00:00
|
|
|
|
|
|
|
Accessing static apps
|
|
|
|
---------------------
|
|
|
|
|
|
|
|
Static apps are stored in `packages/pages`
|
|
|
|
|
|
|
|
```
|
|
|
|
# App ID as files with a list of packages they should load
|
|
|
|
/srv/walnut/packages/pages/<domain.tld#path> # https://domain.tld/path
|
|
|
|
/srv/walnut/packages/pages/<domain.tld> # https://domain.tld and https://domain.tld/foo match
|
|
|
|
|
|
|
|
# packages are directories with reverse dns name # used for debugging
|
|
|
|
/srv/walnut/packages/pages/<tld.domain.package> # matches apps.<domain.tld>/<package-name> and <domain.tld>/apps/<package-name>
|
|
|
|
```
|