# devops
后台使用的 layui 模板来自[这个项目](https://gitee.com/aun/Timo) master 分支的 a806fd0a 版本

## 依赖
- os:Linux
- jdk:11
- maven:3.9
- mysql:5.7

## 架构
devops 项目模块:
- agent
> 监听 127.0.0.1:60001 端口
> > 监听这个端口的目的是防止系统中同时运行多个 agent 实例
> 
> 代理节点, 用于管理机器, 部署应用, 管理应用状态等
- common
> 公共依赖
- deployer
> 用来部署 mgr 和 agent 的工具
- logstash
> 日志收集器
- mgr
> 监听 4020 端口
> > 通过这个端口对外提供 HTTP 服务
> 
> 管理节点, 用于管理 agent 节点, 构建部署应用等

devops-mgr 和 devops-agent 之间的关系如下图所示:
![](https://blog.reghao.cn/file/e4fc2c65c2f44374a09dbb916499a5bf.png)
> agent 和 mgr 之间使用 websocket 进行通信
> 
> 每台被管理的机器上都需要且只能一个部署 agent 实例
> > 在 agent 的配置文件中指定 mgr 的地址
>
> > agent 使用 Linux /etc/machine-id 文件中的字符串作为 machineId 在 mgr 中唯一地标识一台机器
> > > 如果 VirtualBox 中使用的 vdisk 是通过 clonehd 得到, 那么多台 VM 中 /etc/machine-id 文件的内容是相同的, 此时需要在 VM 中执行 devops/zzz/reset_machine_id.sh 脚本来重置 machine-id
> 
> 只能部署一个 mgr 实例
> > 可以在一个节点上同时部署 mgr 和 agent 实例

## 初始化 MySQL
- 1.devops/zzz/devops_init.sql 文件是系统的初始数据
- 2.执行 devops/zzz/init_schema.sh 脚本可完成数据库的创建和初始化
> 需要自行指定脚本中的 host, username, password, db 等变量值
- 3.然后可以开始构建和部署系统 

## 构建
根据需要构建的类型使用 wget 获取构建脚本:
```
# 构建 jar 包使用此脚本
wget https://git.reghao.cn/reghao/bnt/raw/master/zzz/build_jar.sh
```
- 1.修改构建脚本中的 base_dir 变量的值
- 2.执行构建脚本
- 3.构建完成
> 生成的 jar 包会分别存放在 devops/mgr/bin, devops/agent/bin 和 devops/deployer/bin 目录中

## 部署
### 部署 devops-mgr
- 1.修改 devops/mgr/bin/devopsmgr.yml 文件中的配置
> mysql 配置
> 
> app.baseDir 指定 mgr 产生的数据存放的位置
- 2.使用 cd 命令切换到 devops/mgr/bin 目录
- 3.执行 start.sh 脚本

### 部署 devops-agent
- 1.修改 devops/agent/bin/devopsagent.json 文件中的配置
> mgrAddress 可以是 IP 地址, 也可以是域名
> > 如果使用域名, 那么 mgrPort 应使用 Nginx 中的配置
- 2.使用 cd 命令切换到 devops/agent/bin 目录
- 3.执行 start.sh 脚本

### 部署多节点
如果要将 devops-mgr 和 devops-agent 部署到多个节点(注意, devops-mgr 只能部署到多个节点中的某个节点), 可以使用 devops-deployer 工具, 它本质上是一个 SFTP/SSH 客户端, 在和节点建立 SSH 连接后, 执行相应的 Shell 命令.
- 1.使用 devops/zzz/servers.csv 模板文件
> 在该文件中填写节点的相应信息, 必须指定密码或私钥文件绝对路径
- 2.然后根据需要执行 devops/zzz/deploy_mgr.sh 或 devops/zzz/deploy_agent.sh 脚本
> 首先要设置脚本中 proj_dir, remote_dir 和 server_file 这三个变量的值

## Nginx 配置
devops-mgr 应用通常是经由 Nginx 反向带来来访问, 并且 Nginx 还需要提供对 websocket 的支持. 

### 支持 websocket
nginx.conf 文件中配置 websocket:
```
map $http_connection $connection_upgrade {
        "~*Upgrade" $http_connection;
        default keep-alive;
    }
```

### 代理配置
Nginx 代理配置示例:
```
server {
   listen 80;
   server_name devops.reghao.cn;
   access_log off;

   location / {
      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_pass http://127.0.0.1:4020;
   }
   location /ws {
      proxy_set_header Upgrade $http_upgrade;
      proxy_set_header Connection $connection_upgrade;
      proxy_cache off;
      proxy_http_version 1.1;
      proxy_buffering off;
      proxy_read_timeout 100s;
      proxy_set_header Host $host;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header X-Forwarded-Proto $scheme;

      proxy_pass http://127.0.0.1:4020;
   }
}
```

## 使用
至此, devops 系统已部署并处于运行状态, 你可通过自己域名或直接通过 IP:PORT 访问系统.
> devops-mgr 中默认只有一个 admin 用户, 帐号和密码分别为 admin 和 123456
> > 强烈建议首次登录后修改 admin 用户密码
