forked from coolaj86/walnut.js
		
	
		
			
				
	
	
		
			308 lines
		
	
	
		
			7.4 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
			
		
		
	
	
			308 lines
		
	
	
		
			7.4 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
| From 0 to "Hello World"
 | |
| =======================
 | |
| 
 | |
| Goal:
 | |
| 
 | |
| The purpose of this tutorial is to install Walnut and be able to launch a simple "Hello World" app.
 | |
| 
 | |
| Pre-requisites:
 | |
| 
 | |
| * You have compatible server hardware
 | |
|   * Daplie Server
 | |
|   * EspressoBin
 | |
|   * Raspberry Pi
 | |
|   * MacBook
 | |
|   * (pretty much anything, actually)
 | |
| * You have compatible softwar
 | |
|   * Linux of any sort that uses systemd
 | |
|   * macOS using launchd
 | |
| * You own a domain
 | |
|   * through Daplie Domains
 | |
|   * or you understand domains and DNS and all that stuff
 | |
| 
 | |
| Choose a domain
 | |
| ---------------
 | |
| 
 | |
| For the purpose of this instruction we'll assume that your domain is `example.com`,
 | |
| but you can use, say, `johndoe.daplie.me` for testing through Daplie Domains.
 | |
| 
 | |
| Anyway, go ahead and set the bash variable `$my_domain` for the purposes of the
 | |
| rest of this tutorial:
 | |
| 
 | |
| ```
 | |
| my_domain=example.com
 | |
| ```
 | |
| 
 | |
| You can purchase a domain with daplie tools
 | |
| 
 | |
| ```
 | |
| npm install -g git+https://git.daplie.com/Daplie/daplie-tools.git
 | |
| 
 | |
| daplie domains:search -n $my_domain
 | |
| ```
 | |
| 
 | |
| Subodmains
 | |
| ----------
 | |
| 
 | |
| Auth will be loaded with the following domains
 | |
| 
 | |
| ```
 | |
| provider.example.com
 | |
| api.provider.example.com
 | |
| ```
 | |
| 
 | |
| The Hello World app will be loaded with the following domains
 | |
| 
 | |
| ```
 | |
| example.com
 | |
| www.example.com
 | |
| api.example.com
 | |
| assets.example.com
 | |
| ```
 | |
| 
 | |
| The domains can be setup through the Daplie Desktop App or with daplie-tools
 | |
| 
 | |
| Replace `foodevice` with whatever you like to call this device
 | |
| 
 | |
| ```bash
 | |
| # i.e. foodevice
 | |
| my_device=$(hostname)
 | |
| 
 | |
| # curl https://api.oauth3.org/api/tunnel@oauth3.org/checkip
 | |
| my_address=127.0.0.1
 | |
| 
 | |
| # set device address and attach primary domain
 | |
| daplie devices:attach -d $my_device -n $my_domain -a $my_address
 | |
| 
 | |
| # attach all other domains with same device/address
 | |
| daplie devices:attach -d $my_device -n provider.$my_domain
 | |
| daplie devices:attach -d $my_device -n api.provider.$my_domain
 | |
| daplie devices:attach -d $my_device -n www.$my_domain
 | |
| daplie devices:attach -d $my_device -n api.$my_domain
 | |
| daplie devices:attach -d $my_device -n assets.$my_domain
 | |
| daplie devices:attach -d $my_device -n cloud.$my_domain
 | |
| daplie devices:attach -d $my_device -n api.cloud.$my_domain
 | |
| ```
 | |
| 
 | |
| Initialization
 | |
| --------------
 | |
| 
 | |
| needs to know its primary domain
 | |
| 
 | |
| ```
 | |
| POST https://api.<domain.tld>/api/walnut@daplie.com/init
 | |
| 
 | |
| { "domain": "<domain.tld>" }
 | |
| ```
 | |
| 
 | |
| 
 | |
| Example `/etc/goldilocks/goldilocks.yml`:
 | |
