Real-time json cache server for blockchain data
Note: Please use develop
branch for contributing.
Welcome to the server code for Giveth's dapp. The dapp uses feathers as a cache for its blockchain transactions. By utilizing websockets on both the blockchain and client devices, we can receive and push updates simultaneously to all users in real time.
- Click Star on this repo near the top-right corner of this web page (if you want to).
- Join our slack if you haven't already.
- Fork this repo by clicking Fork button in top-right corner of this web page. Continue to follow instruction steps from your own feathers-giveth repo.
- The rest of these steps must be done from your machine's command line. Clone your own "feathers-giveth" repo. Copy the link from the "Clone or download" button near the top right of this repo's home page.
git clone {paste your own repo link here}
- Change directories to feathers-giveth:
cd feathers-giveth
- Make sure you have NodeJS (v8.4.0 or higher), yarn (v0.27.5 or higher), and npm (5.4.1 or higher) installed.
- Install dependencies from within feathers-giveth directory:
npm install
- note: due to a bug in yarn,
yarn install
currently does not work
- note: due to a bug in yarn,
- Install Mongo (we recommend installing via Brew)
- Run Mongo in a terminal window
mongod
or in the backgroundmongod --fork --syslog
- (optionally) Install IPFS (we recommend installing via Brew)
- If you don't install ipfs, image uploading will be affected. You can update the config
ipfsGateway
value to use a public ipfs gateway ex. https://ipfs.io/ipfs/, however your uploads will be removed at some point
The feathers server will need to connect to an ethereum node via websockets. Typically this will be a local TestRPC instance.
The configuration param blockchain.nodeUrl
is used to establish a connection. The default nodeUrl is ws://localhost:8545
-
We need to deploy any contract to that we intend to call. NOTE: The following cmd will clear the
data
dir, thus starting off in a clean state.npm run deploy:ganache
or
npm run deploy:rsk
After deploying local, make sure to copy-paste the MiniMeToken address in default.json
-
We provide an easy way to start the local web3 nodes
npm run start:network:ganache
or
npm run start:network:rsk
-
Since the node is now running, open a new terminal window and navigate to the same feathers-giveth directory.
-
Optionally open a new terminal window and start the ipfs daemon
ipfs daemon
-
Start your app
npm run start:ganache
or
npm run start:rsk
If you run into errors like wallet balance not loading, it is very likely that Ganache is stuck
netstat -vanp tcp | grep 8545
Find the process that is listening on *.8545
and 127.0.0.1.8545
and kill it with kill -9 PID
(which is in the last colomn)
If the ipfsApi
is a valid ipfs node that we can connect to, we will pin every ipfs hash that is stored in feathers. We currently do not remove any orphaned (hashes with no references in feathers) ipfs hashs. In the future we will provide a script that you can run as a cronjob to unpin any orphaned hashes.
Video tutorial walkthrough here: https://tinyurl.com/y9lx6jrl
-
Start a production server
yarn serve
Simply run yarn test
and all your tests in the test/
directory will be run.
You can control the logging level with the LOG_LEVEL
env variable. Available levels can be found at: https://github.com/winstonjs/winston/tree/2.x#logging-levels
To enable debug logging simply start the server with LOG_LEVEL=debug yarn start
Each of these services are available via rest or websockets:
campaigns
dacs
donations
donationsHistory
milestones
uploads
users
If the server is using default configurations, you can see data for any of these services through your web browser at http://localhost:3030/SERVICE_NAME
We use pm2 to manage our production servers. You can start the server using the yarn serve
cmd. You will need to create an ecosystem.config.js
file with the following contents:
module.exports = {
/**
* Application configuration section
* http://pm2.keymetrics.io/docs/usage/application-declaration/
*/
apps: [
// First application
{
name: 'feathers',
script: 'src/index.js',
log_date_format: 'YYYY-MM-DD HH:mm',
env: {
COMMON_VARIABLE: 'true',
},
env_production: {
NODE_ENV: 'production',
},
},
],
};
For more info on how to work with feathers checkout out their docs on service methods, service events, and database querying.