123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315 |
- /**
- * 系统初始化脚本 - 首次运行时执行
- */
- 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
- - 电子邮件: [email protected]
- ## 许可证
- 本项目采用 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
- };
|