- BullMQ + Redis - in-memory and persistent storage
- Datastore (Sequelize => MariaDB, PostgreSQL, MySQL etc)
- P2P server
- Workers - do the service health checks and other tasks
- API - provides http services at
/api - Frontend - serves the web application
Clone the repository:
git clone https://github.com/ibp-network/ibp-monitor.git
cd ibp-monitorUnder the docker folder, Rename .env.sample file to .env, and edit P2P_PUBLIC_HOST and/or P2P_PUBLIC_IP variables.
These are going to be used to announce your monitor node's public address, so that it can connect with the other monitor nodes on the network.
You may leave both commented out, or include any or both.
mv .env.sample .env
nano .env
# edit values as necessaryRest of the default configuration is in config/config.js. Make a copy of the file, and edit the necessary items:
cp config.js config.local.js
Any item changed in config/config.local.js will override the default value in config/config.js
For details of the config items, please refer CONFIG.md
- 3000 - BullMQ admin, HTTP
- 3306 - MariaDB, TCP
- 6379 - Redis, TCP
- 30000 - libp2p, gossip, TCP <= proxy this port TCP
- 30001 - Frontend, HTTP <= proxy this port via SSL
- 30002 - API, HTTP
The database abstraction layer is powered by Sequelize. The default datastore is MariaDB, supported DBs are:
Notes:
- SQLite is not supported by the IBP stack because the separate components need concurrent access to the database.
- If you chose another database you need to create your own installation or Docker container, and amend the
./config/config.local.jswith appropriate DB connection details.
After you make the necessary edits in config/config.local.js for your choice of database, you can use the following commands to install the necessary dependencies and run the migrations:
cd data
node migrate.jsIf you instead choose to run the IBP stack using Docker Compose, the ibp-datastore-init job defined in docker/docker-compose.yml will initialise the database using Sequelize migration definitions under data/migrations, which use the data model definitions under data/models.
- requirements
- Redis server
- MariaDB / MySQL / PostgreSQL server
- hosts file (optional)
- edit the hosts file &
config.local.jsas needed
Inside Docker, the components can access each other by hostnames. When developing locally, you need to edit config/config.local.js file to define the ports, or set /etc/hosts as follows:
127.0.0.1 ibp-redis
127.0.0.1 ibp-datastore
127.0.0.1 ibp-monitor-api
If you don't have Redis or MariaDB installed, you can start these individually & manually via Docker. See below for more info.
Clone the repository and install the dependencies:
git clone https://github.com/ibp-network/ibp-monitor.git
cd ibp-monitor
npm installEach component requires a separate shell window.
-
Redis & MariaDB
See Docker section if you don't have these running locally, or, amend the config to point to your local services.
-
API
node api.js
-
P2P Server
node server.js
-
Front End (static)
See Docker, this will launch on
http://localhost:30001.cd frontend npm install npm run build # target files will populate ./static
-
Front End (developer mode)
In developer mode the frontend will proxy
/apito the API service. See./vue- spa/vite.config.jsif you need to amend this. Note, in production mode the/apilocation is proxied by nginx to theibp-monitor-apiservice.cd frontend npm install npm run serve -
BullMQ See
http://localhost:3000/admin/queuesnode workers.js
As above, each node.js component can run separately in PM2. (Requires MariaDB and Redis)
pm2 start --name ibp-monitor-api api.js
pm2 start --name ibp-monitor-p2p server.js
pm2 start --name ibp-monitor-workders workers.jsThe frontend is located in the ./frontend/static folder. See development above for building the folder contents.
Point Apache or nginx to serve this folder, with the following config (nginx example):
server {
listen 80;
server_name ibp-monitor.metaspan.io;
location /api {
# to preserve the url encoding, don't put the /api on the end
proxy_pass http://ibp-monitor-api:30002;
}
location / {
root /usr/share/nginx/html;
index index.html index.htm;
try_files $uri $uri/ /index.html;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}Docker files and docker-compose.yml are in the ./docker folder. Service names:
- ibp-redis
- ibp-datastore
- ibp-datastore-init
- ibp-monitor-api
- ibp-monitor-server
- ibp-monitor-workers
- ibp-monitor-frontend
Under the docker folder, Rename .env.sample file to .env, and edit P2P_PUBLIC_HOST and/or P2P_PUBLIC_IP variables.
These are going to be used to announce your monitor node's public address, so that it can connect with the other monitor nodes on the network.
You may leave both commented out, or include any or both.
mv .env.sample .env
nano .env
# edit values as necessarycd docker # you need to be in the docker directory!
docker compose upUse ctrl-c to stop services.
Use -d flag with compose (docker compose up -d) for detach to let the services run in background.
cd docker # you need to be in the docker directory!
docker compose up <service name> # optional `-d` flag(Tested on Node v16)
git clone https://github.com/ibp-network/ibp-monitor.git
cd ibp-monitor
npm install
cd config
# edit config.local.js to suit your needs
cp config.js config.local.js
# initialise the datastore
cd data
node migrate.js
cd ..
# run the server
node server.js
# run the workers
node workers.js
# run the API
node api.js
# run the frontend
cd frontend
npm install
npm run devpm2 save # to persist your jobs
pm2 list # see the running jobs
pm2 logs ibp-monitor
-
Implememt scoring
-
Implement alerting
-
implement status / metrics- some basic metrics available at/api/metrics/{serviceId}. -
implement prometheus (or similar) api- Done, each service has a link to the Prometheus data. -
how to create your own peerId- Done, the server will createkeys/peer-id.jsonat 1st startup. -
Peers should sign status updates- This is configured inlibp2p.pubsub.signMessages: true.