92 lines
3.1 KiB
Bash
92 lines
3.1 KiB
Bash
|
|
#!/usr/bin/env bash
|
|||
|
|
# Diagnose 1Panel Redis auth from Nexus container network perspective.
|
|||
|
|
# Usage:
|
|||
|
|
# REDIS_PASS='redis_WP3NyN' bash deploy/test-1panel-redis.sh
|
|||
|
|
# bash deploy/test-1panel-redis.sh # prompts for password
|
|||
|
|
set -euo pipefail
|
|||
|
|
|
|||
|
|
NEXUS_ROOT="${NEXUS_ROOT:-/opt/nexus}"
|
|||
|
|
ENV_PROD="${NEXUS_ROOT}/docker/.env.prod"
|
|||
|
|
|
|||
|
|
info() { echo -e "\033[0;32m[INFO]\033[0m $*"; }
|
|||
|
|
ok() { echo -e "\033[0;32m[OK]\033[0m $*"; }
|
|||
|
|
fail() { echo -e "\033[0;31m[FAIL]\033[0m $*"; }
|
|||
|
|
|
|||
|
|
pick_redis_container() {
|
|||
|
|
if [[ -n "${REDIS_CONTAINER:-}" ]]; then
|
|||
|
|
echo "$REDIS_CONTAINER"
|
|||
|
|
return 0
|
|||
|
|
fi
|
|||
|
|
local h
|
|||
|
|
h="$(grep -E '^NEXUS_1PANEL_REDIS_HOST=' "$ENV_PROD" 2>/dev/null | cut -d= -f2- || true)"
|
|||
|
|
if [[ -n "$h" ]]; then
|
|||
|
|
echo "$h"
|
|||
|
|
return 0
|
|||
|
|
fi
|
|||
|
|
if [[ -x "$NEXUS_ROOT/deploy/detect-1panel-services.sh" ]]; then
|
|||
|
|
h="$("$NEXUS_ROOT/deploy/detect-1panel-services.sh" 2>/dev/null | sed -n 's/^NEXUS_1PANEL_REDIS_HOST=//p' | head -1)"
|
|||
|
|
[[ -n "$h" ]] && echo "$h" && return 0
|
|||
|
|
fi
|
|||
|
|
docker ps --format '{{.Names}}' | grep -iE '^1Panel-redis-' | head -1 || true
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
try_ping() {
|
|||
|
|
local label="$1" url="$2"
|
|||
|
|
local nexus
|
|||
|
|
nexus="$(docker ps --format '{{.Names}}' | grep -E 'nexus-prod-nexus|nexus-nexus-1' | head -1 || true)"
|
|||
|
|
if [[ -z "$nexus" ]]; then
|
|||
|
|
fail "未找到 Nexus 容器"
|
|||
|
|
return 1
|
|||
|
|
fi
|
|||
|
|
if docker exec "$nexus" python3 -c "
|
|||
|
|
import redis
|
|||
|
|
r = redis.Redis.from_url('${url}', socket_timeout=3)
|
|||
|
|
print(r.ping())
|
|||
|
|
" 2>/dev/null | grep -q True; then
|
|||
|
|
ok "$label → $url"
|
|||
|
|
return 0
|
|||
|
|
fi
|
|||
|
|
fail "$label"
|
|||
|
|
return 1
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
main() {
|
|||
|
|
local redis_host pass
|
|||
|
|
redis_host="$(pick_redis_container)"
|
|||
|
|
[[ -n "$redis_host" ]] || { fail "未找到 Redis 容器/主机名"; exit 1; }
|
|||
|
|
info "Redis 主机: $redis_host"
|
|||
|
|
|
|||
|
|
if [[ -z "${REDIS_PASS:-}" ]]; then
|
|||
|
|
read -r -s -p "1Panel Redis 密码(应用参数): " pass
|
|||
|
|
echo ""
|
|||
|
|
else
|
|||
|
|
pass="$REDIS_PASS"
|
|||
|
|
fi
|
|||
|
|
|
|||
|
|
echo ""
|
|||
|
|
info "从 Nexus 容器内尝试多种 URL 格式(807f4c2 修复后)..."
|
|||
|
|
local any=0
|
|||
|
|
try_ping "无认证" "redis://${redis_host}:6379/0" && any=1 || true
|
|||
|
|
if [[ -n "$pass" ]]; then
|
|||
|
|
try_ping "仅密码 (:pass@)" "redis://:${pass}@${redis_host}:6379/0" && any=1 || true
|
|||
|
|
try_ping "default 用户" "redis://default:${pass}@${redis_host}:6379/0" && any=1 || true
|
|||
|
|
info "跳过 root 用户探测 — 1Panel Redis 无 root 账号"
|
|||
|
|
fi
|
|||
|
|
|
|||
|
|
echo ""
|
|||
|
|
if [[ "$any" -eq 1 ]]; then
|
|||
|
|
ok "至少一种格式可用"
|
|||
|
|
echo ""
|
|||
|
|
info "安装向导步骤 3:1Panel Redis 无账号,只填密码(后端自动用 :pass@ 或 default)"
|
|||
|
|
info "已有 .env 时写入 NEXUS_REDIS_URL,例如:"
|
|||
|
|
info " redis://:${pass}@${redis_host}:6379/0"
|
|||
|
|
info " 或 redis://default:${pass}@${redis_host}:6379/0"
|
|||
|
|
exit 0
|
|||
|
|
fi
|
|||
|
|
fail "全部失败。请在 1Panel → Redis → 参数 核对密码,或检查 Nexus 是否在 1panel-network"
|
|||
|
|
info "本机: docker exec -it ${redis_host} redis-cli -u 'redis://:密码@127.0.0.1:6379' ping"
|
|||
|
|
exit 1
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
main "$@"
|