This commit is contained in:
lendry
2026-06-24 18:12:12 +03:00
parent 21f2a1c227
commit dcab6557d3
4 changed files with 104 additions and 19 deletions

View File

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

View File

@@ -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: 'Только для тестовых окружений' },

View File

@@ -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")

View File

@@ -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" <<EOF
services:
log "Настройка docker-compose override (Nginx: ${mode})..."
nginx_fragment="$(cat <<EOF
nginx:
ports:
- "${http_port}:80"
- "${https_port}:443"
EOF
else
# host Nginx — override не нужен; удаляем старый (мог содержать ports: !reset [])
[[ -f "$COMPOSE_OVERRIDE" ]] && rm -f "$COMPOSE_OVERRIDE"
)"
fi
ldap_fragment="$(build_ldap_compose_fragment)"
[[ -n "$ldap_fragment" ]] && log "Настройка docker-compose override (LDAP DNS / host network)..."
body="${nginx_fragment}${ldap_fragment}"
if [[ -z "$body" ]]; then
[[ -f "$COMPOSE_OVERRIDE" ]] && rm -f "$COMPOSE_OVERRIDE"
return
fi
cat >"$COMPOSE_OVERRIDE" <<EOF
services:
${body}
EOF
}
build_ldap_compose_fragment() {
load_env
local use_host dns_servers dns_search extra_hosts
use_host="$(env_get LDAP_USE_HOST_NETWORK false)"
dns_servers="$(env_get LDAP_DNS_SERVERS "")"
dns_search="$(env_get LDAP_DNS_SEARCH "")"
extra_hosts="$(env_get LDAP_EXTRA_HOSTS "")"
[[ "$use_host" == "true" || -n "$dns_servers" || -n "$extra_hosts" ]] || return 0
if [[ "$use_host" == "true" ]]; then
cat <<'EOF'
ldap-auth:
network_mode: host
sso-core:
environment:
LDAP_AUTH_URL: http://host.docker.internal:8086
extra_hosts:
- "host.docker.internal:host-gateway"
EOF
return 0
fi
local fragment=$'\n ldap-auth:'
if [[ -n "$dns_servers" ]]; then
fragment+=$'\n dns:'
local server
IFS=',' read -ra _dns <<< "$dns_servers"
for server in "${_dns[@]}"; do
server="$(echo "$server" | xargs)"
[[ -n "$server" ]] && fragment+=$'\n - "'"${server}"'"'
done
fi
if [[ -n "$dns_search" ]]; then
fragment+=$'\n dns_search:'
local zone
IFS=',' read -ra _zones <<< "$dns_search"
for zone in "${_zones[@]}"; do
zone="$(echo "$zone" | xargs)"
[[ -n "$zone" ]] && fragment+=$'\n - "'"${zone}"'"'
done
fi
if [[ -n "$extra_hosts" ]]; then
fragment+=$'\n extra_hosts:'
local host_entry
IFS=',' read -ra _hosts <<< "$extra_hosts"
for host_entry in "${_hosts[@]}"; do
host_entry="$(echo "$host_entry" | xargs)"
[[ -n "$host_entry" ]] && fragment+=$'\n - "'"${host_entry}"'"'
done
fi
printf '%s' "$fragment"
}
HOST_EDGE_SERVICES=(api-gateway frontend docs media-ws)
@@ -1754,6 +1822,14 @@ print_intranet_hint() {
echo " API вызывается через ${DOMAIN_FRONTEND}/idp-api — отдельно открывать ${DOMAIN_API} не нужно."
echo ""
fi
if [[ "$(env_get LDAP_USE_HOST_NETWORK false)" == "true" ]]; then
echo " LDAP: контейнер ldap-auth использует сеть хоста (резолвит AD-имена как сервер)."
elif [[ -n "$(env_get LDAP_DNS_SERVERS "")" || -n "$(env_get LDAP_EXTRA_HOSTS "")" ]]; then
echo " LDAP: для ldap-auth настроены DNS/extra_hosts из .env"
else
echo " LDAP: если AD-имена не резолвятся — LDAP_USE_HOST_NETWORK=true или IP DC в LDAP_HOST."
fi
echo ""
}
print_summary() {
@@ -1946,8 +2022,8 @@ action_fix_host_proxy() {
log "Шаг 1/4: остановка Docker Nginx..."
stop_docker_nginx
log "Шаг 2/4: удаление override (мог блокировать порты)..."
rm -f "$COMPOSE_OVERRIDE"
log "Шаг 2/4: compose override (LDAP / Nginx)..."
write_compose_override
log "Шаг 3/4: пересоздание api-gateway, frontend, docs, media-ws..."
build_compose_stack_cmd