告别丑UI!装上这个设计师外挂,让AI写出Apple官网级别的界面

GitHub 41.7K Stars,开源界最火的设计技能库


你是不是也被AI写的界面丑到过?

用AI写代码功能实现了,但界面那个丑啊——

  • 配色不是”杀马特紫”就是”城乡结合部红”
  • 按钮土得掉渣,圆角不是太大就是太小
  • 布局一坨,移动端根本无法看
  • 字体搭配灾难现场,读起来眼睛疼

你不好意思发给客户,自己看着也闹心。

今天我要给你安利一个开源神器——ui-ux-pro-max-skill,GitHub上已经41.7K Stars了!装上它之后,AI写出来的界面直接提升10个档次,从”实习生水平”秒变”资深设计师水准”!


先看对比,差距有多大

场景 安装前(普通AI) 安装后(+UI/UX Pro Max)
登录页 灰头土脸的基础表单 现代化配色 + 圆角设计 + 柔和阴影 + 移动端适配
数据图表 简陋的表格展示 专业Dashboard布局 + 可视化最佳实践
配色方案 随机或基础配色 基于设计系统的专业调色板,直接可用
页面布局 内容挤成一团 合理留白、层次分明

技能库有多顶:

  • 🎨 67种UI设计风格:Glassmorphism、Claymorphism、Minimalism、Brutalism、Neumorphism、Bento Grid……主流小众全覆盖
  • 🎯 161套配色方案:医疗、金融、电商、SaaS、教育……161个行业专业配色直接套用
  • 🔤 57组字体搭配:标题用什么、正文用什么、Google Fonts专业组合
  • 📊 25种图表类型:什么场景用什么图表,说得明明白白
  • 🛠️ 13种技术栈:React、Vue、Next.js、Svelte、SwiftUI、React Native、Flutter、Tailwind、shadcn……全部支持
  • 99条UX黄金法则:可访问性、交互性能、动画效果、响应式布局
  • 🧠 161条行业推理规则:v2.0新增!AI自动分析你的项目,给出最适合的设计方案

说白了,这就是给AI装了一个”资深设计师的大脑”。


支持哪些AI编程工具

这是最关键的!目前支持:

工具 安装方式
Claude Code Claude Marketplace / uipro-cli
OpenCode uipro-cli
Trae uipro-cli
Cursor uipro-cli
Windsurf uipro-cli
Kiro 斜杠命令
GitHub Copilot 斜杠命令
Roo Code 斜杠命令
Continue uipro-cli
Codex CLI 自动激活
Gemini CLI 自动激活

不管你用哪个AI编程工具,基本都能无缝衔接!


安装教程(超简单)

方法一:uipro-cli(推荐!一条命令搞定)

这是官方推荐的安装方式,支持所有主流AI编程工具:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 1. 确保安装了 Node.js(去 nodejs.org 下载)

# 2. 全局安装 uipro-cli
npm install -g uipro-cli

# 3. 进入你的项目文件夹
cd 你的项目目录

# 4. 初始化,选择你的AI工具
uipro init --ai claude # Claude Code
uipro init --ai cursor # Cursor
uipro init --ai trae # Trae
uipro init --ai windsurf # Windsurf
uipro init --ai opencode # OpenCode
uipro init --ai all # 全部AI工具

安装完成后,你的项目里会自动创建对应AI工具的配置文件夹和技能文件。


方法二:Claude Code 市场安装

1
2
3
# 在Claude Code中直接执行
/plugin marketplace add nextlevelbuilder/ui-ux-pro-max-skill
/plugin install ui-ux-pro-max@ui-ux-pro-max-skill

方法三:OpenCode / Cursor / Trae 手动安装

1
2
3
4
5
6
7
8
# 安装 Skills 管理器
npm i -g openskills

# 安装 ui-ux-pro-max-skill
openskills install nextlevelbuilder/ui-ux-pro-max-skill

# 同步到项目
openskills sync

正确使用姿势

姿势一:自然语言激活(最简单)

安装完成后,直接对你的AI工具说:

1
帮我设计一个电商网站首页,要现代简约风格
1
创建一个医疗数据分析Dashboard,要暗色模式
1
做一个移动端App界面,电商类的

AI会自动读取技能库,生成专业级的设计代码。


姿势二:设计系统生成(最强大)

这是v2.0最炸的功能!一条命令生成完整设计方案:

