diff --git a/.env.example b/.env.example index 2112a4a..e91243e 100644 --- a/.env.example +++ b/.env.example @@ -31,6 +31,12 @@ PUBLIC_WS_URL=ws://localhost:8085/ws INTERNAL_API_URL=http://api-gateway:3000 INTERNAL_WS_URL=http://media-ws:8085 +# LDAP в Docker: host network (рекомендуется для AD) или корпоративный DNS +LDAP_USE_HOST_NETWORK=true +# LDAP_DNS_SERVERS=192.168.1.10,192.168.1.11 +# LDAP_DNS_SEARCH=mvkug.local +# LDAP_EXTRA_HOSTS=DC-1.mvkug.local:192.168.1.10,DC-2.mvkug.local:192.168.1.11 + # Nginx (USE_NGINX_SSL=true только при SSL_TYPE=letsencrypt|selfsigned) USE_NGINX_SSL=false CERTBOT_EMAIL= diff --git a/apps/frontend/lib/system-settings-catalog.ts b/apps/frontend/lib/system-settings-catalog.ts index 5a292c1..5e11532 100644 --- a/apps/frontend/lib/system-settings-catalog.ts +++ b/apps/frontend/lib/system-settings-catalog.ts @@ -38,7 +38,7 @@ export const SYSTEM_SETTING_CATALOG: SystemSettingMeta[] = [ { key: 'MAINTENANCE_MODE', label: 'Режим обслуживания', group: 'auth', type: 'boolean', hint: 'Блокирует вход для обычных пользователей' }, { key: 'LDAP_ENABLED', label: 'LDAP включён', group: 'ldap', type: 'boolean', hint: 'Показывает кнопку входа через LDAP на странице авторизации' }, { key: 'LDAP_USE_LDAPS', label: 'Использовать LDAPS', group: 'ldap', type: 'boolean', hint: 'Шифрованное подключение (порт 636)' }, - { key: 'LDAP_HOST', label: 'Хост LDAP', group: 'ldap', type: 'text', hint: 'DC-1.local,DC-2.local или ldaps://DC-1.local:636' }, + { key: 'LDAP_HOST', label: 'Хост LDAP', group: 'ldap', type: 'text', hint: 'DC-1.domain.local или IP контроллера (192.168.x.x), если Docker не резолвит AD-имена' }, { key: 'LDAP_PORT', label: 'Порт LDAP', group: 'ldap', type: 'number', hint: '636 для LDAPS, 389 для LDAP. Не используйте 640.' }, { key: 'LDAP_DOMAIN', label: 'Домен AD', group: 'ldap', type: 'text', hint: 'mvkug.local — для bind вида user@domain' }, { key: 'LDAP_SKIP_TLS_VERIFY', label: 'Не проверять TLS', group: 'ldap', type: 'boolean', hint: 'Только для тестовых окружений' }, diff --git a/apps/ldap-auth/main.go b/apps/ldap-auth/main.go index f65118c..51e248c 100644 --- a/apps/ldap-auth/main.go +++ b/apps/ldap-auth/main.go @@ -170,6 +170,9 @@ func connect(cfg ldapConfig) (*ldap.Conn, error) { if strings.Contains(lastErr.Error(), "connection refused") { return nil, fmt.Errorf("не удалось подключиться к LDAP (connection refused). Проверьте host, порт (636 для LDAPS) и доступность контейнера ldap-auth до AD: %w", lastErr) } + if strings.Contains(lastErr.Error(), "server misbehaving") || strings.Contains(lastErr.Error(), "no such host") || strings.Contains(lastErr.Error(), "lookup ") { + return nil, fmt.Errorf("не удалось разрешить имя LDAP-сервера (DNS). Укажите IP DC в LDAP_HOST или включите LDAP_USE_HOST_NETWORK=true в .env и пересоздайте ldap-auth: %w", lastErr) + } return nil, fmt.Errorf("не удалось подключиться к LDAP: %w", lastErr) } return nil, errors.New("не удалось подключиться к LDAP") diff --git a/install.sh b/install.sh index 3d1e740..631b673 100644 --- a/install.sh +++ b/install.sh @@ -948,6 +948,14 @@ persist_domain_env() { env_set MINIO_PUBLIC_ENDPOINT "${MINIO_PUBLIC_ENDPOINT:-localhost:9000}" env_set MINIO_USE_SSL "${MINIO_USE_SSL:-false}" + if [[ "$(env_get INSTALL_MODE local)" == "intranet" && -z "$(env_get LDAP_USE_HOST_NETWORK "")" ]]; then + env_set LDAP_USE_HOST_NETWORK "true" + fi + env_set LDAP_USE_HOST_NETWORK "$(env_get LDAP_USE_HOST_NETWORK false)" + env_set LDAP_DNS_SERVERS "$(env_get LDAP_DNS_SERVERS "")" + env_set LDAP_DNS_SEARCH "$(env_get LDAP_DNS_SEARCH "")" + env_set LDAP_EXTRA_HOSTS "$(env_get LDAP_EXTRA_HOSTS "")" + ok "Файл .env обновлён" } @@ -955,34 +963,94 @@ write_compose_override() { resolve_nginx_mode_and_ports load_env local mode="${NGINX_MODE:-$(env_get NGINX_MODE host)}" - local has_domains + local has_domains install_mode has_domains="$(env_get DOMAIN_API "")" + install_mode="$(env_get INSTALL_MODE local)" - if [[ -z "$has_domains" || "$(env_get INSTALL_MODE local)" == "local" ]]; then - [[ -f "$COMPOSE_OVERRIDE" ]] && rm -f "$COMPOSE_OVERRIDE" - return - fi + local nginx_fragment="" ldap_fragment="" body="" - log "Настройка docker-compose override (Nginx: ${mode})..." - - # Порты edge-сервисов и MinIO (127.0.0.1) заданы в docker-compose.yml. - # Override только добавляет Docker Nginx при NGINX_MODE=docker. - - if [[ "$mode" == "docker" ]]; then + if [[ -n "$has_domains" && "$install_mode" != "local" && "$mode" == "docker" ]]; then local http_port https_port http_port="$(env_get NGINX_HTTP_PORT 80)" https_port="$(env_get NGINX_HTTPS_PORT 443)" - cat >"$COMPOSE_OVERRIDE" <"$COMPOSE_OVERRIDE" <