Skip to content

Commit cc287ba

Browse files
committed
optimization
1 parent cee8f37 commit cc287ba

File tree

18 files changed

+230
-80
lines changed

18 files changed

+230
-80
lines changed

README.md

Lines changed: 34 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
# devops
22
基于 python 3.7 + django 2.2.11 + channels 2.2.0 + celery 4.3.0 + ansible 2.9.2 + AdminLTE-3.0.0 实现的运维 devops 管理系统。具体见 `screenshots` 文件夹中的效果预览图。
3-
本人为运维工程师,非专业开发,此项目各个功能模块都是现学现用,可能有的地方暂时没有考虑合理和性能的问题,欢迎 issue
3+
本人为运维工程师,非专业开发,项目各个功能模块都是现学现用,可能有的地方暂时没有考虑合理和性能的问题。
44

55

66
# 功能
7-
有点多,看图,不想描述了
7+
看图
88

99

1010
# 预览
@@ -35,39 +35,39 @@
3535

3636
# 部署安装
3737

38-
主机操作系统为 Centos 7.5,python 版本 3.7.2,docker 版本 1.13.1,项目目录为 `/home/workspace/devops` 。windows 上就不建议部署了,那是作死的事情
38+
环境:Centos 7.5,python 3.7.2,docker 1.13.1,项目目录为 `/home/workspace/devops`
3939

40-
**安装依赖**
40+
**1. 安装依赖**
4141
```bash
4242
yum install -y epel-release
43-
yum install -y sshpass python3-devel mysql-devel
43+
yum install -y gcc sshpass python3-devel mysql-devel
4444
```
4545
- ansible 连接插件 connection 使用 ssh 模式(还可以使用 paramiko 等模式)并且密码连接主机时需要使用 sshpass
4646
- python3-devel 与 mysql-devel 为 mysqlclient 库的依赖
4747
- 不建议使用 pymysql 代替 mysqlclient ,因为 pymysql 为纯 python 编写的库,性能较低
4848

49-
**安装 redis(docker 方式)**
49+
**2. 安装 redis(docker 方式)**
5050
```bash
5151
docker run --name redis-server -p 6379:6379 -d redis:latest
5252
```
5353
- channels、缓存、celery以及 session 支持所需,必须
5454

55-
**安装 guacd(docker 方式)**
55+
**3. 安装 guacd(docker 方式)**
5656
```bash
5757
docker run --name guacd -e GUACD_LOG_LEVEL=info -v /home/workspace/devops/media/guacd:/fs -p 4822:4822 -d guacamole/guacd
5858
```
5959
- rdp 与 vnc 连接支持所需,非必须
6060
- rdp 必须设置为`允许运行任意版本远程桌面的计算机连接(较不安全)(L)`才能连接,也就说目前暂不支持 nla 登陆方式
6161
- `-v /home/workspace/devops/media/guacd:/fs` 挂载磁盘,用于远程挂载文件系统实现上传和下载文件
6262

63-
**安装 python 依赖库**
63+
**4. 安装 python 依赖库**
6464
```bash
6565
# 安装相关库
6666
pip3 install -i https://mirrors.aliyun.com/pypi/simple -r requirements.txt
6767
```
68-
- -i 指定阿里源,国外源慢得一逼,我大天朝威武,局域网玩得贼6
68+
- -i 指定阿里源,速度飞起,我大 TC 威武,局域网玩得贼 6
6969

70-
**修改 devops/settings.py 配置**
70+
**5. 修改 devops/settings.py 配置**
7171

7272
相关配置均有注释,根据实际情况修改。默认数据库使用的是 sqlite3,如果需要使用 mysql,方法如下:
7373

