add orion-ops docs.

This commit is contained in:
lijiahang
2022-03-13 21:31:42 +08:00
parent f362553f63
commit 6ca1b5c23d
42 changed files with 799 additions and 0 deletions
View File
+83
View File
@@ -0,0 +1,83 @@
## orion-ops 是什么
`orion-ops` 一站式自动化运维平台, 无 Agent 的方式接入应用, 使用多环境的概念, 提供了机器管理、WebTerminal、 WebSftp、 机器批量执行、日志在线查看、定时调度任务、应用环境维护、应用构建及发布任务等功能, 帮助开发人员快速定位问题, 致力于企业级应用。
Github: https://github.com/lijiahangmax/orion-ops
Gitee: https://gitee.com/lijiahangmax/orion-ops
CSDN: https://blog.csdn.net/qq_41011894
Demo: http://116.62.194.246/ops/
演示账号: `orionadmin`
演示密码: `orionadmin`
## 特性
* 易用方便: 极简配置, 开箱即用, 无 Agent 接入
* 在线终端: 支持 Web 终端登录远程机器, 记录操作日志, 管理端可强制下线
* 文件管理: 支持远程机器文件批量上传、批量下载、暂停断点续传、实时传输速率、实时进度、打包传输等功能
* 环境变量: 基于不同 Profile 有着不同的应用环境变量, 命令执行时使用占位符自动替换
* 高兼容性: 自定义 CI/CD 操作, 不论是什么项目, 都是基于 Linux 命令执行, 灵活操作
* 功能强大: 命令批量执行, 任务定时调度, 远程日志查看, 操作日志全记录等
* 高扩展性: 前后端代码规范统一, 代码质量高, 易读好拓展
* 免费开源: 前后端代码完全开源
## 技术栈
* SpringBoot 2.4.4
* MybatisPlus 3.4.0
* Mysql 8.0
* Redis 5.0.5
* Vue 2.6.11
* Ant Design 1.7.8
## 功能预览
> 机器列表
![机器列表](./assert/img/machine_list.png "机器列表")
> 在线终端
![在线终端](./assert/img/web_terminal.png "在线终端")
> 在线文件管理
![在线文件管理](./assert/img/sftp_1.png "在线文件管理")
![在线文件管理](./assert/img/sftp_2.png "在线文件管理")
> 批量执行
![批量执行](./assert/img/batch_exec.png "批量执行")
> 日志文件
![日志文件](./assert/img/log_view.png "日志文件")
> 调度任务
![调度任务](./assert/img/scheduler.png "调度任务")
![调度执行列表](./assert/img/scheduler_record.png "调度执行列表")
![调度执行日志](./assert/img/scheduler_record_log.png "调度执行日志")
> 应用配置
![应用列表](./assert/img/app_list.png "应用列表")
![构建配置](./assert/img/app_build_config.png "构建配置")
![发布配置](./assert/img/app_release_config.png "发布配置")
> 构建列表
![构建列表](./assert/img/build_list.png "构建列表")
![构建日志](./assert/img/build_log.png "构建日志")
> 发布列表
![发布列表](./assert/img/release_list.png "发布列表")
![发布日志](./assert/img/release_log.png "发布日志")
## 支持
......
## License
[Apache-2.0](https://gitee.com/lijiahangmax/orion-ops/blob/main/LICENSE)
+18
View File
@@ -0,0 +1,18 @@
* 关于
* [更新日志](about/change-log.md)
* [Roadmap](about/roadmap.md)
* [设计概念](about/concepts.md)
* 快速开始
* [普通安装](quickstart/install.md)
* [FAQ](quickstart/faq.md)
* 操作手册
* [机器管理](operator/machine.md)
* [执行管理](operator/exec.md)
* [调度任务](operator/scheduler.md)
* [应用管理](operator/app.md)
* [CD/CD](operator/ci-cd.md)
* [用户管理](operator/user.md)
* [系统管理](operator/system.md)
+32
View File
@@ -0,0 +1,32 @@
## 1.0.0-beta
`2022-03-09`
* 🌈 机器管理
* 🌈 秘钥管理
* 🌈 代理管理
* 🌈 WebTerminal
* 🌈 文件管理器
* 🌈 机器环境变量
* 🌈 批量执行命令
* 🌈 日志面板
* 🌈 定时调度任务
* 🌈 应用管理
* 🌈 应用环境
* 🌈 应用环境变量
* 🌈 应用构建
* 🌈 应用发布
* 🌈 用户管理
* 🌈 操作日志
* 🌈 模板管理
* 🌈 系统变量
* 🌈 IP黑白名单
* 💖 这将是一个全新的开始
[comment]: <> (🌈 新功能)
[comment]: <> (⚡ 注意)
[comment]: <> (🔨 优化)
[comment]: <> (🐞 修复)
+11
View File
@@ -0,0 +1,11 @@
### 总体架构
![总体架构](../assert/img/arch.png "总体架构")
### SFTP 文件下载
![文件下载](../assert/img/download-arch.png "文件下载")
### 应用构建&发布
![应用构建&发布](../assert/img/release-arch.png "应用构建&发布")
+79
View File
@@ -0,0 +1,79 @@
### 已完成 ✅
* 用户模块
* 添加用户
* 禁用启用
* 锁定用户
* 操作日志
* 主机配置
* 机器代理
* 环境配置
* 秘钥管理
* web终端
* 文件管理
* 执行命令
* ping
* 调度任务
* 调度执行记录
* 调度任务自动恢复
* 信息管理
* 模板配置
* 日志管理
* 环境变量历史记录
* 应用中心
* 应用维护
* 应用环境变量
* 代码仓库
* 应用构建
* 应用发布
* 定时发布
* 回滚发布
* 日志
* tail
* 日志列表
* 日志配色
* 系统设置
* 系统环境变量
* 系统统计分析
* 自动清理
* 多端登陆开关
* 登陆自动续签
* 登陆IP绑定
* IP黑白名单
### 开发中 ⏱
* 站内信通知
* 系统线程任务统计
### 未开始 ⏳
* docker支持
* 机器监控
* 应用流水线操作
* buildChange
* SFTP 拖拽移动
* 调度任务统计
* 应用构建统计
* 应用发布统计
* 导入导出信息
### 重构中 🔨
* WebTerminal Modal
* logAppender
### 不确定 ❔
* 工作空间的概念
* 监控报警
* 动态菜单
* 动态权限角色
* 钉钉通知
* MFA 二次验证
* 敏感操作二次验证
* 异地构建
### 已放弃 ❌
无
+9
View File
@@ -0,0 +1,9 @@
/*!
* docsify-copy-code
* v2.1.1
* https://github.com/jperasmus/docsify-copy-code
* (c) 2017-2020 JP Erasmus <jperasmus11@gmail.com>
* MIT license
*/
!function(){"use strict";function s(o){return(s="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(o){return typeof o}:function(o){return o&&"function"==typeof Symbol&&o.constructor===Symbol&&o!==Symbol.prototype?"symbol":typeof o})(o)}!function(o,e){void 0===e&&(e={});var t=e.insertAt;if(o&&"undefined"!=typeof document){var n=document.head||document.getElementsByTagName("head")[0],c=document.createElement("style");c.type="text/css","top"===t&&n.firstChild?n.insertBefore(c,n.firstChild):n.appendChild(c),c.styleSheet?c.styleSheet.cssText=o:c.appendChild(document.createTextNode(o))}}(".docsify-copy-code-button,.docsify-copy-code-button span{cursor:pointer;transition:all .25s ease}.docsify-copy-code-button{position:absolute;z-index:1;top:0;right:0;overflow:visible;padding:.65em .8em;border:0;border-radius:0;outline:0;font-size:1em;background:grey;background:var(--theme-color,grey);color:#fff;opacity:0}.docsify-copy-code-button span{border-radius:3px;background:inherit;pointer-events:none}.docsify-copy-code-button .error,.docsify-copy-code-button .success{position:absolute;z-index:-100;top:50%;right:0;padding:.5em .65em;font-size:.825em;opacity:0;-webkit-transform:translateY(-50%);transform:translateY(-50%)}.docsify-copy-code-button.error .error,.docsify-copy-code-button.success .success{right:100%;opacity:1;-webkit-transform:translate(-115%,-50%);transform:translate(-115%,-50%)}.docsify-copy-code-button:focus,pre:hover .docsify-copy-code-button{opacity:1}"),document.querySelector('link[href*="docsify-copy-code"]')&&console.warn("[Deprecation] Link to external docsify-copy-code stylesheet is no longer necessary."),window.DocsifyCopyCodePlugin={init:function(){return function(o,e){o.ready(function(){console.warn("[Deprecation] Manually initializing docsify-copy-code using window.DocsifyCopyCodePlugin.init() is no longer necessary.")})}}},window.$docsify=window.$docsify||{},window.$docsify.plugins=[function(o,r){o.doneEach(function(){var o=Array.apply(null,document.querySelectorAll("pre[data-lang]")),c={buttonText:"Copy to clipboard",errorText:"Error",successText:"Copied"};r.config.copyCode&&Object.keys(c).forEach(function(t){var n=r.config.copyCode[t];"string"==typeof n?c[t]=n:"object"===s(n)&&Object.keys(n).some(function(o){var e=-1<location.href.indexOf(o);return c[t]=e?n[o]:c[t],e})});var e=['<button class="docsify-copy-code-button">','<span class="label">'.concat(c.buttonText,"</span>"),'<span class="error">'.concat(c.errorText,"</span>"),'<span class="success">'.concat(c.successText,"</span>"),"</button>"].join("");o.forEach(function(o){o.insertAdjacentHTML("beforeend",e)})}),o.mounted(function(){document.querySelector(".content").addEventListener("click",function(o){if(o.target.classList.contains("docsify-copy-code-button")){var e="BUTTON"===o.target.tagName?o.target:o.target.parentNode,t=document.createRange(),n=e.parentNode.querySelector("code"),c=window.getSelection();t.selectNode(n),c.removeAllRanges(),c.addRange(t);try{document.execCommand("copy")&&(e.classList.add("success"),setTimeout(function(){e.classList.remove("success")},1e3))}catch(o){console.error("docsify-copy-code: ".concat(o)),e.classList.add("error"),setTimeout(function(){e.classList.remove("error")},1e3)}"function"==typeof(c=window.getSelection()).removeRange?c.removeRange(t):"function"==typeof c.removeAllRanges&&c.removeAllRanges()}})})}].concat(window.$docsify.plugins||[])}();
//# sourceMappingURL=docsify-copy-code.min.js.map
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 62 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 57 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 57 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 60 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 45 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 46 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 130 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 79 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 63 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 51 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 65 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 50 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 79 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 60 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 55 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 58 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 94 KiB

+1
View File
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
+2
View File
@@ -0,0 +1,2 @@
start "" "C:\Program Files\Google\Chrome\Application\chrome.exe" "http://localhost:3000/"
docsify serve A:\Work\idea_project\orion\orion-ops\docs
+56
View File
@@ -0,0 +1,56 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>关于orion-ops</title>
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"/>
<meta name="description" content="Description">
<link rel="icon" href="./assert/favicon.ico">
<meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0">
<!-- Theme: Defaults -->
<link rel="stylesheet" href="./assert/vue.css">
</head>
<body>
<div id="app">
loading...
</div>
<script>
window.$docsify = {
// 左侧文档名称
name: 'orion-ops',
// 右上角仓库
repo: 'https://github.com/lijiahangmax/orion-ops',
// 加载侧边栏
loadSidebar: true,
// 侧边栏折叠
subMaxLevel: 3,
// 标题搜索
search: {
// 过期时间
maxAge: 1000 * 60 * 60,
// 搜索路径 []
paths: 'auto',
placeholder: '搜索',
// 无数据
noData: '找不到结果',
// 搜索标题的最大层级
depth: 3,
// 是否隐藏其他侧边栏内容
hideOtherSidebarContent: false
},
// 页码
pagination: {
previousText: '上一章',
nextText: '下一章',
crossChapter: true,
crossChapterText: true,
},
}
</script>
<!-- Docsify v4 -->
<script src="./assert/docsify@4.js"></script>
<script src="./assert/docsify-pagination.min.js"></script>
<!--<script src="./assert/docsify-copy-code.min.js"></script>-->
<script src="./assert/search.min.js"></script>
</body>
</html>
+119
View File
@@ -0,0 +1,119 @@
### 环境管理
配置应用环境, 如: 开发环境、测试环境、生产环境, 从而做到应用在不同环境的有不同的配置, 操作相互隔离。
### 应用列表
管理和维护应用, 每个应用在不同的环境都可以有不同的配置。
* 配置: 配置应用的基本信息, 构建操作, 发布操作
* 构建: 执行应用构建操作
* 发布: 执行应用发布操作
* 同步: 同步构建发布配置到其他环境
* 复制: 复制当前应用, 会复制应用的环境变量, 构建配置, 发布配置
### 应用配置
配置应用的基本信息, 以及不同环境下的构建与发布配置。
配置时 `机器环境变量` `系统环境变量` `应用环境变量` 都可以在命令执行前进行替换。
应用在配置后系统会将部分配置信息存储到环境变量中。
| key | 示例 | 描述 |
| :---- | :--- | :---- |
| bundle_path | target/app.jar | 宿主机构建产物路径 (绝对路径/基于版本仓库的相对路径) |
| transfer_path | /data/projects/build.jar | 产物传输目标机器绝对路径 |
| transfer_dir_type | dir | 产物为文件夹传输类型 (dir/zip) |
| release_serial | parallel | 发布序列方式 (serial/parallel) |
> ##### 构建配置
设计思路: 应用在发布之前需要先由宿主机进行构建, 生成一个可发布的产物, 发布时需要基于该产物进行发布操作。
`构建产物路径` 就是生成的产物文件路径, 这个路径可以是基于宿主机的`绝对路径` 或 基于版本仓库的`相对路径` (如果配置了版本仓库)。
* vue 项目构建后会生成一个 dist 文件夹, 这个路径就应该是 `xxx/dist`
如果构建完成后执行用 tar 执行压缩命令, 将 dist 文件夹压缩为 dist.tar 这里的路径就是 `xxx/dist.tar`
* spring boot 项目构建后会生成一个可执行的 jar 文件, 这个路径就应该是 `xxx/xxx.jar`
* 可能还会有其他更复杂的情况, 如: 构建完成后会在 a 文件夹生成一个文件, 在 b 文件夹生成一个文件夹。
这之后就应该在构建完成后执行 `mv` 命令, 移动到同一个文件夹, `构建产物路径` 就应该设置为移动的这个文件夹
* 也有可能构建完成后不会生成产物, 或者已经将文件传输过了, 这时候这个路径就随便设置一个存在的文件即可
⚡ 注意: 如果产物路径是一个文件夹, 构建完成后会自动将次文件夹进行 `zip` 压缩, 如设置的路径为 `xxx/dist` 则会生成一个 `dist.zip`
如果应用配置了版本仓库, 会有 `添加检出操作` 这个选项 (git clone)。
构建时系统提供了几个默认的变量, 使用 `@{build.xxx}` 来替换。
| key | 示例 | 描述 |
| :---- | :--- | :---- |
| build_id | 10 | 构建id (数据库自增) |
| build_seq | 1 | 当前环境该应用的构建序列 |
| vcs_home | /orion/vcs/2/10 | 当前应用配置的版本仓库的 `clone` 目录 (如果有) |
| branch | origin/master | 构建所选的 `branch` |
| commit | 8ab50bada8525f6670c36114ad46baa70efda820 | 构建所选的 `commit` |
> ##### 发布配置
设计思路: 发布的应用可能是以集群的形式发布的, 可能会有多台机器同时发布一个应用, 基于选择的构建版本, 进行发布操作。
传输操作的 `产物传输路径` 是将选择的构建版本生成的产物分发到发布机器后的绝对路径。
如果构建产物是一个普通文件 `文件夹传输类型` 无需修改
如: 构建产物是 `xxx.jar` 这里可以配置为 `/data/projects/build.jar`
如果构建产物是一个文件夹, 这里可选择传输产物文件夹 `文件夹` 或者 产物文件夹的zip压缩文件 `zip`
如: 构建产物是 `xxx\dist` 文件夹, 文件夹传输类型选择 `文件夹` 这里可以配置为 `/data/projects/dist`
文件夹传输类型选择 `zip` 这里可以配置为 `/data/projects/dist.zip` 然后在进行解压
发布时系统提供了几个默认的变量, 使用 `@{release.xxx}` 来替换。
| key | 示例 | 描述 |
| :---- | :--- | :---- |
| release_id | 10 | 发布id |
| release_title | 紧急发布 | 发布标题 |
| transfer_path | /data/projects/build.jar | 传输路径 |
### 环境变量
配置不同环境的应用环境变量, 不同环境之间的变量是相互隔离的。
系统提供了几个默认的应用变量, 使用 `@{app.xxx}` 来替换。
| key | 示例 | 描述 |
| :---- | :--- | :---- |
| app_id | 1 | 应用id |
| app_name | 订单服务 | 应用名称 |
| app_tag | order | 应用标签 |
| profile_id | 1 | 应用环境id |
| profile_name | 开发环境 | 应用环境名称 |
| profile_tag | dev | 应用环境标签 |
> ##### 示例
```
# 当前应用 名称: 订单服务
# 当前环境 名称: 测试环境
# 机器环境变量 profile: dev
# 应用环境变量 xmx: 128m; xms: 64m
# 执行命令
echo @{app.app_name}
echo @{app.profile_name}
java -jar xxx.jar --spring.profiles.active=@{machine.profile} -Xmx@{app.xmx} -Xms@{app.xms}
# 命令在执行前会被替换为
echo 订单服务
echo 测试环境
java -jar xxx.jar --spring.profiles.active=dev -Xmx128m -Xms64m
```
⚡ 注意: 切换视图后保存只会增量保存, 并不会删除变量
### 版本仓库
配置应用的版本仓库, 仅支持 `git`, 用于构建时选择构建的 `branch` 以及 `commit`。
可以通过 `密码` 或 `令牌` 方式导入仓库
* 初始化: 初始化版本仓库, 验证密码或者token
* 重新初始化: 重新初始化版本仓库
* 清空: 清空应用构建历史版本, 会保留两个版本, 防止清空正在进行中的构建任务
+23
View File
@@ -0,0 +1,23 @@
### 应用构建
选择应用进行构建。
* 重新构建: 基于选择的 `branch` 和 `commit` 再次执行构建操作, 如果修改了应用构建配置, 则会是新的配置。
* 停止: 停止本次构建操作
按住 `Ctrl` 点击 `日志` 可以打开一个新页面, 否则将会打开一个模态框。
### 应用发布
选择应用进行发布操作。
* 审核: 管理员按钮, 如果该环境配置了发布审核, 则需要管理员进行审核, 审核通过后才可以进行发布操作。
* 发布: 执行应用发布操作。
* 定时: 将未发布的发布操作设置定时发布时间。
* 复制: 复制发布应用, 如果修改了应用构建配置, 发布操作仍然是当前发布任务的发布操作。
* 回滚: 回滚发布应用, 再次执行当前发布任务的发布操作, 如果构建产物不存在则无法回滚。
* 取消: 取消应用定时发布。
* 停止: 停止本次发布操作。
按住 `Ctrl` 点击 `日志` 可以打开一个新页面, 否则将会打开一个模态框。
+34
View File
@@ -0,0 +1,34 @@
### 批量执行
批量执行机器命令, 常用于批量执行某些脚本, 如: 批量同步机器时间、批量删除文件等。
相当于一个无界面的伪终端, 可以执行 `cd` 这种终端命令, 同样的 `调度任务` `应用构建` `应用发布` 命令执行操作都是伪终端。
批量执行的命令可以使用机器环境变量。
### 执行记录
可以查看当前用户执行的所有命令记录, `管理员` 可以查看所有用户的执行记录。
按住 `Ctrl` 点击 `日志` 可以打开一个新页面, 否则将会打开一个模态框。
### 日志面板
维护机器可查看的日志文件, 采用执行命令的方式查看文件, 灵活度高。
```
# 查看普通日志文件
tail -f -n @{offset} @{file}
# 查看 k8s 的日志文件
kubectl get pods -n dev | awk '{print $1}' | grep @{file} | xargs -I '{}' kubectl logs {} -n dev --tail=@{offset} -f
# 这里甚至可以使用 cat
cat /data/info.log
```
这里只有两个可替换的变量, 当然这里也是可以写死的
| key | 示例 | 描述 |
| :---- | :--- | :---- |
| offset | 500 | 偏移量(行) |
| file | /data/info.log | 机器名称 |
按住 `Ctrl` 点击 `打开` 可以打开一个新页面, 否则将会打开一个模态框。
+63
View File
@@ -0,0 +1,63 @@
### 机器列表
管理和维护可操作的机器, 项目初始化后会生成一台默认机器 (本机) 可以称为 `宿主机`, 需要手动设置 `ssh` 密码或添加秘钥。
这里可以打开WebTerminal, WebSftp, 按住 `Ctrl` 点击 `Terminal` / `sftp` 可以打开一个新页面, 否则将会打开一个模态框。
### 环境变量
配置机器环境变量, 这个环境变量并不会设置到远程机器内, 而是运行命令时动态替换命令内容。
`批量执行` `调度任务` `应用发布` `应用构建` 都可以用到, 设计的初衷是每台机器的配置不一样, 不同的机器执行相同的命令时设置不同的参数。
系统提供了几个默认的机器变量, 使用 `@{machine.xxx}` 来替换。
| key | 示例 | 描述 |
| :---- | :--- | :---- |
| machine_id | 1 | 机器id |
| machine_name | server1 | 机器名称 |
| machine_tag | host | 机器标签 |
| machine_host | 127.0.0.1 | 机器主机 |
| machine_port | 22 | 机器端口 |
| machine_username | root | 机器用户名 |
> ##### 示例
```
# 当前机器 名称: dev-server1
# 环境变量 profile: dev
# 执行命令
echo @{machine.machine_name}
java -jar xxx.jar --spring.profiles.active=@{machine.profile}
# 命令在执行前会被替换为
echo dev-server1
java -jar xxx.jar --spring.profiles.active=dev
```
机器创建后系统会生成几个默认的环境变量, 用于部分功能的交互。
| key | 示例 | 描述 |
| :---- | :--- | :---- |
| tail_charset | UTF-8 | 文件追踪编码格式 |
| tail_offset | 400 | 文件追踪偏移量(行) |
| sftp_charset | UTF-8 | sftp 文件名称编码格式 |
⚡ 注意: 切换视图后保存只会增量保存, 并不会删除变量
### 机器秘钥
管理和维护可操作机器 SSH 秘钥
### 代理列表
管理和维护可操作机器 SSH 连接代理
### 终端日志
查看用户连接 Terminal 后执行的键盘输入日志
### 终端控制
`管理员菜单`
查看当前所有已连接的终端会话, 具体到用户和机器, 可强制下线终端
+11
View File
@@ -0,0 +1,11 @@
### 任务列表
配置一个 `cron` 定时任务, 常用于定时执行某些脚本, 如: 定时清理日志、定时备份数据等。
设计理念与批量执行相同, 只不过是不用人为去触发任务执行。
新建任务时鼠标悬停到执行时间上可以得到最近的执行时间。
⚡ 注意: 修改后状态会变为停用状态
### 执行记录
可以查看所有调度任务执行的记录, 查看日志时按住 `Ctrl` 点击 `日志` 可以打开一个新页面, 否则将会打开一个模态框。
+60
View File
@@ -0,0 +1,60 @@
### 模板管理
维护命令模板。 在 `批量执行` `调度任务` `应用配置` 可以直接选择使用。
### 系统变量
配置以及维护系统环境变量。
系统内部维护了几个默认的变量, 使用 `@{system.xxx}` 来替换。
| key | 示例 | 描述 |
| :---- | :--- | :---- |
| key_path | /root/orion/keys | 秘钥存放目录 |
| pic_path | /root/orion/pic | 图片存放目录 |
| swap_path | /root/orion/swap | 交换分区目录 |
| log_path | /root/orion/log | 日志存放目录 |
| temp_path | /root/orion/temp | 临时文件目录 |
| vcs_path | /root/orion/vcs | 应用版本仓库目录 |
| dist_path | /root/orion/dist | 构建产物目录 |
| tail_mode | tracker | 文件追踪模式 tracker 或 tail |
> ##### 示例
```
# 执行命令
echo @{system.log_path}
# 命令在执行前会被替换为
echo /root/orion/log
```
⚡ 注意: 切换视图后保存只会增量保存, 并不会删除变量
### 系统设置
`管理员菜单`
对系统进行一些自定义设置。
* 系统系统分析
* 自动清理开关
* 自动清理阈值
* 系统资源统计分析
* 安全配置
* 多端登陆开关
* 登陆失败锁定开关
* 登陆IP绑定开关
* 登陆凭证自动续签开关
* 凭证有效期设置
* 登陆失败锁定阈值设置
* 登陆自动续签阈值设置
* IP 过滤器配置
* 黑名单配置
* 白名单配置
* 过滤器开启开关
* 启用白名单开关
* 其他配置
* 调度任务自动恢复开关
* 上传文件最大阈值设置
+18
View File
@@ -0,0 +1,18 @@
### 用户列表
系统用户列表。
* 解锁: 解锁已锁定的用户
* 禁用: 禁用用户使该用户无法登陆
* 日志: 查看操作日志
* 重置密码: 重置用户密码
### 个人信息
可以修改当前用户的基本信息, 以及查询当前用户的操作日志。
### 操作日志
`管理员菜单`
可以查看所有所有用户的操作日志。
+79
View File
@@ -0,0 +1,79 @@
## Q&A
> ##### 1. 什么时候会进行版本迭代?
因为前后端都是我一个人在开发, 都是在抽时间写, 我的大部分的闲暇时间都贡献在这个上面了。而且我对代码要求比较高, 也在不断打磨之前的代码, 所以开发周期比较长。
<br/>
> ##### 2. 忘记了默认管理员密码无法登陆怎么办?
重启后端服务 添加启动参数 `--reset-admin` 会将 `orionadmin` 的密码重置为 `orionadmin`
```
nohup java -jar orion-ops-service-1.0.0.jar --spring.profiles.active=prod --reset-admin &
```
<br/>
> ##### 3. 开启了IP黑白名单, 无法访问系统了怎么办?
重启后端服务 添加启动参数 `--disable-ip-filter` 会将禁用ip过滤器
```
nohup java -jar orion-ops-service-1.0.0.jar --spring.profiles.active=prod --disable-ip-filter &
```
<br/>
> ##### 4. 数据误删除怎么办?
数据库的数据都采用了逻辑删除, 可以直接修改表中的 `deleted` 字段改为 `1`
<br/>
> ##### 5. 可以将宿主机 IP 修改为其他机器吗?
暂时不支持
<br/>
> ##### 6. orion-ops 可以实现异地构建吗?
暂时不支持
<br/>
> ##### 7. 为什么 SFTP 大文件无法上传?
1. 修改 application.properties 中的 `spring.servlet.multipart.max-file-size` 为合适的值
2. 修改 系统管理 > 系统设置 > 其他设置 `上传文件最大阈值` 为合适的值
3. 如果使用 nginx 代理后端接口, 修改 nginx 请求限制 `client_max_body_size` 为合适的值
```
server {
listen 80;
client_max_body_size 1024m;
...
}
```
⛔ 不建议上传特别大的文件, 可能会出现 `OOM`
<br/>
> ##### 8. 应用构建时提示 '版本控制仓库操作执行失败'?
应用管理 > 版本仓库 找到应用关联的仓库, 检查密码/token后 重新初始化即可
<br/>
> ##### 9. orion-ops 是否支持 Windows 部署?
不支持, 仅支持 Linux 环境下部署
<br/>
> ##### 10. orion-ops 是否支持 svn 作为版本仓库?
不支持, 但是构建时可以执行 svn 命令
<br/>
> ##### 11. 如果构建不会生成产物, 怎么防止构建失败?
将构建产物路径设置为一个已存在的文件的绝对路径即可
<br/>
+98
View File
@@ -0,0 +1,98 @@
### 所需环境
* JDK 1.8
* Mysql 8.0(+)
* Redis 5.0.5(+)
* Node 11.12.0(+)
* Maven
* Nginx
* npm / yarn
### 构建
1. 拉取代码
```
# github
git clone https://github.com/lijiahangmax/orion-ops
# gitee
git clone https://gitee.com/lijiahangmax/orion-ops
```
2. 初始化数据库
`执行脚本` > `orion-ops/orion-ops-service/init.sql`
3. 构建后端代码
```
# 修改配置文件
orion-ops/orion-ops-service/src/main/resources/application-prod.properties
# 编译
mvn clean package -DskipTests
```
构建时如果有依赖拉不下来可以选择使用阿里云的 maven 镜像
```setting.xml
<mirror>
<id>nexus-aliyun</id>
<mirrorOf>central</mirrorOf>
<name>Nexus aliyun</name>
<url>http://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>
```
4. 构建前端代码
```
# 修改配置文件
orion-ops/orion-ops-vue/.env.production
# 下载依赖
npm i 或 yarn
# 编译
npm run build:prod
```
### 修改 nginx 配置
```
server {
listen 80;
client_max_body_size 4m;
location / {
root html;
index index.html index.htm;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
}
}
```
### 部署
```
复制 orion-ops/orion-ops-vue/dist 的所有文件到 nginx映射目录/ops
复制 orion-ops/orion-ops-service/target/orion-ops-service-1.0.0.jar 到 /data/orion
# 启动后台服务
nohup java -jar orion-ops-service-1.0.0.jar --spring.profiles.active=prod --generator-admin &
# 启动 nginx
service nginx start
```
### 测试访问
在浏览器中输入 http://localhost/ops 访问
账号: `orionadmin`
密码: `orionadmin`
### 配置宿主机信息
登录后需要配置宿主机信息, 直到可以访问
如果是密码登录: 机器管理 > 机器列表 > `宿主机` > 更多 > 编辑 > 选择认证方式为密码 > 输入密码 > 确定
如果是秘钥登陆: 机器管理 > 机器秘钥 > 新建
配置完成后测试连接: 机器管理 > 机器列表 > `宿主机` > 更多 > 测试连接
### 启动参数
> 启动项目时提供了一些可选的执行参数
关闭IP过滤器 `--disable-ip-filter`
生成默认管理员账号 `--generator-admin` 账号: `orionadmin` 密码: `orionadmin`
重置默认管理员账号 `--reset-admin` 账号: `orionadmin` 密码: `orionadmin`