| ```yml
 | |
| tls:
 | |
|   email: domains@example.com
 | |
|   servernames:
 | |
|     - example.com
 | |
|     - www.example.com
 | |
|     - api.example.com
 | |
|     - assets.example.com
 | |
|     - cloud.example.com
 | |
|     - api.cloud.example.com
 | |
| 
 | |
| http:
 | |
|   trust_proxy: true
 | |
|   modules:
 | |
|     - name: proxy
 | |
|       domains:
 | |
|         - '*'
 | |
|       address: '127.0.0.1:3000'
 | |
| ```
 | |
| 
 | |
| 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>/config.json
 | |
| ```
 | |
| 
 | |
| Deleting those files and restarting walnut will reset it to its bootstrap state.
 | |
| 
 | |
| 
 | |
| Basic Walnut Install
 | |
| --------------------
 | |
| 
 | |
| ```bash
 | |
| curl https://daplie.me/install-scripts | bash
 | |
| 
 | |
| daplie-install-walnut
 | |
| ```
 | |
| 
 | |
| You could also, of course, try installing from the repository directly
 | |
| (especially if you have goldilocks or some similar already installed)
 | |
| 
 | |
| ```bash
 | |
| mkdir -p /srv/walnut/
 | |
| git clone git@git.daplie.com:Daplie/walnut.js.git /srv/walnut/core
 | |
| pushd /srv/walnut/core
 | |
|   git checkout v1
 | |
| popd
 | |
| bash /srv/walnut/core/install-helper.sh
 | |
| ```
 | |
| 
 | |
| Initial Configuration
 | |
| -------------
 | |
| 
 | |
| Once installed and started you can visit <https://localhost.daplie.me:3000> to configure the primary domain.
 | |
| 
 | |
| You could also do this manually via curl:
 | |
| 
 | |
| ```bash
 | |
| curl -X POST http://api.localhost.daplie.me:3000/api/walnut@daplie.com/init \
 | |
|   -H 'X-Forwarded-Proto: https' \
 | |
|   -H 'Content-Type: application/json' \
 | |
|   -d '{ "domain": "'$my_domain'" }'
 | |
| ```
 | |
| 
 | |
| Reset Permissions
 | |
| -----------------
 | |
| 
 | |
| Since the app store and package manager are not built yet,
 | |
| you should also change the permissions on the walnut directory for the purposes of this tutorial:
 | |
| 
 | |
| ```bash
 | |
| sudo chown -R $(whoami) /srv/walnut/
 | |
| sudo chmod -R +s /srv/walnut/
 | |
| ```
 | |
| 
 | |
| Install OAuth3 API Package
 | |
| --------------
 | |
| 
 | |
| We need to have a local login system.
 | |
| 
 | |
| For the APIs for that we`ll install the `issuer@oauth3.org` API package and enable it for `api.provider.example.com`:
 | |
| 
 | |
| ```
 | |
| # API packaged for walnut
 | |
| git clone git@git.daplie.com:OAuth3/org.oauth3.provider.git /srv/walnut/packages/rest/issuer@oauth3.org
 | |
| pushd /srv/walnut/packages/rest/issuer@oauth3.org/
 | |
|     git checkout v1.2
 | |
|     npm install
 | |
| popd
 | |
| 
 | |
| # Give permission for this package to provider.example.com
 | |
| # the api. prefix is omitted because it is always assumed for APIs
 | |
| echo "issuer@oauth3.org" >> /srv/walnut/packages/client-api-grants/provider.$my_domain
 | |
| ```
 | |
| 
 | |
| *NOTE*: Currently there are some hard-coded values that need to be changed out (TODO use `getSiteConfig()`).
 | |
| `vim /srv/walnut/packages/rest/issuer@oauth3.org/lib/provide-oauth3.js` and search for the email stuff and change it.
 | |
| 
 | |
| 
 | |
| For the user interface for that we'll install the `issuer@oauth3.org` site package and enable it
 | |
| 
 | |
