mirror of
https://github.com/dqzboy/Docker-Proxy.git
synced 2026-01-12 16:25:42 +08:00
316 lines
7.8 KiB
JavaScript
316 lines
7.8 KiB
JavaScript
/**
|
||
* 系统初始化脚本 - 首次运行时执行
|
||
*/
|
||
const fs = require('fs').promises;
|
||
const path = require('path');
|
||
const bcrypt = require('bcrypt');
|
||
const { execSync } = require('child_process');
|
||
const logger = require('../logger');
|
||
const { ensureDirectoriesExist } = require('../init-dirs');
|
||
const { downloadImages } = require('../download-images');
|
||
const configService = require('../services/configService');
|
||
|
||
// 用户文件路径
|
||
const USERS_FILE = path.join(__dirname, '..', 'users.json');
|
||
|
||
/**
|
||
* 创建管理员用户
|
||
* @param {string} username 用户名
|
||
* @param {string} password 密码
|
||
*/
|
||
async function createAdminUser(username = 'root', password = 'admin') {
|
||
try {
|
||
// 检查用户文件是否已存在
|
||
try {
|
||
await fs.access(USERS_FILE);
|
||
logger.info('用户文件已存在,跳过创建管理员用户');
|
||
return;
|
||
} catch (err) {
|
||
if (err.code !== 'ENOENT') throw err;
|
||
}
|
||
|
||
// 创建默认管理员用户
|
||
const defaultUser = {
|
||
username,
|
||
password: bcrypt.hashSync(password, 10),
|
||
createdAt: new Date().toISOString(),
|
||
loginCount: 0,
|
||
lastLogin: null
|
||
};
|
||
|
||
await fs.writeFile(USERS_FILE, JSON.stringify({ users: [defaultUser] }, null, 2));
|
||
logger.success(`创建默认管理员用户: ${username}/${password}`);
|
||
logger.warn('请在首次登录后立即修改默认密码');
|
||
} catch (error) {
|
||
logger.error('创建管理员用户失败:', error);
|
||
throw error;
|
||
}
|
||
}
|
||
|
||
/**
|
||
* 创建默认配置
|
||
*/
|
||
async function createDefaultConfig() {
|
||
try {
|
||
// 检查配置是否已存在
|
||
const config = await configService.getConfig();
|
||
|
||
// 如果菜单项为空,添加默认菜单项
|
||
if (!config.menuItems || config.menuItems.length === 0) {
|
||
config.menuItems = [
|
||
{
|
||
text: "控制台",
|
||
link: "/admin",
|
||
newTab: false
|
||
},
|
||
{
|
||
text: "镜像搜索",
|
||
link: "/",
|
||
newTab: false
|
||
},
|
||
{
|
||
text: "文档",
|
||
link: "/docs",
|
||
newTab: false
|
||
},
|
||
{
|
||
text: "GitHub",
|
||
link: "https://github.com/dqzboy/hubcmdui",
|
||
newTab: true
|
||
}
|
||
];
|
||
|
||
await configService.saveConfig(config);
|
||
logger.success('创建默认菜单配置');
|
||
}
|
||
|
||
return config;
|
||
} catch (error) {
|
||
logger.error('初始化配置失败:', error);
|
||
throw error;
|
||
}
|
||
}
|
||
|
||
/**
|
||
* 创建示例文档 - 现已禁用
|
||
*/
|
||
async function createSampleDocumentation() {
|
||
logger.info('示例文档创建功能已禁用');
|
||
return; // 不再创建默认文档
|
||
|
||
/* 旧代码保留注释,已禁用
|
||
const docService = require('../services/documentationService');
|
||
|
||
try {
|
||
await docService.ensureDocumentationDir();
|
||
|
||
// 检查是否有现有文档
|
||
const docs = await docService.getDocumentationList();
|
||
if (docs && docs.length > 0) {
|
||
logger.info('文档已存在,跳过创建示例文档');
|
||
return;
|
||
}
|
||
|
||
// 创建示例文档
|
||
const welcomeDoc = {
|
||
title: "欢迎使用 Docker 镜像代理加速系统",
|
||
content: `# 欢迎使用 Docker 镜像代理加速系统
|
||
|
||
## 系统简介
|
||
|
||
Docker 镜像代理加速系统是一个帮助用户快速搜索、拉取 Docker 镜像的工具。本系统提供了以下功能:
|
||
|
||
- 快速搜索 Docker Hub 上的镜像
|
||
- 查看镜像的详细信息和标签
|
||
- 管理本地 Docker 容器
|
||
- 监控容器状态并发送通知
|
||
|
||
## 快速开始
|
||
|
||
1. 在首页搜索框中输入要查找的镜像名称
|
||
2. 点击搜索结果查看详细信息
|
||
3. 使用提供的命令拉取镜像
|
||
|
||
## 管理功能
|
||
|
||
管理员可以通过控制面板管理系统:
|
||
|
||
- 查看所有容器状态
|
||
- 启动/停止/重启容器
|
||
- 更新容器镜像
|
||
- 配置监控告警
|
||
|
||
祝您使用愉快!
|
||
`,
|
||
published: true
|
||
};
|
||
|
||
const aboutDoc = {
|
||
title: "关于系统",
|
||
content: `# 关于 Docker 镜像代理加速系统
|
||
|
||
## 系统版本
|
||
|
||
当前版本: v1.0.0
|
||
|
||
## 技术栈
|
||
|
||
- 前端: HTML, CSS, JavaScript
|
||
- 后端: Node.js, Express
|
||
- 容器: Docker, Dockerode
|
||
- 数据存储: 文件系统
|
||
|
||
## 联系方式
|
||
|
||
如有问题,请通过以下方式联系我们:
|
||
|
||
- GitHub Issues
|
||
- 电子邮件: example@example.com
|
||
|
||
## 许可证
|
||
|
||
本项目采用 MIT 许可证
|
||
`,
|
||
published: true
|
||
};
|
||
|
||
await docService.saveDocument(Date.now().toString(), welcomeDoc.title, welcomeDoc.content);
|
||
await docService.saveDocument((Date.now() + 1000).toString(), aboutDoc.title, aboutDoc.content);
|
||
|
||
logger.success('创建示例文档成功');
|
||
} catch (error) {
|
||
logger.error('创建示例文档失败:', error);
|
||
}
|
||
*/
|
||
}
|
||
|
||
/**
|
||
* 检查必要依赖
|
||
*/
|
||
async function checkDependencies() {
|
||
try {
|
||
logger.info('正在检查系统依赖...');
|
||
|
||
// 检查 Node.js 版本
|
||
const nodeVersion = process.version;
|
||
const minNodeVersion = 'v14.0.0';
|
||
if (compareVersions(nodeVersion, minNodeVersion) < 0) {
|
||
logger.warn(`当前 Node.js 版本 ${nodeVersion} 低于推荐的最低版本 ${minNodeVersion}`);
|
||
} else {
|
||
logger.success(`Node.js 版本 ${nodeVersion} 满足要求`);
|
||
}
|
||
|
||
// 检查必要的 npm 包
|
||
try {
|
||
const packageJson = require('../package.json');
|
||
const requiredDeps = Object.keys(packageJson.dependencies);
|
||
|
||
logger.info(`系统依赖共 ${requiredDeps.length} 个包`);
|
||
|
||
// 检查是否有 node_modules 目录
|
||
try {
|
||
await fs.access(path.join(__dirname, '..', 'node_modules'));
|
||
} catch (err) {
|
||
if (err.code === 'ENOENT') {
|
||
logger.warn('未找到 node_modules 目录,请运行 npm install 安装依赖');
|
||
return false;
|
||
}
|
||
}
|
||
} catch (err) {
|
||
logger.warn('无法读取 package.json:', err.message);
|
||
}
|
||
|
||
// 检查 Docker
|
||
try {
|
||
execSync('docker --version', { stdio: ['ignore', 'ignore', 'ignore'] });
|
||
logger.success('Docker 已安装');
|
||
} catch (err) {
|
||
logger.warn('未检测到 Docker,部分功能可能无法正常使用');
|
||
}
|
||
|
||
return true;
|
||
} catch (error) {
|
||
logger.error('依赖检查失败:', error);
|
||
return false;
|
||
}
|
||
}
|
||
|
||
/**
|
||
* 比较版本号
|
||
*/
|
||
function compareVersions(v1, v2) {
|
||
const v1parts = v1.replace('v', '').split('.');
|
||
const v2parts = v2.replace('v', '').split('.');
|
||
|
||
for (let i = 0; i < Math.max(v1parts.length, v2parts.length); i++) {
|
||
const v1part = parseInt(v1parts[i] || 0);
|
||
const v2part = parseInt(v2parts[i] || 0);
|
||
|
||
if (v1part > v2part) return 1;
|
||
if (v1part < v2part) return -1;
|
||
}
|
||
|
||
return 0;
|
||
}
|
||
|
||
/**
|
||
* 主初始化函数
|
||
*/
|
||
async function initialize() {
|
||
logger.info('开始系统初始化...');
|
||
|
||
try {
|
||
// 1. 检查系统依赖
|
||
await checkDependencies();
|
||
|
||
// 2. 确保目录结构存在
|
||
await ensureDirectoriesExist();
|
||
logger.success('目录结构初始化完成');
|
||
|
||
// 3. 下载必要图片
|
||
await downloadImages();
|
||
|
||
// 4. 创建默认用户
|
||
await createAdminUser();
|
||
|
||
// 5. 创建默认配置
|
||
await createDefaultConfig();
|
||
|
||
// 6. 创建示例文档
|
||
await createSampleDocumentation();
|
||
|
||
logger.success('系统初始化完成!');
|
||
// 移除敏感的账户信息日志
|
||
logger.warn('首次登录后请立即修改默认密码!');
|
||
|
||
return { success: true };
|
||
} catch (error) {
|
||
logger.error('系统初始化失败:', error);
|
||
return { success: false, error: error.message };
|
||
}
|
||
}
|
||
|
||
// 如果直接运行此脚本
|
||
if (require.main === module) {
|
||
initialize()
|
||
.then((result) => {
|
||
if (result.success) {
|
||
process.exit(0);
|
||
} else {
|
||
process.exit(1);
|
||
}
|
||
})
|
||
.catch((error) => {
|
||
logger.fatal('初始化过程中发生错误:', error);
|
||
process.exit(1);
|
||
});
|
||
}
|
||
|
||
module.exports = {
|
||
initialize,
|
||
createAdminUser,
|
||
createDefaultConfig,
|
||
createSampleDocumentation,
|
||
checkDependencies
|
||
};
|