diff --git a/conf/.password_verification b/conf/.password_verification new file mode 100644 index 0000000000..d772f9f2fa --- /dev/null +++ b/conf/.password_verification @@ -0,0 +1 @@ +7b2263727970746f223a207b22636970686572223a20226165732d3132382d637472222c2022636970686572706172616d73223a207b226976223a20223734366663643536643936326439633863373838623637346466623761323964227d2c202263697068657274657874223a20226362326532323838363637356630616232636164222c20226b6466223a202270626b646632222c20226b6466706172616d73223a207b2263223a20313030303030302c2022646b6c656e223a2033322c2022707266223a2022686d61632d736861323536222c202273616c74223a20223064633136356230333037383937373665363534323931343761376263643233227d2c20226d6163223a202262373566636239353763346130613138353464623032663364383932643161343461326339663234353739313432663232393932303734643666646661396433227d2c202276657273696f6e223a20332c2022616c696173223a2022227d \ No newline at end of file diff --git a/conf/conf_client.yml b/conf/conf_client.yml new file mode 100644 index 0000000000..b4243b6937 --- /dev/null +++ b/conf/conf_client.yml @@ -0,0 +1,195 @@ +#################################### +### client_config_map config ### +#################################### + +instance_id: a459a96f1ec053bf4247a9ef452480a001f4d909 + +# Fetch trading pairs from all exchanges if True, otherwise fetch only from connected exchanges. +fetch_pairs_from_all_exchanges: false + +log_level: INFO + +debug_console: false + +strategy_report_interval: 900.0 + +logger_override_whitelist: +- hummingbot.strategy.arbitrage +- hummingbot.strategy.cross_exchange_market_making +- conf + +log_file_path: /home/hummingbot/logs + +kill_switch_mode: {} + +# What to auto-fill in the prompt after each import command (start/config) +autofill_import: disabled + +telegram_mode: {} + +# MQTT Bridge configuration. +mqtt_bridge: + mqtt_host: localhost + mqtt_port: 1883 + mqtt_username: '' + mqtt_password: '' + mqtt_namespace: hbot + mqtt_ssl: false + mqtt_logger: true + mqtt_notifier: true + mqtt_commands: true + mqtt_events: true + mqtt_external_events: true + mqtt_autostart: false + +# Error log sharing +send_error_logs: true + +# Can store the previous strategy ran for quick retrieval. +previous_strategy: null + +# Advanced database options, currently supports SQLAlchemy's included dialects +# Reference: https://docs.sqlalchemy.org/en/13/dialects/ +# To use an instance of SQLite DB the required configuration is +# db_engine: sqlite +# To use a DBMS the required configuration is +# db_host: 127.0.0.1 +# db_port: 3306 +# db_username: username +# db_password: password +# db_name: dbname +db_mode: + db_engine: sqlite + +# Balance Limit Configurations +# e.g. Setting USDT and BTC limits on Binance. +# balance_asset_limit: +# binance: +# BTC: 0.1 +# USDT: 1000 +balance_asset_limit: + coinbase_advanced_trade: {} + gate_io: {} + dexalot: {} + ascend_ex: {} + vertex_testnet: {} + bybit: {} + bybit_testnet: {} + polkadex: {} + bitfinex: {} + okx: {} + vertex: {} + hashkey: {} + hashkey_global_testnet: {} + cube: {} + binance: {} + tegro: {} + kraken: {} + injective_v2: {} + ndax_testnet: {} + binance_us: {} + tegro_testnet: {} + htx: {} + bitrue: {} + bitstamp: {} + kucoin: {} + xrpl: {} + btc_markets: {} + foxbit: {} + mexc: {} + ndax: {} + kucoin_hft: {} + bitmart: {} + +# Fixed gas price (in Gwei) for Ethereum transactions +manual_gas_price: 50.0 + +# Gateway API Configurations +# default host to only use localhost +# Port need to match the final installation port for Gateway +gateway: + gateway_api_host: localhost + gateway_api_port: '15888' + +certs_path: /home/hummingbot/certs + +# Whether to enable aggregated order and trade data collection +anonymized_metrics_mode: + anonymized_metrics_interval_min: 15.0 + +# Command Shortcuts +# Define abbreviations for often used commands +# or batch grouped commands together +command_shortcuts: +- command: spreads + help: Set bid and ask spread + arguments: + - Bid Spread + - Ask Spread + output: + - config bid_spread $1 + - config ask_spread $2 + +# A source for rate oracle, currently ascend_ex, binance, binance_us, coin_gecko, coin_cap, dexalot, kucoin, gate_io, coinbase_advanced_trade, cube +rate_oracle_source: + name: binance + +# A universal token which to display tokens values in, e.g. USD,EUR,BTC +global_token: + global_token_name: USDT + global_token_symbol: $ + +# Percentage of API rate limits (on any exchange and any end point) allocated to this bot instance. +# Enter 50 to indicate 50%. E.g. if the API rate limit is 100 calls per second, and you allocate +# 50% to this setting, the bot will have a maximum (limit) of 50 calls per second +rate_limits_share_pct: 100.0 + +commands_timeout: + create_command_timeout: 10.0 + other_commands_timeout: 30.0 + +# Tabulate table format style (https://github.com/astanin/python-tabulate#table-format) +tables_format: psql + +paper_trade: + paper_trade_exchanges: + - binance + - kucoin + - kraken + - gate_io + paper_trade_account_balance: + BTC: 1.0 + USDT: 100000.0 + USDC: 100000.0 + ETH: 20.0 + WETH: 20.0 + SOL: 100.0 + DOGE: 1000000.0 + HBOT: 10000000.0 + +color: + top_pane: '#000000' + bottom_pane: '#000000' + output_pane: '#262626' + input_pane: '#1C1C1C' + logs_pane: '#121212' + terminal_primary: '#5FFFD7' + primary_label: '#5FFFD7' + secondary_label: '#FFFFFF' + success_label: '#5FFFD7' + warning_label: '#FFFF00' + info_label: '#5FD7FF' + error_label: '#FF0000' + gold_label: '#FFD700' + silver_label: '#C0C0C0' + bronze_label: '#CD7F32' + +# The tick size is the frequency with which the clock notifies the time iterators by calling the +# c_tick() method, that means for example that if the tick size is 1, the logic of the strategy +# will run every second. +tick_size: 1.0 + +market_data_collection: + market_data_collection_enabled: false + market_data_collection_interval: 60 + market_data_collection_depth: 20 diff --git a/conf/conf_fee_overrides.yml b/conf/conf_fee_overrides.yml new file mode 100644 index 0000000000..02eaac457e --- /dev/null +++ b/conf/conf_fee_overrides.yml @@ -0,0 +1,310 @@ +######################################## +### Fee overrides configurations ### +######################################## + +# For more detailed information: https://docs.hummingbot.io +template_version: 14 + +# Example of the fields that can be specified to override the `TradeFeeFactory` default settings. +# If the field is missing or the value is left blank, the default value will be used. +# The percentage values are specified as 0.1 for 0.1%. +# +# [exchange name]_percent_fee_token: +# [exchange name]_maker_percent_fee: +# [exchange name]_taker_percent_fee: +# [exchange name]_buy_percent_fee_deducted_from_returns: # if False, the buy fee is added to the order costs +# [exchange name]_maker_fixed_fees: # a list of lists of token-fee pairs (e.g. [["ETH", 1]]) +# [exchange name]_taker_fixed_fees: # a list of lists of token-fee pairs (e.g. [["ETH", 1]]) + +binance_percent_fee_token: # BNB +binance_maker_percent_fee: # 0.75 +binance_taker_percent_fee: # 0.75 +binance_buy_percent_fee_deducted_from_returns: # True + +# List of supported Exchanges for which the user's conf/conf_fee_override.yml +# will work. This file currently needs to be in sync with hummingbot list of +# supported exchanges +ascend_ex_buy_percent_fee_deducted_from_returns: +ascend_ex_maker_fixed_fees: +ascend_ex_maker_percent_fee: +ascend_ex_percent_fee_token: +ascend_ex_taker_fixed_fees: +ascend_ex_taker_percent_fee: +binance_maker_fixed_fees: +binance_perpetual_buy_percent_fee_deducted_from_returns: +binance_perpetual_maker_fixed_fees: +binance_perpetual_maker_percent_fee: +binance_perpetual_percent_fee_token: +binance_perpetual_taker_fixed_fees: +binance_perpetual_taker_percent_fee: +binance_perpetual_testnet_buy_percent_fee_deducted_from_returns: +binance_perpetual_testnet_maker_fixed_fees: +binance_perpetual_testnet_maker_percent_fee: +binance_perpetual_testnet_percent_fee_token: +binance_perpetual_testnet_taker_fixed_fees: +binance_perpetual_testnet_taker_percent_fee: +binance_taker_fixed_fees: +binance_us_buy_percent_fee_deducted_from_returns: +binance_us_maker_fixed_fees: +binance_us_maker_percent_fee: +binance_us_percent_fee_token: +binance_us_taker_fixed_fees: +binance_us_taker_percent_fee: +bitfinex_buy_percent_fee_deducted_from_returns: +bitfinex_maker_fixed_fees: +bitfinex_maker_percent_fee: +bitfinex_percent_fee_token: +bitfinex_taker_fixed_fees: +bitfinex_taker_percent_fee: +bitmart_buy_percent_fee_deducted_from_returns: +bitmart_maker_fixed_fees: +bitmart_maker_percent_fee: +bitmart_percent_fee_token: +bitmart_taker_fixed_fees: +bitmart_taker_percent_fee: +bitstamp_buy_percent_fee_deducted_from_returns: +bitstamp_maker_fixed_fees: +bitstamp_maker_percent_fee: +bitstamp_percent_fee_token: +bitstamp_taker_fixed_fees: +bitstamp_taker_percent_fee: +btc_markets_percent_fee_token: +btc_markets_maker_percent_fee: +btc_markets_taker_percent_fee: +btc_markets_buy_percent_fee_deducted_from_returns: +bybit_perpetual_buy_percent_fee_deducted_from_returns: +bybit_perpetual_maker_fixed_fees: +bybit_perpetual_maker_percent_fee: +bybit_perpetual_percent_fee_token: +bybit_perpetual_taker_fixed_fees: +bybit_perpetual_taker_percent_fee: +bybit_perpetual_testnet_buy_percent_fee_deducted_from_returns: +bybit_perpetual_testnet_maker_fixed_fees: +bybit_perpetual_testnet_maker_percent_fee: +bybit_perpetual_testnet_percent_fee_token: +bybit_perpetual_testnet_taker_fixed_fees: +bybit_perpetual_testnet_taker_percent_fee: +coinbase_advanced_trade_buy_percent_fee_deducted_from_returns: +coinbase_advanced_trade_maker_fixed_fees: +coinbase_advanced_trade_maker_percent_fee: +coinbase_advanced_trade_percent_fee_token: +coinbase_advanced_trade_taker_fixed_fees: +coinbase_advanced_trade_taker_percent_fee: +gate_io_buy_percent_fee_deducted_from_returns: +gate_io_maker_fixed_fees: +gate_io_maker_percent_fee: +gate_io_percent_fee_token: +gate_io_taker_fixed_fees: +gate_io_taker_percent_fee: +htx_buy_percent_fee_deducted_from_returns: +htx_maker_fixed_fees: +htx_maker_percent_fee: +htx_percent_fee_token: +htx_taker_fixed_fees: +htx_taker_percent_fee: +kraken_buy_percent_fee_deducted_from_returns: +kraken_maker_fixed_fees: +kraken_maker_percent_fee: +kraken_percent_fee_token: +kraken_taker_fixed_fees: +kraken_taker_percent_fee: +kucoin_buy_percent_fee_deducted_from_returns: +kucoin_maker_fixed_fees: +kucoin_maker_percent_fee: +kucoin_percent_fee_token: +kucoin_taker_fixed_fees: +kucoin_taker_percent_fee: +mexc_buy_percent_fee_deducted_from_returns: +mexc_maker_fixed_fees: +mexc_maker_percent_fee: +mexc_percent_fee_token: +mexc_taker_fixed_fees: +mexc_taker_percent_fee: +ndax_buy_percent_fee_deducted_from_returns: +ndax_maker_fixed_fees: +ndax_maker_percent_fee: +ndax_percent_fee_token: +ndax_taker_fixed_fees: +ndax_taker_percent_fee: +ndax_testnet_buy_percent_fee_deducted_from_returns: +ndax_testnet_maker_fixed_fees: +ndax_testnet_maker_percent_fee: +ndax_testnet_percent_fee_token: +ndax_testnet_taker_fixed_fees: +ndax_testnet_taker_percent_fee: +okx_buy_percent_fee_deducted_from_returns: +okx_maker_fixed_fees: +okx_maker_percent_fee: +okx_percent_fee_token: +okx_taker_fixed_fees: +okx_taker_percent_fee: +hashkey_perpetual_percent_fee_token: +hashkey_perpetual_maker_percent_fee: +hashkey_perpetual_taker_percent_fee: +hashkey_perpetual_buy_percent_fee_deducted_from_returns: +hashkey_perpetual_maker_fixed_fees: +hashkey_perpetual_taker_fixed_fees: +hashkey_perpetual_testnet_percent_fee_token: +hashkey_perpetual_testnet_maker_percent_fee: +hashkey_perpetual_testnet_taker_percent_fee: +hashkey_perpetual_testnet_buy_percent_fee_deducted_from_returns: +hashkey_perpetual_testnet_maker_fixed_fees: +hashkey_perpetual_testnet_taker_fixed_fees: +vega_perpetual_percent_fee_token: +vega_perpetual_maker_percent_fee: +vega_perpetual_taker_percent_fee: +vega_perpetual_buy_percent_fee_deducted_from_returns: +vega_perpetual_maker_fixed_fees: +vega_perpetual_taker_fixed_fees: +vega_perpetual_testnet_percent_fee_token: +vega_perpetual_testnet_maker_percent_fee: +vega_perpetual_testnet_taker_percent_fee: +vega_perpetual_testnet_buy_percent_fee_deducted_from_returns: +vega_perpetual_testnet_maker_fixed_fees: +vega_perpetual_testnet_taker_fixed_fees: +hyperliquid_perpetual_percent_fee_token: +hyperliquid_perpetual_maker_percent_fee: +hyperliquid_perpetual_taker_percent_fee: +hyperliquid_perpetual_buy_percent_fee_deducted_from_returns: +hyperliquid_perpetual_maker_fixed_fees: +hyperliquid_perpetual_taker_fixed_fees: +hyperliquid_perpetual_testnet_percent_fee_token: +hyperliquid_perpetual_testnet_maker_percent_fee: +hyperliquid_perpetual_testnet_taker_percent_fee: +hyperliquid_perpetual_testnet_buy_percent_fee_deducted_from_returns: +hyperliquid_perpetual_testnet_maker_fixed_fees: +hyperliquid_perpetual_testnet_taker_fixed_fees: +injective_v2_perpetual_percent_fee_token: +injective_v2_perpetual_maker_percent_fee: +injective_v2_perpetual_taker_percent_fee: +injective_v2_perpetual_buy_percent_fee_deducted_from_returns: +injective_v2_perpetual_maker_fixed_fees: +injective_v2_perpetual_taker_fixed_fees: +kucoin_perpetual_percent_fee_token: +kucoin_perpetual_maker_percent_fee: +kucoin_perpetual_taker_percent_fee: +kucoin_perpetual_buy_percent_fee_deducted_from_returns: +kucoin_perpetual_maker_fixed_fees: +kucoin_perpetual_taker_fixed_fees: +bitget_perpetual_percent_fee_token: +bitget_perpetual_maker_percent_fee: +bitget_perpetual_taker_percent_fee: +bitget_perpetual_buy_percent_fee_deducted_from_returns: +bitget_perpetual_maker_fixed_fees: +bitget_perpetual_taker_fixed_fees: +dydx_v4_perpetual_percent_fee_token: +dydx_v4_perpetual_maker_percent_fee: +dydx_v4_perpetual_taker_percent_fee: +dydx_v4_perpetual_buy_percent_fee_deducted_from_returns: +dydx_v4_perpetual_maker_fixed_fees: +dydx_v4_perpetual_taker_fixed_fees: +gate_io_perpetual_percent_fee_token: +gate_io_perpetual_maker_percent_fee: +gate_io_perpetual_taker_percent_fee: +gate_io_perpetual_buy_percent_fee_deducted_from_returns: +gate_io_perpetual_maker_fixed_fees: +gate_io_perpetual_taker_fixed_fees: +okx_perpetual_percent_fee_token: +okx_perpetual_maker_percent_fee: +okx_perpetual_taker_percent_fee: +okx_perpetual_buy_percent_fee_deducted_from_returns: +okx_perpetual_maker_fixed_fees: +okx_perpetual_taker_fixed_fees: +hashkey_percent_fee_token: +hashkey_maker_percent_fee: +hashkey_taker_percent_fee: +hashkey_buy_percent_fee_deducted_from_returns: +hashkey_maker_fixed_fees: +hashkey_taker_fixed_fees: +hashkey_global_testnet_percent_fee_token: +hashkey_global_testnet_maker_percent_fee: +hashkey_global_testnet_taker_percent_fee: +hashkey_global_testnet_buy_percent_fee_deducted_from_returns: +hashkey_global_testnet_maker_fixed_fees: +hashkey_global_testnet_taker_fixed_fees: +vertex_percent_fee_token: +vertex_maker_percent_fee: +vertex_taker_percent_fee: +vertex_buy_percent_fee_deducted_from_returns: +vertex_maker_fixed_fees: +vertex_taker_fixed_fees: +vertex_testnet_percent_fee_token: +vertex_testnet_maker_percent_fee: +vertex_testnet_taker_percent_fee: +vertex_testnet_buy_percent_fee_deducted_from_returns: +vertex_testnet_maker_fixed_fees: +vertex_testnet_taker_fixed_fees: +cube_percent_fee_token: +cube_maker_percent_fee: +cube_taker_percent_fee: +cube_buy_percent_fee_deducted_from_returns: +cube_maker_fixed_fees: +cube_taker_fixed_fees: +kucoin_hft_percent_fee_token: +kucoin_hft_maker_percent_fee: +kucoin_hft_taker_percent_fee: +kucoin_hft_buy_percent_fee_deducted_from_returns: +kucoin_hft_maker_fixed_fees: +kucoin_hft_taker_fixed_fees: +foxbit_percent_fee_token: +foxbit_maker_percent_fee: +foxbit_taker_percent_fee: +foxbit_buy_percent_fee_deducted_from_returns: +foxbit_maker_fixed_fees: +foxbit_taker_fixed_fees: +bybit_percent_fee_token: +bybit_maker_percent_fee: +bybit_taker_percent_fee: +bybit_buy_percent_fee_deducted_from_returns: +bybit_maker_fixed_fees: +bybit_taker_fixed_fees: +bybit_testnet_percent_fee_token: +bybit_testnet_maker_percent_fee: +bybit_testnet_taker_percent_fee: +bybit_testnet_buy_percent_fee_deducted_from_returns: +bybit_testnet_maker_fixed_fees: +bybit_testnet_taker_fixed_fees: +injective_v2_percent_fee_token: +injective_v2_maker_percent_fee: +injective_v2_taker_percent_fee: +injective_v2_buy_percent_fee_deducted_from_returns: +injective_v2_maker_fixed_fees: +injective_v2_taker_fixed_fees: +bitrue_percent_fee_token: +bitrue_maker_percent_fee: +bitrue_taker_percent_fee: +bitrue_buy_percent_fee_deducted_from_returns: +bitrue_maker_fixed_fees: +bitrue_taker_fixed_fees: +xrpl_percent_fee_token: +xrpl_maker_percent_fee: +xrpl_taker_percent_fee: +xrpl_buy_percent_fee_deducted_from_returns: +xrpl_maker_fixed_fees: +xrpl_taker_fixed_fees: +btc_markets_maker_fixed_fees: +btc_markets_taker_fixed_fees: +tegro_percent_fee_token: +tegro_maker_percent_fee: +tegro_taker_percent_fee: +tegro_buy_percent_fee_deducted_from_returns: +tegro_maker_fixed_fees: +tegro_taker_fixed_fees: +tegro_testnet_percent_fee_token: +tegro_testnet_maker_percent_fee: +tegro_testnet_taker_percent_fee: +tegro_testnet_buy_percent_fee_deducted_from_returns: +tegro_testnet_maker_fixed_fees: +tegro_testnet_taker_fixed_fees: +dexalot_percent_fee_token: +dexalot_maker_percent_fee: +dexalot_taker_percent_fee: +dexalot_buy_percent_fee_deducted_from_returns: +dexalot_maker_fixed_fees: +dexalot_taker_fixed_fees: +polkadex_percent_fee_token: +polkadex_maker_percent_fee: +polkadex_taker_percent_fee: +polkadex_buy_percent_fee_deducted_from_returns: +polkadex_maker_fixed_fees: +polkadex_taker_fixed_fees: diff --git a/conf/hummingbot_logs.yml b/conf/hummingbot_logs.yml new file mode 100755 index 0000000000..8e65271c08 --- /dev/null +++ b/conf/hummingbot_logs.yml @@ -0,0 +1,83 @@ +--- +version: 1 +template_version: 12 + +formatters: + simple: + format: "%(asctime)s - %(process)d - %(name)s - %(levelname)s - %(message)s" + +handlers: + console: + class: hummingbot.logger.cli_handler.CLIHandler + level: DEBUG + formatter: simple + stream: ext://sys.stdout + console_warning: + class: hummingbot.logger.cli_handler.CLIHandler + level: WARNING + formatter: simple + stream: ext://sys.stdout + console_info: + class: hummingbot.logger.cli_handler.CLIHandler + level: INFO + formatter: simple + stream: ext://sys.stdout + file_handler: + class: logging.handlers.TimedRotatingFileHandler + level: DEBUG + formatter: simple + filename: $PROJECT_DIR/logs/logs_$STRATEGY_FILE_PATH.log + encoding: utf8 + when: "D" + interval: 1 + backupCount: 7 + "null": + class: logging.NullHandler + level: DEBUG + +loggers: + hummingbot.core.utils.eth_gas_station_lookup: + level: NETWORK + propagate: false + handlers: [console, file_handler] + mqtt: true + hummingbot.logger.log_server_client: + level: WARNING + propagate: false + handlers: [console, file_handler] + mqtt: true + hummingbot.logger.reporting_proxy_handler: + level: WARNING + propagate: false + handlers: [console, file_handler] + mqtt: true + hummingbot.strategy: + level: NETWORK + propagate: false + handlers: [console, file_handler] + mqtt: true + hummingbot.connector: + level: NETWORK + propagate: false + handlers: [console, file_handler] + mqtt: true + hummingbot.client: + level: NETWORK + propagate: false + handlers: [console, file_handler] + mqtt: true + hummingbot.core.event.event_reporter: + level: EVENT_LOG + propagate: false + handlers: [file_handler] + mqtt: false + conf: + level: NETWORK + handlers: ["null"] + propagate: false + mqtt: false + +root: + level: INFO + handlers: [console, file_handler] + mqtt: true diff --git a/docker-compose-dev.yml b/docker-compose-dev.yml deleted file mode 100644 index af6bd9c04b..0000000000 --- a/docker-compose-dev.yml +++ /dev/null @@ -1,74 +0,0 @@ -services: - dashboard: - container_name: dashboard - image: hummingbot/dashboard:development - ports: - - "8501:8501" - environment: - - AUTH_SYSTEM_ENABLED=False - - BACKEND_API_HOST=backend-api - - BACKEND_API_PORT=8000 - - BACKEND_API_USERNAME=admin - - BACKEND_API_PASSWORD=admin - volumes: - - ./credentials.yml:/home/dashboard/credentials.yml - - ./pages:/home/dashboard/frontend/pages - networks: - - emqx-bridge - backend-api: - container_name: backend-api - image: hummingbot/backend-api:development - ports: - - "8000:8000" - volumes: - - ./bots:/backend-api/bots - - /var/run/docker.sock:/var/run/docker.sock - env_file: - - .env - environment: - - BROKER_HOST=emqx - - BROKER_PORT=1883 - - USERNAME=admin - - PASSWORD=admin - networks: - - emqx-bridge - emqx: - container_name: hummingbot-broker - image: emqx:5 - restart: unless-stopped - environment: - - EMQX_NAME=emqx - - EMQX_HOST=node1.emqx.local - - EMQX_CLUSTER__DISCOVERY_STRATEGY=static - - EMQX_CLUSTER__STATIC__SEEDS=[emqx@node1.emqx.local] - - EMQX_LOADED_PLUGINS="emqx_recon,emqx_retainer,emqx_management,emqx_dashboard" - volumes: - - emqx-data:/opt/emqx/data - - emqx-log:/opt/emqx/log - - emqx-etc:/opt/emqx/etc - ports: - - "1883:1883" # mqtt:tcp - - "8883:8883" # mqtt:tcp:ssl - - "8083:8083" # mqtt:ws - - "8084:8084" # mqtt:ws:ssl - - "8081:8081" # http:management - - "18083:18083" # http:dashboard - - "61613:61613" # web-stomp gateway - networks: - emqx-bridge: - aliases: - - node1.emqx.local - healthcheck: - test: [ "CMD", "/opt/emqx/bin/emqx_ctl", "status" ] - interval: 5s - timeout: 25s - retries: 5 - -networks: - emqx-bridge: - driver: bridge - -volumes: - emqx-data: { } - emqx-log: { } - emqx-etc: { } diff --git a/docker-compose-dydx.yml b/docker-compose-dydx.yml deleted file mode 100644 index df2c4ec152..0000000000 --- a/docker-compose-dydx.yml +++ /dev/null @@ -1,74 +0,0 @@ -services: - dashboard: - container_name: dashboard - image: hummingbot/dashboard:dydx - ports: - - "8501:8501" - environment: - - AUTH_SYSTEM_ENABLED=False - - BACKEND_API_HOST=backend-api - - BACKEND_API_PORT=8000 - - BACKEND_API_USERNAME=admin - - BACKEND_API_PASSWORD=admin - volumes: - - ./credentials.yml:/home/dashboard/credentials.yml - - ./pages:/home/dashboard/frontend/pages - networks: - - emqx-bridge - backend-api: - container_name: backend-api - image: hummingbot/backend-api:dydx - ports: - - "8000:8000" - volumes: - - ./bots:/backend-api/bots - - /var/run/docker.sock:/var/run/docker.sock - env_file: - - .env - environment: - - BROKER_HOST=emqx - - BROKER_PORT=1883 - - USERNAME=admin - - PASSWORD=admin - networks: - - emqx-bridge - emqx: - container_name: hummingbot-broker - image: emqx:5 - restart: unless-stopped - environment: - - EMQX_NAME=emqx - - EMQX_HOST=node1.emqx.local - - EMQX_CLUSTER__DISCOVERY_STRATEGY=static - - EMQX_CLUSTER__STATIC__SEEDS=[emqx@node1.emqx.local] - - EMQX_LOADED_PLUGINS="emqx_recon,emqx_retainer,emqx_management,emqx_dashboard" - volumes: - - emqx-data:/opt/emqx/data - - emqx-log:/opt/emqx/log - - emqx-etc:/opt/emqx/etc - ports: - - "1883:1883" # mqtt:tcp - - "8883:8883" # mqtt:tcp:ssl - - "8083:8083" # mqtt:ws - - "8084:8084" # mqtt:ws:ssl - - "8081:8081" # http:management - - "18083:18083" # http:dashboard - - "61613:61613" # web-stomp gateway - networks: - emqx-bridge: - aliases: - - node1.emqx.local - healthcheck: - test: [ "CMD", "/opt/emqx/bin/emqx_ctl", "status" ] - interval: 5s - timeout: 25s - retries: 5 - -networks: - emqx-bridge: - driver: bridge - -volumes: - emqx-data: { } - emqx-log: { } - emqx-etc: { } diff --git a/setup.sh b/setup.sh index d479381549..6bebe3af21 100644 --- a/setup.sh +++ b/setup.sh @@ -1,12 +1,546 @@ #!/bin/bash -# Pulling the required Docker images -docker compose pull -docker pull hummingbot/hummingbot:latest +function show_menu() { + clear + echo "╔════════════════════════════════════════════════════════════╗" + echo "║ Installation Options ║" + echo "╚════════════════════════════════════════════════════════════╝" + echo "" + echo "[1] Use recommended settings [default]" + echo " - Installs all components with default configurations" + echo "" + echo "[2] Use dYdX branch" + echo " - Installs the Hummingbot Dashboard version tailored for dYdX" + echo "" + echo "[3] Dashboard only" + echo " - Installs only the Dashboard interface" + echo "" + echo "[4] Backend-API only" + echo " - Installs only the Backend-API service" + echo "" + echo "[5] Broker Only" + echo " - Installs only the EMQX broker service" + echo "" + echo "[6] Hummingbot Client Only" + echo " - Installs only the Hummingbot CLI client using the 'latest' tag" + echo "" + echo "[7] Use Setup Wizard" + echo " - Create a custom configuration using the setup wizard" + echo "" + echo "[8] Exit" + echo " - Exits the setup process" + echo "" +} -# Creating .env file with the required environment variables -echo "CONFIG_PASSWORD=a" > .env -echo "BOTS_PATH=$(pwd)" >> .env +while true; do + show_menu + read -p "Please select an option [1-8] or press Enter for default (1): " choice + choice=${choice:-1} # Set default value to 1 if choice is empty -# Running docker-compose in detached mode -docker compose up -d + case $choice in + 1) + echo "Using default settings..." + # Pulling the required Docker images + docker compose pull + docker pull hummingbot/hummingbot:latest + + # Check if .env exists before creating + if [ ! -f .env ]; then + echo "CONFIG_PASSWORD=a" > .env + echo "BOTS_PATH=$(pwd)" >> .env + else + echo ".env already exists, skipping creation." + fi + + # Running docker-compose in detached mode + docker compose up -d + + # Clear screen and show completion message + clear + echo "╔════════════════════════════════════════════════════════════╗" + echo "║ Installation Complete! ║" + echo "╚════════════════════════════════════════════════════════════╝" + echo "" + echo " You can now view Hummingbot Dashboard in your browser." + echo "" + echo " Network URL: http://localhost:8501" + echo " Alternate URL: http://127.0.0.1:8501" + echo "" + echo " Backend API running on http://localhost:8000" + echo " Swagger Docs: http://localhost:8000/docs" + echo "" + echo " For more documentation on how to use Dashboard " + echo " https://hummingbot.org/dashboard" + echo "" + echo " To stop all services, run:" + echo " docker compose down" + echo "" + exit 0 + ;; + 2) + echo "Using dYdX branch..." + docker pull hummingbot/hummingbot:latest_dydx --quiet + # Create a permanent docker-compose file for dYdX + cat > docker-compose.dydx.yml << 'EOL' +services: + dashboard: + container_name: dashboard + image: hummingbot/dashboard:dydx + ports: + - "8501:8501" + volumes: + - ./credentials.yml:/home/dashboard/credentials.yml + - ./pages:/home/dashboard/frontend/pages + networks: + - emqx-bridge + + backend-api: + container_name: backend-api + image: hummingbot/backend-api:dydx + ports: + - "8000:8000" + volumes: + - ./bots:/backend-api/bots + - /var/run/docker.sock:/var/run/docker.sock + env_file: + - .env + networks: + - emqx-bridge + +emqx: + container_name: hummingbot-broker + image: emqx:5 + restart: unless-stopped + environment: + - EMQX_NAME=emqx + - EMQX_HOST=node1.emqx.local + - EMQX_CLUSTER__DISCOVERY_STRATEGY=static + - EMQX_CLUSTER__STATIC__SEEDS=[emqx@node1.emqx.local] + - EMQX_LOADED_PLUGINS="emqx_recon,emqx_retainer,emqx_management,emqx_dashboard" + volumes: + - emqx-data:/opt/emqx/data + - emqx-log:/opt/emqx/log + - emqx-etc:/opt/emqx/etc + ports: + - "1883:1883" # mqtt:tcp + - "8883:8883" # mqtt:tcp:ssl + - "8083:8083" # mqtt:ws + - "8084:8084" # mqtt:ws:ssl + - "8081:8081" # http:management + - "18083:18083" # http:dashboard + - "61613:61613" # web-stomp gateway + networks: + emqx-bridge: + aliases: + - node1.emqx.local + healthcheck: + test: [ "CMD", "/opt/emqx/bin/emqx_ctl", "status" ] + interval: 5s + timeout: 25s + retries: 5 + +networks: + emqx-bridge: + driver: bridge + +volumes: + emqx-data: { } + emqx-log: { } + emqx-etc: { } + +EOL + + # Check if .env exists before creating + if [ ! -f .env ]; then + echo "CONFIG_PASSWORD=a" > .env + echo "BOTS_PATH=$(pwd)" >> .env + else + echo ".env already exists, skipping creation." + fi + + # Running docker-compose in detached mode + docker compose -f docker-compose.dydx.yml pull + docker compose -f docker-compose.dydx.yml up -d + + # Clear screen and show completion message + clear + echo "╔════════════════════════════════════════════════════════════╗" + echo "║ Installation (dYdX) Complete! ║" + echo "╚════════════════════════════════════════════════════════════╝" + echo "" + echo " You can now view Hummingbot Dashboard in your browser." + echo "" + echo " Network URL: http://localhost:8501" + echo " Alternate URL: http://127.0.0.1:8501" + echo "" + echo " Backend API running on http://localhost:8000" + echo " Swagger Docs: http://localhost:8000/docs" + echo "" + echo " For more documentation on how to use Dashboard " + echo " https://hummingbot.org/dashboard" + echo "" + echo " To stop the running containers, run:" + echo " docker compose -f docker-compose.dydx.yml down" + echo "" + exit 0 + ;; + 3) + echo "Dashboard only mode..." + # Create a permanent docker-compose file for dashboard + cat > docker-compose.dashboard.yml << 'EOL' +services: + dashboard: + container_name: dashboard + image: hummingbot/dashboard:latest + ports: + - "8501:8501" + environment: + - AUTH_SYSTEM_ENABLED=False + - BACKEND_API_HOST=backend-api + - BACKEND_API_PORT=8000 + - BACKEND_API_USERNAME=admin + - BACKEND_API_PASSWORD=admin + volumes: + - ./credentials.yml:/home/dashboard/credentials.yml + - ./pages:/home/dashboard/frontend/pages + networks: + - emqx-bridge + +networks: + emqx-bridge: + driver: bridge +EOL + + # Use the dashboard compose file + docker compose -f docker-compose.dashboard.yml pull + docker compose -f docker-compose.dashboard.yml up -d + + # Clear screen and show completion message + clear + echo "╔════════════════════════════════════════════════════════════╗" + echo "║ Dashboard Installation Complete ║" + echo "╚════════════════════════════════════════════════════════════╝" + echo "" + echo " You can now view Hummingbot Dashboard in your browser." + echo "" + echo " Network URL: http://localhost:8501" + echo " Alternate URL: http://127.0.0.1:8501" + echo "" + echo " For more documentation on how to use Dashboard " + echo " https://hummingbot.org/dashboard" + echo "" + echo " To stop the dashboard service, run:" + echo " docker compose -f docker-compose.dashboard.yml down" + echo "" + exit 0 + ;; + 4) + echo "Backend-API only mode..." + # Create a permanent docker-compose file for backend-api + cat > docker-compose.backend.yml << 'EOL' +services: + backend-api: + container_name: backend-api + image: hummingbot/backend-api:latest + ports: + - "8000:8000" + volumes: + - ./bots:/backend-api/bots + - /var/run/docker.sock:/var/run/docker.sock + env_file: + - .env + environment: + - BROKER_HOST=emqx + - BROKER_PORT=1883 + - USERNAME=admin + - PASSWORD=admin + networks: + - emqx-bridge + +networks: + emqx-bridge: + driver: bridge +EOL + + # Check if .env exists before creating + if [ ! -f .env ]; then + echo "CONFIG_PASSWORD=a" > .env + echo "BOTS_PATH=$(pwd)" >> .env + else + echo ".env already exists, skipping creation." + fi + + # Use the backend compose file + docker compose -f docker-compose.backend.yml pull + docker compose -f docker-compose.backend.yml up -d + + # Clear screen and show completion message + clear + echo "╔════════════════════════════════════════════════════════════╗" + echo "║ Backend API Installation Complete! ║" + echo "╚════════════════════════════════════════════════════════════╝" + echo "" + echo " Backend API running on http://localhost:8000" + echo " Swagger Docs: http://localhost:8000/docs" + echo "" + echo " To stop the backend service, run:" + echo " docker compose -f docker-compose.backend.yml down" + echo "" + exit 0 + ;; + 5) + echo "Broker Only mode..." + # Create a permanent docker-compose file for broker + cat > docker-compose.broker.yml << 'EOL' +services: + emqx: + container_name: hummingbot-broker + image: emqx:5 + restart: unless-stopped + environment: + - EMQX_NAME=emqx + - EMQX_HOST=node1.emqx.local + - EMQX_CLUSTER__DISCOVERY_STRATEGY=static + - EMQX_CLUSTER__STATIC__SEEDS=[emqx@node1.emqx.local] + - EMQX_LOADED_PLUGINS="emqx_recon,emqx_retainer,emqx_management,emqx_dashboard" + volumes: + - emqx-data:/opt/emqx/data + - emqx-log:/opt/emqx/log + - emqx-etc:/opt/emqx/etc + ports: + - "1883:1883" # mqtt:tcp + - "8883:8883" # mqtt:tcp:ssl + - "8083:8083" # mqtt:ws + - "8084:8084" # mqtt:ws:ssl + - "8081:8081" # http:management + - "18083:18083" # http:dashboard + - "61613:61613" # web-stomp gateway + networks: + emqx-bridge: + aliases: + - node1.emqx.local + healthcheck: + test: [ "CMD", "/opt/emqx/bin/emqx_ctl", "status" ] + interval: 5s + timeout: 25s + retries: 5 + +networks: + emqx-bridge: + driver: bridge + +volumes: + emqx-data: { } + emqx-log: { } + emqx-etc: { } +EOL + + # Use the broker compose file + docker compose -f docker-compose.broker.yml pull + docker compose -f docker-compose.broker.yml up -d + + # Clear screen and show completion message + clear + echo "╔════════════════════════════════════════════════════════════╗" + echo "║ Broker Installation Complete ║" + echo "╚════════════════════════════════════════════════════════════╝" + echo "" + echo " Hummingbot Broker service is running in the background" + echo "" + echo " To stop the broker service, run:" + echo " docker compose -f docker-compose.broker.yml down" + echo "" + exit 0 + ;; + 6) + echo "Hummingbot Client Only mode..." + # Create a permanent docker-compose file for Hummingbot client + cat > docker-compose.client.yml << 'EOL' +services: + hummingbot: + container_name: hummingbot + image: hummingbot/hummingbot:latest + volumes: + - ./conf:/home/hummingbot/conf + - ./conf/connectors:/home/hummingbot/conf/connectors + - ./conf/strategies:/home/hummingbot/conf/strategies + - ./conf/controllers:/home/hummingbot/conf/controllers + - ./conf/scripts:/home/hummingbot/conf/scripts + - ./logs:/home/hummingbot/logs + - ./data:/home/hummingbot/data + - ./certs:/home/hummingbot/certs + - ./scripts:/home/hummingbot/scripts + - ./controllers:/home/hummingbot/controllers + logging: + driver: "json-file" + options: + max-size: "10m" + max-file: "5" + tty: true + stdin_open: true + network_mode: host +EOL + + # Use the client compose file + docker compose -f docker-compose.client.yml pull + docker compose -f docker-compose.client.yml up -d + + # Clear screen and show completion message + clear + echo "╔════════════════════════════════════════════════════════════╗" + echo "║ Hummingbot Client Installation Complete ║" + echo "╚════════════════════════════════════════════════════════════╝" + echo "" + echo " Hummingbot is running in the background" + echo "" + echo " To connect to Hummingbot, run the command:" + echo " docker attach hummingbot" + echo "" + echo " To stop the Hummingbot client, run:" + echo " docker compose -f docker-compose.client.yml down" + echo "" + exit 0 + ;; + 7) + echo "Starting Setup Wizard..." + + # Function to prompt for yes/no + ask_yes_no() { + while true; do + read -p "$1 (y/N): " choice + case "$choice" in + [Yy]* ) return 0;; + [Nn]* | "" ) return 1;; + * ) echo "Please answer y or n.";; + esac + done + } + + # Function to prompt with default value + prompt_with_default() { + local prompt="$1" + local default="$2" + read -p "$prompt (default: $default): " value + echo "${value:-$default}" + } + + # Initialize empty docker-compose content + compose_content="services:\n" + + # Dashboard Service + if ask_yes_no "Do you want to install Dashboard?"; then + compose_content+=" dashboard:\n" + container_name=$(prompt_with_default "Enter container name" "dashboard") + image_tag=$(prompt_with_default "Enter image tag" "latest") + port=$(prompt_with_default "Enter port" "8501") + auth_enabled=$(ask_yes_no "Enable Auth System?" && echo "True" || echo "False") + backend_host=$(prompt_with_default "Enter Backend API host" "backend-api") + backend_port=$(prompt_with_default "Enter Backend API port" "8000") + backend_user=$(prompt_with_default "Enter Backend API username" "admin") + backend_pass=$(prompt_with_default "Enter Backend API password" "admin") + + compose_content+=" container_name: $container_name\n" + compose_content+=" image: hummingbot/dashboard:$image_tag\n" + compose_content+=" ports:\n" + compose_content+=" - \"$port:8501\"\n" + compose_content+=" environment:\n" + compose_content+=" - AUTH_SYSTEM_ENABLED=$auth_enabled\n" + compose_content+=" - BACKEND_API_HOST=$backend_host\n" + compose_content+=" - BACKEND_API_PORT=$backend_port\n" + compose_content+=" - BACKEND_API_USERNAME=$backend_user\n" + compose_content+=" - BACKEND_API_PASSWORD=$backend_pass\n" + compose_content+=" volumes:\n" + compose_content+=" - ./credentials.yml:/home/dashboard/credentials.yml\n" + compose_content+=" - ./pages:/home/dashboard/frontend/pages\n" + compose_content+=" networks:\n" + compose_content+=" - emqx-bridge\n" + fi + + # Backend API Service + if ask_yes_no "Do you want to install Backend API?"; then + compose_content+=" backend-api:\n" + container_name=$(prompt_with_default "Enter container name" "backend-api") + image_tag=$(prompt_with_default "Enter image tag" "latest") + port=$(prompt_with_default "Enter port" "8000") + username=$(prompt_with_default "Enter username" "admin") + password=$(prompt_with_default "Enter password" "admin") + + compose_content+=" container_name: $container_name\n" + compose_content+=" image: hummingbot/backend-api:$image_tag\n" + compose_content+=" ports:\n" + compose_content+=" - \"$port:8000\"\n" + compose_content+=" volumes:\n" + compose_content+=" - ./bots:/backend-api/bots\n" + compose_content+=" - /var/run/docker.sock:/var/run/docker.sock\n" + compose_content+=" env_file:\n" + compose_content+=" - .env\n" + compose_content+=" environment:\n" + compose_content+=" - BROKER_HOST=emqx\n" + compose_content+=" - BROKER_PORT=1883\n" + compose_content+=" - USERNAME=$username\n" + compose_content+=" - PASSWORD=$password\n" + compose_content+=" networks:\n" + compose_content+=" - emqx-bridge\n" + fi + + # Broker Service + if ask_yes_no "Do you want to install Broker?"; then + compose_content+=" emqx:\n" + compose_content+=" container_name: hummingbot-broker\n" + compose_content+=" image: emqx:5\n" + compose_content+=" restart: unless-stopped\n" + compose_content+=" environment:\n" + compose_content+=" - EMQX_NAME=emqx\n" + compose_content+=" - EMQX_HOST=node1.emqx.local\n" + compose_content+=" - EMQX_CLUSTER__DISCOVERY_STRATEGY=static\n" + compose_content+=" - EMQX_CLUSTER__STATIC__SEEDS=[emqx@node1.emqx.local]\n" + compose_content+=" - EMQX_LOADED_PLUGINS=\"emqx_recon,emqx_retainer,emqx_management,emqx_dashboard\"\n" + compose_content+=" volumes:\n" + compose_content+=" - emqx-data:/opt/emqx/data\n" + compose_content+=" - emqx-log:/opt/emqx/log\n" + compose_content+=" - emqx-etc:/opt/emqx/etc\n" + compose_content+=" ports:\n" + compose_content+=" - \"1883:1883\"\n" + compose_content+=" - \"8883:8883\"\n" + compose_content+=" - \"8083:8083\"\n" + compose_content+=" - \"8084:8084\"\n" + compose_content+=" - \"8081:8081\"\n" + compose_content+=" - \"18083:18083\"\n" + compose_content+=" - \"61613:61613\"\n" + compose_content+=" networks:\n" + compose_content+=" emqx-bridge:\n" + compose_content+=" aliases:\n" + compose_content+=" - node1.emqx.local\n" + fi + + # Add networks and volumes + compose_content+="\nnetworks:\n" + compose_content+=" emqx-bridge:\n" + compose_content+=" driver: bridge\n" + compose_content+="\nvolumes:\n" + compose_content+=" emqx-data: {}\n" + compose_content+=" emqx-log: {}\n" + compose_content+=" emqx-etc: {}\n" + + # Write to docker-compose.yml + echo -e "$compose_content" > docker-compose.yml + echo "docker-compose.yml has been generated successfully!" + + # Ask to start services + if ask_yes_no "Would you like to start the services now?"; then + docker compose pull + docker compose up -d + echo "Services have been started!" + fi + + exit 0 + ;; + 8) + echo "Exiting..." + exit 0 + ;; + *) + echo "Invalid choice. Please try again." + ;; + esac +done diff --git a/setup_dev.sh b/setup_dev.sh deleted file mode 100644 index 38f12ac860..0000000000 --- a/setup_dev.sh +++ /dev/null @@ -1,12 +0,0 @@ -#!/bin/bash - -# Pulling the required Docker images -docker compose -f docker-compose-dev.yml pull -docker pull hummingbot/hummingbot:latest - -# Creating .env file with the required environment variables -echo "CONFIG_PASSWORD=a" > .env -echo "BOTS_PATH=$(pwd)" >> .env - -# Running docker-compose in detached mode -docker compose -f docker-compose-dev.yml up -d diff --git a/setup_dydx.sh b/setup_dydx.sh deleted file mode 100644 index be70067072..0000000000 --- a/setup_dydx.sh +++ /dev/null @@ -1,12 +0,0 @@ -#!/bin/bash - -# Pulling the required Docker images -docker compose pull -docker pull hummingbot/hummingbot:latest_dydx - -# Creating .env file with the required environment variables -echo "CONFIG_PASSWORD=a" > .env -echo "BOTS_PATH=$(pwd)" >> .env - -# Running docker-compose in detached mode -docker compose -f docker-compose-dydx.yml up -d \ No newline at end of file