diff --git a/packages/dashmate/configs/defaults/getBaseConfigFactory.js b/packages/dashmate/configs/defaults/getBaseConfigFactory.js index 1c0b41813df..b8149d46fa9 100644 --- a/packages/dashmate/configs/defaults/getBaseConfigFactory.js +++ b/packages/dashmate/configs/defaults/getBaseConfigFactory.js @@ -46,7 +46,7 @@ export default function getBaseConfigFactory(homeDir) { group: null, docker: { network: { - subnet: '0.0.0.0/0', bindIp: '0.0.0.0', + subnet: '0.0.0.0/0', }, baseImage: { build: { @@ -75,9 +75,12 @@ export default function getBaseConfigFactory(homeDir) { image: 'dashpay/dashd:20', commandArgs: [], }, p2p: { - port: 9999, seeds: [], + host: '0.0.0.0', + port: 9999, + seeds: [], }, rpc: { + host: '127.0.0.1', port: 9998, user: 'dashrpc', password: 'rpcpassword', @@ -113,6 +116,7 @@ export default function getBaseConfigFactory(homeDir) { image: 'dashpay/envoy:1.22.11', }, http: { + host: '0.0.0.0', port: 443, }, rateLimiter: { @@ -167,16 +171,22 @@ export default function getBaseConfigFactory(homeDir) { image: 'dashpay/tenderdash:0.13.4', }, p2p: { - port: 26656, persistentPeers: [], seeds: [], + host: '0.0.0.0', + port: 26656, + persistentPeers: [], + seeds: [], }, rpc: { + host: '127.0.0.1', port: 26657, }, pprof: { enabled: false, port: 6060, }, metrics: { - enabled: false, port: 26660, + enabled: false, + host: '127.0.0.1', + port: 26660, }, consensus: { createEmptyBlocks: true, createEmptyBlocksInterval: '3m', diff --git a/packages/dashmate/configs/getConfigFileMigrationsFactory.js b/packages/dashmate/configs/getConfigFileMigrationsFactory.js index 988b0feec4d..a568c8caae7 100644 --- a/packages/dashmate/configs/getConfigFileMigrationsFactory.js +++ b/packages/dashmate/configs/getConfigFileMigrationsFactory.js @@ -359,6 +359,15 @@ export default function getConfigFileMigrationsFactory(homeDir, defaultConfigs) Object.entries(configFile.configs) .forEach(([, options]) => { options.platform.drive.tenderdash.docker.image = base.get('platform.drive.tenderdash.docker.image'); + + delete options.docker.network.bindIp; + + options.core.p2p.host = base.get('core.p2p.host'); + options.core.rpc.host = base.get('core.rpc.host'); + options.platform.dapi.envoy.http.host = base.get('platform.dapi.envoy.http.host'); + options.platform.drive.tenderdash.p2p.host = base.get('platform.drive.tenderdash.p2p.host'); + options.platform.drive.tenderdash.rpc.host = base.get('platform.drive.tenderdash.rpc.host'); + options.platform.drive.tenderdash.metrics.host = base.get('platform.drive.tenderdash.metrics.host'); }); return configFile; diff --git a/packages/dashmate/docker-compose.yml b/packages/dashmate/docker-compose.yml index 9be5bb23d7b..8ecff50b5b5 100644 --- a/packages/dashmate/docker-compose.yml +++ b/packages/dashmate/docker-compose.yml @@ -22,8 +22,8 @@ services: org.dashmate.service.title: "Core" restart: unless-stopped ports: - - ${DOCKER_NETWORK_BIND_IP:?err}:${CORE_P2P_PORT:?err}:${CORE_P2P_PORT:?err} # P2P - - 127.0.0.1:${CORE_RPC_PORT:?err}:${CORE_RPC_PORT:?err} #RPC + - ${CORE_P2P_HOST:?err}:${CORE_P2P_PORT:?err}:${CORE_P2P_PORT:?err} # P2P + - ${CORE_RPC_HOST:?err}:${CORE_RPC_PORT:?err}:${CORE_RPC_PORT:?err} #RPC volumes: - core_data:/home/dash - ${DASHMATE_HOME_DIR:?err}/${CONFIG_NAME:?err}/core/dash.conf:/home/dash/.dashcore/dash.conf:ro @@ -85,10 +85,10 @@ services: depends_on: - drive_abci ports: - - ${DOCKER_NETWORK_BIND_IP:?err}:${PLATFORM_DRIVE_TENDERDASH_P2P_PORT:?err}:${PLATFORM_DRIVE_TENDERDASH_P2P_PORT:?err} # P2P - - 127.0.0.1:${PLATFORM_DRIVE_TENDERDASH_RPC_PORT:?err}:${PLATFORM_DRIVE_TENDERDASH_RPC_PORT:?err} # RPC + - ${PLATFORM_DRIVE_TENDERDASH_P2P_HOST:?err}:${PLATFORM_DRIVE_TENDERDASH_P2P_PORT:?err}:${PLATFORM_DRIVE_TENDERDASH_P2P_PORT:?err} # P2P + - ${PLATFORM_DRIVE_TENDERDASH_RPC_HOST}:${PLATFORM_DRIVE_TENDERDASH_RPC_PORT:?err}:${PLATFORM_DRIVE_TENDERDASH_RPC_PORT:?err} # RPC - 127.0.0.1:${PLATFORM_DRIVE_TENDERDASH_PPROF_PORT:?err}:${PLATFORM_DRIVE_TENDERDASH_PPROF_PORT:?err} # pprof - - 127.0.0.1:${PLATFORM_DRIVE_TENDERDASH_METRICS_PORT:?err}:${PLATFORM_DRIVE_TENDERDASH_METRICS_PORT:?err} # Metrics + - ${PLATFORM_DRIVE_TENDERDASH_METRICS_HOST:?err}:${PLATFORM_DRIVE_TENDERDASH_METRICS_PORT:?err}:${PLATFORM_DRIVE_TENDERDASH_METRICS_PORT:?err} # Metrics volumes: - drive_tenderdash:/tenderdash - ${DASHMATE_HOME_DIR:?err}/${CONFIG_NAME:?err}/platform/drive/tenderdash:/tenderdash/config:ro @@ -155,7 +155,7 @@ services: org.dashmate.service.title: "DAPI Envoy" restart: unless-stopped ports: - - ${DOCKER_NETWORK_BIND_IP:?err}:${PLATFORM_DAPI_ENVOY_HTTP_PORT:?err}:10000 # JSON RPC and gRPC Web & Native + - ${PLATFORM_DAPI_ENVOY_HTTP_HOST:?err}:${PLATFORM_DAPI_ENVOY_HTTP_PORT:?err}:10000 # JSON RPC and gRPC Web & Native depends_on: - dapi_api - dapi_tx_filter_stream diff --git a/packages/dashmate/src/config/configJsonSchema.js b/packages/dashmate/src/config/configJsonSchema.js index 493762f94ee..f9518fe59c2 100644 --- a/packages/dashmate/src/config/configJsonSchema.js +++ b/packages/dashmate/src/config/configJsonSchema.js @@ -93,13 +93,9 @@ export default { subnet: { type: 'string', }, - bindIp: { - type: 'string', - format: 'ipv4', - }, }, additionalProperties: false, - required: ['subnet', 'bindIp'], + required: ['subnet'], }, baseImage: { type: 'object', @@ -168,6 +164,11 @@ export default { p2p: { type: 'object', properties: { + host: { + type: 'string', + minLength: 1, + format: 'ipv4', + }, port: { $ref: '#/definitions/port', }, @@ -189,12 +190,17 @@ export default { }, }, }, - required: ['port', 'seeds'], + required: ['host', 'port', 'seeds'], additionalProperties: false, }, rpc: { type: 'object', properties: { + host: { + type: 'string', + minLength: 1, + format: 'ipv4', + }, port: { $ref: '#/definitions/port', }, @@ -213,7 +219,7 @@ export default { }, }, }, - required: ['port', 'user', 'password'], + required: ['host', 'port', 'user', 'password'], additionalProperties: false, }, spork: { @@ -346,11 +352,16 @@ export default { http: { type: 'object', properties: { + host: { + type: 'string', + minLength: 1, + format: 'ipv4', + }, port: { $ref: '#/definitions/port', }, }, - required: ['port'], + required: ['host', 'port'], additionalProperties: false, }, rateLimiter: { @@ -501,6 +512,11 @@ export default { p2p: { type: 'object', properties: { + host: { + type: 'string', + minLength: 1, + format: 'ipv4', + }, port: { $ref: '#/definitions/port', }, @@ -517,7 +533,7 @@ export default { }, }, }, - required: ['port', 'persistentPeers', 'seeds'], + required: ['host', 'port', 'persistentPeers', 'seeds'], additionalProperties: false, }, consensus: { @@ -556,11 +572,16 @@ export default { rpc: { type: 'object', properties: { + host: { + type: 'string', + minLength: 1, + format: 'ipv4', + }, port: { $ref: '#/definitions/port', }, }, - required: ['port'], + required: ['host', 'port'], additionalProperties: false, }, pprof: { @@ -583,11 +604,16 @@ export default { enabled: { type: 'boolean', }, + host: { + type: 'string', + minLength: 1, + format: 'ipv4', + }, port: { $ref: '#/definitions/port', }, }, - required: ['enabled', 'port'], + required: ['enabled', 'host', 'port'], additionalProperties: false, }, node: { diff --git a/packages/dashmate/src/core/startCoreFactory.js b/packages/dashmate/src/core/startCoreFactory.js index bc2a980c916..71fe923e48a 100644 --- a/packages/dashmate/src/core/startCoreFactory.js +++ b/packages/dashmate/src/core/startCoreFactory.js @@ -77,7 +77,7 @@ export default function startCoreFactory( port: config.get('core.rpc.port'), user: config.get('core.rpc.user'), pass: config.get('core.rpc.password'), - host: await getConnectionHost(config, 'core'), + host: await getConnectionHost(config, 'core', 'core.rpc.host'), }, ); diff --git a/packages/dashmate/src/docker/getConnectionHostFactory.js b/packages/dashmate/src/docker/getConnectionHostFactory.js index a32e925724f..b676f15aa89 100644 --- a/packages/dashmate/src/docker/getConnectionHostFactory.js +++ b/packages/dashmate/src/docker/getConnectionHostFactory.js @@ -9,9 +9,10 @@ export default function getConnectionHostFactory(dockerCompose, isHelper) { * @typedef {function} getConnectionHost * @param {Config} config * @param {string} serviceName + * @param {string} hostConfigurationPath * @return {Promise} */ - async function getConnectionHost(config, serviceName) { + async function getConnectionHost(config, serviceName, hostConfigurationPath) { if (isHelper) { const containerInfo = await dockerCompose.inspectService(config, serviceName); @@ -21,7 +22,7 @@ export default function getConnectionHostFactory(dockerCompose, isHelper) { return containerIP; } - return '127.0.0.1'; + return config.get(hostConfigurationPath); } return getConnectionHost; diff --git a/packages/dashmate/src/helper/waitForDashmateHelperAPI.js b/packages/dashmate/src/helper/waitForDashmateHelperAPI.js index 64b99368291..98448983a8e 100644 --- a/packages/dashmate/src/helper/waitForDashmateHelperAPI.js +++ b/packages/dashmate/src/helper/waitForDashmateHelperAPI.js @@ -5,7 +5,7 @@ import wait from '../util/wait.js'; * * @typedef {waitForDashmateHelperAPI} * @param {Config} config - * @param {{maxRetries: number, delay: number}} options, default 120s + * @param {{maxRetries: number, delay: number}} [options] maxRetries default is 120s * @return {Promise} */ export default async function waitForDashmateHelperAPI(config, options = @@ -19,9 +19,12 @@ export default async function waitForDashmateHelperAPI(config, options = const { maxRetries, delay } = options; + const host = '127.0.0.1'; + const port = config.get('dashmate.helper.api.port'); + do { try { - const response = await fetch(`http://127.0.0.1:${config.get('dashmate.helper.api.port')}`, { + const response = await fetch(`http://${host}:${port}`, { headers: { 'Content-Type': 'application/json' }, method: 'POST', body: JSON.stringify({ diff --git a/packages/dashmate/src/listr/tasks/platform/waitForNodeToBeReadyTaskFactory.js b/packages/dashmate/src/listr/tasks/platform/waitForNodeToBeReadyTaskFactory.js index 8ef1c1c87b2..371097e0612 100644 --- a/packages/dashmate/src/listr/tasks/platform/waitForNodeToBeReadyTaskFactory.js +++ b/packages/dashmate/src/listr/tasks/platform/waitForNodeToBeReadyTaskFactory.js @@ -19,9 +19,10 @@ export default function waitForNodeToBeReadyTaskFactory( { title: `Wait for node ${config.getName()} to be ready`, task: async () => { + const host = config.get('platform.drive.tenderdash.rpc.host'); const port = config.get('platform.drive.tenderdash.rpc.port'); - const tenderdashRpcClient = createTenderdashRpcClient({ port }); + const tenderdashRpcClient = createTenderdashRpcClient({ host, port }); let success = false; do { diff --git a/packages/dashmate/src/listr/tasks/reindexNodeTaskFactory.js b/packages/dashmate/src/listr/tasks/reindexNodeTaskFactory.js index 716a3e488c2..e666de51980 100644 --- a/packages/dashmate/src/listr/tasks/reindexNodeTaskFactory.js +++ b/packages/dashmate/src/listr/tasks/reindexNodeTaskFactory.js @@ -117,7 +117,7 @@ export default function reindexNodeTaskFactory( port: config.get('core.rpc.port'), user: config.get('core.rpc.user'), pass: config.get('core.rpc.password'), - host: await getConnectionHost(config, 'core'), + host: await getConnectionHost(config, 'core', 'core.rpc.host'), }); const container = await getCoreContainer(config); diff --git a/packages/dashmate/src/listr/tasks/startGroupNodesTaskFactory.js b/packages/dashmate/src/listr/tasks/startGroupNodesTaskFactory.js index b1343af9495..8a923331132 100644 --- a/packages/dashmate/src/listr/tasks/startGroupNodesTaskFactory.js +++ b/packages/dashmate/src/listr/tasks/startGroupNodesTaskFactory.js @@ -72,7 +72,7 @@ export default function startGroupNodesTaskFactory( port: config.get('core.rpc.port'), user: config.get('core.rpc.user'), pass: config.get('core.rpc.password'), - host: await getConnectionHost(config, 'core'), + host: await getConnectionHost(config, 'core', 'core.rpc.host'), }); await waitForCorePeersConnected(rpcClient); diff --git a/packages/dashmate/src/listr/tasks/startNodeTaskFactory.js b/packages/dashmate/src/listr/tasks/startNodeTaskFactory.js index 25223a52406..ac2ea87a0c3 100644 --- a/packages/dashmate/src/listr/tasks/startNodeTaskFactory.js +++ b/packages/dashmate/src/listr/tasks/startNodeTaskFactory.js @@ -115,7 +115,7 @@ export default function startNodeTaskFactory( port: config.get('core.rpc.port'), user: config.get('core.rpc.user'), pass: config.get('core.rpc.password'), - host: await getConnectionHost(config, 'core'), + host: await getConnectionHost(config, 'core', 'core.rpc.host'), }); return new Observable(async (observer) => { diff --git a/packages/dashmate/src/listr/tasks/stopNodeTaskFactory.js b/packages/dashmate/src/listr/tasks/stopNodeTaskFactory.js index 634ecaeb117..9fe5f4dbda2 100644 --- a/packages/dashmate/src/listr/tasks/stopNodeTaskFactory.js +++ b/packages/dashmate/src/listr/tasks/stopNodeTaskFactory.js @@ -43,7 +43,7 @@ export default function stopNodeTaskFactory( port: config.get('core.rpc.port'), user: config.get('core.rpc.user'), pass: config.get('core.rpc.password'), - host: await getConnectionHost(config, 'core'), + host: await getConnectionHost(config, 'core', 'core.rpc.host'), }); const { result: { mediantime } } = await rpcClient.getBlockchainInfo(); diff --git a/packages/dashmate/src/status/scopes/core.js b/packages/dashmate/src/status/scopes/core.js index 7860ec69723..339e4794011 100644 --- a/packages/dashmate/src/status/scopes/core.js +++ b/packages/dashmate/src/status/scopes/core.js @@ -25,7 +25,7 @@ export default function getCoreScopeFactory( */ async function getCoreScope(config) { const network = config.get('network'); - const rpcService = config.get('core.rpc.port') ? `127.0.0.1:${config.get('core.rpc.port')}` : null; + const rpcService = `${config.get('core.rpc.host')}:${config.get('core.rpc.port')}`; const p2pService = config.get('externalIp') ? `${config.get('externalIp')}:${config.get('core.p2p.port')}` : null; const core = { @@ -78,7 +78,7 @@ export default function getCoreScopeFactory( port: config.get('core.rpc.port'), user: config.get('core.rpc.user'), pass: config.get('core.rpc.password'), - host: await getConnectionHost(config, 'core'), + host: await getConnectionHost(config, 'core', 'core.rpc.host'), }); const [mnsyncStatus, networkInfo, blockchainInfo] = await Promise.all([ diff --git a/packages/dashmate/src/status/scopes/masternode.js b/packages/dashmate/src/status/scopes/masternode.js index 67af3ecb43e..0a3cff387ae 100644 --- a/packages/dashmate/src/status/scopes/masternode.js +++ b/packages/dashmate/src/status/scopes/masternode.js @@ -19,7 +19,7 @@ export default function getMasternodeScopeFactory( port: config.get('core.rpc.port'), user: config.get('core.rpc.user'), pass: config.get('core.rpc.password'), - host: await getConnectionHost(config, 'core'), + host: await getConnectionHost(config, 'core', 'core.rpc.host'), }); const mnsyncStatus = await rpcClient.mnsync('status'); @@ -33,7 +33,7 @@ export default function getMasternodeScopeFactory( port: config.get('core.rpc.port'), user: config.get('core.rpc.user'), pass: config.get('core.rpc.password'), - host: await getConnectionHost(config, 'core'), + host: await getConnectionHost(config, 'core', 'core.rpc.host'), }); const info = { diff --git a/packages/dashmate/src/status/scopes/platform.js b/packages/dashmate/src/status/scopes/platform.js index 282c6f03be1..74d961e63c4 100644 --- a/packages/dashmate/src/status/scopes/platform.js +++ b/packages/dashmate/src/status/scopes/platform.js @@ -20,7 +20,7 @@ export default function getPlatformScopeFactory( port: config.get('core.rpc.port'), user: config.get('core.rpc.user'), pass: config.get('core.rpc.password'), - host: await getConnectionHost(config, 'core'), + host: await getConnectionHost(config, 'core', 'core.rpc.host'), }); const { @@ -86,11 +86,17 @@ export default function getPlatformScopeFactory( info.p2pPortState = p2pPortState; try { - const tenderdashHost = await getConnectionHost(config, 'drive_tenderdash'); + const tenderdashHost = await getConnectionHost( + config, + 'drive_tenderdash', + 'platform.drive.tenderdash.rpc.host', + ); + + const port = config.get('platform.drive.tenderdash.rpc.port'); const [tenderdashStatusResponse, tenderdashNetInfoResponse] = await Promise.all([ - fetch(`http://${tenderdashHost}:${config.get('platform.drive.tenderdash.rpc.port')}/status`), - fetch(`http://${tenderdashHost}:${config.get('platform.drive.tenderdash.rpc.port')}/net_info`), + fetch(`http://${tenderdashHost}:${port}/status`), + fetch(`http://${tenderdashHost}:${port}/net_info`), ]); const [tenderdashStatus, tenderdashNetInfo] = await Promise.all([ @@ -179,8 +185,9 @@ export default function getPlatformScopeFactory( const httpService = config.get('externalIp') ? `${config.get('externalIp')}:${httpPort}` : null; const p2pPort = config.get('platform.drive.tenderdash.p2p.port'); const p2pService = config.get('externalIp') ? `${config.get('externalIp')}:${p2pPort}` : null; + const rpcHost = config.get('platform.drive.tenderdash.rpc.host'); const rpcPort = config.get('platform.drive.tenderdash.rpc.port'); - const rpcService = rpcPort ? `127.0.0.1:${rpcPort}` : rpcPort; + const rpcService = `${rpcHost}:${rpcPort}`; const scope = { coreIsSynced: null, diff --git a/packages/dashmate/src/test/mock/getConfigMock.js b/packages/dashmate/src/test/mock/getConfigMock.js index 7be1e12baac..0e30ce5e0b4 100644 --- a/packages/dashmate/src/test/mock/getConfigMock.js +++ b/packages/dashmate/src/test/mock/getConfigMock.js @@ -6,10 +6,15 @@ export default function getConfigMock(sinon) { getOptions: sinon.stub(), }; + configMock.get.withArgs('core.rpc.host').returns('127.0.0.1'); + configMock.get.withArgs('docker.network.privateInterface').returns('127.0.0.1'); + configMock.get.withArgs('docker.network.privateInterface').returns('127.0.0.1'); configMock.get.withArgs('platform.dapi.envoy.http.port').returns('8100'); configMock.get.withArgs('externalIp').returns('127.0.0.1'); configMock.get.withArgs('platform.drive.tenderdash.p2p.port').returns('8101'); + configMock.get.withArgs('platform.dapi.envoy.http.host').returns('0.0.0.0'); configMock.get.withArgs('platform.dapi.envoy.http.port').returns('8102'); + configMock.get.withArgs('platform.drive.tenderdash.rpc.host').returns('127.0.0.1'); configMock.get.withArgs('platform.drive.tenderdash.rpc.port').returns('8103'); configMock.get.withArgs('platform.enable').returns(true); configMock.get.withArgs('core.log.file.path').returns('/Users/user/.dashmate/logs/base/core.log'); diff --git a/packages/dashmate/test/e2e/testnetEvonode.spec.js b/packages/dashmate/test/e2e/testnetEvonode.spec.js index b1c9410aef3..efabb10553e 100644 --- a/packages/dashmate/test/e2e/testnetEvonode.spec.js +++ b/packages/dashmate/test/e2e/testnetEvonode.spec.js @@ -127,6 +127,7 @@ describe('Testnet Evonode', function main() { describe('sync', () => { it('should sync Dash Core', async () => { const coreRpcClient = createRpcClient({ + host: config.get('core.rpc.host'), port: config.get('core.rpc.port'), user: config.get('core.rpc.user'), pass: config.get('core.rpc.password'), diff --git a/packages/dashmate/test/e2e/testnetFullnode.spec.js b/packages/dashmate/test/e2e/testnetFullnode.spec.js index 78f0653b331..147b9d820d2 100644 --- a/packages/dashmate/test/e2e/testnetFullnode.spec.js +++ b/packages/dashmate/test/e2e/testnetFullnode.spec.js @@ -120,6 +120,7 @@ describe('Testnet Fullnode', function main() { describe('sync', () => { it('should sync Dash Core', async () => { const coreRpcClient = createRpcClient({ + host: config.get('core.rpc.host'), port: config.get('core.rpc.port'), user: config.get('core.rpc.user'), pass: config.get('core.rpc.password'), diff --git a/packages/dashmate/test/unit/commands/config/set.spec.js b/packages/dashmate/test/unit/commands/config/set.spec.js index ca378fbedcb..94089cb9a77 100644 --- a/packages/dashmate/test/unit/commands/config/set.spec.js +++ b/packages/dashmate/test/unit/commands/config/set.spec.js @@ -87,7 +87,7 @@ describe('Config set command', () => { await command.runWithDependencies({ option: 'docker.network', - value: '{"subnet":"127.0.0.1/24", "bindIp": "0.0.0.0"}', + value: '{"subnet":"127.0.0.1/24"}', }, flags, config); });