host_ip fix

This commit is contained in:
2025-12-03 19:57:11 +09:00
parent e94a79b9e7
commit 5023bfbca2
7 changed files with 55 additions and 7 deletions

View File

@@ -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: