host_ip fix
This commit is contained in:
40
server.py
40
server.py
@@ -38,7 +38,8 @@ load_dotenv()
|
||||
|
||||
# ========== КОНФИГУРАЦИЯ ==========
|
||||
SERVER_CONFIG = {
|
||||
"host": os.getenv("host", "0.0.0.0"), # сюда IP смотрящий наружу или 0.0.0.0 для всех интерфейсов
|
||||
# считываем переменную окружения HOST (или legacy 'host'), чтобы можно было управлять через .env / docker-compose
|
||||
"host": os.getenv("HOST", os.getenv("host", "0.0.0.0")), # сюда IP смотрящий наружу или 0.0.0.0 для всех интерфейсов
|
||||
"port": 8000,
|
||||
"debug": False,
|
||||
"max_clients_per_room": 50,
|
||||
@@ -97,13 +98,42 @@ def safe_json_serializer(obj: Any) -> Any:
|
||||
|
||||
def get_server_host():
|
||||
"""Получение IP адреса сервера"""
|
||||
import socket
|
||||
|
||||
# 0) Если явно задан адрес, который должен отображаться в UI (рекомендуется при запуске в Docker), используем его
|
||||
public_host = os.getenv("PUBLIC_HOST") or os.getenv("ADVERTISED_HOST")
|
||||
if public_host and public_host not in ("", "0.0.0.0", "127.0.0.1", "localhost"):
|
||||
return public_host
|
||||
|
||||
# 1) Если в конфиге явно указан хост (и это не 0.0.0.0 / localhost), используем его
|
||||
cfg_host = SERVER_CONFIG.get("host")
|
||||
if cfg_host and cfg_host not in ("0.0.0.0", "127.0.0.1", "localhost", ""):
|
||||
return cfg_host
|
||||
|
||||
# 2) Попытка определить внешний IP без отправки данных — UDP socket к публичному адресу
|
||||
try:
|
||||
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
|
||||
# Не устанавливаем реального соединения, просто используем маршрутную информацию
|
||||
s.connect(("8.8.8.8", 80))
|
||||
ip_address = s.getsockname()[0]
|
||||
s.close()
|
||||
|
||||
if ip_address and not ip_address.startswith("127."):
|
||||
return ip_address
|
||||
except Exception:
|
||||
pass
|
||||
|
||||
# 3) Попытка через hostname (может вернуть 127.0.1.1 на некоторых системах)
|
||||
try:
|
||||
import socket
|
||||
hostname = socket.gethostname()
|
||||
ip_address = socket.gethostbyname(hostname)
|
||||
return ip_address
|
||||
except:
|
||||
return SERVER_CONFIG["host"]
|
||||
if ip_address and not ip_address.startswith("127."):
|
||||
return ip_address
|
||||
except Exception:
|
||||
pass
|
||||
|
||||
# 4) Фолбэк — вернуть значение из конфига (возможно 0.0.0.0 или что задано в ENV)
|
||||
return cfg_host or "0.0.0.0"
|
||||
|
||||
# ========== КЛАССЫ ДЛЯ УПРАВЛЕНИЯ ==========
|
||||
class RoomManager:
|
||||
|
||||
Reference in New Issue
Block a user