1
python3 .claude/skills/ui-ux-pro-max/scripts/search.py "电商网站 移动端 暗黑模式" --design-system -p "我的电商项目"

几秒钟后你会得到:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
+-----------------------------------------------------------------------------------------+
| TARGET: 我的电商项目 - RECOMMENDED DESIGN SYSTEM |
+----------------------------------------------------------------------------------------+
| PATTERN: Hero-Centric + Social Proof |
| 落地页结构:Hero → 服务介绍 → 用户评价 → 预约咨询 → 联系 |
| |
| STYLE: Modern SaaS + Bento Grid |
| 关键词: 现代、专业、简洁、数据展示 |
| 最佳用于: SaaS产品、电商平台 |
| |
| COLORS: |
| Primary: #0F172A (深蓝) |
| Secondary: #3B82F6 (科技蓝) |
| CTA: #F97316 (活力橙) |
| Background: #F8FAFC (浅灰白) |
| |
| TYPOGRAPHY: Inter / Poppins |
| |
| AVOID: |
| 避免使用荧光色、过于复杂的动画、暗色模式(除非用户明确要求) |
+----------------------------------------------------------------------------------------+

姿势三:按需查询具体规则

实际开发中遇到具体问题:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 查交互设计规范
python3 .claude/skills/ui-ux-pro-max/scripts/search.py "按钮 悬停 动画" --domain ux

# 查无障碍设计
python3 .claude/skills/ui-ux-pro-max/scripts/search.py "无障碍 颜色对比度" --domain ux

# 查特定风格
python3 .claude/skills/ui-ux-pro-max/scripts/search.py "glassmorphism" --domain style

# 查字体搭配
python3 .claude/skills/ui-ux-pro-max/scripts/search.py "elegant serif" --domain typography

# 查图表推荐
python3 .claude/skills/ui-ux-pro-max/scripts/search.py "dashboard" --domain chart

姿势四:技术栈专项指南

用特定框架?加上栈参数:

1
2
3
4
5
6
7
8
# React项目
python3 .claude/skills/ui-ux-pro-max/scripts/search.py "表单验证 错误处理" --stack react

# Next.js项目
python3 .claude/skills/ui-ux-pro-max/scripts/search.py "图片优化 字体加载" --stack nextjs

# Tailwind项目
python3 .claude/skills/ui-ux-pro-max/scripts/search.py "暗色模式 组件样式" --stack html-tailwind

进阶技巧

技巧一:固化设计系统

多页面项目建议保存设计方案:

1
python3 .claude/skills/ui-ux-pro-max/scripts/search.py "社交App 移动端" --design-system --persist -p "社交App"

这会生成:

1
2
3
4
design-system/
├── MASTER.md # 全局设计规范(颜色、字体、间距、组件)
└── pages/
└── dashboard.md # 页面级覆盖(仅偏离Master的规则)

后续开发新页面时,AI会自动参考这套规范,保证整个项目风格统一。


技巧二:关键词越具体越好

❌ 搜”好看的设计”
✅ 搜”医疗SaaS后台仪表盘 深色模式 极简主义”


实战案例

上周我做了个在线教育平台客户要求”专业、友好、有趣”。

以前怎么也得折腾半天,这次直接:

1
帮我设计一个在线教育App首页,要活泼友好风格

几秒钟后得到:

  • 风格:”活力亲和”,暖橙色+清新绿
  • 配色:主色#F97316,辅色#10B981
  • 字体:标题Poppins,正文Inter
  • 布局:卡片式设计,大圆角,充足留白
  • 特别提醒:教育类要注意儿童友好设计

客户看到成品说:”这是我见过最好看的教育类APP!”


常见问题

Q:真的免费吗?
A:完全免费!开源项目,MIT协议,不收钱。

Q:英语不好能用吗?
A:当然能!搜索关键词用中文完全OK。不过专业术语用英文搜更准,比如”glassmorphism”比”玻璃拟态”结果更丰富。

Q:和现有代码风格冲突咋办?
A:不会!设计系统只是建议,决定权在你。--persist 可以把方案和代码放一起,新同事一看就懂。

Q:团队怎么统一风格?
A:把 design-system/ 文件夹丢进Git,所有人开发时AI都会自动参考同一套规范,团队设计统一不是梦。

Q:Trae怎么用?
A:切换到 SOLO 模式,技能会自动激活。


