diff --git a/Dockerfile b/Dockerfile index 7da8ea6..50e307e 100644 --- a/Dockerfile +++ b/Dockerfile @@ -217,7 +217,7 @@ COPY --from=builder /usr/local/maven /usr/local/maven WORKDIR /app # 配置Nginx - 复制自定义配置文件 -COPY web/nginx.conf /etc/nginx/sites-available/default +COPY nginx.conf /etc/nginx/sites-available/default RUN ln -sf /etc/nginx/sites-available/default /etc/nginx/sites-enabled/default # 复制前端构建文件到Nginx静态文件目录 diff --git a/README.md b/README.md index e698640..b50e7b3 100644 --- a/README.md +++ b/README.md @@ -50,7 +50,7 @@ LiteOps采用前后端分离的架构设计: - **Ant Design Vue 4.x**:基于Vue的UI组件库 - **Axios**:基于Promise的HTTP客户端 - **Vue Router**:Vue官方路由管理器 -- **AntV G2**:数据可视化图表库 +- **echarts**:数据可视化图表库 ### 后端技术栈 @@ -61,9 +61,32 @@ LiteOps采用前后端分离的架构设计: - **Python-GitLab**:GitLab API客户端 - **JWT认证**:用户身份验证 -### 部署方案 +### 部署架构 -- **Docker**:容器化部署 +LiteOps采用容器化部署方案,主要包含以下组件: + +``` +┌─────────────────────┐ ┌─────────────────────┐ +│ Nginx (Port 80) │ │ Django (Port 8900) │ +│ 静态文件服务 │◄───┤ 后端API服务 │ +└─────────────────────┘ └─────────────────────┘ + │ + ┌─────────────────────┐ + │ MySQL (Port 3306) │ + │ 数据库服务 │ + └─────────────────────┘ + │ + ┌─────────────────────┐ + │ Docker in Docker │ + │ CI/CD构建环境 │ + └─────────────────────┘ +``` + +**部署特点**: +- **Docker**:容器化部署,环境一致性 +- **Docker in Docker**:支持CI/CD构建环境,完全隔离 +- **一键部署**:自动化脚本部署,简化操作流程 +- **多阶段构建**:优化镜像大小,提高构建效率 ## 项目目标 @@ -84,9 +107,115 @@ LiteOps主要适用于以下场景: - 希望减少手动操作、提高效率的开发环境 - 对现有工具不满意,需要更贴合实际工作流程的解决方案 -## 项目当前状态与未来规划 +## 🚀 快速部署 -LiteOps目前处于未完善状态,虽然核心功能已经初步实现,但仍有许多需求和功能有待完善,如实现部署k8s项目。我希望通过开放的方式收集更多的需求和建议,使这个项目能够更好地服务于实际开发场景。 +### 前置要求 + +在开始部署之前,请确保您的系统满足以下要求: + +- **操作系统**:Linux (推荐 Ubuntu 20.04+、CentOS 7+) +- **Docker**:版本 20.0+ +- **Docker Compose**:版本 2.0+ +- **磁盘空间**:至少 5GB 可用空间 +- **内存**:推荐 4GB +- **网络**:能够访问 Docker Hub 和相关软件源 + +### 快速开始 + +#### 1. 获取部署文件 + +您需要获取以下部署文件: + +- `start-containers.sh` - 一键部署脚本 +- `liteops_init.sql` - 数据库初始化文件 +- `liteops` - Docker镜像 + +#### 2. 获取Docker镜像 + +```bash +# 拉取LiteOps镜像(如果有公开镜像仓库) +docker pull liteops:v1 + +# 或者从提供的镜像文件加载 +# docker load < liteops-v1.tar +``` + +#### 3. 准备部署文件 + +创建部署目录并放置必要文件: + +```bash +# 创建部署目录 +mkdir liteops-deploy +cd liteops-deploy + +# 将以下文件放入此目录: +# - start-containers.sh +# - liteops_init.sql +``` + +#### 4. 一键部署 + +使用提供的启动脚本进行自动化部署: + +```bash +# 给启动脚本执行权限 +chmod +x start-containers.sh + +# 执行一键部署 +./start-containers.sh +``` + +启动脚本会自动完成以下操作: + + +#### 5. 验证部署 + +部署完成后,您可以通过以下方式验证: + +```bash +# 检查容器状态 +docker ps + +# 检查日志 +docker logs liteops +🐳 启动 Docker in Docker 环境... +🚀 启动 Docker daemon (轻量级CI/CD模式)... +⏳ 等待 Docker daemon 启动... +time="2025-06-13T02:15:10.086745884Z" level=warning msg="CDI setup error /etc/cdi: failed to monitor for changes: no such file or directory" +time="2025-06-13T02:15:10.086771075Z" level=warning msg="CDI setup error /var/run/cdi: failed to monitor for changes: no such file or directory" +✅ Docker daemon 启动成功 +🔍 验证 Docker 功能... +✅ Docker daemon 版本: 28.2.2 +✅ 存储驱动: vfs +🎉 Docker in Docker 环境启动完成 (轻量级CI/CD模式) +Starting nginx... +Starting nginx: nginx. +Starting backend service... +INFO: Started server process [188] +INFO: Waiting for application startup. +INFO: ASGI 'lifespan' protocol appears unsupported. +INFO: Application startup complete. +INFO: Uvicorn running on http://0.0.0.0:8900 (Press CTRL+C to quit) +docker logs liteops-mysql +``` + +### 访问应用 + +部署成功后,您可以通过以下地址访问: + +- **前端界面**:http://localhost +- **后端API**:http://localhost:8900/api/ +- **MySQL数据库**:localhost:3306 + +### 默认登录信息 + +- **用户名**:admin +- **密码**:admin123 (初始密码) + +## 项目当前状态 + +LiteOps目前处于未完善状态,虽然核心功能已经初步实现,但仍有许多需求和功能有待完善,。我希望通过开放的方式收集更多的需求和建议,使这个项目能够更好地服务于实际开发场景。 ### 需求征集 diff --git a/backend/backend/settings.py b/backend/backend/settings.py index f1188ed..86e49fb 100644 --- a/backend/backend/settings.py +++ b/backend/backend/settings.py @@ -195,5 +195,5 @@ DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField' # 构建相关配置 #BUILD_ROOT = Path('/data/liteops/build') # 修改为指定目录 -BUILD_ROOT = Path('/Users/huk/Downloads/data') +BUILD_ROOT = Path('/data') BUILD_ROOT.mkdir(exist_ok=True, parents=True) # 确保目录存在,包括父目录 \ No newline at end of file diff --git a/backend/conf/config.txt b/backend/conf/config.txt index fa7c5e1..e8c4f77 100644 --- a/backend/conf/config.txt +++ b/backend/conf/config.txt @@ -1,6 +1,7 @@ [client] #host = 127.0.0.1 -host = mysql +#host = mysql +host = liteops-mysql port = 3306 database = liteops user = root diff --git a/liteops_init.sql b/liteops_init.sql new file mode 100644 index 0000000..f8450be --- /dev/null +++ b/liteops_init.sql @@ -0,0 +1,354 @@ +/* + Navicat Premium Data Transfer + + Source Server : 127.0.0.1 + Source Server Type : MySQL + Source Server Version : 80100 (8.1.0) + Source Host : 127.0.0.1:3306 + Source Schema : liteops + + Target Server Type : MySQL + Target Server Version : 80100 (8.1.0) + File Encoding : 65001 + + Date: 12/06/2025 17:13:48 +*/ + +SET NAMES utf8mb4; +SET FOREIGN_KEY_CHECKS = 0; +-- ---------------------------- +-- Table structure for build_history +-- ---------------------------- +DROP TABLE IF EXISTS `build_history`; +CREATE TABLE `build_history` ( + `id` int NOT NULL AUTO_INCREMENT, + `history_id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL, + `build_number` int NOT NULL, + `branch` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL, + `commit_id` varchar(40) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL, + `version` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL, + `status` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL, + `requirement` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_bin, + `build_log` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_bin, + `stages` json NOT NULL, + `build_time` json NOT NULL, + `create_time` datetime(6) DEFAULT NULL, + `update_time` datetime(6) DEFAULT NULL, + `operator_id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL, + `task_id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `history_id` (`history_id`), + UNIQUE KEY `build_history_task_id_build_number_8fc0b316_uniq` (`task_id`,`build_number`), + KEY `build_history_operator_id_f43bdff4_fk_user_user_id` (`operator_id`), + CONSTRAINT `build_history_operator_id_f43bdff4_fk_user_user_id` FOREIGN KEY (`operator_id`) REFERENCES `user` (`user_id`), + CONSTRAINT `build_history_task_id_dfb7725d_fk_build_task_task_id` FOREIGN KEY (`task_id`) REFERENCES `build_task` (`task_id`) +) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin; + +-- ---------------------------- +-- Table structure for build_task +-- ---------------------------- +DROP TABLE IF EXISTS `build_task`; +CREATE TABLE `build_task` ( + `id` int NOT NULL AUTO_INCREMENT, + `task_id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL, + `name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL, + `description` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_bin, + `branch` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL, + `stages` json NOT NULL, + `notification_channels` json NOT NULL, + `status` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL, + `last_build_number` int NOT NULL, + `total_builds` int NOT NULL, + `success_builds` int NOT NULL, + `failure_builds` int NOT NULL, + `create_time` datetime(6) DEFAULT NULL, + `update_time` datetime(6) DEFAULT NULL, + `creator_id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL, + `environment_id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL, + `git_token_id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL, + `project_id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL, + `version` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL, + `build_time` json NOT NULL DEFAULT (_utf8mb3'{}'), + `requirement` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_bin, + `building_status` varchar(20) COLLATE utf8mb4_bin DEFAULT NULL, + `external_script_config` json NOT NULL DEFAULT (_utf8mb3'{}'), + `use_external_script` tinyint(1) NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `task_id` (`task_id`), + KEY `build_task_creator_id_e702c745_fk_user_user_id` (`creator_id`), + KEY `build_task_environment_id_8f5e7798_fk_environment_environment_id` (`environment_id`), + KEY `build_task_git_token_id_813ab2b1_fk_gitlab_to` (`git_token_id`), + KEY `build_task_project_id_f92c80ac_fk_project_project_id` (`project_id`), + CONSTRAINT `build_task_creator_id_e702c745_fk_user_user_id` FOREIGN KEY (`creator_id`) REFERENCES `user` (`user_id`), + CONSTRAINT `build_task_environment_id_8f5e7798_fk_environment_environment_id` FOREIGN KEY (`environment_id`) REFERENCES `environment` (`environment_id`), + CONSTRAINT `build_task_git_token_id_813ab2b1_fk_gitlab_to` FOREIGN KEY (`git_token_id`) REFERENCES `gitlab_token_credential` (`credential_id`), + CONSTRAINT `build_task_project_id_f92c80ac_fk_project_project_id` FOREIGN KEY (`project_id`) REFERENCES `project` (`project_id`) +) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin; + +-- ---------------------------- +-- Table structure for environment +-- ---------------------------- +DROP TABLE IF EXISTS `environment`; +CREATE TABLE `environment` ( + `id` int NOT NULL AUTO_INCREMENT, + `environment_id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL, + `name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL, + `description` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_bin, + `create_time` datetime(6) DEFAULT NULL, + `update_time` datetime(6) DEFAULT NULL, + `creator_id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL, + `type` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `environment_id` (`environment_id`), + KEY `environment_creator_id_2f30820a_fk_user_user_id` (`creator_id`), + CONSTRAINT `environment_creator_id_2f30820a_fk_user_user_id` FOREIGN KEY (`creator_id`) REFERENCES `user` (`user_id`) +) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin; + +-- ---------------------------- +-- Table structure for gitlab_token_credential +-- ---------------------------- +DROP TABLE IF EXISTS `gitlab_token_credential`; +CREATE TABLE `gitlab_token_credential` ( + `id` int NOT NULL AUTO_INCREMENT, + `credential_id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL, + `name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL, + `description` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_bin, + `token` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL, + `create_time` datetime(6) DEFAULT NULL, + `update_time` datetime(6) DEFAULT NULL, + `creator_id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `credential_id` (`credential_id`), + KEY `gitlab_token_credential_creator_id_d53c3666_fk_user_user_id` (`creator_id`), + CONSTRAINT `gitlab_token_credential_creator_id_d53c3666_fk_user_user_id` FOREIGN KEY (`creator_id`) REFERENCES `user` (`user_id`) +) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin; + +-- ---------------------------- +-- Table structure for kubeconfig_credential +-- ---------------------------- +DROP TABLE IF EXISTS `kubeconfig_credential`; +CREATE TABLE `kubeconfig_credential` ( + `id` int NOT NULL AUTO_INCREMENT, + `credential_id` varchar(32) COLLATE utf8mb4_bin DEFAULT NULL, + `name` varchar(50) COLLATE utf8mb4_bin DEFAULT NULL, + `description` longtext COLLATE utf8mb4_bin, + `kubeconfig_content` longtext COLLATE utf8mb4_bin, + `cluster_name` varchar(100) COLLATE utf8mb4_bin DEFAULT NULL, + `context_name` varchar(100) COLLATE utf8mb4_bin DEFAULT NULL, + `create_time` datetime(6) DEFAULT NULL, + `update_time` datetime(6) DEFAULT NULL, + `creator_id` varchar(32) COLLATE utf8mb4_bin DEFAULT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `credential_id` (`credential_id`), + KEY `kubeconfig_credential_creator_id_a3490ac1_fk_user_user_id` (`creator_id`), + CONSTRAINT `kubeconfig_credential_creator_id_a3490ac1_fk_user_user_id` FOREIGN KEY (`creator_id`) REFERENCES `user` (`user_id`) +) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin; + +-- ---------------------------- +-- Table structure for login_attempt +-- ---------------------------- +DROP TABLE IF EXISTS `login_attempt`; +CREATE TABLE `login_attempt` ( + `id` int NOT NULL AUTO_INCREMENT, + `ip_address` varchar(50) COLLATE utf8mb4_bin DEFAULT NULL, + `failed_attempts` int NOT NULL, + `locked_until` datetime(6) DEFAULT NULL, + `last_attempt_time` datetime(6) NOT NULL, + `create_time` datetime(6) DEFAULT NULL, + `user_id` varchar(32) COLLATE utf8mb4_bin DEFAULT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `login_attempt_user_id_ip_address_a69098a0_uniq` (`user_id`,`ip_address`), + CONSTRAINT `login_attempt_user_id_0f42fcb7_fk_user_user_id` FOREIGN KEY (`user_id`) REFERENCES `user` (`user_id`) +) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin; + +-- ---------------------------- +-- Table structure for login_log +-- ---------------------------- +DROP TABLE IF EXISTS `login_log`; +CREATE TABLE `login_log` ( + `id` int NOT NULL AUTO_INCREMENT, + `log_id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL, + `ip_address` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL, + `user_agent` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_bin, + `status` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL, + `fail_reason` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL, + `login_time` datetime(6) DEFAULT NULL, + `user_id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `log_id` (`log_id`), + KEY `login_log_user_id_69642132_fk_user_user_id` (`user_id`), + CONSTRAINT `login_log_user_id_69642132_fk_user_user_id` FOREIGN KEY (`user_id`) REFERENCES `user` (`user_id`) +) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin; + +-- ---------------------------- +-- Table structure for notification_robot +-- ---------------------------- +DROP TABLE IF EXISTS `notification_robot`; +CREATE TABLE `notification_robot` ( + `id` int NOT NULL AUTO_INCREMENT, + `robot_id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL, + `type` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL, + `name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL, + `webhook` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL, + `secret` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL, + `remark` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_bin, + `create_time` datetime(6) DEFAULT NULL, + `update_time` datetime(6) DEFAULT NULL, + `creator_id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL, + `ip_list` json DEFAULT NULL, + `keywords` json DEFAULT NULL, + `security_type` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `robot_id` (`robot_id`), + KEY `notification_robot_creator_id_de406276_fk_user_user_id` (`creator_id`), + CONSTRAINT `notification_robot_creator_id_de406276_fk_user_user_id` FOREIGN KEY (`creator_id`) REFERENCES `user` (`user_id`) +) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin; + +-- ---------------------------- +-- Table structure for project +-- ---------------------------- +DROP TABLE IF EXISTS `project`; +CREATE TABLE `project` ( + `id` int NOT NULL AUTO_INCREMENT, + `project_id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL, + `name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL, + `description` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_bin, + `category` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL, + `repository` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL, + `create_time` datetime(6) DEFAULT NULL, + `update_time` datetime(6) DEFAULT NULL, + `creator_id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `project_id` (`project_id`), + KEY `project_creator_id_e70918ae_fk_user_user_id` (`creator_id`), + CONSTRAINT `project_creator_id_e70918ae_fk_user_user_id` FOREIGN KEY (`creator_id`) REFERENCES `user` (`user_id`) +) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin; + +-- ---------------------------- +-- Table structure for role +-- ---------------------------- +DROP TABLE IF EXISTS `role`; +CREATE TABLE `role` ( + `id` int NOT NULL AUTO_INCREMENT, + `role_id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL, + `name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL, + `description` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_bin, + `permissions` json DEFAULT NULL, + `create_time` datetime(6) DEFAULT NULL, + `update_time` datetime(6) DEFAULT NULL, + `creator_id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `role_id` (`role_id`), + UNIQUE KEY `name` (`name`), + KEY `role_creator_id_37780e7e_fk_user_user_id` (`creator_id`), + CONSTRAINT `role_creator_id_37780e7e_fk_user_user_id` FOREIGN KEY (`creator_id`) REFERENCES `user` (`user_id`) +) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin; + +-- ---------------------------- +-- Table structure for security_config +-- ---------------------------- +DROP TABLE IF EXISTS `security_config`; +CREATE TABLE `security_config` ( + `id` int NOT NULL AUTO_INCREMENT, + `min_password_length` int NOT NULL, + `password_complexity` json NOT NULL, + `session_timeout` int NOT NULL, + `max_login_attempts` int NOT NULL, + `lockout_duration` int NOT NULL, + `enable_2fa` tinyint(1) NOT NULL, + `update_time` datetime(6) DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin; + +-- ---------------------------- +-- Table structure for ssh_key_credential +-- ---------------------------- +DROP TABLE IF EXISTS `ssh_key_credential`; +CREATE TABLE `ssh_key_credential` ( + `id` int NOT NULL AUTO_INCREMENT, + `credential_id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL, + `name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL, + `description` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_bin, + `private_key` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_bin, + `passphrase` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL, + `create_time` datetime(6) DEFAULT NULL, + `update_time` datetime(6) DEFAULT NULL, + `creator_id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `credential_id` (`credential_id`), + KEY `ssh_key_credential_creator_id_c7396682_fk_user_user_id` (`creator_id`), + CONSTRAINT `ssh_key_credential_creator_id_c7396682_fk_user_user_id` FOREIGN KEY (`creator_id`) REFERENCES `user` (`user_id`) +) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin; + +-- ---------------------------- +-- Table structure for user +-- ---------------------------- +DROP TABLE IF EXISTS `user`; +CREATE TABLE `user` ( + `id` int NOT NULL AUTO_INCREMENT, + `user_id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL, + `username` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL, + `name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL, + `password` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL, + `email` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL, + `status` smallint DEFAULT NULL, + `login_time` datetime(6) DEFAULT NULL, + `create_time` datetime(6) DEFAULT NULL, + `update_time` datetime(6) DEFAULT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `user_id` (`user_id`), + UNIQUE KEY `username` (`username`), + UNIQUE KEY `email` (`email`) +) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin; + +-- ---------------------------- +-- Table structure for user_role +-- ---------------------------- +DROP TABLE IF EXISTS `user_role`; +CREATE TABLE `user_role` ( + `id` int NOT NULL AUTO_INCREMENT, + `create_time` datetime(6) DEFAULT NULL, + `update_time` datetime(6) DEFAULT NULL, + `role_id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL, + `user_id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `user_role_user_id_role_id_a1d0951e_uniq` (`user_id`,`role_id`), + KEY `user_role_role_id_6a11361a_fk_role_role_id` (`role_id`), + CONSTRAINT `user_role_role_id_6a11361a_fk_role_role_id` FOREIGN KEY (`role_id`) REFERENCES `role` (`role_id`), + CONSTRAINT `user_role_user_id_12d84374_fk_user_user_id` FOREIGN KEY (`user_id`) REFERENCES `user` (`user_id`) +) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin; + +-- ---------------------------- +-- Table structure for user_token +-- ---------------------------- +DROP TABLE IF EXISTS `user_token`; +CREATE TABLE `user_token` ( + `id` int NOT NULL AUTO_INCREMENT, + `token_id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL, + `token` varchar(256) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL, + `create_time` datetime(6) DEFAULT NULL, + `update_time` datetime(6) DEFAULT NULL, + `user_id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `token_id` (`token_id`), + KEY `user_token_user_id_69e1f632_fk_user_user_id` (`user_id`), + CONSTRAINT `user_token_user_id_69e1f632_fk_user_user_id` FOREIGN KEY (`user_id`) REFERENCES `user` (`user_id`) +) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin; + +-- ---------------------------- +-- 初始化数据 +-- ---------------------------- + +-- 插入用户数据 +INSERT INTO `user` (`id`, `user_id`, `username`, `name`, `password`, `email`, `status`, `login_time`, `create_time`, `update_time`) VALUES (1, '9bfef5a1ee1d4054be9727934ad112es', 'admin', '管理员', '240be518fabd2724ddb6f04eeb1da5967448d7e831c08c8fa822809f74c720a9', 'admin@example.com', 1, '2025-06-12 16:29:01.815564', '2025-03-26 11:41:20.549327', '2025-06-12 16:29:01.815655'); + +-- 插入角色数据 +INSERT INTO `role` (`id`, `role_id`, `name`, `description`, `permissions`, `create_time`, `update_time`, `creator_id`) VALUES (1, '333ec25423e04a4e96b4bb238de51cc3', '管理员', '系统管理员,拥有所有权限', '{\"data\": {\"operations\": [\"view\"], \"project_ids\": [], \"project_scope\": \"all\", \"environment_scope\": \"all\", \"environment_types\": []}, \"menu\": [\"/projects\", \"/projects/list\", \"/build\", \"/build/tasks\", \"/build/history\", \"/logs/login\", \"/user\", \"/user/list\", \"/user/role\", \"/credentials\", \"/environments\", \"/environments/list\", \"/dashboard\", \"/logs\", \"/system/basic\", \"/system/notification\", \"/system/backup\", \"/system\"], \"function\": {\"role\": [\"view\", \"create\", \"edit\", \"delete\", \"assign_permission\"], \"user\": [\"view\", \"create\", \"edit\", \"delete\", \"toggle_status\", \"reset_password\"], \"build\": [\"view\", \"create\", \"edit\", \"delete\", \"execute\", \"view_log\"], \"project\": [\"view\", \"create\", \"edit\", \"delete\"], \"release\": [\"view\", \"create\", \"edit\", \"delete\", \"approve\", \"execute\", \"rollback\"], \"build_task\": [\"view\", \"create\", \"edit\", \"delete\", \"execute\", \"view_log\", \"disable\"], \"credential\": [\"view\", \"create\", \"edit\", \"delete\"], \"logs_login\": [\"view\"], \"environment\": [\"view\", \"create\", \"edit\", \"delete\"], \"notification\": [\"view\", \"create\", \"edit\", \"delete\", \"test\"], \"system_basic\": [\"view\", \"edit\", \"create\", \"delete\", \"test\"], \"build_history\": [\"view\", \"view_log\", \"rollback\"], \"build_approval\": [\"view\", \"request\", \"approve\"], \"logs_operation\": [\"view\"]}}', '2025-03-27 14:45:04.779759', '2025-06-09 16:04:40.782374', '9bfef5a1ee1d4054be9727934ad112es'); +INSERT INTO `role` (`id`, `role_id`, `name`, `description`, `permissions`, `create_time`, `update_time`, `creator_id`) VALUES (2, '5575cfdc75dd4f8e9c5441359478314e', '开发人员', '开发人员,负责编写代码和构建', '{\"data\": {\"operations\": [\"view\"], \"project_ids\": [], \"project_scope\": \"custom\", \"environment_scope\": \"custom\", \"environment_types\": []}, \"menu\": [], \"function\": {\"build\": [], \"project\": [], \"release\": [\"view\", \"create\", \"edit\"], \"build_task\": [], \"credential\": [], \"environment\": [], \"notification\": [], \"build_history\": []}}', '2025-03-27 14:45:04.783696', '2025-04-17 09:42:38.079772', '9bfef5a1ee1d4054be9727934ad112es'); +INSERT INTO `role` (`id`, `role_id`, `name`, `description`, `permissions`, `create_time`, `update_time`, `creator_id`) VALUES (3, 'ea78a0379d7d45559c4db69e38f07cd3', '测试人员', '测试人员,负责测试和验证', '{\"data\": {\"operations\": [\"view\"], \"project_ids\": [], \"project_scope\": \"custom\", \"environment_scope\": \"custom\", \"environment_types\": []}, \"menu\": [], \"function\": {\"build\": [\"view\", \"view_log\"], \"project\": [], \"release\": [\"view\", \"approve\"], \"build_history\": []}}', '2025-03-27 14:45:04.785872', '2025-04-17 09:43:16.944919', '9bfef5a1ee1d4054be9727934ad112es'); +INSERT INTO `role` (`id`, `role_id`, `name`, `description`, `permissions`, `create_time`, `update_time`, `creator_id`) VALUES (4, '3aac992b37e441abbeb2c67a0c79f01f', '运维人员', '运维人员,负责部署和运维', '{\"data\": {\"operations\": [\"view\"], \"project_ids\": [], \"project_scope\": \"custom\", \"environment_scope\": \"custom\", \"environment_types\": []}, \"menu\": [], \"function\": {\"build\": [\"view\", \"execute\", \"view_log\"], \"project\": [], \"release\": [\"view\", \"approve\", \"execute\", \"rollback\"], \"environment\": [], \"notification\": [], \"build_history\": []}}', '2025-03-27 14:45:04.787850', '2025-04-17 09:44:08.530007', '9bfef5a1ee1d4054be9727934ad112es'); + +-- 插入用户角色关联数据 +INSERT INTO `user_role` (`id`, `create_time`, `update_time`, `role_id`, `user_id`) VALUES (1, '2025-03-27 14:45:11.269249', '2025-03-27 14:45:11.269261', '333ec25423e04a4e96b4bb238de51cc3', '9bfef5a1ee1d4054be9727934ad112es'); + +SET FOREIGN_KEY_CHECKS = 1; diff --git a/nginx.conf b/nginx.conf new file mode 100644 index 0000000..3b4344e --- /dev/null +++ b/nginx.conf @@ -0,0 +1,78 @@ +server { + listen 80; + server_name localhost; + root /usr/share/nginx/html; + index index.html; + + # 开启gzip + gzip on; + gzip_min_length 1k; + gzip_comp_level 9; + gzip_types text/plain text/css text/javascript application/json application/javascript application/x-javascript application/xml; + gzip_vary on; + gzip_disable "MSIE [1-6]\."; + + # 前端静态文件 + location / { + try_files $uri $uri/ /index.html; + add_header Cache-Control "no-cache, no-store, must-revalidate"; + } + + # SSE日志流特殊配置 - 完全禁用缓冲 + location /api/build/logs/stream/ { + proxy_pass http://localhost:8900/api/build/logs/stream/; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + + # 完全禁用缓冲 + proxy_buffering off; + proxy_cache off; + proxy_request_buffering off; + + # SSE专用头部 + proxy_set_header Connection ''; + proxy_set_header Cache-Control 'no-cache, no-store, must-revalidate'; + proxy_set_header Pragma 'no-cache'; + proxy_set_header Expires '0'; + + # 超时设置 + proxy_read_timeout 24h; + proxy_connect_timeout 5s; + proxy_send_timeout 24h; + + # HTTP版本和传输编码 + proxy_http_version 1.1; + chunked_transfer_encoding off; + + # 添加CORS头 + add_header Access-Control-Allow-Origin *; + add_header Access-Control-Allow-Methods 'GET, OPTIONS'; + add_header Access-Control-Allow-Headers 'Cache-Control, Authorization'; + } + + # API请求代理到后端服务 + location /api/ { + proxy_pass http://localhost:8900/api/; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + + # 一般API的缓冲配置 + proxy_buffering off; + proxy_cache off; + proxy_read_timeout 60s; + proxy_connect_timeout 5s; + proxy_send_timeout 60s; + + proxy_http_version 1.1; + } + + # 错误页面 + error_page 500 502 503 504 /50x.html; + location = /50x.html { + root /usr/share/nginx/html; + } +} diff --git a/start-containers.sh b/start-containers.sh index 9f89991..ee88b78 100755 --- a/start-containers.sh +++ b/start-containers.sh @@ -39,6 +39,53 @@ print_step() { echo -e "\n${PURPLE}=== $1 ===${NC}" } +# 等待MySQL就绪的函数 +wait_for_mysql() { + local max_attempts=30 + local attempt=1 + + print_info "等待MySQL服务完全启动..." + + while [ $attempt -le $max_attempts ]; do + if docker exec $MYSQL_CONTAINER mysqladmin ping -uroot -p$MYSQL_PASSWORD --silent >/dev/null 2>&1; then + print_success "MySQL服务已就绪 (尝试次数: $attempt)" + return 0 + fi + + print_info "MySQL还未就绪,等待中... (尝试 $attempt/$max_attempts)" + sleep 2 + attempt=$((attempt + 1)) + done + + print_error "MySQL在 $((max_attempts * 2)) 秒内未能就绪" + return 1 +} + +# 导入SQL文件的函数 +import_sql_with_retry() { + local max_attempts=3 + local attempt=1 + + while [ $attempt -le $max_attempts ]; do + print_info "尝试导入初始化数据 (尝试 $attempt/$max_attempts)..." + + if docker exec -i $MYSQL_CONTAINER mysql -uroot -p$MYSQL_PASSWORD liteops < liteops_init.sql; then + print_success "初始化数据导入成功" + return 0 + else + print_warning "初始化数据导入失败,尝试 $attempt/$max_attempts" + if [ $attempt -lt $max_attempts ]; then + print_info "等待5秒后重试..." + sleep 5 + fi + attempt=$((attempt + 1)) + fi + done + + print_error "初始化数据导入失败,已尝试 $max_attempts 次" + return 1 +} + # 创建Docker网络(如果不存在) print_step "创建Docker网络" if ! docker network inspect $NETWORK_NAME >/dev/null 2>&1; then @@ -56,17 +103,6 @@ docker stop $CONTAINER_NAME $MYSQL_CONTAINER 2>/dev/null || true docker rm $CONTAINER_NAME $MYSQL_CONTAINER 2>/dev/null || true print_success "容器清理完成" -# 构建镜像 -print_step "构建应用镜像" -print_info "构建LiteOps镜像..." -# 确保前端已经构建 -if [ ! -d "web/dist" ]; then - print_error "前端dist目录不存在,请先运行 npm run build" - exit 1 -fi -docker build --platform linux/amd64 -t $CONTAINER_IMAGE . -print_success "镜像构建成功: $CONTAINER_IMAGE" - # 启动MySQL容器 print_step "启动MySQL容器" print_info "启动MySQL $MYSQL_VERSION 容器..." @@ -78,14 +114,18 @@ docker run -d \ -e MYSQL_DATABASE=liteops \ mysql:$MYSQL_VERSION -# 等待MySQL启动 -print_info "等待MySQL启动..." -sleep 10 +# 等待MySQL完全就绪 +if ! wait_for_mysql; then + print_error "MySQL启动失败,退出部署" + exit 1 +fi # 初始化数据库 print_step "初始化数据库" -print_info "导入初始数据..." -docker exec -i $MYSQL_CONTAINER mysql -uroot -p$MYSQL_PASSWORD liteops < liteops_init.sql +if ! import_sql_with_retry; then + print_error "数据库初始化失败,退出部署" + exit 1 +fi print_success "数据库初始化完成" # 启动应用容器