| ```
 | |
| # Frontend
 | |
| git clone git@git.daplie.com:OAuth3/org.oauth3.git /srv/walnut/packages/pages/issuer@oauth3.org
 | |
| pushd /srv/walnut/packages/pages/issuer@oauth3.org
 | |
|   bash ./install.sh
 | |
| popd
 | |
| 
 | |
| # Tell Walnut to load this site package when provider.example.com is requested
 | |
| echo "issuer@oauth3.org" >> /srv/walnut/var/sites/provider.$my_domain
 | |
| ```
 | |
| 
 | |
| OAuth3 Secrets
 | |
| --------------
 | |
| 
 | |
| OAuth3 is currently configured to use mailgun for sending verification emails.
 | |
| It is intended to provide a way to use various mail services in the future,
 | |
| just bear with us for the time being (or open a Merge Request).
 | |
| 
 | |
| ```
 | |
| vim /srv/walnut/var/$my_domain/config.json
 | |
| ```
 | |
| 
 | |
| ```
 | |
| { "mailgun.org": {
 | |
|     "apiKey": "key-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
 | |
|   , "apiPublicKey": "pubkey-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
 | |
|   , "auth": {
 | |
|       "user": "robtherobot@example.com"
 | |
|     , "pass": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
 | |
|     , "api_key": "key-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
 | |
|     , "domain": "example.com"
 | |
|     }
 | |
|   }
 | |
| , "issuer@oauth3.org": {
 | |
|     "mailer": {
 | |
|       "from": "login@example.com"
 | |
|     , "subject": "Login code request"
 | |
|     , "text": ":code\n\nis your login code"
 | |
|     }
 | |
|   }
 | |
| }
 | |
| ```
 | |
| 
 | |
| Install the 'hello@example.com' package
 | |
| ---------------------
 | |
| 
 | |
| ```bash
 | |
| git clone git@git.daplie.com:Daplie/com.example.hello.git /srv/walnut/packages/rest/hello@example.com
 | |
| 
 | |
| echo "hello@example.com" >> /srv/walnut/packages/client-api-grants/provider.$my_domain
 | |
| ```
 | |
| 
 | |
| What it should look like:
 | |
| 
 | |
| ```
 | |
| /srv/walnut/packages/rest/hello@example.com/
 | |
|   package.json
 | |
|   api.js
 | |
|   models.js
 | |
|   rest.js
 | |
| 
 | |
| /srv/walnut/packages/client-api-grants/example.com
 | |
|   '''
 | |
|   hello@example.com
 | |
|   '''
 | |
| ```
 | |
| 
 | |
| Setup the Seed App (front-end)
 | |
| ------------------------
 | |
| 
 | |
| Get the Seed App
 | |
| 
 | |
| ```bash
 | |
| pushd /srv/walnut/packages/pages/
 | |
| 
 | |
| git clone git@git.daplie.com:Daplie/seed_example.com.git --branch v1 seed@example.com
 | |
| 
 | |
| pushd seed@example.com/
 | |
|   git clone git@git.daplie.com:OAuth3/oauth3.js.git --branch v1.1 assets/oauth3.org
 | |
| 
 | |
|   mkdir -p .well-known
 | |
|   ln -sf  ../assets/oauth3.org/.well-known/oauth3 .well-known/oauth3
 | |
| popd
 | |
| 
 | |
| echo "seed@example.com" >> /srv/walnut/var/sites/$my_domain
 | |
| 
 | |
| popd
 | |
| ```
 | |
| 
 | |
| You will need to change the authenication provider/issuer URL from `oauth3.org` to the domain you've selected (i.e. `provider.example.com`)
 | |
| 
 | |
| ```
 | |
| vim /srv/walnut/packages/pages/seed@example.com/js/config.js
 | |
| ```
 | |
| 
 | |
| ```
 | |
| { "azp@oauth3.org": { issuer_uri: 'provider.example.com', client_uri: 'example.com' } }
 | |
| ```
 | |
| 
 | |
| See Hello World
 | |
| ---------------
 | |
| 
 | |
| Now visit your site (i.e. https://example.com) and you will be able to login
 | |
| and access the hello world data. |