[REF-2956] Fail When Backend port or frontend port is explicitly provided and the port is in use (#3432)
This commit is contained in:
parent
bbd320b3ce
commit
44ad9a7311
@ -161,13 +161,13 @@ class Config(Base):
|
|||||||
loglevel: constants.LogLevel = constants.LogLevel.INFO
|
loglevel: constants.LogLevel = constants.LogLevel.INFO
|
||||||
|
|
||||||
# The port to run the frontend on. NOTE: When running in dev mode, the next available port will be used if this is taken.
|
# The port to run the frontend on. NOTE: When running in dev mode, the next available port will be used if this is taken.
|
||||||
frontend_port: int = 3000
|
frontend_port: int = constants.DefaultPorts.FRONTEND_PORT
|
||||||
|
|
||||||
# The path to run the frontend on. For example, "/app" will run the frontend on http://localhost:3000/app
|
# The path to run the frontend on. For example, "/app" will run the frontend on http://localhost:3000/app
|
||||||
frontend_path: str = ""
|
frontend_path: str = ""
|
||||||
|
|
||||||
# The port to run the backend on. NOTE: When running in dev mode, the next available port will be used if this is taken.
|
# The port to run the backend on. NOTE: When running in dev mode, the next available port will be used if this is taken.
|
||||||
backend_port: int = 8000
|
backend_port: int = constants.DefaultPorts.BACKEND_PORT
|
||||||
|
|
||||||
# The backend url the frontend will connect to. This must be updated if the backend is hosted elsewhere, or in production.
|
# The backend url the frontend will connect to. This must be updated if the backend is hosted elsewhere, or in production.
|
||||||
api_url: str = f"http://localhost:{backend_port}"
|
api_url: str = f"http://localhost:{backend_port}"
|
||||||
|
@ -36,6 +36,7 @@ from .compiler import (
|
|||||||
from .config import (
|
from .config import (
|
||||||
ALEMBIC_CONFIG,
|
ALEMBIC_CONFIG,
|
||||||
Config,
|
Config,
|
||||||
|
DefaultPorts,
|
||||||
Expiration,
|
Expiration,
|
||||||
GitIgnore,
|
GitIgnore,
|
||||||
RequirementsTxt,
|
RequirementsTxt,
|
||||||
@ -72,6 +73,7 @@ __ALL__ = [
|
|||||||
ComponentName,
|
ComponentName,
|
||||||
CustomComponents,
|
CustomComponents,
|
||||||
DefaultPage,
|
DefaultPage,
|
||||||
|
DefaultPorts,
|
||||||
Dirs,
|
Dirs,
|
||||||
Endpoint,
|
Endpoint,
|
||||||
Env,
|
Env,
|
||||||
|
@ -50,5 +50,12 @@ class RequirementsTxt(SimpleNamespace):
|
|||||||
DEFAULTS_STUB = f"{Reflex.MODULE_NAME}=="
|
DEFAULTS_STUB = f"{Reflex.MODULE_NAME}=="
|
||||||
|
|
||||||
|
|
||||||
|
class DefaultPorts(SimpleNamespace):
|
||||||
|
"""Default port constants."""
|
||||||
|
|
||||||
|
FRONTEND_PORT = 3000
|
||||||
|
BACKEND_PORT = 8000
|
||||||
|
|
||||||
|
|
||||||
# The deployment URL.
|
# The deployment URL.
|
||||||
PRODUCTION_BACKEND_URL = "https://{username}-{app_name}.api.pynecone.app"
|
PRODUCTION_BACKEND_URL = "https://{username}-{app_name}.api.pynecone.app"
|
||||||
|
@ -157,12 +157,16 @@ def _run(
|
|||||||
if prerequisites.needs_reinit(frontend=frontend):
|
if prerequisites.needs_reinit(frontend=frontend):
|
||||||
_init(name=config.app_name, loglevel=loglevel)
|
_init(name=config.app_name, loglevel=loglevel)
|
||||||
|
|
||||||
# Find the next available open port.
|
# Find the next available open port if applicable.
|
||||||
if frontend and processes.is_process_on_port(frontend_port):
|
if frontend:
|
||||||
frontend_port = processes.change_port(frontend_port, "frontend")
|
frontend_port = processes.handle_port(
|
||||||
|
"frontend", frontend_port, str(constants.DefaultPorts.FRONTEND_PORT)
|
||||||
|
)
|
||||||
|
|
||||||
if backend and processes.is_process_on_port(backend_port):
|
if backend:
|
||||||
backend_port = processes.change_port(backend_port, "backend")
|
backend_port = processes.handle_port(
|
||||||
|
"backend", backend_port, str(constants.DefaultPorts.BACKEND_PORT)
|
||||||
|
)
|
||||||
|
|
||||||
# Apply the new ports to the config.
|
# Apply the new ports to the config.
|
||||||
if frontend_port != str(config.frontend_port):
|
if frontend_port != str(config.frontend_port):
|
||||||
|
@ -109,6 +109,33 @@ def change_port(port: str, _type: str) -> str:
|
|||||||
return new_port
|
return new_port
|
||||||
|
|
||||||
|
|
||||||
|
def handle_port(service_name: str, port: str, default_port: str) -> str:
|
||||||
|
"""Change port if the specified port is in use and is not explicitly specified as a CLI arg or config arg.
|
||||||
|
otherwise tell the user the port is in use and exit the app.
|
||||||
|
|
||||||
|
We make an assumption that when port is the default port,then it hasnt been explicitly set since its not straightforward
|
||||||
|
to know whether a port was explicitly provided by the user unless its any other than the default.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
service_name: The frontend or backend.
|
||||||
|
port: The provided port.
|
||||||
|
default_port: The default port number associated with the specified service.
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
The port to run the service on.
|
||||||
|
|
||||||
|
Raises:
|
||||||
|
Exit:when the port is in use.
|
||||||
|
"""
|
||||||
|
if is_process_on_port(port):
|
||||||
|
if int(port) == int(default_port):
|
||||||
|
return change_port(port, service_name)
|
||||||
|
else:
|
||||||
|
console.error(f"{service_name.capitalize()} port: {port} is already in use")
|
||||||
|
raise typer.Exit()
|
||||||
|
return port
|
||||||
|
|
||||||
|
|
||||||
def new_process(args, run: bool = False, show_logs: bool = False, **kwargs):
|
def new_process(args, run: bool = False, show_logs: bool = False, **kwargs):
|
||||||
"""Wrapper over subprocess.Popen to unify the launch of child processes.
|
"""Wrapper over subprocess.Popen to unify the launch of child processes.
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user