# Installation and setup

## Install requirements
- [docker](https://docs.docker.com/install/)  
- [docker-compose](https://docs.docker.com/compose/install/)
- loki plugin for docker logs
```
docker plugin install grafana/loki-docker-driver:latest --alias loki --grant-all-permissions
```

## Setup .env file

Copy `.env.example` to `.env` and change any required paramaters.

| Variable        | Usage           | 
| ------------- |:-------------:|
|   `GF_SECURITY_ADMIN_USER`   |    Grafana admin user name   |
|   `ZCASHD_RPCUSER`   |    zcashd rpc user   |
|   `ZCASHD_RPCPASSWORD` | zcashd rpc password |
|   `ZCASHD_RPCPORT`   |    zcashd rpc port   |
|`ZCASHD_ALLOWIP`| zcashd rpc allowed IPs (don't change unless you know what you're doing)|
|`ZCASHD_DATADIR`| local location of zcashd data directory. `uid` 2001 needs write access|
|`ZCASHD_PARMDIR`| local location of zcashd data directory. `uid` 2001 needs read access|
|`ZCASHD_NETWORK`| zcashd network to use, `testnet` or `mainnet`|
|`ZCASHD_GEN`| should zcashd mine? `0` or `1`
|`LWD_PORT`| port for lightwalletd to bind to|
|`ZCASHD_CONF_PATH`| path for lightwalletd to pick up configuration|


## Populate secret env vars with random values

```
./buildenv.sh | tee .env
```

## Edit the two zcash.conf files
There are two zcash.conf files; one read by zcashd, one read by lightwalletd.

### `$ZCASHD_DATADIR/zcash.conf`—read by zcashd
The zcashd's `zcash.conf` needs to look like: 
```
rpcuser=zcashrpc
rpcpassword=TODO INSERT A RANDOM PASSWORD HERE
experimentalfeatures=1
lightwalletd=1
```

Replace `TODO INSERT A RANDOM PASSWORD HERE` with a random password, e.g. the output of `head -c 16 /dev/urandom | base64`.

`rpcuser` and `rpcpassword` must be set, as lightwalletd doesn't work with RPC cookies (see the [rpcpassword](https://zcash.readthedocs.io/en/latest/rtd_pages/zcash_conf_guide.html) documentation) for authentication.

`rpcuser` and `rpcpassword` in `.env` are only used by zcashd_exporter, but they also must be the same values as in `$ZCASHD_DATADIR/zcash.conf`

### `lightwalletd/docker/zcash.conf`—read by lightwalletd
The other `zcashd.conf`—the one read by lightwalletd—needs to have `rpcbind` (the address of the zcashd it will connect to) set to `zcashd`, and then docker-compose networking will make it resolve to the right IP address. Also, it needs to have the same `rpcuser` and `rpcpassword` values that are listed in `$ZCASHD_DATADIR/zcash.conf` to be able to authenticate.


## Build initial local docker image

`docker-compose build`

## Start the project

```
docker-compose up -d
```

# Setup and use Grafana

Open a browser to http://localhost:3000

![grafana-login](./images/grafana-login.png)


Login with the user (`GF_SECURITY_ADMIN_USER`) and password (`GF_SECURITY_ADMIN_PASSWORD`).  
The values can be found in your `.env` file

Open the `Dashboard Manage` menu on the left

 ![grafana-manage](./images/grafana-manage.png)

Select `Import`

![grafana-import](./images/grafana-import-1.png)

Enter `11325` for the `Grafana.com Dashboard`

![grafana-import](./images/grafana-import-2.png)

On the next screen, select the `Prometheus` and `Loki` values (there should only be 1 to select)

![grafana-configure](./images/grafana-configure.png)

Click `Import`


This should then be taken to the `Zcashd node exporter` dashboard.

![grafana-zcashd-dashboard](./images/grafana-zcashd-dashboard.png)

If all goes as planned, the dashboard should start populating data from the container services.

If there are an issues, you can view all the `docker-compose` services under the `Explore` section.

# Viewing container logs

Open the `Explore` menu entry

![grafana-explore.png](./images/grafana-explore.png)

Make sure `Loki` is selected as the datasource at the top.

![grafana-explore2](./images/grafana-explore-2.png)

Then choose the container to view it's logs.

![grafana-explore3](./images/grafana-explore-3.png)

Loki as a rich query syntax to help with log in many ways, for example combine 2 container logs entries:

![grafana-explore4](./images/grafana-explore-4.png)

See more here: https://github.com/grafana/loki/blob/master/docs/logql.md


# Exposing `lightwalletd` to the network

Edit `docker-compose.yml` to look like

```
    ports:    
      #- "127.0.0.1:$LWD_GRPC_PORT:$LWD_GRPC_PORT"
      #- "127.0.0.1:$LWD_HTTP_PORT:$LWD_HTTP_PORT"           
      - "0.0.0.0:$LWD_GRPC_PORT:$LWD_GRPC_PORT"
      - "0.0.0.0:$LWD_HTTP_PORT:$LWD_HTTP_PORT"      
```

When you edit these lines in `docker-compose.yml`, stopping/starting the individual `lightwalletd` container doesn't actually make the changes happen—you have to stop/start the whole `docker-compose` ensemble of containers because the ports/network config stuff lives at that level and doesn't seem to be affected by individual container stop/starts. Also if you want to expose `lightwalletd` to the whole internet, you don't need to specify an IP address, `0.0.0.0` works as it should.
