diff --git a/README.md b/README.md new file mode 100644 index 0000000..a0d847d --- /dev/null +++ b/README.md @@ -0,0 +1,219 @@ +# Webchain Explorer + +Webchain Explorer logo + +## Installation + +Clone the repo + +`git clone https://github.com/webchain-network/explorer` + +Download [Nodejs and npm](https://docs.npmjs.com/getting-started/installing-node "Nodejs install") if you don't have them + +Install dependencies: + +`npm install` + +Install mongodb: + +Debian based distro Linux: `sudo apt-get install -y mongodb-org` + +## Populate the DB + +This will fetch and parse the entire blockchain. + +Review your configuration file: `cat config.json` + +The `config.json` file must looks as follow + +Settings: +```{ + "nodeAddr": "localhost", + "gethPort": 39573, + "wsPort": 8546, + "startBlock": 0, + "endBlock": "latest", + "quiet": false, + "syncAll": true, + "patch": true, + "patchBlocks": 100, + "bulkSize": 100, + "settings": { + "symbol": "WEB", + "name": "Webchain", + "description": "Webchain Block Explorer allows you to search through the blockchain. Enter a wallet address, transaction hash, block hash or block number.", + "keywords": "Block Height, Block Time, Network Hashrate, Difficulty, Transaction hash, Block Explorer, block number, block hash, wallet address", + "author": "Webchain project", + "contact": "mailto:support@webchain.network", + "about": "This is an open source Webchain Explorer.", + "facebook": "http://facebook.com/thewebchain", + "twitter": "https://twitter.com/TheWebchain", + "github": "https://github.com/webchain-network", + "linkedin": "https://www.linkedin.com/company/webchain-blockchain", + "reddit": "https://www.reddit.com/r/Webchain", + "telegram_group": "https://t.me/joinchat/Hzio4lCr-95bHcbB1-RX9Q", + "telegram_channel": "https://www.t.me/webchainnetwork", + "discord": "https://discord.gg/uuZXhCn", + "gitter": "https://gitter.im/webchain-network/public", + "logo": "img/explorer-logo.png", + "customCss": "green-haze.min.css", + "copyright": "2018-2019 © Webchain explorer.", + "useRichList": true, + "useFiat": false, + "poweredbyCustom": "Powered by Webchain explorer", + "miners": { + }, + "analytics-code": "UA-1111111-00", + "path": "/explorer/" + } +} + +``` + +| Name | Explanation | +|-------------|-----| +| `nodeAddr` | Your node API RPC address. | +| `wsPort` | Your node API WS (Websocket) port. (RPC HTTP port is deprecated on Web3 1.0 see https://web3js.readthedocs.io/en/1.0/web3.html#value) | +| `startBlock` | This is the start block of the blockchain, should always be 0 if you want to sync the whole Webchain. | +| `endBlock` | This is usually the 'latest'/'newest' block in the blockchain, this value gets updated automatically, and will be used to patch missing blocks if the whole app goes down. | +| `quiet` | Suppress some messages. (admittedly still not quiet) | +| `syncAll` | If this is set to true at the start of the app, the sync will start syncing all blocks from lastSync, and if lastSync is 0 it will start from whatever the endBlock or latest block in the blockchain is. | +| `patch` | If set to true and below value is set, sync will iterated through the # of blocks specified. | +| `patchBlocks` | If `patch` is set to true, the amount of block specified will be check from the latest one. | + + +### Configure MongoDB + +In view of system security, most of mongoDB Admin has setup security options, So, You need to setup mongodb auth informations. +Switch to the built-in admin database: + +``` +$ mongo +$ > use admin +``` + +1. Create an administrative user (if you have already admin or root of mongodb account, then skip it) + +``` +# make admin auth and role setup +$ > db.createUser( { user: "admin", pwd: "", roles: ["root"] } ) +``` + +And, You can make Explorer's "explorerDB" database with db user accounts "explorer" and password "some_pass_code". + +``` +$ > use explorerDB +$ > db.createUser( { user: "explorer", pwd: "", roles: ["dbOwner"] } ) +$ > quit() +``` + +Above dbuser explorer will full access explorerDB and cluster setting will be well used on monitoring the multiple sharding and replication of multiple mongodb instances. +Enable database authorization in the MongoDB configuration file /etc/mongodb.conf by appending the following lines: + +``` +auth=true +``` + +Restart MongoDB and verify the administrative user created earlier can connect: + +``` +$ sudo service mongodb restart +$ mongo -u admin -p your_password --authenticationDatabase=admin +``` + +If everything is configured correctly the Mongo Shell will connect and + +``` +$ > show dbs +``` +will show db informations. + + +### Run + +The below will start both the web-gui and sync.js (which populates MongoDB with blocks/transactions). + +`npm start` + +You can leave sync.js running without app.js and it will sync and grab blocks based on config.json parameters + +`npm run sync` + +Enabling stats requires running a separate process: + +`npm run stats` + +Enabling richlist requires running a separate process: + +`npm run rich` + +You can configure intervals (how often a new data point is pulled) and range (how many blocks to go back) with the following: + +`RESCAN=100:7700000 node tools/stats.js` (New data point every 100 blocks. Go back 7,700,000 blocks). + +## Configuring system service for webchain-explorer + +Create a service file at `/etc/systemd/system` with suffix `.service` e.g.: `sudo touch /etc/systemd/system/webchain-explorer.service` and put the following content on it: + +```[Unit] +Description=Webchain explorer +After=network.target + +[Service] +User= +Group= + +Environment=MONGO_URI=mongodb://blockDB_user:@127.0.0.1/blockDB +Environment=PATH=:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin + +Type=simple +Restart=on-failure +WorkingDirectory= +ExecStart=/bin/npm run start + +[Install] +WantedBy=multi-user.target +``` +Note you need to change `User` `Group`, `ExecStart`, `WorkingDirectory` and `Environment` (path and mongo_uri) and set the correspond values of your system. Note: User and Group must match with owner and group of your explorer folder. + +save changes and run `systemctl daemon-reload` `systemctl start webchain-explorer` + +## Nginx node proxy configuration + +Create a new nginx conf file in order to proxy pass the node explorer app in nginx (by default `app.js` runs on port 3000). Add the following lines to the new nginx conf (Note you must to change alias value): +``` +listen ; +server_name +. +. +. +location /explorer { + location /explorer { + expires 10m; + alias /path/of/webchain-explorer/public; + try_files $uri @nodeproxy; + } + + } + + location @nodeproxy { + expires 10m; + rewrite /explorer/(.*) /$1 break; + proxy_pass http://127.0.0.1:3000; + proxy_redirect off; + proxy_http_version 1.1; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection 'upgrade'; + proxy_set_header Host $host; + proxy_cache_bypass $http_upgrade; + } +``` +After that run `systemctl reload nginx` + +Test it on your browser! + +## Docker installation + +Set `nodeAddr` in `config.json` to `host.docker.internal` + +Run `docker-compose up`