diff --git a/python/ray/dashboard/dashboard.py b/python/ray/dashboard/dashboard.py index 33c200ced..e8c510d42 100644 --- a/python/ray/dashboard/dashboard.py +++ b/python/ray/dashboard/dashboard.py @@ -415,6 +415,7 @@ if __name__ == "__main__": "--host", required=True, type=str, + choices=["127.0.0.1", "0.0.0.0"], help="The host to use for the HTTP server.") parser.add_argument( "--port", diff --git a/python/ray/node.py b/python/ray/node.py index 19d9e1db9..fba0b3fc8 100644 --- a/python/ray/node.py +++ b/python/ray/node.py @@ -579,9 +579,6 @@ class Node(object): # The dashboard is Python3.x only. if PY3 and self._ray_params.include_webui: self.start_dashboard() - else: - logger.info( - "To enable the Ray Web UI, run `pip install ray[dashboard]`.") def start_ray_processes(self): """Start all of the processes on the node.""" diff --git a/python/ray/parameter.py b/python/ray/parameter.py index 5b0fce306..cb1c6ef46 100644 --- a/python/ray/parameter.py +++ b/python/ray/parameter.py @@ -58,8 +58,8 @@ class RayParams(object): include_webui: Boolean flag indicating whether to start the web UI, which displays the status of the Ray cluster. webui_host: The host to bind the web UI server to. Can either be - localhost (127.0.0.1) or 0.0.0.0 (available from all interfaces). - By default, this is set to localhost to prevent access from + 127.0.0.1 (localhost) or 0.0.0.0 (available from all interfaces). + By default, this is set to 127.0.0.1 to prevent access from external machines. logging_level: Logging level, default will be logging.INFO. logging_format: Logging format, default contains a timestamp, @@ -108,7 +108,7 @@ class RayParams(object): worker_path=None, huge_pages=False, include_webui=None, - webui_host="localhost", + webui_host="127.0.0.1", logging_level=logging.INFO, logging_format=ray_constants.LOGGER_FORMAT, plasma_store_socket_name=None, diff --git a/python/ray/scripts/scripts.py b/python/ray/scripts/scripts.py index b45cdd6aa..31313e4b0 100644 --- a/python/ray/scripts/scripts.py +++ b/python/ray/scripts/scripts.py @@ -165,10 +165,11 @@ def cli(logging_level, logging_format): @click.option( "--webui-host", required=False, - default="localhost", - help="The host to bind the web UI server to. Can either be localhost " - "(127.0.0.1) or 0.0.0.0 (available from all interfaces). By default, this " - "is set to localhost to prevent access from external machines.") + type=click.Choice(["127.0.0.1", "0.0.0.0"]), + default="127.0.0.1", + help="The host to bind the web UI server to. Can either be 127.0.0.1 " + "(localhost) or 0.0.0.0 (available from all interfaces). By default, this " + "is set to 127.0.0.1 to prevent access from external machines.") @click.option( "--block", is_flag=True, diff --git a/python/ray/services.py b/python/ray/services.py index 2f241d4b2..3cb7474d1 100644 --- a/python/ray/services.py +++ b/python/ray/services.py @@ -12,10 +12,10 @@ import resource import socket import subprocess import sys +import textwrap import time import redis -import colorama import pyarrow # Ray modules import ray @@ -1035,11 +1035,21 @@ def start_dashboard(host, ray_constants.PROCESS_TYPE_DASHBOARD, stdout_file=stdout_file, stderr_file=stderr_file) - dashboard_url = "{}:{}".format( - host if host != "0.0.0.0" else get_node_ip_address(), port) - logger.info("View the Ray dashboard at {}{}{}{}{}.".format( - colorama.Style.BRIGHT, colorama.Fore.GREEN, dashboard_url, - colorama.Fore.RESET, colorama.Style.NORMAL)) + dashboard_url = "http://{}:{}".format( + host if host == "127.0.0.1" else get_node_ip_address(), port) + print("\n" + "=" * 70) + print("View the dashboard at {}.".format(dashboard_url)) + if host == "127.0.0.1": + note = ( + "Note: If Ray is running on a remote node, you will need to set " + "up an SSH tunnel with local port forwarding in order to access " + "the dashboard in your browser, e.g. by running " + "'ssh -L {}:{}:{} @'. Alternatively, you can set " + "webui_host=\"0.0.0.0\" in the call to ray.init() to allow direct " + "access from external machines.") + note = note.format(port, host, port) + print("\n".join(textwrap.wrap(note, width=70))) + print("=" * 70 + "\n") return dashboard_url, process_info diff --git a/python/ray/tests/test_webui.py b/python/ray/tests/test_webui.py index 0318a320d..56f28e25e 100644 --- a/python/ray/tests/test_webui.py +++ b/python/ray/tests/test_webui.py @@ -19,13 +19,12 @@ def test_get_webui(shutdown_only): webui_url = addresses["webui_url"] assert ray.get_webui_url() == webui_url - assert re.match(r"^(localhost|\d+\.\d+\.\d+\.\d+):8080$", webui_url) + assert re.match(r"^http://\d+\.\d+\.\d+\.\d+:8080$", webui_url) start_time = time.time() while True: try: - node_info = requests.get("http://" + webui_url + - "/api/node_info").json() + node_info = requests.get(webui_url + "/api/node_info").json() break except requests.exceptions.ConnectionError: if time.time() > start_time + 30: diff --git a/python/ray/worker.py b/python/ray/worker.py index f96e8e3ba..a23d96163 100644 --- a/python/ray/worker.py +++ b/python/ray/worker.py @@ -76,11 +76,6 @@ ERROR_KEY_PREFIX = b"Error:" # entry/init points. logger = logging.getLogger(__name__) -try: - import aiohttp -except ImportError: - aiohttp = None - try: import setproctitle except ImportError: @@ -844,8 +839,8 @@ def init(address=None, redis_password=None, plasma_directory=None, huge_pages=False, - include_webui=aiohttp is not None, - webui_host="localhost", + include_webui=False, + webui_host="127.0.0.1", job_id=None, configure_logging=True, logging_level=logging.INFO, @@ -926,8 +921,8 @@ def init(address=None, include_webui: Boolean flag indicating whether to start the web UI, which displays the status of the Ray cluster. webui_host: The host to bind the web UI server to. Can either be - localhost (127.0.0.1) or 0.0.0.0 (available from all interfaces). - By default, this is set to localhost to prevent access from + 127.0.0.1 (localhost) or 0.0.0.0 (available from all interfaces). + By default, this is set to 127.0.0.1 to prevent access from external machines. job_id: The ID of this job. configure_logging: True if allow the logging cofiguration here.