# MobyMask Watcher P2P Network - Web App

Instructions to setup and deploy the MobyMask app locally, pointed to a watcher on the p2p network

## Prerequisites

* Laconic Stack Orchestrator ([installation](/README.md#install))
* Watcher GQL endpoint

## Setup

Build the container images:

  ```bash
  laconic-so --stack mobymask-v2 build-containers --include cerc/react-peer,cerc/mobymask-ui
  ```

Check that the required images are created in the local image registry:

  ```bash
  docker image ls

  # Expected output:

  # REPOSITORY                TAG      IMAGE ID       CREATED          SIZE
  # cerc/react-peer           local    d66b144dbb53   4 days ago       868MB
  # cerc/mobymask-ui          local    e456bf9937ec   4 days ago       1.67GB
  # .
  # .
  ```

## Deploy

### Configuration

Create an env file `mobymask-app.env`:

  ```bash
  touch mobymask-app.env
  ```

Add the following contents to `mobymask-app.env`:

  ```bash
  # Watcher endpoint used by the app for GQL queries
  CERC_APP_WATCHER_URL="http://127.0.0.1:3001"


  # DO NOT CHANGE THESE VALUES
  CERC_DEPLOYED_CONTRACT="0x2B6AFbd4F479cE4101Df722cF4E05F941523EaD9"
  CERC_RELAY_NODES=["/dns4/relay1.dev.vdb.to/tcp/443/wss/p2p/12D3KooWAx83SM9GWVPc9v9fNzLzftRX6EaAFMjhYiFxRYqctcW1","/dns4/relay2.dev.vdb.to/tcp/443/wss/p2p/12D3KooWBycy6vHVEfUwwYRbPLBdb5gx9gtFSEMpErYPUjUkDNkm","/dns4/relay3.dev.vdb.to/tcp/443/wss/p2p/12D3KooWARcUJsiGCgiygiRVVK94U8BNSy8DFBbzAF3B6orrabwn"]
  ```

Replace `CERC_APP_WATCHER_URL` with the watcher's endpoint (eg. `https://mobymask.example.com`)

### Deploy the stack

```bash
laconic-so --stack mobymask-v2 deploy --cluster mm_v2 --include mobymask-app --env-file mobymask-app.env up lxdao-mobymask-app

# Expected output (ignore the "The X variable is not set. Defaulting to a blank string." warnings):

# [+] Running 4/4
#  ✔ Network mm_v2_default                            Created                            0.1s
#  ✔ Volume "mm_v2_peers_ids"                         Created                            0.0s
#  ✔ Volume "mm_v2_mobymask_deployment"               Created                            0.0s
#  ✔ Container mm_v2-lxdao-mobymask-app-1             Started                            1.1s
```

This will run the `lxdao-mobymask-app` (at `http://localhost:3004`) pointed to `CERC_APP_WATCHER_URL` for GQL queries

To monitor the running container:

  ```bash
  # With status
  docker ps

  # Expected output:

  # CONTAINER ID   IMAGE                    COMMAND                  CREATED         STATUS                   PORTS                  NAMES
  # f1369dbae1c9   cerc/mobymask-ui:local   "docker-entrypoint.s…"   2 minutes ago   Up 2 minutes (healthy)   127.0.0.1:3004->80/tcp   mm_v2-lxdao-mobymask-app-1

  # Check logs for a container
  docker logs -f mm_v2-lxdao-mobymask-app-1

  # Expected output:

  # .
  # .
  # .
  # Available on:
  #   http://127.0.0.1:80
  #   http://192.168.0.2:80
  # Hit CTRL-C to stop the server
  ```

Note: For opening an invite link on this deployed app, replace the URL part before `/#` with `http://localhost:3004`
For example: `http://localhost:3004/#/members?invitation=XYZ`

In order to host the app using a public domain, configure your website with SSL and `https` traffic reverse proxied to port `3004`.

For example, a Nginx configuration for domain `my-mobymask-app.example.com` would look something like:

  ```bash
  server {
    server_name my-mobymask-app.example.com;

    location / {
      proxy_pass http://localhost:3004;
      proxy_set_header Host $host;
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header X-Forwarded-Proto $scheme;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }

    listen [::]:443 ssl;
    listen 443 ssl;
    ssl_certificate /etc/letsencrypt/live/my-mobymask-app.example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/my-mobymask-app.example.com/privkey.pem;
    include /etc/letsencrypt/options-ssl-nginx.conf;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
  }

  server {
    if ($host = my-mobymask-app.example.com) {
      return 301 https://$host$request_uri;
    } # managed by Certbot

    server_name my-mobymask-app.example.com;
    listen 80;
    return 404; # managed by Certbot
  }
  ```

## Clean up

Stop all services running in the background:

  ```bash
  laconic-so --stack mobymask-v2 deploy --cluster mm_v2 --include mobymask-app down

  # Expected output:

  # [+] Running 2/2
  #  ✔ Container mm_v2-lxdao-mobymask-app-1             Removed                   10.6s
  #  ✔ Network mm_v2_default                            Removed                    0.5s
  ```

Clear volumes created by this stack:

  ```bash
  # List all relevant volumes
  docker volume ls -q --filter "name=mm_v2"

  # Expected output:

  # mm_v2_mobymask_deployment
  # mm_v2_peers_ids

  # Remove all the listed volumes
  docker volume rm $(docker volume ls -q --filter "name=mm_v2")
  ```
