fix ldap
This commit is contained in:
@@ -31,6 +31,12 @@ PUBLIC_WS_URL=ws://localhost:8085/ws
|
|||||||
INTERNAL_API_URL=http://api-gateway:3000
|
INTERNAL_API_URL=http://api-gateway:3000
|
||||||
INTERNAL_WS_URL=http://media-ws:8085
|
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)
|
# Nginx (USE_NGINX_SSL=true только при SSL_TYPE=letsencrypt|selfsigned)
|
||||||
USE_NGINX_SSL=false
|
USE_NGINX_SSL=false
|
||||||
CERTBOT_EMAIL=
|
CERTBOT_EMAIL=
|
||||||
|
|||||||
@@ -38,7 +38,7 @@ export const SYSTEM_SETTING_CATALOG: SystemSettingMeta[] = [
|
|||||||
{ key: 'MAINTENANCE_MODE', label: 'Режим обслуживания', group: 'auth', type: 'boolean', hint: 'Блокирует вход для обычных пользователей' },
|
{ key: 'MAINTENANCE_MODE', label: 'Режим обслуживания', group: 'auth', type: 'boolean', hint: 'Блокирует вход для обычных пользователей' },
|
||||||
{ key: 'LDAP_ENABLED', label: 'LDAP включён', group: 'ldap', type: 'boolean', hint: 'Показывает кнопку входа через LDAP на странице авторизации' },
|
{ 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_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_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_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: 'Только для тестовых окружений' },
|
{ key: 'LDAP_SKIP_TLS_VERIFY', label: 'Не проверять TLS', group: 'ldap', type: 'boolean', hint: 'Только для тестовых окружений' },
|
||||||
|
|||||||
@@ -170,6 +170,9 @@ func connect(cfg ldapConfig) (*ldap.Conn, error) {
|
|||||||
if strings.Contains(lastErr.Error(), "connection refused") {
|
if strings.Contains(lastErr.Error(), "connection refused") {
|
||||||
return nil, fmt.Errorf("не удалось подключиться к LDAP (connection refused). Проверьте host, порт (636 для LDAPS) и доступность контейнера ldap-auth до AD: %w", lastErr)
|
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, fmt.Errorf("не удалось подключиться к LDAP: %w", lastErr)
|
||||||
}
|
}
|
||||||
return nil, errors.New("не удалось подключиться к LDAP")
|
return nil, errors.New("не удалось подключиться к LDAP")
|
||||||
|
|||||||
112
install.sh
112
install.sh
@@ -948,6 +948,14 @@ persist_domain_env() {
|
|||||||
env_set MINIO_PUBLIC_ENDPOINT "${MINIO_PUBLIC_ENDPOINT:-localhost:9000}"
|
env_set MINIO_PUBLIC_ENDPOINT "${MINIO_PUBLIC_ENDPOINT:-localhost:9000}"
|
||||||
env_set MINIO_USE_SSL "${MINIO_USE_SSL:-false}"
|
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 обновлён"
|
ok "Файл .env обновлён"
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -955,34 +963,94 @@ write_compose_override() {
|
|||||||
resolve_nginx_mode_and_ports
|
resolve_nginx_mode_and_ports
|
||||||
load_env
|
load_env
|
||||||
local mode="${NGINX_MODE:-$(env_get NGINX_MODE host)}"
|
local mode="${NGINX_MODE:-$(env_get NGINX_MODE host)}"
|
||||||
local has_domains
|
local has_domains install_mode
|
||||||
has_domains="$(env_get DOMAIN_API "")"
|
has_domains="$(env_get DOMAIN_API "")"
|
||||||
|
install_mode="$(env_get INSTALL_MODE local)"
|
||||||
|
|
||||||
if [[ -z "$has_domains" || "$(env_get INSTALL_MODE local)" == "local" ]]; then
|
local nginx_fragment="" ldap_fragment="" body=""
|
||||||
[[ -f "$COMPOSE_OVERRIDE" ]] && rm -f "$COMPOSE_OVERRIDE"
|
|
||||||
return
|
|
||||||
fi
|
|
||||||
|
|
||||||
log "Настройка docker-compose override (Nginx: ${mode})..."
|
if [[ -n "$has_domains" && "$install_mode" != "local" && "$mode" == "docker" ]]; then
|
||||||
|
|
||||||
# Порты edge-сервисов и MinIO (127.0.0.1) заданы в docker-compose.yml.
|
|
||||||
# Override только добавляет Docker Nginx при NGINX_MODE=docker.
|
|
||||||
|
|
||||||
if [[ "$mode" == "docker" ]]; then
|
|
||||||
local http_port https_port
|
local http_port https_port
|
||||||
http_port="$(env_get NGINX_HTTP_PORT 80)"
|
http_port="$(env_get NGINX_HTTP_PORT 80)"
|
||||||
https_port="$(env_get NGINX_HTTPS_PORT 443)"
|
https_port="$(env_get NGINX_HTTPS_PORT 443)"
|
||||||
cat >"$COMPOSE_OVERRIDE" <<EOF
|
log "Настройка docker-compose override (Nginx: ${mode})..."
|
||||||
services:
|
nginx_fragment="$(cat <<EOF
|
||||||
nginx:
|
nginx:
|
||||||
ports:
|
ports:
|
||||||
- "${http_port}:80"
|
- "${http_port}:80"
|
||||||
- "${https_port}:443"
|
- "${https_port}:443"
|
||||||
EOF
|
EOF
|
||||||
else
|
)"
|
||||||
# host Nginx — override не нужен; удаляем старый (мог содержать ports: !reset [])
|
|
||||||
[[ -f "$COMPOSE_OVERRIDE" ]] && rm -f "$COMPOSE_OVERRIDE"
|
|
||||||
fi
|
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)
|
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 " API вызывается через ${DOMAIN_FRONTEND}/idp-api — отдельно открывать ${DOMAIN_API} не нужно."
|
||||||
echo ""
|
echo ""
|
||||||
fi
|
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() {
|
print_summary() {
|
||||||
@@ -1946,8 +2022,8 @@ action_fix_host_proxy() {
|
|||||||
log "Шаг 1/4: остановка Docker Nginx..."
|
log "Шаг 1/4: остановка Docker Nginx..."
|
||||||
stop_docker_nginx
|
stop_docker_nginx
|
||||||
|
|
||||||
log "Шаг 2/4: удаление override (мог блокировать порты)..."
|
log "Шаг 2/4: compose override (LDAP / Nginx)..."
|
||||||
rm -f "$COMPOSE_OVERRIDE"
|
write_compose_override
|
||||||
|
|
||||||
log "Шаг 3/4: пересоздание api-gateway, frontend, docs, media-ws..."
|
log "Шаг 3/4: пересоздание api-gateway, frontend, docs, media-ws..."
|
||||||
build_compose_stack_cmd
|
build_compose_stack_cmd
|
||||||
|
|||||||
Reference in New Issue
Block a user