Farmbot-Web-App/README.md

131 lines
7.4 KiB
Markdown
Raw Normal View History

2017-06-29 15:34:38 -06:00
[![Code Climate](https://codeclimate.com/github/FarmBot/farmbot-web-app/badges/gpa.svg)](https://codeclimate.com/github/FarmBot/farmbot-web-app)
[![Test Coverage](https://codeclimate.com/github/FarmBot/farmbot-web-app/badges/coverage.svg)](https://codeclimate.com/github/FarmBot/farmbot-web-app)
2015-08-19 09:37:13 -06:00
2017-06-29 15:34:38 -06:00
# Q: Do I need this?
2015-08-19 09:37:13 -06:00
2017-06-29 15:34:38 -06:00
This repository is intended for *software developers* who wish to modify the [Farmbot Web App](http://my.farmbot.io/). **If you are not a developer**, you are highly encouraged to use [the publicly available web app](http://my.farmbot.io/). Running a server is a non-trivial task which will require an intermediate background in Ruby, SQL and Linux system administration.
2015-08-19 09:37:13 -06:00
2017-06-29 15:34:38 -06:00
If you are a developer interested in contributing or would like to provision your own server, you are in the right place.
2015-08-19 09:37:13 -06:00
2017-06-29 15:34:38 -06:00
# Q: What is the Farmbot Web API?
2015-11-25 12:59:54 -07:00
2017-06-29 15:34:38 -06:00
This Repo is the RESTful JSON API for Farmbot. This includes things like storage of user data, plant data, authorization tokens and a variety of other resources.
2017-06-29 15:34:38 -06:00
The key responsibility of the API is *information and permissions management*. This should not be confused with device control, which is done via [MQTT](https://github.com/FarmBot/mqtt-gateway).
2017-06-29 15:34:38 -06:00
# Q: Can I see some example API requests?
2016-12-07 12:27:46 -07:00
2017-06-29 15:34:38 -06:00
For a list of example API requests and responses, see our [reference documentation](https://gist.github.com/RickCarlino/10db2df375d717e9efdd3c2d9d8932af). If you wish to write an add-on application that uses the FarmBot API, please let us know in an issue. We are happy to answer any specific questions you may have.
2016-12-07 12:27:46 -07:00
2017-06-29 15:34:38 -06:00
# Q: How do I Setup an API locally?
2017-06-29 15:34:38 -06:00
## Prerequisites
2016-09-26 15:27:56 -06:00
2017-06-29 15:34:38 -06:00
Your machine will need the following:
2016-09-26 15:27:56 -06:00
2017-06-29 15:34:38 -06:00
0. A Linux or Mac based machine. We do not support windows at this time.
0. [Ruby 2.3.3](http://rvm.io/rvm/install)
1. [ImageMagick](https://www.imagemagick.org/script/index.php) (`brew install imagemagick` (Mac) or `sudo apt-get install imagemagick` (Ubuntu))
2. [Node JS > v6](https://nodejs.org/en/download/)
3. [`libpq-dev` and `postgresql`](http://stackoverflow.com/questions/6040583/cant-find-the-libpq-fe-h-header-when-trying-to-install-pg-gem/6040822#6040822)
### Setup
0. `git clone https://github.com/FarmBot/Farmbot-Web-API`
0. `cd Farmbot-Web-API`
0. [Install `libpq-dev` and `postgresql`](http://stackoverflow.com/questions/6040583/cant-find-the-libpq-fe-h-header-when-trying-to-install-pg-gem/6040822#6040822)
0. `bundle install`
0. **MOST IMPORTANT STEP**. Copy `config/database.example.yml` to `config/database.yml`. In GNU/Linux or Mac: `mv config/database.example.yml config/database.yml`. **Please read the instructions inside the file. Replace the example values provided with real world values.**
0. Give permission to create a database*
0. `rake db:create:all db:migrate db:seed`
0. (optional) Verify installation with `RAILS_ENV=test rake db:create db:migrate && rspec spec`.
0. `MQTT_HOST=your_mqtt_server_domain rails s -b 0.0.0.0` where `your_mqtt_server_domain` is the IP or domain name of the MQTT server (see next step). The MQTT server does not need to be running yet.
0. Now that the API server is running, [provision an MQTT server](https://github.com/FarmBot/mqtt-gateway).
0. Initialize background workers in a seperate process: `rails jobs:work`. For production setups, this is a required step.
0. (REQUIRES NODE JS > v6) Run `./install_frontend.sh` to build the latest frontend app. You may also run the frontend on a seperate server. The [frontend repository](https://github.com/FarmBot/farmbot-web-frontend) has more info on this if you wish to do so. For most users, `./install_frontend.sh` should be sufficient.
0. Open [localhost:3000](http://localhost:3000). The application is now ready for use.
0. [Raise an issue](https://github.com/FarmBot/Farmbot-Web-API/issues/new?title=Installation%20Failure) if you hit problems with any of these steps.
\*Give permission to `user` to create database:
```
sudo -u postgres createuser user
sudo -u postgres psql
ALTER USER "user" WITH SUPERUSER;
2017-02-07 22:28:44 -07:00
```
2017-06-29 15:34:38 -06:00
# Q: Is Dokku / Docker supported?
Doku (a Docker management system) is partially supported. Pull requests welcome. Please see `deployment.md` for more information.
# Config Settings (important)
We try our best to follow the [12 Factor Methodology](https://12factor.net/). Part of that means using ENV variables as a means of [storing configuration](https://12factor.net/config). **Your server won't run without setting ENV variables first**.
You can accomplish this by setting the ENV variables directly from your shell / server management tool or by writing an `application.yml` file.
See `config/application.example.yml` for a list of all the variables that must be set.
**Encryption keys**: Encryption keys will be autogenerated if not present. They can be reset using `rake keys:generate`. If `ENV['RSA_KEY']` is set, it will be used in place of the `*.pem` files. Useful for environments like Heroku, where file system access is not allowed.
**We can't fix issues we don't know about.** Please submit an issue if you are having trouble installing on your local machine.
# Q: How can I Generate an API token?
You must pass a `token` string into most HTTP requests under the `Authorization: ` request header.
Here's what a response looks like when you request a token:
```json
2016-03-27 14:25:17 -06:00
{
2017-06-29 15:34:38 -06:00
"token": {
"unencoded": {
"sub": "test123@test.com",
"iat": 1459109728,
"jti": "922a5a0d-0b3a-4767-9318-1e41ae600352",
"iss": "http://localhost:3000/",
"exp": 1459455328,
"mqtt": "localhost",
"bot": "aa7bb37f-5ba3-4654-b2e4-58ed5746508c"
},
"encoded":
// THE IMPORTANT PART IS HERE!!:
"eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJzdWIiOiJ0ZXN0MTIzQHRlc3QuY29tIiwiaWF0IjoxNDU5MTA5NzI4LCJqdGkiOiI5MjJhNWEwZC0wYjNhLTQ3NjctOTMxOC0xZTQxYWU2MDAzNTIiLCJpc3MiOiJodHRwOi8vbG9jYWxob3N0OjMwMDAvIiwiZXhwIjoxNDU5NDU1MzI4LCJtcXR0IjoibG9jYWxob3N0IiwiYm90IjoiYWE3YmIzN2YtNWJhMy00NjU0LWIyZTQtNThlZDU3NDY1MDhjIn0.KpkNGR9YH68AF3iHP48GormqXzspBJrDGm23aMFGyL_eRIN8iKzy4gw733SaJgFjmebJOqZkz3cly9P5ZpCKwlaxAyn9RvfjQgFcUK0mywWAAvKp5lHfOFLhBBGICTW1r4HcZBgY1zTzVBw4BqS4zM7Y0BAAsflYRdl4dDRG_236p9ETCj0MSYxFagfLLLq0W63943jSJtNwv_nzfqi3TTi0xASB14k5vYMzUDXrC-Z2iBdgmwAYUZUVTi2HsfzkIkRcTZGE7l-rF6lvYKIiKpYx23x_d7xGjnQb8hqbDmLDRXZJnSBY3zGY7oEURxncGBMUp4F_Yaf3ftg4Ry7CiA"
}
2016-03-27 14:25:17 -06:00
}
```
2017-06-29 15:34:38 -06:00
**Important:** The response is provided as JSON for human readability. For your `Authorization` header, you will only be using `data.token.encoded`. In this example, it's the string starting with `eyJ0eXAiOiJ...`
2016-03-27 14:25:17 -06:00
2017-06-29 15:34:38 -06:00
## Via CURL
```
curl -H "Content-Type: application/json" \
-X POST \
-d '{"user":{"email":"test123@test.com","password":"password123"}}' \
https://my.farmbot.io/api/tokens
```
2016-03-27 14:25:17 -06:00
2017-06-29 15:34:38 -06:00
## Via JQuery
2014-03-11 20:58:53 -06:00
2017-06-29 15:34:38 -06:00
Since the API supports [CORS](http://enable-cors.org/), you can generate your token right in the browser.
Here's an example:
```javascript
$.ajax({
url: "https://my.farmbot.io/api/tokens",
type: "POST",
data: JSON.stringify({user: {email: 'admin@admin.com', password: 'password123'}}),
contentType: "application/json",
success: function (data) {
// You can now use your token:
var MY_SHINY_TOKEN = data.token.encoded;
}
});
```
# Want to Help?
2016-10-05 16:09:48 -06:00
2017-06-29 15:34:38 -06:00
[Low Hanging Fruit](https://github.com/FarmBot/Farmbot-Web-API/search?utf8=%E2%9C%93&q=todo). [Raise an issue](https://github.com/FarmBot/Farmbot-Web-API/issues/new?title=Question%20about%20a%20TODO) if you have any questions.