feat: Add Docker Compose configurations for Kvrocks and Redis deployments
- 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.
This commit is contained in:
@@ -0,0 +1,122 @@
|
||||
/* eslint-disable no-console, @typescript-eslint/no-explicit-any */
|
||||
|
||||
/**
|
||||
* 验证 Kvrocks 密码处理修复
|
||||
* 模拟用户反馈的错误场景
|
||||
*/
|
||||
|
||||
// 模拟用户的环境变量设置
|
||||
process.env.NEXT_PUBLIC_STORAGE_TYPE = 'kvrocks';
|
||||
process.env.KVROCKS_URL = 'redis://kvrocks:6666';
|
||||
process.env.KVROCKS_PASSWORD = ''; // 用户设置了空密码,这是问题所在
|
||||
process.env.KVROCKS_DATABASE = '0';
|
||||
|
||||
// 模拟 Redis 客户端创建函数
|
||||
function createClient(config) {
|
||||
console.log('🔧 创建 Redis 客户端配置:', JSON.stringify(config, null, 2));
|
||||
|
||||
if (config.password === '') {
|
||||
console.log('❌ 检测到空密码,这会导致认证错误!');
|
||||
return {
|
||||
connect: () => Promise.reject(new Error('ERR Client sent AUTH, but no password is set')),
|
||||
isOpen: false
|
||||
};
|
||||
} else if (config.password === undefined) {
|
||||
console.log('✅ 无密码配置,正常连接');
|
||||
return {
|
||||
connect: () => Promise.resolve(),
|
||||
isOpen: true
|
||||
};
|
||||
} else {
|
||||
console.log('✅ 有效密码配置,正常连接');
|
||||
return {
|
||||
connect: () => Promise.resolve(),
|
||||
isOpen: true
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
// 使用修复后的客户端创建逻辑
|
||||
function getKvrocksClient() {
|
||||
const kvrocksUrl = process.env.KVROCKS_URL || 'redis://localhost:6666';
|
||||
const kvrocksPassword = process.env.KVROCKS_PASSWORD;
|
||||
const kvrocksDatabase = parseInt(process.env.KVROCKS_DATABASE || '0');
|
||||
|
||||
console.log('🏪 Initializing Kvrocks client...');
|
||||
console.log('🔗 Kvrocks URL:', kvrocksUrl);
|
||||
console.log('🔑 Password configured:', kvrocksPassword ? 'Yes' : 'No');
|
||||
console.log('🔑 Password value:', JSON.stringify(kvrocksPassword));
|
||||
|
||||
// 构建客户端配置
|
||||
const clientConfig = {
|
||||
url: kvrocksUrl,
|
||||
database: kvrocksDatabase,
|
||||
socket: {
|
||||
connectTimeout: 10000,
|
||||
},
|
||||
};
|
||||
|
||||
// 只有当密码存在且不为空时才添加密码配置
|
||||
if (kvrocksPassword && kvrocksPassword.trim() !== '') {
|
||||
clientConfig.password = kvrocksPassword;
|
||||
console.log('🔐 Using password authentication');
|
||||
} else {
|
||||
console.log('🔓 No password authentication (connecting without password)');
|
||||
}
|
||||
|
||||
return createClient(clientConfig);
|
||||
}
|
||||
|
||||
async function testScenarios() {
|
||||
console.log('🧪 测试不同密码配置场景\n');
|
||||
|
||||
// 场景1:用户的问题场景 - 空字符串密码
|
||||
console.log('📝 场景1:用户问题场景(空字符串密码)');
|
||||
console.log('环境变量: KVROCKS_PASSWORD=""');
|
||||
process.env.KVROCKS_PASSWORD = '';
|
||||
try {
|
||||
const client = getKvrocksClient();
|
||||
await client.connect();
|
||||
console.log('✅ 场景1通过:无认证错误\n');
|
||||
} catch (error) {
|
||||
console.log('❌ 场景1失败:', error.message, '\n');
|
||||
}
|
||||
|
||||
// 场景2:未设置密码
|
||||
console.log('📝 场景2:未设置密码');
|
||||
console.log('环境变量: KVROCKS_PASSWORD=undefined');
|
||||
delete process.env.KVROCKS_PASSWORD;
|
||||
try {
|
||||
const client = getKvrocksClient();
|
||||
await client.connect();
|
||||
console.log('✅ 场景2通过:无认证错误\n');
|
||||
} catch (error) {
|
||||
console.log('❌ 场景2失败:', error.message, '\n');
|
||||
}
|
||||
|
||||
// 场景3:有效密码
|
||||
console.log('📝 场景3:有效密码');
|
||||
console.log('环境变量: KVROCKS_PASSWORD="validpassword"');
|
||||
process.env.KVROCKS_PASSWORD = 'validpassword';
|
||||
try {
|
||||
const client = getKvrocksClient();
|
||||
await client.connect();
|
||||
console.log('✅ 场景3通过:正常密码认证\n');
|
||||
} catch (error) {
|
||||
console.log('❌ 场景3失败:', error.message, '\n');
|
||||
}
|
||||
|
||||
// 场景4:只有空格的密码
|
||||
console.log('📝 场景4:只有空格的密码');
|
||||
console.log('环境变量: KVROCKS_PASSWORD=" "');
|
||||
process.env.KVROCKS_PASSWORD = ' ';
|
||||
try {
|
||||
const client = getKvrocksClient();
|
||||
await client.connect();
|
||||
console.log('✅ 场景4通过:空格密码被正确处理\n');
|
||||
} catch (error) {
|
||||
console.log('❌ 场景4失败:', error.message, '\n');
|
||||
}
|
||||
}
|
||||
|
||||
testScenarios().catch(console.error);
|
||||
Reference in New Issue
Block a user