82485d1939
- Implemented `docker-compose.kvrocks.auth.yml` for Kvrocks with password authentication. - Created `docker-compose.redis.yml` for Redis deployment. - Added Kvrocks configuration file `kvrocks.auth.conf` with necessary settings. - Updated documentation with deployment guidelines for Kvrocks. - Introduced ESLint configuration for code quality. - Developed deployment configuration check script `check-deployment-configs.js`. - Added D1 database initialization script `d1-init.sql` for KatelyaTV. - Created test script `test-kvrocks-deployment.js` to validate Kvrocks deployment. - Implemented fix verification script `verify-kvrocks-fix.js` for password handling. - Updated `wrangler.toml` for Cloudflare deployment configuration.
149 lines
3.6 KiB
Markdown
149 lines
3.6 KiB
Markdown
# 🐛 Kvrocks 部署问题修复报告
|
||
|
||
## 📋 问题描述
|
||
|
||
用户反馈在使用 Docker + Kvrocks 部署方案时遇到以下错误:
|
||
|
||
```
|
||
❌ Kvrocks Client Error: [Error]: ERR Client sent AUTH, but no password is set
|
||
```
|
||
|
||
## 🔍 问题分析
|
||
|
||
### 根本原因
|
||
|
||
当环境变量 `KVROCKS_PASSWORD` 被设置为空字符串时,Redis 客户端仍然会尝试进行密码认证,但 Kvrocks 服务端没有配置密码,导致认证失败。
|
||
|
||
### 问题场景
|
||
|
||
1. **用户配置**:`KVROCKS_PASSWORD=` 或 `KVROCKS_PASSWORD=""`
|
||
2. **Docker Compose**:`${KVROCKS_PASSWORD:-}` 解析为空字符串
|
||
3. **Kvrocks 服务**:没有设置 `requirepass`,不需要密码认证
|
||
4. **客户端行为**:检测到 `password: ""` 参数,尝试发送 AUTH 命令
|
||
5. **服务端响应**:`ERR Client sent AUTH, but no password is set`
|
||
|
||
## 🔧 修复方案
|
||
|
||
### 1. 客户端密码处理优化
|
||
|
||
修改 `src/lib/kvrocks.db.ts` 中的客户端创建逻辑:
|
||
|
||
```typescript
|
||
// 修复前(有问题)
|
||
kvrocksClient = createClient({
|
||
url: kvrocksUrl,
|
||
password: kvrocksPassword, // 即使为空字符串也会尝试认证
|
||
database: kvrocksDatabase,
|
||
// ...
|
||
});
|
||
|
||
// 修复后(正确)
|
||
const clientConfig = {
|
||
url: kvrocksUrl,
|
||
database: kvrocksDatabase,
|
||
// ...
|
||
};
|
||
|
||
// 只有当密码存在且不为空时才添加密码配置
|
||
if (kvrocksPassword && kvrocksPassword.trim() !== '') {
|
||
clientConfig.password = kvrocksPassword;
|
||
console.log('🔐 Using password authentication');
|
||
} else {
|
||
console.log('🔓 No password authentication (connecting without password)');
|
||
}
|
||
|
||
kvrocksClient = createClient(clientConfig);
|
||
```
|
||
|
||
### 2. Docker Compose 配置分离
|
||
|
||
创建两个独立的部署配置:
|
||
|
||
- **无密码部署**:`docker-compose.kvrocks.yml`(开发环境推荐)
|
||
- **密码认证部署**:`docker-compose.kvrocks.auth.yml`(生产环境推荐)
|
||
|
||
### 3. 环境变量示例更新
|
||
|
||
更新 `.env.kvrocks.example` 提供清晰的配置指导:
|
||
|
||
```bash
|
||
# 选项1:不使用密码(推荐用于开发环境)
|
||
# KVROCKS_PASSWORD=
|
||
|
||
# 选项2:使用密码(推荐用于生产环境)
|
||
# KVROCKS_PASSWORD=your_secure_password_here
|
||
```
|
||
|
||
## ✅ 修复验证
|
||
|
||
### 测试场景覆盖
|
||
|
||
修复已通过以下场景验证:
|
||
|
||
1. ✅ **空字符串密码**:`KVROCKS_PASSWORD=""`
|
||
2. ✅ **未设置密码**:`KVROCKS_PASSWORD` 未定义
|
||
3. ✅ **有效密码**:`KVROCKS_PASSWORD="validpassword"`
|
||
4. ✅ **空格密码**:`KVROCKS_PASSWORD=" "`
|
||
|
||
### 验证工具
|
||
|
||
提供验证脚本 `scripts/verify-kvrocks-fix.js` 用于测试修复效果。
|
||
|
||
## 📚 部署指南
|
||
|
||
### 快速修复(现有部署)
|
||
|
||
如果您已经遇到此问题:
|
||
|
||
1. **停止服务**
|
||
|
||
```bash
|
||
docker-compose down
|
||
```
|
||
|
||
2. **更新代码**
|
||
|
||
```bash
|
||
git pull origin main
|
||
```
|
||
|
||
3. **清理环境变量**
|
||
|
||
```bash
|
||
# 编辑 .env 文件,确保 KVROCKS_PASSWORD 设置正确
|
||
# 选择以下之一:
|
||
# KVROCKS_PASSWORD= # 无密码
|
||
# KVROCKS_PASSWORD=your_password # 有密码
|
||
```
|
||
|
||
4. **重新启动**
|
||
|
||
```bash
|
||
# 无密码部署
|
||
docker-compose -f docker-compose.kvrocks.yml up -d
|
||
|
||
# 或密码认证部署
|
||
docker-compose -f docker-compose.kvrocks.auth.yml up -d
|
||
```
|
||
|
||
### 新部署
|
||
|
||
请参考 [docs/KVROCKS_DEPLOYMENT.md](../docs/KVROCKS_DEPLOYMENT.md) 获取完整部署指南。
|
||
|
||
## 🚀 改进效果
|
||
|
||
修复后的部署将:
|
||
|
||
- ✅ 消除密码认证错误
|
||
- ✅ 支持灵活的密码配置
|
||
- ✅ 提供清晰的部署选项
|
||
- ✅ 增强错误日志可读性
|
||
|
||
## 📞 技术支持
|
||
|
||
如果仍有问题,请:
|
||
|
||
1. 运行测试脚本:`node scripts/test-kvrocks-deployment.js`
|
||
2. 检查日志:`docker-compose logs -f`
|
||
3. 参考部署文档:`docs/KVROCKS_DEPLOYMENT.md`
|