From 9a3df9c18547f8f594a75ca36cef40b8e483ef7a Mon Sep 17 00:00:00 2001 From: Ivan Shumkov Date: Mon, 11 Dec 2023 19:27:34 +0700 Subject: [PATCH 1/2] feat(dashmate)!: configure private interface --- .../configs/defaults/getBaseConfigFactory.js | 4 +++- .../configs/getConfigFileMigrationsFactory.js | 12 ++++++++++++ packages/dashmate/docker-compose.insight_api.yml | 2 +- packages/dashmate/docker-compose.insight_ui.yml | 2 +- packages/dashmate/docker-compose.yml | 16 ++++++++-------- packages/dashmate/src/config/configJsonSchema.js | 8 ++++++-- .../src/docker/getConnectionHostFactory.js | 2 +- .../src/helper/waitForDashmateHelperAPI.js | 7 +++++-- .../platform/waitForNodeToBeReadyTaskFactory.js | 3 ++- packages/dashmate/src/status/scopes/core.js | 2 +- packages/dashmate/src/status/scopes/platform.js | 3 ++- packages/dashmate/src/test/mock/getConfigMock.js | 1 + .../dashmate/test/e2e/testnetEvonode.spec.js | 1 + .../dashmate/test/e2e/testnetFullnode.spec.js | 1 + .../test/unit/commands/config/set.spec.js | 2 +- .../test/unit/status/scopes/core.spec.js | 1 + 16 files changed, 47 insertions(+), 20 deletions(-) diff --git a/packages/dashmate/configs/defaults/getBaseConfigFactory.js b/packages/dashmate/configs/defaults/getBaseConfigFactory.js index d5c91747cc7..81d4920401a 100644 --- a/packages/dashmate/configs/defaults/getBaseConfigFactory.js +++ b/packages/dashmate/configs/defaults/getBaseConfigFactory.js @@ -46,7 +46,9 @@ 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', + privateInterface: '127.0.0.1', + publicInterface: '0.0.0.0', }, baseImage: { build: { diff --git a/packages/dashmate/configs/getConfigFileMigrationsFactory.js b/packages/dashmate/configs/getConfigFileMigrationsFactory.js index 0cea1fee872..3b46472a237 100644 --- a/packages/dashmate/configs/getConfigFileMigrationsFactory.js +++ b/packages/dashmate/configs/getConfigFileMigrationsFactory.js @@ -355,6 +355,18 @@ export default function getConfigFileMigrationsFactory(homeDir, defaultConfigs) return configFile; }, + '0.25.16-rc.7': (configFile) => { + Object.entries(configFile.configs) + .forEach(([, options]) => { + if (options.docker.network.bindIp) { + options.docker.network.publicInterface = options.docker.network.bindIp; + options.docker.network.privateInterface = base.get('docker.network.privateInterface'); + delete options.docker.network.bindIp; + } + }); + + return configFile; + }, }; } diff --git a/packages/dashmate/docker-compose.insight_api.yml b/packages/dashmate/docker-compose.insight_api.yml index ad05c7e4d79..af6e17f1bf8 100644 --- a/packages/dashmate/docker-compose.insight_api.yml +++ b/packages/dashmate/docker-compose.insight_api.yml @@ -7,7 +7,7 @@ services: org.dashmate.service.title: "Core Insight API" restart: unless-stopped ports: - - 127.0.0.1:${CORE_INSIGHT_PORT:?err}:${CORE_INSIGHT_PORT:?err} + - ${DOCKER_NETWORK_PRIVATE_INTERFACE:?err}:${CORE_INSIGHT_PORT:?err}:${CORE_INSIGHT_PORT:?err} depends_on: - core volumes: diff --git a/packages/dashmate/docker-compose.insight_ui.yml b/packages/dashmate/docker-compose.insight_ui.yml index 1d958caa23c..afa14a506e2 100644 --- a/packages/dashmate/docker-compose.insight_ui.yml +++ b/packages/dashmate/docker-compose.insight_ui.yml @@ -7,7 +7,7 @@ services: org.dashmate.service.title: "Core Insight UI" restart: unless-stopped ports: - - 127.0.0.1:${CORE_INSIGHT_PORT:?err}:${CORE_INSIGHT_PORT:?err} + - ${DOCKER_NETWORK_PRIVATE_INTERFACE:?err}:${CORE_INSIGHT_PORT:?err}:${CORE_INSIGHT_PORT:?err} depends_on: - core volumes: diff --git a/packages/dashmate/docker-compose.yml b/packages/dashmate/docker-compose.yml index 0702a1716e3..aff922e7b70 100644 --- a/packages/dashmate/docker-compose.yml +++ b/packages/dashmate/docker-compose.yml @@ -10,7 +10,7 @@ services: - LOCAL_UID=${LOCAL_UID:?err} - LOCAL_GID=${LOCAL_GID:?err} ports: - - 127.0.0.1:${DASHMATE_HELPER_API_PORT:?err}:${DASHMATE_HELPER_API_PORT:?err} + - ${DOCKER_NETWORK_PRIVATE_INTERFACE:?err}:${DASHMATE_HELPER_API_PORT:?err}:${DASHMATE_HELPER_API_PORT:?err} command: yarn workspace dashmate helper ${CONFIG_NAME:?err} volumes: - ${DASHMATE_HOME_DIR:?err}:/home/dashmate/.dashmate @@ -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 + - ${DOCKER_NETWORK_PUBLIC_INTERFACE:?err}:${CORE_P2P_PORT:?err}:${CORE_P2P_PORT:?err} # P2P + - ${DOCKER_NETWORK_PRIVATE_INTERFACE:?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 - - 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 + - ${DOCKER_NETWORK_PUBLIC_INTERFACE:?err}:${PLATFORM_DRIVE_TENDERDASH_P2P_PORT:?err}:${PLATFORM_DRIVE_TENDERDASH_P2P_PORT:?err} # P2P + - ${DOCKER_NETWORK_PRIVATE_INTERFACE:?err}:${PLATFORM_DRIVE_TENDERDASH_RPC_PORT:?err}:${PLATFORM_DRIVE_TENDERDASH_RPC_PORT:?err} # RPC + - ${DOCKER_NETWORK_PRIVATE_INTERFACE:?err}:${PLATFORM_DRIVE_TENDERDASH_PPROF_PORT:?err}:${PLATFORM_DRIVE_TENDERDASH_PPROF_PORT:?err} # pprof + - ${DOCKER_NETWORK_PRIVATE_INTERFACE:?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 + - ${DOCKER_NETWORK_PUBLIC_INTERFACE:?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..50343ee3aab 100644 --- a/packages/dashmate/src/config/configJsonSchema.js +++ b/packages/dashmate/src/config/configJsonSchema.js @@ -93,13 +93,17 @@ export default { subnet: { type: 'string', }, - bindIp: { + publicInterface: { + type: 'string', + format: 'ipv4', + }, + privateInterface: { type: 'string', format: 'ipv4', }, }, additionalProperties: false, - required: ['subnet', 'bindIp'], + required: ['subnet', 'privateInterface', 'publicInterface'], }, baseImage: { type: 'object', diff --git a/packages/dashmate/src/docker/getConnectionHostFactory.js b/packages/dashmate/src/docker/getConnectionHostFactory.js index a32e925724f..04e44114a60 100644 --- a/packages/dashmate/src/docker/getConnectionHostFactory.js +++ b/packages/dashmate/src/docker/getConnectionHostFactory.js @@ -21,7 +21,7 @@ export default function getConnectionHostFactory(dockerCompose, isHelper) { return containerIP; } - return '127.0.0.1'; + return config.get('docker.network.privateInterface'); } return getConnectionHost; diff --git a/packages/dashmate/src/helper/waitForDashmateHelperAPI.js b/packages/dashmate/src/helper/waitForDashmateHelperAPI.js index 64b99368291..68033e70ebc 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 = config.get('docker.network.privateInterface'); + 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..61aa1b3fdd2 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('docker.network.privateInterface'); 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/status/scopes/core.js b/packages/dashmate/src/status/scopes/core.js index 7860ec69723..21338be68ef 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('docker.network.privateInterface')}:${config.get('core.rpc.port')}`; const p2pService = config.get('externalIp') ? `${config.get('externalIp')}:${config.get('core.p2p.port')}` : null; const core = { diff --git a/packages/dashmate/src/status/scopes/platform.js b/packages/dashmate/src/status/scopes/platform.js index 282c6f03be1..4c204302331 100644 --- a/packages/dashmate/src/status/scopes/platform.js +++ b/packages/dashmate/src/status/scopes/platform.js @@ -179,8 +179,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('docker.network.privateInterface'); 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..9160d03504d 100644 --- a/packages/dashmate/src/test/mock/getConfigMock.js +++ b/packages/dashmate/src/test/mock/getConfigMock.js @@ -6,6 +6,7 @@ export default function getConfigMock(sinon) { getOptions: sinon.stub(), }; + 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'); diff --git a/packages/dashmate/test/e2e/testnetEvonode.spec.js b/packages/dashmate/test/e2e/testnetEvonode.spec.js index 4489183ef52..5f11782bbc6 100644 --- a/packages/dashmate/test/e2e/testnetEvonode.spec.js +++ b/packages/dashmate/test/e2e/testnetEvonode.spec.js @@ -142,6 +142,7 @@ describe('Testnet Evonode', function main() { describe('sync', () => { it('should sync Dash Core', async () => { const coreRpcClient = createRpcClient({ + host: config.get('docker.network.privateInterface'), 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 edca8322f53..5a6880432c3 100644 --- a/packages/dashmate/test/e2e/testnetFullnode.spec.js +++ b/packages/dashmate/test/e2e/testnetFullnode.spec.js @@ -135,6 +135,7 @@ describe('Testnet Fullnode', function main() { describe('sync', () => { it('should sync Dash Core', async () => { const coreRpcClient = createRpcClient({ + host: config.get('docker.network.privateInterface'), 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..32d35062e9c 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", "publicInterface": "0.0.0.0", "privateInterface": "127.0.0.1"}', }, flags, config); }); diff --git a/packages/dashmate/test/unit/status/scopes/core.spec.js b/packages/dashmate/test/unit/status/scopes/core.spec.js index b9c5c0de55f..90cec20bdb7 100644 --- a/packages/dashmate/test/unit/status/scopes/core.spec.js +++ b/packages/dashmate/test/unit/status/scopes/core.spec.js @@ -41,6 +41,7 @@ describe('getCoreScopeFactory', () => { config = getConfigMock(this.sinon); + config.get.withArgs('docker.network.privateInterface').returns('127.0.0.1'); config.get.withArgs('network').returns('testnet'); config.get.withArgs('core.rpc.port').returns('8080'); config.get.withArgs('core.p2p.port').returns('8081'); From 719dfc3b7881b9f76cd7bee8f605a619be76e8fd Mon Sep 17 00:00:00 2001 From: Ivan Shumkov Date: Mon, 11 Dec 2023 22:49:50 +0700 Subject: [PATCH 2/2] chore: more granular configuration --- .../configs/defaults/getBaseConfigFactory.js | 18 +++++-- .../configs/getConfigFileMigrationsFactory.js | 13 +++-- .../dashmate/docker-compose.insight_api.yml | 2 +- .../dashmate/docker-compose.insight_ui.yml | 2 +- packages/dashmate/docker-compose.yml | 16 +++--- .../dashmate/src/config/configJsonSchema.js | 52 +++++++++++++------ .../dashmate/src/core/startCoreFactory.js | 2 +- .../src/docker/getConnectionHostFactory.js | 5 +- .../src/helper/waitForDashmateHelperAPI.js | 2 +- .../waitForNodeToBeReadyTaskFactory.js | 2 +- .../src/listr/tasks/reindexNodeTaskFactory.js | 2 +- .../listr/tasks/startGroupNodesTaskFactory.js | 2 +- .../src/listr/tasks/startNodeTaskFactory.js | 2 +- .../src/listr/tasks/stopNodeTaskFactory.js | 2 +- packages/dashmate/src/status/scopes/core.js | 4 +- .../dashmate/src/status/scopes/masternode.js | 4 +- .../dashmate/src/status/scopes/platform.js | 16 ++++-- .../dashmate/src/test/mock/getConfigMock.js | 4 ++ .../dashmate/test/e2e/testnetEvonode.spec.js | 2 +- .../dashmate/test/e2e/testnetFullnode.spec.js | 2 +- .../test/unit/commands/config/set.spec.js | 2 +- .../test/unit/status/scopes/core.spec.js | 1 - 22 files changed, 100 insertions(+), 57 deletions(-) diff --git a/packages/dashmate/configs/defaults/getBaseConfigFactory.js b/packages/dashmate/configs/defaults/getBaseConfigFactory.js index 81d4920401a..d8330771553 100644 --- a/packages/dashmate/configs/defaults/getBaseConfigFactory.js +++ b/packages/dashmate/configs/defaults/getBaseConfigFactory.js @@ -47,8 +47,6 @@ export default function getBaseConfigFactory(homeDir) { docker: { network: { subnet: '0.0.0.0/0', - privateInterface: '127.0.0.1', - publicInterface: '0.0.0.0', }, baseImage: { build: { @@ -77,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', @@ -115,6 +116,7 @@ export default function getBaseConfigFactory(homeDir) { image: 'dashpay/envoy:1.22.11', }, http: { + host: '0.0.0.0', port: 443, }, rateLimiter: { @@ -169,16 +171,22 @@ export default function getBaseConfigFactory(homeDir) { image: 'dashpay/tenderdash:0.13.3', }, 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 3b46472a237..b0bb5eb46da 100644 --- a/packages/dashmate/configs/getConfigFileMigrationsFactory.js +++ b/packages/dashmate/configs/getConfigFileMigrationsFactory.js @@ -358,11 +358,14 @@ export default function getConfigFileMigrationsFactory(homeDir, defaultConfigs) '0.25.16-rc.7': (configFile) => { Object.entries(configFile.configs) .forEach(([, options]) => { - if (options.docker.network.bindIp) { - options.docker.network.publicInterface = options.docker.network.bindIp; - options.docker.network.privateInterface = base.get('docker.network.privateInterface'); - delete options.docker.network.bindIp; - } + 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.insight_api.yml b/packages/dashmate/docker-compose.insight_api.yml index af6e17f1bf8..ad05c7e4d79 100644 --- a/packages/dashmate/docker-compose.insight_api.yml +++ b/packages/dashmate/docker-compose.insight_api.yml @@ -7,7 +7,7 @@ services: org.dashmate.service.title: "Core Insight API" restart: unless-stopped ports: - - ${DOCKER_NETWORK_PRIVATE_INTERFACE:?err}:${CORE_INSIGHT_PORT:?err}:${CORE_INSIGHT_PORT:?err} + - 127.0.0.1:${CORE_INSIGHT_PORT:?err}:${CORE_INSIGHT_PORT:?err} depends_on: - core volumes: diff --git a/packages/dashmate/docker-compose.insight_ui.yml b/packages/dashmate/docker-compose.insight_ui.yml index afa14a506e2..1d958caa23c 100644 --- a/packages/dashmate/docker-compose.insight_ui.yml +++ b/packages/dashmate/docker-compose.insight_ui.yml @@ -7,7 +7,7 @@ services: org.dashmate.service.title: "Core Insight UI" restart: unless-stopped ports: - - ${DOCKER_NETWORK_PRIVATE_INTERFACE:?err}:${CORE_INSIGHT_PORT:?err}:${CORE_INSIGHT_PORT:?err} + - 127.0.0.1:${CORE_INSIGHT_PORT:?err}:${CORE_INSIGHT_PORT:?err} depends_on: - core volumes: diff --git a/packages/dashmate/docker-compose.yml b/packages/dashmate/docker-compose.yml index aff922e7b70..858f1ac3902 100644 --- a/packages/dashmate/docker-compose.yml +++ b/packages/dashmate/docker-compose.yml @@ -10,7 +10,7 @@ services: - LOCAL_UID=${LOCAL_UID:?err} - LOCAL_GID=${LOCAL_GID:?err} ports: - - ${DOCKER_NETWORK_PRIVATE_INTERFACE:?err}:${DASHMATE_HELPER_API_PORT:?err}:${DASHMATE_HELPER_API_PORT:?err} + - 127.0.0.1:${DASHMATE_HELPER_API_PORT:?err}:${DASHMATE_HELPER_API_PORT:?err} command: yarn workspace dashmate helper ${CONFIG_NAME:?err} volumes: - ${DASHMATE_HOME_DIR:?err}:/home/dashmate/.dashmate @@ -22,8 +22,8 @@ services: org.dashmate.service.title: "Core" restart: unless-stopped ports: - - ${DOCKER_NETWORK_PUBLIC_INTERFACE:?err}:${CORE_P2P_PORT:?err}:${CORE_P2P_PORT:?err} # P2P - - ${DOCKER_NETWORK_PRIVATE_INTERFACE:?err}:${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_PUBLIC_INTERFACE:?err}:${PLATFORM_DRIVE_TENDERDASH_P2P_PORT:?err}:${PLATFORM_DRIVE_TENDERDASH_P2P_PORT:?err} # P2P - - ${DOCKER_NETWORK_PRIVATE_INTERFACE:?err}:${PLATFORM_DRIVE_TENDERDASH_RPC_PORT:?err}:${PLATFORM_DRIVE_TENDERDASH_RPC_PORT:?err} # RPC - - ${DOCKER_NETWORK_PRIVATE_INTERFACE:?err}:${PLATFORM_DRIVE_TENDERDASH_PPROF_PORT:?err}:${PLATFORM_DRIVE_TENDERDASH_PPROF_PORT:?err} # pprof - - ${DOCKER_NETWORK_PRIVATE_INTERFACE:?err}:${PLATFORM_DRIVE_TENDERDASH_METRICS_PORT:?err}:${PLATFORM_DRIVE_TENDERDASH_METRICS_PORT:?err} # Metrics + - ${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 + - ${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_PUBLIC_INTERFACE:?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 50343ee3aab..f9518fe59c2 100644 --- a/packages/dashmate/src/config/configJsonSchema.js +++ b/packages/dashmate/src/config/configJsonSchema.js @@ -93,17 +93,9 @@ export default { subnet: { type: 'string', }, - publicInterface: { - type: 'string', - format: 'ipv4', - }, - privateInterface: { - type: 'string', - format: 'ipv4', - }, }, additionalProperties: false, - required: ['subnet', 'privateInterface', 'publicInterface'], + required: ['subnet'], }, baseImage: { type: 'object', @@ -172,6 +164,11 @@ export default { p2p: { type: 'object', properties: { + host: { + type: 'string', + minLength: 1, + format: 'ipv4', + }, port: { $ref: '#/definitions/port', }, @@ -193,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', }, @@ -217,7 +219,7 @@ export default { }, }, }, - required: ['port', 'user', 'password'], + required: ['host', 'port', 'user', 'password'], additionalProperties: false, }, spork: { @@ -350,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: { @@ -505,6 +512,11 @@ export default { p2p: { type: 'object', properties: { + host: { + type: 'string', + minLength: 1, + format: 'ipv4', + }, port: { $ref: '#/definitions/port', }, @@ -521,7 +533,7 @@ export default { }, }, }, - required: ['port', 'persistentPeers', 'seeds'], + required: ['host', 'port', 'persistentPeers', 'seeds'], additionalProperties: false, }, consensus: { @@ -560,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: { @@ -587,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 04e44114a60..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 config.get('docker.network.privateInterface'); + return config.get(hostConfigurationPath); } return getConnectionHost; diff --git a/packages/dashmate/src/helper/waitForDashmateHelperAPI.js b/packages/dashmate/src/helper/waitForDashmateHelperAPI.js index 68033e70ebc..98448983a8e 100644 --- a/packages/dashmate/src/helper/waitForDashmateHelperAPI.js +++ b/packages/dashmate/src/helper/waitForDashmateHelperAPI.js @@ -19,7 +19,7 @@ export default async function waitForDashmateHelperAPI(config, options = const { maxRetries, delay } = options; - const host = config.get('docker.network.privateInterface'); + const host = '127.0.0.1'; const port = config.get('dashmate.helper.api.port'); do { diff --git a/packages/dashmate/src/listr/tasks/platform/waitForNodeToBeReadyTaskFactory.js b/packages/dashmate/src/listr/tasks/platform/waitForNodeToBeReadyTaskFactory.js index 61aa1b3fdd2..371097e0612 100644 --- a/packages/dashmate/src/listr/tasks/platform/waitForNodeToBeReadyTaskFactory.js +++ b/packages/dashmate/src/listr/tasks/platform/waitForNodeToBeReadyTaskFactory.js @@ -19,7 +19,7 @@ export default function waitForNodeToBeReadyTaskFactory( { title: `Wait for node ${config.getName()} to be ready`, task: async () => { - const host = config.get('docker.network.privateInterface'); + const host = config.get('platform.drive.tenderdash.rpc.host'); const port = config.get('platform.drive.tenderdash.rpc.port'); const tenderdashRpcClient = createTenderdashRpcClient({ host, port }); 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 21338be68ef..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('docker.network.privateInterface')}:${config.get('core.rpc.port')}`; + 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 4c204302331..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,7 +185,7 @@ 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('docker.network.privateInterface'); + const rpcHost = config.get('platform.drive.tenderdash.rpc.host'); const rpcPort = config.get('platform.drive.tenderdash.rpc.port'); const rpcService = `${rpcHost}:${rpcPort}`; diff --git a/packages/dashmate/src/test/mock/getConfigMock.js b/packages/dashmate/src/test/mock/getConfigMock.js index 9160d03504d..0e30ce5e0b4 100644 --- a/packages/dashmate/src/test/mock/getConfigMock.js +++ b/packages/dashmate/src/test/mock/getConfigMock.js @@ -6,11 +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 5f11782bbc6..18620462acb 100644 --- a/packages/dashmate/test/e2e/testnetEvonode.spec.js +++ b/packages/dashmate/test/e2e/testnetEvonode.spec.js @@ -142,7 +142,7 @@ describe('Testnet Evonode', function main() { describe('sync', () => { it('should sync Dash Core', async () => { const coreRpcClient = createRpcClient({ - host: config.get('docker.network.privateInterface'), + 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 5a6880432c3..dde03c4fa5c 100644 --- a/packages/dashmate/test/e2e/testnetFullnode.spec.js +++ b/packages/dashmate/test/e2e/testnetFullnode.spec.js @@ -135,7 +135,7 @@ describe('Testnet Fullnode', function main() { describe('sync', () => { it('should sync Dash Core', async () => { const coreRpcClient = createRpcClient({ - host: config.get('docker.network.privateInterface'), + 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 32d35062e9c..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", "publicInterface": "0.0.0.0", "privateInterface": "127.0.0.1"}', + value: '{"subnet":"127.0.0.1/24"}', }, flags, config); }); diff --git a/packages/dashmate/test/unit/status/scopes/core.spec.js b/packages/dashmate/test/unit/status/scopes/core.spec.js index 90cec20bdb7..b9c5c0de55f 100644 --- a/packages/dashmate/test/unit/status/scopes/core.spec.js +++ b/packages/dashmate/test/unit/status/scopes/core.spec.js @@ -41,7 +41,6 @@ describe('getCoreScopeFactory', () => { config = getConfigMock(this.sinon); - config.get.withArgs('docker.network.privateInterface').returns('127.0.0.1'); config.get.withArgs('network').returns('testnet'); config.get.withArgs('core.rpc.port').returns('8080'); config.get.withArgs('core.p2p.port').returns('8081');