总结

以前做个好看的前端界面,需要:

  • 翻几十篇博客
  • 查几十份文档
  • 踩无数坑

现在倒好,一个技能库装上,最佳实践直接喂到嘴边。

你和专业UI设计师之间,可能就差这一个技能库。


资源链接


有问题评论区见!觉得有用,点个赞再走~

本文提及的工具名称均为各自所有者的商标或产品,本文仅作为技术教程分享,无商业推广意图。

检查网站的TLS版本

有时候需要知道某个网站支持的TLS的版本。现在SSL 2.0和SSL 3.0都已经被淘汰了。其中TLS 1.0,TLS 1.1,TLS 1.2是目前的的主流,相对也是安全的。主要看加密的算法。TLS 1.3是目前最新的协议版本,也是相对最安全的版本了。

通过网页查看

通过命令行

1
2
3
openssl s_client -connect www.baidu.com:443 -tls1_2
openssl s_client -connect www.baidu.com:443 -tls1_1
openssl s_client -connect www.baidu.com:443 -tls1

以上分别检查了tls1.2,tls1.1和``tls1`。如果握手失败的话,那么就是不支持了。

NMAP

依赖于nmap

1
nmap --script ssl-enum-ciphers -p 443 baidu.com

结果如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
Starting Nmap 7.91 ( https://nmap.org ) at 2020-11-29 09:51 CST
Nmap scan report for baidu.com (39.156.69.79)
Host is up (0.0068s latency).
Other addresses for baidu.com (not scanned): 220.181.38.148

PORT STATE SERVICE
443/tcp open https
| ssl-enum-ciphers:
| SSLv3:
| ciphers:
| TLS_ECDHE_RSA_WITH_RC4_128_SHA (secp256r1) - C
| TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA (secp256r1) - A
| TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA (secp256r1) - A
| TLS_RSA_WITH_AES_128_CBC_SHA (rsa 2048) - A
| TLS_RSA_WITH_AES_256_CBC_SHA (rsa 2048) - A
| TLS_RSA_WITH_RC4_128_SHA (rsa 2048) - C
| compressors:
| NULL
| cipher preference: server
| warnings:
| Broken cipher RC4 is deprecated by RFC 7465
| CBC-mode cipher in SSLv3 (CVE-2014-3566)
| TLSv1.0:
| ciphers:
| TLS_ECDHE_RSA_WITH_RC4_128_SHA (secp256r1) - C
| TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA (secp256r1) - A
| TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA (secp256r1) - A
| TLS_RSA_WITH_AES_128_CBC_SHA (rsa 2048) - A
| TLS_RSA_WITH_AES_256_CBC_SHA (rsa 2048) - A
| TLS_RSA_WITH_RC4_128_SHA (rsa 2048) - C
| compressors:
| NULL
| cipher preference: server
| warnings:
| Broken cipher RC4 is deprecated by RFC 7465
| TLSv1.1:
| ciphers:
| TLS_ECDHE_RSA_WITH_RC4_128_SHA (secp256r1) - C
| TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA (secp256r1) - A
| TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA (secp256r1) - A
| TLS_RSA_WITH_AES_128_CBC_SHA (rsa 2048) - A
| TLS_RSA_WITH_AES_256_CBC_SHA (rsa 2048) - A
| TLS_RSA_WITH_RC4_128_SHA (rsa 2048) - C
| compressors:
| NULL
| cipher preference: server
| warnings:
| Broken cipher RC4 is deprecated by RFC 7465
| TLSv1.2:
| ciphers:
| TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (secp256r1) - A
| TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256 (secp256r1) - A
| TLS_ECDHE_RSA_WITH_RC4_128_SHA (secp256r1) - C
| TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA (secp256r1) - A
| TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA (secp256r1) - A
| TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (secp256r1) - A
| TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384 (secp256r1) - A
| TLS_RSA_WITH_AES_128_GCM_SHA256 (rsa 2048) - A
| TLS_RSA_WITH_AES_256_GCM_SHA384 (rsa 2048) - A
| TLS_RSA_WITH_AES_128_CBC_SHA256 (rsa 2048) - A
| TLS_RSA_WITH_AES_128_CBC_SHA (rsa 2048) - A
| TLS_RSA_WITH_AES_256_CBC_SHA256 (rsa 2048) - A
| TLS_RSA_WITH_AES_256_CBC_SHA (rsa 2048) - A
| TLS_RSA_WITH_RC4_128_SHA (rsa 2048) - C
| compressors:
| NULL
| cipher preference: server
| warnings:
| Broken cipher RC4 is deprecated by RFC 7465
|_ least strength: C

Nmap done: 1 IP address (1 host up) scanned in 3.22 seconds

Scrapy中Request()、FormRequest()、FormRequest.from_response()的小结

一、Request()类的实例化
对于爬取普通网站,不需要验证码,不需要登入的界面,我们一般用scrapy.Request类直接去爬取信息就行,下面是Request类的定义:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class Request(object_ref):

def __init__(self, url, callback=None, method='GET', headers=None, body=None,
cookies=None, meta=None, encoding='utf-8', priority=0,
dont_filter=False, errback=None, flags=None):
# url是要爬取的网址
# callback是回调函数
# method是请求的方式post还是get
# headers是浏览器伪装的头信息
# body是网页源代码信息
# cookies是登入某网站后,网站在你电脑上保留的信息
# meta要携带或者传递的信息
# encoding是编码方式
# priority用来设置访问网站的优先级
# dont_filter是否允许重复爬取网站

可以看见,其中url,即要爬取的目标网站是必填的,其他的是选填的,method=‘GET’,说明此类是get请求,实例化该对象后,会得到一个response。

1
2
3
4
def start_requests(self):
# 首先爬一次登陆页,看是否有验证码。回调函数为parse(),'cookiejar'的值为1表示开启状态
# 这里要返回一个可迭代对象,用yield本身就是可迭代对象,但是,这里是return,所以用[]将其构造成一个可迭代对象
return [Request("https://accounts.douban.com/passport/login", meta={'cookiejar': 1}, headers=self.header, callback=self.parse)]

二、scrapy.FormRequest与scrapy.http.FormRequest

(1)普通请求使用scrapy.Request类就可以实现,但是遇到模拟表单或Ajax提交post请求的时候,Request类就不如 子类 FormRequest类方便了,因为他自带 formdata ,专门用来设置表单字段数据,即填写账号、密码,实现登入,默认method也是POST。
(2)FormRequest相当于是手动指定post。
(3)事实上,scrapy.FormRequest()与scrapy.http.FormRequest()使用起来的区别不大,你可以将两种方法等价互换。

1
2
3
4
5
6
7
def start_requests(self):
form_data = {'f1':'1', 'f2':'100'} # 表单数据,字典格式,注意数字也要用引号引起来,否则报错。
yield scrapy.FormRequest(url, formdata=form_data) # 还可以通过callback修改回调函数等
# 也可以
def start_requests(self):
form_data = {'f1':'1', 'f2':'100'} # 表单数据,字典格式,注意数字也要用引号引起来,否则报错。
yield scrapy.http.FormRequest(url, formdata=form_data) # 还可以通过callback修改回调函数等

三、FormRequest.from_response()

(1)FormRequest.from_response也可以进行设置formdata,用来填写并提交表单,实现模拟登入。
(2)FormRequest.from_response相当于是自动识别post。
(3)FormRequest.from_response与FormRequest.http.from_response也没有区别。

1
2
3
4
5
6
def parse(self, response):
return scrapy.FormRequest.from_response(
response,
formdata={'username': 'john', 'password': 'secret'},
callback=self.after_login
)

四、scrapy.FormRequest与FormRequest.from_response 的区别

1.什么情况下分别使用什么

先找到填写表单时发送的post请求的地址,下面以豆瓣登入为例子:

可以看见其post的地址为:https://accounts.douban.com/j/mobile/login/basic
然后用浏览器访问https://accounts.douban.com/j/mobile/login/basic

  1. 发现页面没有表单信息(也就是没有填写账号、密码的地方),所以,我们只能采用scrapy.FormRequest,手动的去发送post请求。
  2. 如果浏览器访问某post网址时,里面有表单信息,这时候你可以用FormRequest.from_response也可以用scrapy.FormRequest实现模拟登入

2.参数的不一样

scrapy.FormRequest的必填参数是目标网址,而FormRequest.from_response的必填参数是response

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
def parse(self, response):
# 如果有验证码
# 没有验证码,就进行登入
# 设置要发送的post信息
data = {
'name': '18371417971',
'password': 'wanghao211',
'remember': 'false'
}
print("登入中...")
return FormRequest(
url='https://accounts.douban.com/j/mobile/login/basic',
method='post',
formdata=data,
meta={'cookiejar':response.meta['cookiejar']},
# 如果需要多次提交表单,且url一样,那么就必须加此参数dont_filter,防止被当成重复网页过滤掉了
dont_filter=True,
callback=self.next
)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
def parse(self, response):
# 如果有验证码
# 没有验证码,就进行登入
# 设置要发送的post信息
data = {
'name': '18371417971',
'password': 'wanghao211',
'remember': 'false'
}
print("登入中...")
return FormRequest(
url=response,
method='post',
formdata=data,
meta={'cookiejar':response.meta['cookiejar']},
# 如果需要多次提交表单,且url一样,那么就必须加此参数dont_filter,防止被当成重复网页过滤掉了
dont_filter=True,
callback=self.next
)

3.小结

总的来说,scrapy.FormRequest的功能更加强大,如果FormRequest.from_response 不能解决就用scrapy.FormRequest来解决模拟登入,毕竟是手动设置目标网址,比自动识别要精准。

Docker修改Docker0网桥默认网段

Docker 服务启动后默认会创建一个 docker0 网桥(其上有一个 docker0 内部接口),它在内核层连通了其他的物理或虚拟网卡,这就将所有容器和本地主机都放到同一个物理网络。

Docker 默认指定了 docker0 接口 的 IP 地址和子网掩码,让主机和容器之间可以通过网桥相互通信,它还给出了 MTU(接口允许接收的最大传输单元),通常是 1500 Bytes,或宿主主机网络路由上支持的默认值。这些值都可以在服务启动的时候进行配置。

  1. 默认docker0 网桥信息
    默认的docker0网桥ip为“172.17.0.1”,尤其是在自建机房和办公环境在一起的情况下,会与办公网络发生冲突,所以我们在使用docker的时候需要修改调整默认的网桥信息。

  2. 修改步骤
    修改文件vim /etc/docker/daemon.json(这里没有这个文件的话,自行创建)

1
2
3
{
"bip":"10.120.0.1/16"
}
  1. 关闭docker服务
1
systemctl stop docker
  1. 再启动docker服务器
1
systemctl start docker
  1. 再重新看网段

xpath获取内容的方式

以百度为例:’https://tieba.baidu.com

1.获取最外面标签,遍历内部所有的字标签,获取标签文本

content_list =div.xpath(‘.//div[@class=”d_post_content j_d_post_content “]/text()’).extract()

2.正则去掉所有标签  <.*?>   re.compile.sub()

content_list=div.xpath(‘.//div[@class=”d_post_content j_d_post_content “]’)

pattern=re.compile(r(‘<.*?>’),re.S)

content=pattern.sub(‘’,content_list)

3./text() 获取标签的文本 //text()获取标签以及子标签的文本

content_list = div.xpath(‘.//div[@class=”d_post_content j_d_post_content “]//text()’).extract()

4 使用xpath(‘string(.)’)这种方式获取所有文本 并且拼接

content_list=div.xpath(‘.//div[@class=”d_post_content j_d_post_content “]’).xpath(‘string(.)’).extract()[0]+’\n’

文本内容获取之后print(content_list)查看内容,如需处理格式,则如下:

remove = re.compile(‘\s’)
content = ‘’
for string in content_list:
    string = remove.sub(‘’,string)
    content += string
    print(content)

————————————————
版权声明:本文为CSDN博主「sklsxy」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/sklsklsklsxy/article/details/81448478

Nginx配置禁止IP访问

在配置安装好Nginx之后,打开浏览器直接输入ip地址是可以直接访问项目的,或者只要有域名指向ip可以直接用域名进行访问。
但是现在要求禁止使用ip地址直接访问,打开文件/etc/nginx/nginx.conf,在server上面添加代码

1
2
3
4
5
6
7
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name _;

return 404;
}

并将原server中的两个default_server去掉

代表的意思是所有除了已经配置的server_name可以访问外,其他地址返回404并断开连接,也可以返回其他状态码。

Docker中设置Tomcat的内存大小配置

安装在docker中的tomcat,在下载大文件或者某些情况下,会出现tomcat的内存溢出等情况,所以需要配置tomcat的内存大小,docker中的tomcat内存大小配置有两种方式:

一、挂载docker中的配置文件

1
通过将docker中tomcat的catalina.sh配置文件挂载到宿主机中,然后再catalina.sh配置jvm内存大小即可。
  1. 需要重新运行一个tomcat容器(注意: 端口和容器名称不能重复)
1
2
3
4
5
6
7
8
9
docker run -d \
-v /server/webapps:/usr/local/tomcat/webapps/ \
-v /server/catalina.sh:/usr/local/tomcat/bin/catalina.sh \
-v /server/logs/demo:/server/logs/demo \
-e TZ="Asia/Shanghai" \
--privileged=true \
--name demo \
-p 8080:8080 \
tomcat8

说明:

  • -v /server/webapps:/usr/local/tomcat/webapps/ 挂载当前项目的运行目录到tomcat下的webapps
  • -v /server/catalina.sh:/usr/local/tomcat/bin/catalina.sh 挂载宿主机的catalina.sh到docker中tomcat下的catalina.sh
  • -v /server/logs/demo:/server/logs/demo 挂载日志到宿主机中
  • -e TZ=”Asia/Shanghai” 设置时区
  • –privileged=true 设置拥有容器中的真正的root权限
  • -p 8080:8080 映射端口
  • tomcat8 镜像的名称

2 .catalina.sh中的配置内存

cygwin=false下面加入:

1
JAVA_OPTS="-server -Xms1024m -Xmx2048m -XX:MaxNewSize=256m -XX:PermSize=128m -XX:MaxPermSize=256m"

-xms 初始化堆内存
-xmx 最大堆内存

二、直接修改tomcat容器的catalina.sh的配置

1
可以直接进入容器中修改tomcat的catalina.sh的配置文件,不过该方法不推荐,因为以后再次秀挂比较麻烦,并且不方便配置,如果需要重新运行容器的时候,不知道容器中的内存大小的配置

进入容器
docker exec -it /bin/bash

找到catalina.sh配置文件, 并增加配置(第一步中增加的配置语句即可)

// 如果没有vi 命令,则需要安装
vi /usr/local/tomcat/bin/catalina.sh
// 退出容器,并重新启动
exit
docker restart

注意: 如果修改Catalina.sh的时候提示该文件是一个只读文件或者提示没有权限修改,那么则需要以root权限进入容器,具体的方法见: Docker容器中的root权限获取

参考资料

升级ShadowSocks支持aes-256-gcm算法(ShadowsocksX-NG)

以前安装的Shadowsocks是2.8.2 不支持aes-256-gcm模式,需要升级到3.x才可以。

1
2
pip install --upgrade pip
sudo pip install https://github.com/shadowsocks/shadowsocks/archive/master.zip -U

然后修改/etc/shadowsocks.conf配置文件算法为aes-256-gcm。

下载最新的ShadowsocksX-NG客户端进行配置即可。

在一台新的政务云服务器上的部署操作

  1. 安装vim
    yum install vim

  2. 关闭系统自带防火墙,安装iptables
    systemctl stop firewalld
    systemctl disable firewalld
    vi /etc/selinux/config
    yum install iptables-services iptables-devel
    开启
    systemctl enable iptables.service
    systemctl start iptables.service
    systemctl enable iptables.service
    关闭firewall

  3. 安装nginx
    yum install epel-release
    yum install nginx

  4. 安装docker

先卸载旧版本的docker
sudo yum remove docker
docker-client
docker-client-latest
docker-common
docker-latest
docker-latest-logrotate
docker-logrotate
docker-engine

安装新的docker
yum install -y yum-utils
yum-config-manager
–add-repo
https://download.docker.com/linux/centos/docker-ce.repo
yum install docker-ce-18.09.6 docker-ce-cli-18.09.6 containerd.io

升级docker
yum -y upgrade docker-ce docker-ce-cli containerd.io

systemctl start docker
systemctl enable docker

  1. 安装kk
    docker pull keking/kkfileview

  2. 安装minio
    docker pull minio/minio

kkfilepreview nginx redis
anaconda

  1. 解决docker中控制台乱码问题
1
docker run --restart=always -d --name zzb10001 -p 10001:8080 -e "LC_ALL=zh_CN.UTF-8" -e "LANG=zh_CN.UTF-8" -v /data/zzb10001/webapps:/tomcat/webapps/ -v /data/zzb10001/logs:/tomcat/logs spdk/jdk8 > /data/zzb10001/id