@@ -93,7 +93,7 @@ DATABASES = {
9393
```
9494
- 相关数据库(不需创建表)与账号必须事先在 mysql 数据库中创建好并授权。
9595

96-
**迁移数据库**
96+
**6. 迁移数据库**
9797
```bash
9898
sh delete_makemigrations.sh
9999
rm -f db.sqlite3
@@ -102,15 +102,15 @@ python3 manage.py makemigrations
102102
python3 manage.py migrate
103103
```
104104

105-
**初始化数据**
105+
**7. 初始化数据**
106106
```bash
107107
python3 manage.py loaddata initial_data.json
108108
python3 init.py
109109
```
110110
- initial_data.json 为权限数据
111111
- init.py 创建超级管理员 admin 以及部分测试数据,可根据实际情况修改
112112

113-
**启动相关服务**
113+
**8. 启动相关服务**
114114
```bash
115115
rm -rf logs/*
116116
export PYTHONOPTIMIZE=1 # 解决 celery 不允许创建子进程的问题
@@ -127,7 +127,7 @@ nohup gunicorn -c gunicorn.cfg devops.wsgi:application > logs/gunicorn.log 2>&1
127127
- celery_beat 定时任务处理进程,读取 `devops/settings.py` 中设置的 `CELERY_BEAT_SCHEDULE` 定时任务,详见 v1.8.8 升级日志
128128
- 需要停止时 kill 相应的进程,然后删除 logs 目录下所有的 pid 文件即可
129129

130-
**nginx 前端代理**
130+
**9. 配置 nginx 前端代理**
131131
```
132132
yum install -y nginx
133133
```
@@ -272,22 +272,34 @@ systemctl start nginx
272272
```
273273
- 启动前建议先检查下配置是否正确:`nginx -t`
274274

275-
访问首页:http://127.0.0.1
275+
**10. 访问首页:http://127.0.0.1**
276276

277-
超级管理员
277+
初始超级管理员
278278
> 账号: admin 密码:123456
279279
280280

281281
# 已知问题或者不足
282-
1. web 终端(包括 webssh,webtelnet)在使用 chrome 浏览器打开时,很大机率会出现一片空白无法显示 xterm.js 终端的情况。
282+
1. 代码的质量以我现在的眼光来看都太差了,但是这个项目的初衷也只是学习而已,也就没有动力重构优化了。
283+
284+
2. web 终端(包括 webssh,webtelnet)在使用 chrome 浏览器打开时,很大机率会出现一片空白无法显示 xterm.js 终端的情况。
283285
解决方法是改变一下 chrome 窗口大小就好了,在 firefox 下也有无此问题,但出现的机率小一些,具体原因未知。
284286

285-
2. 关于前后端分离,有同学建议使用 vue 做前后端分离。这是个很好的建议,但是由于个人时间精力的问题,只能是慢慢来吧。
287+
3. 关于使用 vue 做前后端分离,这肯定是以后的趋势,但是由于个人时间精力的问题,只能是慢慢来吧。
288+
289+
4. 数据权限是有一点小问题的,在某些特定的情况下会越权,细心的同学可以在代码中发现。
290+
291+
5. webssh 使用 zmodem 上传下载还有很多可以优化的地方,可以参考我的 go 项目 [gowebssh](https://github.com/leffss/gowebssh)
292+
293+
6. webrdp 下载文件也还可以优化。
286294

287-
3. 数据权限是有一点小问题的,细心的同学可以在代码中发现。
288295

289296
# 升级日志
290297

298+
### ver2.1.0
299+
增强 zmodem 命令兼容性,新增支持 rz -e \ rz -S \ rz -e -S 命令;
300+
301+
新增 django_cachalot 缓存 sql 数据库查询结果,提高整体响应速度;
302+
291303
### ver2.0.0
292304
优化 web 终端无法显示 _ 符号的问题(xterm v3 默认的渲染器 canvas 有兼容问题 ,故改用 dom,v4 版本不存在此问题);
293305

@@ -306,8 +318,8 @@ systemctl start nginx
306318
- tab 自动补全命令无法正常识别(tab 补全操作太复杂,不好判断)
307319
- 无法识别 top 等类似命令中输入的操作命令
308320
- 无法识别中文命令
309-
- 识别命令的准确率只能尽可能的提高,应该没有那个堡垒机敢说自己准确率100%
310-
- 真正想实现 100% 准确率,应该只有修改 shell 源码或者调用 shell 历史命令了(但是这些方式都有很多弊端
321+
- 识别命令的准确率只能尽可能的提高,应该没有那个堡垒机(包括商业的)敢说自己准确率 100% 吧
322+
- 真正想实现 100% 准确率,应该只有修改 shell 源码或者调用 shell 历史命令了(但是这些方式都不是太现实
311323

312324
优化 webrdp 下载文件时录像数据记录逻辑(不保存下载的文件内容到录像结果)
313325

@@ -473,7 +485,7 @@ linux 平台下使用 celery 任务保存终端会话日志与录像(windows
473485

474486
# MIT License
475487
```
476-
Copyright (c) 2019-2020 leffss
488+
Copyright (c) 2019-2020 leffss.
477489
```
478490

479491

apps/webssh/ssh.py

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,12 +23,21 @@
2323
except Exception:
2424
terminal_exipry_time = 60 * 30
2525

26-
zmodemszstart = b'rz\r**\x18B00000000000000\r\x8a'
26+
# sz
27+
zmodemszstart = b'**\x18B00000000000000\r\x8a\x11'
2728
zmodemszend = b'**\x18B0800000000022d\r\x8a'
28-
zmodemrzstart = b'rz waiting to receive.**\x18B0100000023be50\r\x8a'
29+
30+
# rz
31+
zmodemrzstart = b'**\x18B0100000023be50\r\x8a\x11' # rz
32+
zmodemrzestart = b'**\x18B0100000063f694\r\x8a\x11' # rz -e
33+
zmodemrzsstart = b'**\x18B0100000223d832\r\x8a\x11' # rz -S
34+
zmodemrzesstart = b'**\x18B010000026390f6\r\x8a\x11' # rz -e -S
2935
zmodemrzend = b'**\x18B0800000000022d\r\x8a'
36+
37+
# zmodem cancel
3038
zmodemcancel = b'\x18\x18\x18\x18\x18\x08\x08\x08\x08\x08'
3139

40+
3241
BufferSize = 4096 # 4096 足够,高于 4096 时使用 zmodem 传输时会出现错误
3342

3443

@@ -199,7 +208,8 @@ def websocket_to_django(self):
199208
self.channel.send('\n')
200209
self.websocker.send(bytes_data=x)
201210
else:
202-
if zmodemszstart in x or zmodemrzstart in x:
211+
if zmodemszstart in x or zmodemrzstart in x or zmodemrzestart in x or zmodemrzsstart in x \
212+
or zmodemrzesstart in x:
203213
self.zmodem = True
204214
self.websocker.send(bytes_data=x)
205215
else:
@@ -333,5 +343,4 @@ def shell(self, data):
333343
# Thread(target=self.django_to_ssh, args=(data,)).start()
334344
self.django_to_ssh(data)
335345
# 原作者将发送数据到django websocket的线程创建函数如果写到这,会导致每在客户端输入一个字符就创建一个线程
336-
# 最终可能导致线程创建太多,故将其写到 connect 函数中
337346
# Thread(target=self.websocket_to_django).start()

apps/webssh/sshd/sshinterface.py

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -39,10 +39,18 @@
3939
except Exception:
4040
terminal_exipry_time = 60 * 30
4141

42-
zmodemszstart = b'rz\r**\x18B00000000000000\r\x8a'
42+
# sz
43+
zmodemszstart = b'**\x18B00000000000000\r\x8a\x11'
4344
zmodemszend = b'**\x18B0800000000022d\r\x8a'
44-
zmodemrzstart = b'rz waiting to receive.**\x18B0100000023be50\r\x8a'
45+
46+
# rz
47+
zmodemrzstart = b'**\x18B0100000023be50\r\x8a\x11' # rz
48+
zmodemrzestart = b'**\x18B0100000063f694\r\x8a\x11' # rz -e
49+
zmodemrzsstart = b'**\x18B0100000223d832\r\x8a\x11' # rz -S
50+
zmodemrzesstart = b'**\x18B010000026390f6\r\x8a\x11' # rz -e -S
4551
zmodemrzend = b'**\x18B0800000000022d\r\x8a'
52+
53+
# zmodem cancel
4654
zmodemcancel = b'\x18\x18\x18\x18\x18\x08\x08\x08\x08\x08'
4755

4856
support_term = ["linux", "ansi", "xterm"]
@@ -241,7 +249,9 @@ def bridge(self):
241249
self.chan_cli.send(recv_message)
242250
continue
243251
else:
244-
if zmodemszstart in recv_message or zmodemrzstart in recv_message:
252+
if zmodemszstart in recv_message or zmodemrzstart in recv_message or \
253+
zmodemrzestart in recv_message or zmodemrzsstart in recv_message or \
254+
zmodemrzesstart in recv_message:
245255
self.zmodem = True
246256
# logger.info("zmodem start")
247257
self.chan_cli.send(recv_message)

devops/settings.py

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,7 @@
7373
'django.contrib.messages',
7474
'django.contrib.staticfiles',
7575
# 'debug_toolbar',
76+
'cachalot',
7677
'channels',
7778
'server',
7879
'user',
@@ -85,6 +86,14 @@
8586
# 'django_apscheduler',
8687
]
8788

89+
# django-cachalot 原理是捕获 insert\update\delete 操作而刷新缓存,如果不是通过 django orm,而是直接改的数据库,那么就不能触发其缓存
90+
# 刷新机制,这是可以使用其提供的手动刷新命令解决:./manage.py invalidate_cachalot [app]
91+
# 具体参考文档:https://django-cachalot.readthedocs.io/en/latest/quickstart.html#manage-py-command
92+
# 并且 django-cachalot 不适用于 insert\update\delete 操作很频繁的项目,这种项目反而会使其性能下降
93+
CACHALOT_ENABLED = True # 不懂官方这个配置什么意思,设置 False 还是会启用缓存
94+
CACHALOT_DATABASES = ['default'] # 需要缓存的数据库别名,必须设置,默认的 supported_only 只支持 django 默认的数据库引擎,不支持自定义的 db_pool.mysql 连接池引擎
95+
# 更多配置参考:https://django-cachalot.readthedocs.io/en/latest/quickstart.html#settings
96+
8897
# 中间件
8998
MIDDLEWARE = [
9099
# 'debug_toolbar.middleware.DebugToolbarMiddleware',
@@ -117,6 +126,7 @@
117126
# 'debug_toolbar.panels.logging.LoggingPanel',
118127
# 'debug_toolbar.panels.redirects.RedirectsPanel',
119128
# 'debug_toolbar.panels.profiling.ProfilingPanel',
129+
# 'cachalot.panels.CachalotPanel',
120130
# ]
121131

122132
# INTERNAL_IPS = [
@@ -172,8 +182,8 @@
172182
# 'ENGINE': 'django.db.backends.mysql',
173183
'ENGINE': 'db_pool.mysql', # 重写 mysql 连接库实现连接池
174184
'NAME': 'devops',
175-
'USER': 'devops',
176-
'PASSWORD': 'devops',
185+
'USER': 'root',
186+
'PASSWORD': '123456',
177187
'HOST': '192.168.223.111',
178188
'PORT': '3306',
179189
# 'CONN_MAX_AGE': 600, # 如果使用 db_pool.mysql 绝对不能设置此参数,否则会造成使用连接后不会快速释放到连接池,从而造成连接池阻塞

docker.sh

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
docker run -d --name redis -p 6379:6379 redis:latest
2+
docker run -d --name mysql -e MYSQL_ROOT_PASSWORD=123456 -p 3306:3306 mysql:5.7
3+
docker run -d --name guacd -e GUACD_LOG_LEVEL=info -v /home/workspace/devops/media/guacd:/fs -p 4822:4822 guacamole/guacd

gunicorn.cfg

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ timeout = 60
8686
# 接收到restart信号后,worker可以在graceful_timeout时间内,继续处理完当前requests。
8787
graceful_timeout = 120
8888
# keepalive, 1-5 秒
89-
# server端保持连接时间。如果Gunicorn 在负载均衡后面,可以设置高点
89+
# server端保持连接时间。如果 Gunicorn 在负载均衡后面,可以设置高点
9090
keepalive = 5
9191

9292
# 启动 worker 前加载代码,代码只执行一次,但是使用 kill -HUP 重启 gunicorn 后无法更新代码了

migrations.sh

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
/home/python372/bin/python3 manage.py makemigrations

requirements.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,3 +34,4 @@ django-apscheduler==0.3.0
3434
requests==2.22.0
3535
jsonpickle==1.2
3636
redisbeat==1.2.3
37+
django-cachalot==2.3.1

static/webssh/webssh.clissh.view.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -163,7 +163,7 @@ function websocket() {
163163
toastr.options.extendedTimeOut = 3000;
164164
// toastr.options.progressBar = true;
165165
toastr.options.positionClass = 'toast-bottom-center';
166-
toastr.info('调整行列值: ' + cols_rows.cols + ' x ' + cols_rows.rows);
166+
toastr.info('行列值: ' + cols_rows.cols + ' x ' + cols_rows.rows);
167167
}, 130)
168168
})
169169
}

0 commit comments

Comments
 (0)