fix Coolify host env handling
All checks were successful
Build and Push Docker Image / build (push) Successful in 41s

This commit is contained in:
2026-04-21 08:58:37 +02:00
parent ffacb3f198
commit fa7a27ae38

View File

@@ -12,6 +12,7 @@ https://docs.djangoproject.com/en/5.2/ref/settings/
import os import os
from pathlib import Path from pathlib import Path
from urllib.parse import urlparse
# Build paths inside the project like this: BASE_DIR / 'subdir'. # Build paths inside the project like this: BASE_DIR / 'subdir'.
BASE_DIR = Path(__file__).resolve().parent.parent BASE_DIR = Path(__file__).resolve().parent.parent
@@ -40,7 +41,7 @@ def env_bool(name: str, default: bool = False) -> bool:
def env_list(name: str, default: list[str]) -> list[str]: def env_list(name: str, default: list[str]) -> list[str]:
value = os.getenv(name) value = os.getenv(name)
if value is None: if value is None or not value.strip():
return default return default
return [item.strip() for item in value.split(",") if item.strip()] return [item.strip() for item in value.split(",") if item.strip()]
@@ -56,6 +57,82 @@ def env_pair(name: str, default: tuple[str, str]) -> tuple[str, str]:
return parts[0], parts[1] return parts[0], parts[1]
def merge_unique(*value_lists: list[str]) -> list[str]:
merged: list[str] = []
seen: set[str] = set()
for values in value_lists:
for value in values:
if value and value not in seen:
seen.add(value)
merged.append(value)
return merged
def normalize_host(value: str) -> str | None:
value = value.strip()
if not value:
return None
parsed = urlparse(value if "://" in value else f"//{value}")
if parsed.hostname:
return parsed.hostname
return value.split("/", 1)[0].split(":", 1)[0] or None
def normalize_origin(value: str) -> str | None:
value = value.strip()
if not value:
return None
if "://" not in value:
host = normalize_host(value)
return f"https://{host}" if host else None
parsed = urlparse(value)
if not parsed.scheme or not parsed.hostname:
return None
origin = f"{parsed.scheme}://{parsed.hostname}"
if parsed.port:
origin = f"{origin}:{parsed.port}"
return origin
def collect_hosts(*env_names: str) -> list[str]:
hosts: list[str] = []
for env_name in env_names:
value = os.getenv(env_name)
if not value:
continue
for item in value.split(","):
host = normalize_host(item)
if host:
hosts.append(host)
return hosts
def collect_origins(*env_names: str) -> list[str]:
origins: list[str] = []
for env_name in env_names:
value = os.getenv(env_name)
if not value:
continue
for item in value.split(","):
origin = normalize_origin(item)
if origin:
origins.append(origin)
return origins
ENV_FILE = Path(os.getenv("DJANGO_ENV_FILE", BASE_DIR / ".env")) ENV_FILE = Path(os.getenv("DJANGO_ENV_FILE", BASE_DIR / ".env"))
load_env_file(ENV_FILE) load_env_file(ENV_FILE)
if not ENV_FILE.exists(): if not ENV_FILE.exists():
@@ -70,11 +147,18 @@ SECRET_KEY = os.getenv("SECRET_KEY", "django-insecure-*%u*i415=%@ny05mbd-j3802bc
# SECURITY WARNING: don't run with debug turned on in production! # SECURITY WARNING: don't run with debug turned on in production!
DEBUG = env_bool("DEBUG", True) DEBUG = env_bool("DEBUG", True)
ALLOWED_HOSTS = env_list("ALLOWED_HOSTS", ["127.0.0.1", "preview-1.azimkin.dev"]) ALLOWED_HOSTS = merge_unique(
collect_hosts("COOLIFY_FQDN", "COOLIFY_URL"),
env_list("ALLOWED_HOSTS", ["127.0.0.1", "localhost", "preview-1.azimkin.dev"]),
)
CSRF_TRUSTED_ORIGINS = env_list( CSRF_TRUSTED_ORIGINS = env_list(
"CSRF_TRUSTED_ORIGINS", "CSRF_TRUSTED_ORIGINS",
["https://preview-1.azimkin.dev", "http://127.0.0.1", "http://localhost"], ["https://preview-1.azimkin.dev", "http://127.0.0.1", "http://localhost"],
) )
CSRF_TRUSTED_ORIGINS = merge_unique(
collect_origins("COOLIFY_URL", "COOLIFY_FQDN"),
CSRF_TRUSTED_ORIGINS,
)
USE_X_FORWARDED_HOST = env_bool("USE_X_FORWARDED_HOST", True) USE_X_FORWARDED_HOST = env_bool("USE_X_FORWARDED_HOST", True)
SECURE_PROXY_SSL_HEADER = env_pair( SECURE_PROXY_SSL_HEADER = env_pair(
"SECURE_PROXY_SSL_HEADER", "SECURE_PROXY_SSL_HEADER",