From e03f32ea5fc5a1393121f3d29db6f8c083f597b9 Mon Sep 17 00:00:00 2001 From: tecnovert Date: Mon, 11 Jul 2022 23:36:28 +0200 Subject: [PATCH] docker: Fix and document isolated coins config. --- Dockerfile | 2 +- basicswap/base.py | 6 +- basicswap/config.py | 4 +- basicswap/interface_xmr.py | 2 +- bin/basicswap_prepare.py | 100 +++++++++++------- bin/basicswap_run.py | 4 +- docker/production/.env | 22 ---- .../production/compose-fragments/0_start.yml | 8 +- .../compose-fragments/1_bitcoin.yml | 4 +- .../compose-fragments/1_litecoin.yml | 2 + .../compose-fragments/1_monero-wallet.yml | 2 +- docker/production/compose-fragments/2_tor.yml | 16 +++ ..._monero-daemon.yml => 8_monero-daemon.yml} | 4 +- .../compose-fragments/9_swapprepare.yml | 37 +++---- docker/production/example.env | 37 +++++-- docker/production/monero_daemon/Dockerfile | 3 +- docker/production/monero_wallet/Dockerfile | 3 +- docker/production/notes.md | 73 ++++++++++++- docker/production/swapclient/Dockerfile | 2 +- docker/production/tor/Dockerfile | 8 ++ 20 files changed, 219 insertions(+), 120 deletions(-) delete mode 100644 docker/production/.env create mode 100644 docker/production/compose-fragments/2_tor.yml rename docker/production/compose-fragments/{1_monero-daemon.yml => 8_monero-daemon.yml} (86%) create mode 100644 docker/production/tor/Dockerfile diff --git a/Dockerfile b/Dockerfile index c121e92..601241a 100644 --- a/Dockerfile +++ b/Dockerfile @@ -12,7 +12,7 @@ RUN wget -O protobuf_src.tar.gz https://github.com/protocolbuffers/protobuf/rele tar xvf protobuf_src.tar.gz && \ cd protobuf-3.21.1 && \ ./configure --prefix=/usr && \ - make install && \ + make -j$(nproc) install && \ ldconfig ARG COINCURVE_VERSION=v0.1 diff --git a/basicswap/base.py b/basicswap/base.py index 891893a..681c450 100644 --- a/basicswap/base.py +++ b/basicswap/base.py @@ -118,10 +118,12 @@ class BaseApp: return bytes(segwit_addr.decode(chainparams[coin_type][self.chain]['hrp'], addr)[1]) def callrpc(self, method, params=[], wallet=None): - return callrpc(self.coin_clients[Coins.PART]['rpcport'], self.coin_clients[Coins.PART]['rpcauth'], method, params, wallet) + cc = self.coin_clients[Coins.PART] + return callrpc(cc['rpcport'], cc['rpcauth'], method, params, wallet, cc['rpchost']) def callcoinrpc(self, coin, method, params=[], wallet=None): - return callrpc(self.coin_clients[coin]['rpcport'], self.coin_clients[coin]['rpcauth'], method, params, wallet) + cc = self.coin_clients[coin] + return callrpc(cc['rpcport'], cc['rpcauth'], method, params, wallet, cc['rpchost']) def calltx(self, cmd): bindir = self.coin_clients[Coins.PART]['bindir'] diff --git a/basicswap/config.py b/basicswap/config.py index 59fad0f..bf8533f 100644 --- a/basicswap/config.py +++ b/basicswap/config.py @@ -1,13 +1,13 @@ # -*- coding: utf-8 -*- -# Copyright (c) 2019 tecnovert +# Copyright (c) 2019-2022 tecnovert # Distributed under the MIT software license, see the accompanying # file LICENSE or http://www.opensource.org/licenses/mit-license.php. import os CONFIG_FILENAME = 'basicswap.json' -DEFAULT_DATADIR = '~/.basicswap' +BASICSWAP_DATADIR = os.getenv('BASICSWAP_DATADIR', '~/.basicswap') DEFAULT_ALLOW_CORS = False TEST_DATADIRS = os.path.expanduser(os.getenv('DATADIRS', '/tmp/basicswap')) DEFAULT_TEST_BINDIR = os.path.expanduser(os.getenv('DEFAULT_TEST_BINDIR', '~/tmp/bin')) diff --git a/basicswap/interface_xmr.py b/basicswap/interface_xmr.py index 402aae1..d676d31 100644 --- a/basicswap/interface_xmr.py +++ b/basicswap/interface_xmr.py @@ -67,7 +67,7 @@ class XMRInterface(CoinInterface): super().__init__(network) self.rpc_cb = make_xmr_rpc_func(coin_settings['rpcport'], host=coin_settings.get('rpchost', '127.0.0.1')) self.rpc_cb2 = make_xmr_rpc2_func(coin_settings['rpcport'], host=coin_settings.get('rpchost', '127.0.0.1')) # non-json endpoint - self.rpc_wallet_cb = make_xmr_wallet_rpc_func(coin_settings['walletrpcport'], coin_settings['walletrpcauth']) + self.rpc_wallet_cb = make_xmr_wallet_rpc_func(coin_settings['walletrpcport'], coin_settings['walletrpcauth'], host=coin_settings.get('walletrpchost', '127.0.0.1')) self.blocks_confirmed = coin_settings['blocks_confirmed'] self._restore_height = coin_settings.get('restore_height', 0) diff --git a/bin/basicswap_prepare.py b/bin/basicswap_prepare.py index 0ea738d..7f0d295 100755 --- a/bin/basicswap_prepare.py +++ b/bin/basicswap_prepare.py @@ -87,7 +87,7 @@ XMR_WALLET_RPC_USER = os.getenv('XMR_WALLET_RPC_USER', 'xmr_wallet_user') XMR_WALLET_RPC_PWD = os.getenv('XMR_WALLET_RPC_PWD', 'xmr_wallet_pwd') XMR_SITE_COMMIT = 'abcf12c4ccac3e48bb4ff178f18bb8a95d94b029' # Lock hashes.txt to monero version -DEFAULT_XMR_RESTORE_HEIGHT = 2245107 +DEFAULT_XMR_RESTORE_HEIGHT = int(os.getenv('DEFAULT_XMR_RESTORE_HEIGHT', 2245107)) UI_HTML_PORT = int(os.getenv('UI_HTML_PORT', 12700)) PART_ZMQ_PORT = int(os.getenv('PART_ZMQ_PORT', 20792)) @@ -125,6 +125,7 @@ TEST_ONION_LINK = toBool(os.getenv('TEST_ONION_LINK', 'false')) BITCOIN_FASTSYNC_URL = os.getenv('BITCOIN_FASTSYNC_URL', 'http://utxosets.blob.core.windows.net/public/') BITCOIN_FASTSYNC_FILE = os.getenv('BITCOIN_FASTSYNC_FILE', 'utxo-snapshot-bitcoin-mainnet-720179.tar') + use_tor_proxy = False default_socket = socket.socket @@ -461,7 +462,11 @@ def prepareDataDir(coin, settings, chain, particl_mnemonic, extra_opts={}): fp.write('restricted-rpc=1\n') if chain == 'testnet': fp.write('testnet=1\n') - fp.write('data-dir={}\n'.format(data_dir)) + config_datadir = data_dir + if core_settings['manage_daemon'] is False: + # Assume conf file is for isolated coin docker setup + config_datadir = '/data' + fp.write(f'data-dir={config_datadir}\n') fp.write('rpc-bind-port={}\n'.format(core_settings['rpcport'])) fp.write('rpc-bind-ip={}\n'.format(COINS_RPCBIND_IP)) fp.write('zmq-rpc-bind-port={}\n'.format(core_settings['zmqport'])) @@ -487,9 +492,13 @@ def prepareDataDir(coin, settings, chain, particl_mnemonic, extra_opts={}): fp.write('no-dns=1\n') fp.write('rpc-bind-port={}\n'.format(core_settings['walletrpcport'])) fp.write('rpc-bind-ip={}\n'.format(COINS_RPCBIND_IP)) - fp.write('wallet-dir={}\n'.format(os.path.join(data_dir, 'wallets'))) - fp.write('log-file={}\n'.format(os.path.join(data_dir, 'wallet.log'))) - fp.write('shared-ringdb-dir={}\n'.format(os.path.join(data_dir, 'shared-ringdb'))) + config_datadir = os.path.join(data_dir, 'wallets') + if core_settings['manage_wallet_daemon'] is False: + # Assume conf file is for isolated coin docker setup + config_datadir = '/data' + fp.write(f'wallet-dir={config_datadir}\n') + fp.write('log-file={}\n'.format(os.path.join(config_datadir, 'wallet.log'))) + fp.write('shared-ringdb-dir={}\n'.format(os.path.join(config_datadir, 'shared-ringdb'))) fp.write('rpc-login={}:{}\n'.format(core_settings['walletrpcuser'], core_settings['walletrpcpassword'])) if tor_control_password is not None: @@ -532,7 +541,7 @@ def prepareDataDir(coin, settings, chain, particl_mnemonic, extra_opts={}): fp.write('staking=0\n') if PART_RPC_USER != '': fp.write('rpcauth={}:{}${}\n'.format(PART_RPC_USER, salt, password_to_hmac(salt, PART_RPC_PWD))) - if particl_mnemonic == 'none': + if particl_mnemonic == 'auto': fp.write('createdefaultmasterkey=1') elif coin == 'litecoin': fp.write('prune=4000\n') @@ -710,13 +719,14 @@ def printHelp(): logger.info('Usage: basicswap-prepare ') logger.info('\n--help, -h Print help.') logger.info('--version, -v Print version.') - logger.info('--datadir=PATH Path to basicswap data directory, default:{}.'.format(cfg.DEFAULT_DATADIR)) + logger.info('--datadir=PATH Path to basicswap data directory, default:{}.'.format(cfg.BASICSWAP_DATADIR)) logger.info('--bindir=PATH Path to cores directory, default:datadir/bin.') logger.info('--mainnet Run in mainnet mode.') logger.info('--testnet Run in testnet mode.') logger.info('--regtest Run in regtest mode.') logger.info('--particl_mnemonic= Recovery phrase to use for the Particl wallet, default is randomly generated,\n' - + ' "none" to set autogenerate account mode.') + + ' "auto" to create a wallet automatically - No mnemonic.' + + ' "none" to disable wallet initialisation.') logger.info('--withcoin= Prepare system to run daemon for coin.') logger.info('--withoutcoin= Do not prepare system to run daemon for coin.') logger.info('--addcoin= Add coin to existing setup.') @@ -733,6 +743,7 @@ def printHelp(): logger.info('--disabletor Setup Basicswap instance to not use TOR.') logger.info('--usebtcfastsync Initialise the BTC chain with a snapshot from btcpayserver FastSync.\n' + ' See https://github.com/btcpayserver/btcpayserver-docker/blob/master/contrib/FastSync/README.md') + logger.info('--initwalletsonly Setup coin wallets only.') logger.info('\n' + 'Known coins: %s', ', '.join(known_coins.keys())) @@ -764,7 +775,6 @@ def initialise_wallets(particl_wallet_mnemonic, with_coins, data_dir, settings, for coin_name in start_daemons: coin_settings = settings['chainclients'][coin_name] c = swap_client.getCoinIdFromName(coin_name) - swap_client.setCoinConnectParams(c) if c == Coins.XMR: if coin_settings['manage_wallet_daemon']: @@ -804,7 +814,18 @@ def initialise_wallets(particl_wallet_mnemonic, with_coins, data_dir, settings, finally: for d in daemons: finalise_daemon(d) - return particl_wallet_mnemonic + + if particl_wallet_mnemonic is not None: + if particl_wallet_mnemonic: + # Print directly to stdout for tests + print('IMPORTANT - Save your particl wallet recovery phrase:\n{}\n'.format(particl_wallet_mnemonic)) + + +def load_config(config_path): + if not os.path.exists(config_path): + exitWithError('{} does not exist'.format(config_path)) + with open(config_path) as fs: + return json.load(fs) def main(): @@ -814,19 +835,20 @@ def main(): port_offset = None chain = 'mainnet' particl_wallet_mnemonic = None - prepare_bin_only = False - no_cores = False - use_containers = False with_coins = {'particl', } add_coin = '' disable_coin = '' htmlhost = '127.0.0.1' xmr_restore_height = DEFAULT_XMR_RESTORE_HEIGHT + prepare_bin_only = False + no_cores = False + use_containers = False enable_tor = False disable_tor = False tor_control_password = None use_btc_fastsync = False extract_core_overwrite = True + initwalletsonly = False for v in sys.argv[1:]: if len(v) < 2 or v[0] != '-': @@ -877,6 +899,9 @@ def main(): if name == 'usebtcfastsync': use_btc_fastsync = True continue + if name == 'initwalletsonly': + initwalletsonly = True + continue if len(s) == 2: if name == 'datadir': data_dir = os.path.expanduser(s[1].strip('"')) @@ -933,7 +958,7 @@ def main(): testOnionLink() if data_dir is None: - data_dir = os.path.join(os.path.expanduser(cfg.DEFAULT_DATADIR)) + data_dir = os.path.join(os.path.expanduser(cfg.BASICSWAP_DATADIR)) if bin_dir is None: bin_dir = os.path.join(data_dir, 'bin') @@ -1037,13 +1062,20 @@ def main(): chainclients['monero']['walletsdir'] = os.getenv('XMR_WALLETS_DIR', chainclients['monero']['datadir']) + if initwalletsonly: + logger.info('Initialising wallets') + settings = load_config(config_path) + + init_coins = settings['chainclients'].keys() + logger.info('Active coins: %s', ', '.join(init_coins)) + initialise_wallets(particl_wallet_mnemonic, init_coins, data_dir, settings, chain, use_tor_proxy) + + print('Done.') + return 0 + if enable_tor: logger.info('Enabling TOR') - - if not os.path.exists(config_path): - exitWithError('{} does not exist'.format(config_path)) - with open(config_path) as fs: - settings = json.load(fs) + settings = load_config(config_path) tor_control_password = settings.get('tor_control_password', None) if tor_control_password is None: @@ -1063,12 +1095,7 @@ def main(): if disable_tor: logger.info('Disabling TOR') - - if not os.path.exists(config_path): - exitWithError('{} does not exist'.format(config_path)) - with open(config_path) as fs: - settings = json.load(fs) - + settings = load_config(config_path) settings['use_tor'] = False for coin in settings['chainclients']: modify_tor_config(settings, coin, tor_control_password=None, enable=False) @@ -1081,10 +1108,7 @@ def main(): if disable_coin != '': logger.info('Disabling coin: %s', disable_coin) - if not os.path.exists(config_path): - exitWithError('{} does not exist'.format(config_path)) - with open(config_path) as fs: - settings = json.load(fs) + settings = load_config(config_path) if disable_coin not in settings['chainclients']: exitWithError('{} has not been prepared'.format(disable_coin)) @@ -1107,10 +1131,7 @@ def main(): if add_coin != '': logger.info('Adding coin: %s', add_coin) - if not os.path.exists(config_path): - exitWithError('{} does not exist'.format(config_path)) - with open(config_path) as fs: - settings = json.load(fs) + settings = load_config(config_path) if add_coin in settings['chainclients']: coin_settings = settings['chainclients'][add_coin] @@ -1132,7 +1153,9 @@ def main(): if not prepare_bin_only: prepareDataDir(add_coin, settings, chain, particl_wallet_mnemonic, extra_opts) - initialise_wallets(None, [add_coin, ], data_dir, settings, chain, use_tor_proxy) + + if particl_wallet_mnemonic not in ('none', 'auto'): + initialise_wallets(None, [add_coin, ], data_dir, settings, chain, use_tor_proxy) with open(config_path, 'w') as fp: json.dump(settings, fp, indent=4) @@ -1153,7 +1176,7 @@ def main(): settings = { 'debug': True, - 'zmqhost': 'tcp://127.0.0.1', + 'zmqhost': f'tcp://{PART_RPC_HOST}', 'zmqport': PART_ZMQ_PORT + port_offset, 'htmlhost': htmlhost, 'htmlport': UI_HTML_PORT + port_offset, @@ -1185,14 +1208,11 @@ def main(): with open(config_path, 'w') as fp: json.dump(settings, fp, indent=4) - if particl_wallet_mnemonic == 'none': + if particl_wallet_mnemonic in ('none', 'auto'): logger.info('Done.') return 0 - particl_wallet_mnemonic = initialise_wallets(particl_wallet_mnemonic, with_coins, data_dir, settings, chain, use_tor_proxy) - if particl_wallet_mnemonic: - # Print directly to stdout for tests - print('IMPORTANT - Save your particl wallet recovery phrase:\n{}\n'.format(particl_wallet_mnemonic)) + initialise_wallets(particl_wallet_mnemonic, with_coins, data_dir, settings, chain, use_tor_proxy) print('Done.') diff --git a/bin/basicswap_run.py b/bin/basicswap_run.py index 3506889..6b4b7b3 100755 --- a/bin/basicswap_run.py +++ b/bin/basicswap_run.py @@ -216,7 +216,7 @@ def printHelp(): logger.info('Usage: basicswap-run ') logger.info('\n--help, -h Print help.') logger.info('--version, -v Print version.') - logger.info('--datadir=PATH Path to basicswap data directory, default:{}.'.format(cfg.DEFAULT_DATADIR)) + logger.info('--datadir=PATH Path to basicswap data directory, default:{}.'.format(cfg.BASICSWAP_DATADIR)) logger.info('--mainnet Run in mainnet mode.') logger.info('--testnet Run in testnet mode.') logger.info('--regtest Run in regtest mode.') @@ -260,7 +260,7 @@ def main(): logger.warning('Unknown argument %s', v) if data_dir is None: - data_dir = os.path.join(os.path.expanduser(cfg.DEFAULT_DATADIR)) + data_dir = os.path.join(os.path.expanduser(cfg.BASICSWAP_DATADIR)) logger.info('Using datadir: %s', data_dir) logger.info('Chain: %s', chain) diff --git a/docker/production/.env b/docker/production/.env deleted file mode 100644 index fdb9e14..0000000 --- a/docker/production/.env +++ /dev/null @@ -1,22 +0,0 @@ -HTML_PORT=127.0.0.1:12700:12700 -TZ=UTC -DATA_PATH=/mnt/hdd50/docker2 - -PART_RPC_HOST=particl_core -LTC_RPC_HOST=litecoin_core -BTC_RPC_HOST=bitcoin_core - -PART_RPC_USER=particl_user -PART_RPC_PWD=particl_pwd -BTC_RPC_USER=bitcoin_user -BTC_RPC_PWD=bitcoin_pwd -LTC_RPC_USER=litecoin_user -LTC_RPC_PWD=litecoin_pwd - -PART_DATA_DIR=/data/particl -LTC_DATA_DIR=/data/litecoin -BTC_DATA_DIR=/data/bitcoin -XMR_DATA_DIR=/data/monero_daemon -XMR_WALLETS_DIR=/data/monero_wallet - -COINS_RPCBIND_IP=0.0.0.0 diff --git a/docker/production/compose-fragments/0_start.yml b/docker/production/compose-fragments/0_start.yml index 4d4943a..5d2609a 100644 --- a/docker/production/compose-fragments/0_start.yml +++ b/docker/production/compose-fragments/0_start.yml @@ -2,8 +2,7 @@ version: '3.3' networks: default: - external: - name: coinswap_network + name: coinswap_network services: particl_core: image: i_particl @@ -13,10 +12,9 @@ services: container_name: particl_core volumes: - ${DATA_PATH}/particl:/data - #ports: - # - "51738:51738" expose: - - 51735 + - ${PART_RPC_PORT} + - ${PART_ZMQ_PORT} logging: driver: "json-file" options: diff --git a/docker/production/compose-fragments/1_bitcoin.yml b/docker/production/compose-fragments/1_bitcoin.yml index 0a18417..019cd42 100644 --- a/docker/production/compose-fragments/1_bitcoin.yml +++ b/docker/production/compose-fragments/1_bitcoin.yml @@ -6,10 +6,8 @@ container_name: bitcoin_core volumes: - ${DATA_PATH}/bitcoin:/data - #ports: - # - "8333:8333" expose: - - 8332 + - ${BTC_RPC_PORT} logging: driver: "json-file" options: diff --git a/docker/production/compose-fragments/1_litecoin.yml b/docker/production/compose-fragments/1_litecoin.yml index 99f4d89..c595091 100644 --- a/docker/production/compose-fragments/1_litecoin.yml +++ b/docker/production/compose-fragments/1_litecoin.yml @@ -6,6 +6,8 @@ container_name: litecoin_core volumes: - ${DATA_PATH}/litecoin:/data + expose: + - ${LTC_RPC_PORT} logging: driver: "json-file" options: diff --git a/docker/production/compose-fragments/1_monero-wallet.yml b/docker/production/compose-fragments/1_monero-wallet.yml index 0b5b091..94c5810 100644 --- a/docker/production/compose-fragments/1_monero-wallet.yml +++ b/docker/production/compose-fragments/1_monero-wallet.yml @@ -7,7 +7,7 @@ volumes: - ${DATA_PATH}/monero_wallet:/data expose: - - 8332 + - ${BASE_XMR_WALLET_PORT} logging: driver: "json-file" options: diff --git a/docker/production/compose-fragments/2_tor.yml b/docker/production/compose-fragments/2_tor.yml new file mode 100644 index 0000000..b063ddd --- /dev/null +++ b/docker/production/compose-fragments/2_tor.yml @@ -0,0 +1,16 @@ + tor: + image: i_tor + container_name: tor + build: + context: ./tor + volumes: + - ${DATA_PATH}/tor/data:/var/lib/tor/ + - ${DATA_PATH}/tor/torrc:/etc/tor/torrc + logging: + driver: "json-file" + options: + max-size: "10m" + max-file: "5" + networks: + tor_net: + coinswap_network: 172.16.238.200 diff --git a/docker/production/compose-fragments/1_monero-daemon.yml b/docker/production/compose-fragments/8_monero-daemon.yml similarity index 86% rename from docker/production/compose-fragments/1_monero-daemon.yml rename to docker/production/compose-fragments/8_monero-daemon.yml index 355f88e..9990f65 100644 --- a/docker/production/compose-fragments/1_monero-daemon.yml +++ b/docker/production/compose-fragments/8_monero-daemon.yml @@ -6,10 +6,8 @@ container_name: monero_daemon volumes: - ${DATA_PATH}/monero_daemon:/data - #ports: - # - "18080:18080" expose: - - 8332 + - ${BASE_XMR_RPC_PORT} logging: driver: "json-file" options: diff --git a/docker/production/compose-fragments/9_swapprepare.yml b/docker/production/compose-fragments/9_swapprepare.yml index 02f2f9f..49d0f84 100644 --- a/docker/production/compose-fragments/9_swapprepare.yml +++ b/docker/production/compose-fragments/9_swapprepare.yml @@ -13,32 +13,33 @@ - ${DATA_PATH}/litecoin:/data/litecoin environment: - TZ - - PART_RPC_HOST - - LTC_RPC_HOST - - BTC_RPC_HOST - - PART_RPC_PORT - - LTC_RPC_PORT - - BTC_RPC_PORT - - XMR_RPC_HOST - - BASE_XMR_RPC_PORT - - BASE_XMR_ZMQ_PORT - - BASE_XMR_WALLET_PORT - - XMR_WALLET_RPC_HOST - - XMR_WALLET_RPC_USER - - XMR_WALLET_RPC_PWD - - DEFAULT_XMR_RESTORE_HEIGHT - UI_HTML_PORT + - COINS_RPCBIND_IP + - BASICSWAP_DATADIR + - PART_DATA_DIR + - PART_RPC_HOST - PART_ZMQ_PORT - PART_RPC_USER - PART_RPC_PWD + - PART_RPC_PORT + - BTC_DATA_DIR + - BTC_RPC_HOST + - BTC_RPC_PORT - BTC_RPC_USER - BTC_RPC_PWD + - LTC_DATA_DIR + - LTC_RPC_HOST + - LTC_RPC_PORT - LTC_RPC_USER - LTC_RPC_PWD - - PART_DATA_DIR - - LTC_DATA_DIR - - BTC_DATA_DIR - XMR_DATA_DIR + - XMR_RPC_HOST + - BASE_XMR_RPC_PORT + - BASE_XMR_ZMQ_PORT - XMR_WALLETS_DIR - - COINS_RPCBIND_IP + - XMR_WALLET_RPC_HOST + - BASE_XMR_WALLET_PORT + - XMR_WALLET_RPC_USER + - XMR_WALLET_RPC_PWD + - DEFAULT_XMR_RESTORE_HEIGHT restart: "no" diff --git a/docker/production/example.env b/docker/production/example.env index c8c9171..3608142 100644 --- a/docker/production/example.env +++ b/docker/production/example.env @@ -1,21 +1,36 @@ HTML_PORT=127.0.0.1:12700:12700 TZ=UTC -DATA_PATH=/var/swapdata/ -PART_RPC_HOST=particl_core -LTC_RPC_HOST=litecoin_core -BTC_RPC_HOST=bitcoin_core +DATA_PATH=/var/swapdata/ + +BASICSWAP_DATADIR=/data/swapclient +COINS_RPCBIND_IP=0.0.0.0 + +PART_DATA_DIR=/data/particl +PART_RPC_HOST=particl_core +PART_RPC_PORT=19792 +PART_ZMQ_PORT=20792 PART_RPC_USER=particl_user PART_RPC_PWD=particl_pwd -BTC_RPC_USER=bitcoin_user -BTC_RPC_PWD=bitcoin_pwd + +LTC_DATA_DIR=/data/litecoin +LTC_RPC_HOST=litecoin_core +LTC_RPC_PORT=19795 LTC_RPC_USER=litecoin_user LTC_RPC_PWD=litecoin_pwd -PART_DATA_DIR=/data/particl -LTC_DATA_DIR=/data/litecoin BTC_DATA_DIR=/data/bitcoin -XMR_DATA_DIR=/data/monero_daemon -XMR_WALLETS_DIR=/data/monero_wallet +BTC_RPC_HOST=bitcoin_core +BTC_RPC_PORT=19796 +BTC_RPC_USER=bitcoin_user +BTC_RPC_PWD=bitcoin_pwd -COINS_RPCBIND_IP=0.0.0.0 +XMR_DATA_DIR=/data/monero_daemon +XMR_RPC_HOST=monero_daemon +BASE_XMR_RPC_PORT=29798 + +XMR_WALLETS_DIR=/data/monero_wallet +XMR_WALLET_RPC_HOST=monero_wallet +BASE_XMR_WALLET_PORT=29998 +XMR_WALLET_RPC_USER=xmr_wallet_user +XMR_WALLET_RPC_PWD=xmr_wallet_pwd diff --git a/docker/production/monero_daemon/Dockerfile b/docker/production/monero_daemon/Dockerfile index 7bfda4f..c470e8e 100644 --- a/docker/production/monero_daemon/Dockerfile +++ b/docker/production/monero_daemon/Dockerfile @@ -21,5 +21,4 @@ VOLUME $MONERO_DATA COPY entrypoint.sh /entrypoint.sh ENTRYPOINT ["/entrypoint.sh"] -EXPOSE 18080 -CMD ["monerod", "--non-interactive", "--config-file=/home/monero/.monero/monerod.conf"] +CMD ["/monero/monerod", "--non-interactive", "--config-file=/home/monero/.monero/monerod.conf", "--confirm-external-bind"] diff --git a/docker/production/monero_wallet/Dockerfile b/docker/production/monero_wallet/Dockerfile index 043dd84..63a7bd3 100644 --- a/docker/production/monero_wallet/Dockerfile +++ b/docker/production/monero_wallet/Dockerfile @@ -13,5 +13,4 @@ VOLUME $MONERO_DATA COPY entrypoint.sh /entrypoint.sh ENTRYPOINT ["/entrypoint.sh"] -EXPOSE 18080 -CMD ["monero-wallet-rpc", "--non-interactive", "--config-file=/data/monero_wallet.conf"] +CMD ["/monero/monero-wallet-rpc", "--non-interactive", "--config-file=/data/monero_wallet.conf", "--confirm-external-bind"] diff --git a/docker/production/notes.md b/docker/production/notes.md index e7c478e..a481ce1 100644 --- a/docker/production/notes.md +++ b/docker/production/notes.md @@ -1,8 +1,16 @@ +# Split container setup + +This will setup Basicswap so that each coin runs in it's own container. Copy and edit .env config: - $ cp example.env .env + cp example.env .env + + +Set the latest Monero chain height, or the height your wallet must restore from: + + echo "DEFAULT_XMR_RESTORE_HEIGHT=$(curl https://localmonero.co/blocks/api/get_stats | jq .height)" >> .env Create docker-compose config: @@ -12,13 +20,70 @@ Create docker-compose config: # Add the relevant coin fragments cat compose-fragments/1_bitcoin.yml >> docker-compose.yml cat compose-fragments/1_litecoin.yml >> docker-compose.yml - cat compose-fragments/1_monero-daemon.yml >> docker-compose.yml cat compose-fragments/1_monero-wallet.yml >> docker-compose.yml - cat compose-fragments/8_swapclient.yml >> docker-compose.yml - # Copy for prepare script config cp docker-compose.yml docker-compose-prepare.yml cat compose-fragments/9_swapprepare.yml >> docker-compose-prepare.yml + # Add the Monero daemon if required (should not go in docker-compose-prepare.yml) + cat compose-fragments/8_monero-daemon.yml >> docker-compose.yml + # Add the swapclient + cat compose-fragments/8_swapclient.yml >> docker-compose.yml + + +Create the docker network, with a specific subnet (for optional tor use): + + docker network create coinswap_network --subnet="172.16.238.0/24" + + +Build the swapclient container: + + docker-compose build swapclient + + +Build the monero container, if required: + + docker-compose build monero_daemon + + +Build the remaining coin containers: + + docker-compose build + + +Build the prepare-only containers: + + docker-compose -f docker-compose-prepare.yml build + + +Create config files: + + # Select relevant coins: + export WITH_COINS=bitcoin,litecoin,monero + + docker-compose -f docker-compose-prepare.yml run --rm swapprepare \ + basicswap-prepare --nocores --withcoins=${WITH_COINS} --htmlhost="0.0.0.0" --particl_mnemonic=none + + +Start coin cores only: + + docker-compose -f docker-compose-prepare.yml up -d --scale swapprepare=0 + + +Initialise wallets: + + docker-compose -f docker-compose-prepare.yml run --rm swapprepare \ + basicswap-prepare --initwalletsonly + + +Stop cores: + + docker-compose -f docker-compose-prepare.yml stop + + +Start BasicSwap: + + docker-compose up + diff --git a/docker/production/swapclient/Dockerfile b/docker/production/swapclient/Dockerfile index 110e5a3..3e00b73 100644 --- a/docker/production/swapclient/Dockerfile +++ b/docker/production/swapclient/Dockerfile @@ -12,7 +12,7 @@ RUN wget -O protobuf_src.tar.gz https://github.com/protocolbuffers/protobuf/rele tar xvf protobuf_src.tar.gz && \ cd protobuf-3.21.1 && \ ./configure --prefix=/usr && \ - make install && \ + make -j$(nproc) install && \ ldconfig ARG COINCURVE_VERSION=v0.1 diff --git a/docker/production/tor/Dockerfile b/docker/production/tor/Dockerfile new file mode 100644 index 0000000..928bed7 --- /dev/null +++ b/docker/production/tor/Dockerfile @@ -0,0 +1,8 @@ +FROM alpine:latest + +# 9050 SOCKS port +# 9051 control port +# 5353 DNS port +EXPOSE 9050 9051 5353 +RUN apk add --no-cache tor +CMD tor -f /etc/tor/torrc