From 2f94e07788bcadc27a994908936c76074eb914bb Mon Sep 17 00:00:00 2001 From: Josh Harvey Date: Sun, 9 Jul 2017 00:48:15 +0300 Subject: [PATCH] use supervisor instead of pm2 for stability --- lib/blockchain/bitcoin.js | 12 +++++------- lib/blockchain/common.js | 18 +++++++++++++++++- lib/blockchain/dash.js | 12 +++++------- lib/blockchain/dashd.js | 0 lib/blockchain/do-volume.js | 5 +++++ lib/blockchain/ethereum.js | 11 ++++------- lib/blockchain/install.js | 2 +- lib/blockchain/litecoin.js | 12 +++++------- lib/blockchain/zcash.js | 9 ++++----- lib/blockchain/zcashd.js | 0 10 files changed, 46 insertions(+), 35 deletions(-) delete mode 100644 lib/blockchain/dashd.js delete mode 100644 lib/blockchain/zcashd.js diff --git a/lib/blockchain/bitcoin.js b/lib/blockchain/bitcoin.js index 988e8d7c..d8f76339 100644 --- a/lib/blockchain/bitcoin.js +++ b/lib/blockchain/bitcoin.js @@ -2,19 +2,21 @@ const fs = require('fs') const path = require('path') const coinUtils = require('../coin-utils') +const options = require('../options') const common = require('./common') module.exports = {setup} -const es = common.es +const coinRec = coinUtils.getCryptoCurrency('BTC') function setup (dataDir) { - const coinRec = coinUtils.getCryptoCurrency('BTC') common.firewall([coinRec.defaultPort]) const config = buildConfig() fs.writeFileSync(path.resolve(dataDir, coinRec.configFile), config) - setupPm2(dataDir) + const blockchainDir = options.blockchainDir + const cmd = `/usr/local/bin/${coinRec.daemon} -datadir=${blockchainDir}` + common.writeSupervisorConfig(coinRec, cmd) } function buildConfig () { @@ -27,7 +29,3 @@ keypool=10000 prune=4000 daemon=0` } - -function setupPm2 (dataDir) { - es(`pm2 start /usr/local/bin/bitcoind -- -datadir=${dataDir}`) -} diff --git a/lib/blockchain/common.js b/lib/blockchain/common.js index 75adfe5a..7c646dd2 100644 --- a/lib/blockchain/common.js +++ b/lib/blockchain/common.js @@ -2,9 +2,10 @@ const crypto = require('crypto') const os = require('os') const path = require('path') const cp = require('child_process') +const fs = require('fs') const logger = require('console-log-level')({level: 'info'}) -module.exports = {es, firewall, randomPass, fetchAndInstall, logger} +module.exports = {es, writeSupervisorConfig, firewall, randomPass, fetchAndInstall, logger} const BINARIES = { BTC: { @@ -47,6 +48,21 @@ function es (cmd) { return res.toString() } +function writeSupervisorConfig (coinRec, cmd) { + const blockchain = coinRec.code + + const supervisorConfig = `[program:${blockchain}] +command=${cmd} +autostart=true +autorestart=true +stderr_logfile=/var/log/supervisor/${blockchain}.err.log +stdout_logfile=/var/log/supervisor/${blockchain}.out.log +environment=HOME="/root" +` + + fs.writeFileSync(`/etc/supervisor/conf.d/${coinRec.code}.conf`, supervisorConfig) +} + function fetchAndInstall (crypto) { const binaries = BINARIES[crypto.cryptoCode] if (!binaries) throw new Error(`No such coin: ${crypto.code}`) diff --git a/lib/blockchain/dash.js b/lib/blockchain/dash.js index f24c4ce3..33361849 100644 --- a/lib/blockchain/dash.js +++ b/lib/blockchain/dash.js @@ -2,19 +2,21 @@ const fs = require('fs') const path = require('path') const coinUtils = require('../coin-utils') +const options = require('../options') const common = require('./common') module.exports = {setup} -const es = common.es +const coinRec = coinUtils.getCryptoCurrency('BTC') function setup (dataDir) { - const coinRec = coinUtils.getCryptoCurrency('DASH') common.firewall([coinRec.defaultPort]) const config = buildConfig() + const blockchainDir = options.blockchainDir fs.writeFileSync(path.resolve(dataDir, coinRec.configFile), config) - setupPm2(dataDir) + const cmd = `/usr/local/bin/${coinRec.daemon} -datadir=${blockchainDir}` + common.writeSupervisorConfig(coinRec, cmd) } function buildConfig () { @@ -22,7 +24,3 @@ function buildConfig () { rpcpassword=${common.randomPass()} dbcache=500` } - -function setupPm2 (dataDir) { - es(`pm2 start /usr/local/bin/dashd -- -datadir=${dataDir}`) -} diff --git a/lib/blockchain/dashd.js b/lib/blockchain/dashd.js deleted file mode 100644 index e69de29b..00000000 diff --git a/lib/blockchain/do-volume.js b/lib/blockchain/do-volume.js index 40b7f7fc..061818c0 100644 --- a/lib/blockchain/do-volume.js +++ b/lib/blockchain/do-volume.js @@ -59,6 +59,11 @@ function locateVolume () { } function prepareVolume () { + if (isMounted()) { + logger.info('Volume is already mounted.') + return true + } + const volumePath = locateVolume() if (!volumePath) return false diff --git a/lib/blockchain/ethereum.js b/lib/blockchain/ethereum.js index 89ed4249..0ee0b0b5 100644 --- a/lib/blockchain/ethereum.js +++ b/lib/blockchain/ethereum.js @@ -1,17 +1,14 @@ const coinUtils = require('../coin-utils') +const options = require('../options') const common = require('./common') module.exports = {setup} -const es = common.es - function setup (dataDir) { const coinRec = coinUtils.getCryptoCurrency('ETH') common.firewall([coinRec.defaultPort]) - setupPm2(dataDir) -} - -function setupPm2 (dataDir) { - es(`pm2 start /usr/local/bin/geth -- --datadir "${dataDir}" --cache 500`) + const blockchainDir = options.blockchainDir + const cmd = `/usr/local/bin/${coinRec.daemon} --datadir "${blockchainDir}" --cache 500` + common.writeSupervisorConfig(coinRec, cmd) } diff --git a/lib/blockchain/install.js b/lib/blockchain/install.js index 055e88d7..41fc34b2 100644 --- a/lib/blockchain/install.js +++ b/lib/blockchain/install.js @@ -51,7 +51,7 @@ function processCryptos (codes) { const selectedCryptos = _.map(code => _.find(['code', code], cryptos), codes) _.forEach(setupCrypto, selectedCryptos) - common.es('pm2 save') + common.es('sudo service supervisor restart') logger.info('Installation complete.') } diff --git a/lib/blockchain/litecoin.js b/lib/blockchain/litecoin.js index 0c66beb4..6105258d 100644 --- a/lib/blockchain/litecoin.js +++ b/lib/blockchain/litecoin.js @@ -2,19 +2,21 @@ const fs = require('fs') const path = require('path') const coinUtils = require('../coin-utils') +const options = require('../options') const common = require('./common') module.exports = {setup} -const es = common.es +const coinRec = coinUtils.getCryptoCurrency('LTC') function setup (dataDir) { - const coinRec = coinUtils.getCryptoCurrency('LTC') common.firewall([coinRec.defaultPort]) const config = buildConfig() fs.writeFileSync(path.resolve(dataDir, coinRec.configFile), config) - setupPm2(dataDir) + const blockchainDir = options.blockchainDir + const cmd = `/usr/local/bin/${coinRec.daemon} -datadir=${blockchainDir}` + common.writeSupervisorConfig(coinRec, cmd) } function buildConfig () { @@ -27,7 +29,3 @@ keypool=10000 prune=4000 daemon=0` } - -function setupPm2 (dataDir) { - es(`pm2 start /usr/local/bin/litecoind -- -datadir=${dataDir}`) -} diff --git a/lib/blockchain/zcash.js b/lib/blockchain/zcash.js index d6cf937d..1843f8e6 100644 --- a/lib/blockchain/zcash.js +++ b/lib/blockchain/zcash.js @@ -2,6 +2,7 @@ const fs = require('fs') const path = require('path') const coinUtils = require('../coin-utils') +const options = require('../options') const common = require('./common') @@ -21,7 +22,9 @@ function setup (dataDir) { logger.info('Finished fetching proofs.') const config = buildConfig() fs.writeFileSync(path.resolve(dataDir, 'zcash.conf'), config) - setupPm2(dataDir) + const blockchainDir = options.blockchainDir + const cmd = `/usr/local/bin/${coinRec.daemon} -datadir=${blockchainDir}` + common.writeSupervisorConfig(coinRec, cmd) } function buildConfig () { @@ -31,7 +34,3 @@ rpcuser=lamassuserver rpcpassword=${common.randomPass()} dbcache=500` } - -function setupPm2 (dataDir) { - es(`pm2 start /usr/local/bin/zcashd -- -datadir=${dataDir}`) -} diff --git a/lib/blockchain/zcashd.js b/lib/blockchain/zcashd.js deleted file mode 100644 index e69de29b..00000000