L B T

记 录 过 去 的 经 验

Node.js 是一个 基于 Chrome V8 引擎的 JavaScript 运行环境,可以让 JavaScript 在服务器端运行

  • JavaScript : 原本只能在浏览器运行
  • Node.js : 让 JS 可以读写服务器

Node.js 的核心特点:

  • 单线程模型 ,通过 事件循环(Event Loop) 实现高并发。
  • 非阻塞 IO ,适合 IO 密集型任务,不适合 CPU 密集型任务(单线程一旦被卡住,整个服务器就会卡住)。
  • npm 生态npm 是世界最大的包管理平台。

Node.js 安装

wget https://nodejs.org/dist/latest/node-v15.12.0-linux-x64.tar.gz
tar -xf node-v15.12.0-linux-x64.tar.gz -C /usr/local
ln -s /usr/local/node-v15.12.0-linux-x64/bin/* /bin/

安装pm2

npm install pm2 -g
npm install -g [email protected] # 安装指定版本
npm install -g pm2@latest # 安装最新版本

Node.js 相关常见操作

安装包

npm install pm2

安装指定版本的包

npm install -g [email protected]

查看可用的安装版本

hexo 安装包为例,以下命令查看 hexo 安装包有哪些可选版本

# npm show hexo versions
[
'3.3.9', '3.4.0', '3.4.1', '3.4.2', '3.4.3',
'3.4.4', '3.5.0', '3.6.0', '3.7.0', '3.7.1',
'3.8.0', '3.9.0', '4.0.0', '4.1.0', '4.1.1',
'4.2.0', '4.2.1', '5.0.0', '5.0.1', '5.0.2',
'5.1.0', '5.1.1', '5.2.0', '5.3.0', '5.4.0',
'5.4.1', '5.4.2', '6.0.0', '6.1.0', '6.2.0',
'6.3.0', '7.0.0-rc1', '7.0.0-rc2'
]

查看已安装的包名

以下命令可显示安装的包及它们的版本

npm ls

如果要查看全局类型的包,使用 -g 选项

npm ls -g

卸载安装的包

npm uninstall package_name

卸载全局安装的包

npm uninstall package_name -g

Node.js 常见错误

WARN EACCES user “root” does not have permission to access the dev dir “/root/.node-gyp/11.15.0”
ERR! stack Error: EACCES: permission denied, mkdir ‘node_modules/sqlite3/.node-gyp’

[解决方法]:

npm install --unsafe-perm

Node.js 基础项目结构

一个 Node 项目通常是:

project
├─ node_modules
├─ package.json
├─ package-lock.json
├─ app.js
└─ routes

在 Node.js 生态中,通常有两个 核心基础配置文件

  • package.json : 这是每个 Node.js 项目的核心。它定义了项目的元数据、依赖项和运行脚本。
  • .env : 我们绝不应该把数据库密码、API 密钥等敏感信息直接写在代码里。通常配合 dotenv 库使用。

package.json 配置文件详解

{
"name": "admin",
"version": "4.4.0",
"description": "A magical vue admin. An out-of-box UI solution for enterprise applications. Newest development stack of vue. Lots of awesome features",
"author": "Auth <[email protected]>",
"main": "app.js",
"scripts": {
"dev": "vue-cli-service serve",
"build": "prisma generate && nest build",
"lint": "eslint --ext .js,.vue src",
"build:prod": "vue-cli-service build",
"build:stage": "vue-cli-service build --mode staging",
"start": "nest start",
"preview": "node build/index.js --preview",
"new": "plop",
"svgo": "svgo -f src/icons/svg --config=src/icons/svgo.yml",
"test:unit": "jest --clearCache && vue-cli-service test:unit",
"test:ci": "npm run lint && npm run test:unit"
},
"dependencies": {
"axios": "0.18.1",
"clipboard": "2.0.4"

},
"devDependencies": {
"@vue/cli-plugin-babel": "4.4.4",
"@vue/cli-plugin-eslint": "4.4.4",
"vue-template-compiler": "2.6.10"
},
"browserslist": [
"> 1%",
"last 2 versions"
],
"bugs": {
"url": "https://github.com/PanJiaChen/vue-element-admin/issues"
},
"engines": {
"node": ">=8.9",
"npm": ">= 3.0.0"
},
"keywords": [
"vue",
"admin",
"dashboard",
"element-ui",
"management-system"
],
"license": "MIT",
"lint-staged": {
"src/**/*.{js,vue}": [
"eslint --fix",
"git add"
]
},
"husky": {
"hooks": {
"pre-commit": "lint-staged"
}
},
"repository": {
"type": "git",
"url": "git+https://github.com/PanJiaChen/vue-element-admin.git"
}
}

  • name & version : 项目名称和版本。发布 npm 包时这是必填的唯一标识。
  • main : 程序主入口,Node 默认的执行文件。
  • scripts : 这是整个配置中最重要的部分。它定义了 快捷命令(命令脚本)
    • "start": "node app.js" -> 执行 npm start 命令,实际会运行 node app.js 启动程序。
    • "dev": "vue-cli-service serve" -> 执行 npm run dev 命令,会使用 vue-cli-service serve 启动服务
  • dependencies : 行环境必需的包(如 express, mongoose 等)。安装命令:npm install <pkg>
  • devDependencies : 仅开发环境需要的包(如 eslint, jest, nodemon )。安装命令:npm i <pkg> -D
  • engines : 指定 Node.js 或 npm 的版本范围,防止因环境版本不同导致代码崩溃。

初始化项目 ,会生成 package.json

npm init

安装依赖

npm install

启动

node app.js

PM2

如果直接使用 node app.js 这种方式启动,会存在以下问题:

  • 1️⃣ 程序崩溃自动退出,不会自动启动
  • 2️⃣ 服务器重启后,程序不会自动启动
  • 3️⃣ 无法负载均衡
  • 4️⃣ 日志不好管理

PM2 就是为解决这些问题而生,它是 Node.js 最流行的进程管理工具 。主要负责以下功能:

功能 说明
进程守护 程序崩溃自动重启
负载均衡 Node.js 是单线程的,pm2 可以让其充分利用多核 CPU 实现多进程
日志管理 自动手机程序日志
开机自启 服务器启动自动运行
性能监控 CPU/内存
后台运行 让程序以守护进程(Daemon)方式在后台运行

PM2 启动程序,假设程序是 app.js

pm2 start app.js --name "app-name"

查看进程状态

pm2 list

pm2 常用命令

  • 程序生命周期管理

    pm2 start app.js

    pm2 restart app-name|all|id

    pm2 stop app-name|all|id

    pm2 delete app

    pm2 reload <name> --update-env # PM2 会缓存环境变量。如果你修改了配置文件中的 env 变量,直接 pm2 restart 有时是不生效的。

    pm2 reload all # 平滑重启, 相比 restart,reload 会逐个重启进程,实现 0 秒停机

    pm2 env <name> # 查看程序加载的 env 配置,这在定位问题时很有用,通过此命令可以直观的看到程序加载的环境变量
  • 查看进程

    pm2 list
  • 日志管理

    pm2 logs     # 默认日志位置 ~/.pm2/logs
    pm2 logs app-name

    pm2 flush # 清空日志

    pm2 set pm2-logrotate:max_size 10M # PM2 日志会越来越大。建议配置 日志轮转
  • 监控程序,查看 CPU/Memory 实时监控界面

    pm2 monit
  • 配置 pm2 开机自启动

    pm2 save      # 保存当前进程列表
    pm2 startup # 生成启动脚本命令,复制终端弹出的那行代码并执行。
    pm2 resurrect # 查看开机启动进程

PM2 集群模式

Node.js 是单线程 。PM2 可以启动 多进程利用多核 CPU

  • ✔ 提高性能

  • ✔ 提高并发

  • ✔ 程序挂掉自动拉起

  • 集群模式启动命令

    pm2 start app.js -i max
    • -i max : 根据 CPU 核心数启动,如 4 vCPU 则启动 4 个 node 进程。

PM2 配置文件

生产环境一般使用 ecosystem.config.js 作为 pm2 管理配置文件来管理所有的项目,让你的部署过程 版本化、自动化、可复用

ecosystem.config.js
module.exports = {
apps : [{
// --- 基础配置 ---
name: "myapp", // 应用名称,用于 pm2 list 展示
cwd: "./", // 应用运行的根目录
script: "app.js", // 启动脚本路径
args: "-- port 3000", // 传递给运行脚本的参数

// --- 进阶控制 ---
instances: "max", // 开启集群模式,利用多 CPU。数字或 "max"(根据 CPU 核心数启动)
exec_mode: "cluster", // 模式:'cluster'(集群)或 'fork'(单实例),默认为 'fork'
watch: false, // 监控目录,文件变动则自动重启,'false' 或者监控目标 '["node_modules", "logs"]'
ignore_watch: [ // 忽略监听目录,防止频繁重启。
"node_modules",
"logs"
],

// --- 日志管理 ---
error_file: "./logs/err.log", // 错误日志路径
out_file: "./logs/out.log", // 普通输出日志路径
log_date_format: "YYYY-MM-DD HH:mm:ss", // 给日志加上时间戳

// --- 环境变量控制 ---
env: { // 默认环境变量 (pm2 start)
NODE_ENV: "development"
},
env_production : { // 生产环境变量 (pm2 start --env production)
NODE_ENV: "production"
},

// --- 重启策略 ---
autorestart: true, // 程序崩溃是否自动重启
min_uptime: 60, // 程序运行多久才算启动成功
max_restarts: 10, // 最大重启次数,防止程序有问题还一直不停重启
max_memory_restart: "1G", // 内存占用超过 1G 则自动重启,防止内存泄漏
restart_delay: 3000 // 异常重启之间的延迟(毫秒)

}]
}
  • 启动命令
    pm2 start ecosystem.config.js

    pm2 start ecosystem.config.js --env production # 启动生产环境 env

使用 PM2 配置文件时,需要注意以下事项:

  • 集群模式(Cluster)与单实例(Fork)

    如果你的应用是单机版的,没做多进程适配(例如:在内存里存 Session、使用本地变量计数),开启 instances: max 会导致数据不一致。

    生产环境尽量使用 cluster 模式以压榨多核性能,但确保你的应用是 无状态(Stateless) 的。

  • 内存溢出防御

    • Node.js 程序如果不小心写了内存泄漏,长期运行会导致服务器宕机。
    • 务必配置 max_memory_restart 。比如你的服务器有 2G 内存,给每个实例设个 800M 左右的阈值,能有效防止全机卡死。
  • 避免 无限重启循环

    • 如果你的程序在启动阶段就报错,PM2 会疯狂尝试重启。
    • 设置 min_uptime (程序运行多久才算启动成功)和 max_restarts (最大重试次数),避免刷爆 CPU 和日志文件。
  • Watch 模式的风险

    • 不要在生产环境开启 watch: true
    • 生产环境下任何小的配置改动或日志写入(如果路径不对)都可能触发进程重启,导致服务抖动。 watch 仅建议在开发或测试环境使用。
  • 环境变量的优先级

    • PM2 会缓存环境变量。如果你修改了配置文件中的 env 变量,直接 pm2 restart 有时是不生效的。
    • 建议使用 pm2 reload <name> --update-env 或直接 pm2 delete 后再重新 start

AWS OpenSearch 是一个完全开源的搜索和分析引擎,用于日志分析、实时应用程序监控和点击流分析等用例。

AWS OpenSearch(AOS) 和 Elasticsearch 对比

OpenSearch Elasticsearch
背景 AWS 主导的开源分支 Elastic 公司主导
授权 Apache 2.0 SSPL + Elastic License
商业控制 社区驱动 公司控制
K8s 生态 非常友好 也支持
云原生趋势 越来越主流 商业版更强
日志检索 很强 很强
向量搜索 更成熟
ML 功能 更强
APM 基础 商业版更强
插件生态 少一些 更丰富

原本是同一个项目

2021 年因授权问题分叉

👉 7.10 是最后一个纯开源 Elasticsearch 版本
之后 AWS fork 出:

🔹 OpenSearch

而原厂继续发展:

🔹 Elasticsearch

在 AWS 上,Amazon 托管服务默认是 OpenSearch。

创建 OpenSearch 域 (AOS)

  • AWS OpenSearch Service Version: v 3.3.0

OpenSearch 服务域是 OpenSearch 集群的同义词.域是包含您指定的设置、实例类型、实例计数和存储资源的集群。
登录控制台:前往 Amazon OpenSearch Service。 Domains -> Create domain

  • 填写 域(Domain)名称
  • 选择 标准创建
  • 选择实例类型和数量
  • 网络选项包含 2 种,创建集群后不能再变更:
    • VPC 访问,此中方式创建的 Domain 只支持 VPC 内部访问,不支持互联网公开访问,如果要互联网访问,可以通过在 VPC 内部使用 Nginx 代理。
    • 公开访问权限,允许互联网访问

使用 公开访问权限 部署的 AOS,可以直接使用 OpenSearch 控制面板 URL 在互联网访问。如果要控制访问,可以使用以下方法:

  • 修改 集群访问策略 (Access Policy)

    1. 进入 Amazon OpenSearch Service 控制台,点击进入你的 Domain (网域)
    2. 点击 Security configuration (安全配置) 选项卡。
    3. 滚动到 Access policy (访问策略) 部分。
    4. 在 JSON 编辑框中,添加基于 IpAddressCondition
      {
      "Version": "2012-10-17",
      "Statement": [
      {
      "Effect": "Allow",
      "Principal": {
      "AWS": "*"
      },
      "Action": "es:*",
      "Resource": "arn:aws:es:ap-southeast-1:你的账号ID:domain/你的域/*",
      "Condition": {
      "IpAddress": {
      "aws:SourceIp": [
      "1.2.3.4/32", // 你办公室的公网出口 IP
      "5.6.7.8/32" // EKS 节点的公网出口 IP (NAT Gateway EIP)
      ]
      }
      }
      }
      ]
      }
阅读全文 »

使用 Docker Compose 部署 3 个节点的 Elasticsearch 集群并开启安全认证

环境信息

  • Rocky9 Linux
  • Elastic Stack 8.12

三台 Rocky9 Linux 服务器, 配置为 4CPU 16G RAM , 内网地址和主机名分别为:

  • 172.31.29.164 vp-elk-1
  • 172.31.24.61 vp-elk-2
  • 172.31.25.106 vp-elk-3

修改系统参数 /etc/sysctl.conf ,Elasticsearch 必须配置:

/etc/sysctl.conf
vm.max_map_count = 262144

执行命令 sysctl -p 生效,使用命令 sysctl vm.max_map_count 验证

创建 ELK 目录

mkdir -p /data/elk
cd /data/elk
mkdir -p data/{elasticsearch,kibana} config/certs

目录结构如下:

/data/elk
├── config
│ └── certs
├── data
│ ├── elasticsearch
│ └── kibana
└── docker-compose.yml

因为要开启集群安全认证(X-Pack Security) xpack.security.enabled: true ,就必须为节点之间的通信配置 Transport 层 TLS 加密 ,否则 ES 会拒绝在生产模式下启动。

证书可以选用以下两种方式之一

  1. 生成集群证书(仅在一个节点上操作即可) 。利用 ES 自带的工具生成 CA 和节点证书,每个节点有自己的证书。

    cd /data/elk

    # 首先生成 CA 证书
    docker run --rm \
    -v $(pwd)/config/certs:/certs \
    docker.elastic.co/elasticsearch/elasticsearch:8.12.2 \
    bin/elasticsearch-certutil ca \
    --silent \
    --pem \
    --out /certs/ca.zip

    # 解压 CA 证书,获得 ca.crt ca.key
    cd config/certs
    unzip ca.zip

    创建 实例配置文件,比如 config/certs/instances.yml 用来为节点生成证书

    config/certs/instances.yml
    instances:
    - name: vp-elk-1
    ip:
    - 172.31.29.164

    - name: vp-elk-2
    ip:
    - 172.31.24.61

    - name: vp-elk-3
    ip:
    - 172.31.25.106

    使用实例配置文件,比如 config/certs/instances.yml 生成节点证书

    docker run --rm \
    -v $(pwd)/config/certs:/certs \
    docker.elastic.co/elasticsearch/elasticsearch:8.12.2 \
    bin/elasticsearch-certutil cert \
    --silent \
    --pem \
    --in /certs/instances.yml \
    --ca-cert /certs/ca/ca.crt \
    --ca-key /certs/ca/ca.key \
    --out /certs/certs.zip

    解压证书文件,获得节点证书,文件结构如下:

    # tree
    .
    ├── ca
    │ ├── ca.crt
    │ └── ca.key
    ├── ca.zip
    ├── certs.zip
    ├── instances.yml
    ├── vp-elk-1
    │ ├── vp-elk-1.crt
    │ └── vp-elk-1.key
    ├── vp-elk-2
    │ ├── vp-elk-2.crt
    │ └── vp-elk-2.key
    └── vp-elk-3
    ├── vp-elk-3.crt
    └── vp-elk-3.key

    4 directories, 11 files

  2. 生成 p12 类型的节点证书

    生成 config/instances.yml

    config/instances.yml
    instances:
    - name: vp-elk-1
    dns:
    - vp-elk-1
    - localhost
    ip:
    - 172.31.29.164
    - 127.0.0.1

    - name: vp-elk-2
    dns:
    - vp-elk-2
    - localhost
    ip:
    - 172.31.24.61
    - 127.0.0.1

    - name: vp-elk-3
    dns:
    - vp-elk-3
    - localhost
    ip:
    - 172.31.25.106
    - 127.0.0.1

    生成 CA

    cd /data/elk

    docker run --rm -v ./config/certs:/certs docker.elastic.co/elasticsearch/elasticsearch:8.12.2 \
    bin/elasticsearch-certutil ca --out /certs/elastic-ca.p12 --pass ""

    会生成无密码的 config/certs/elastic-ca.p12 CA 证书文件,接着使用 CA 根证书生成节点证书,使用 config/instances.yml 配置证书中包含的 SAN

    docker run --rm -v ./config/certs:/certs docker.elastic.co/elasticsearch/elasticsearch:8.12.2 \
    bin/elasticsearch-certutil cert --ca /certs/elastic-ca.p12 --ca-pass "" \
    --in /certs/instances.yml \
    --out /certs/elastic-certificates.p12 --pass ""

    会生成 ./config/certs/elastic-certificates.p12 ,这实际上是个 zip 压缩文件,要解压后获得各个节点的证书

    可以通过以下方式检查证书中的 SAN 信息

    # # cd config/certs/

    # file elastic-certificates.p12
    elastic-certificates.p12: Zip archive data, at least v2.0 to extract

    # unzip elastic-certificates.p12
    Archive: elastic-certificates.p12
    creating: vp-elk-1/
    inflating: vp-elk-1/vp-elk-1.p12
    creating: vp-elk-2/
    inflating: vp-elk-2/vp-elk-2.p12
    creating: vp-elk-3/
    inflating: vp-elk-3/vp-elk-3.p12


    # openssl pkcs12 -in vp-elk-1/vp-elk-1.p12 -nodes -passin pass: \
    | openssl x509 -noout -text | grep -A1 "Subject Alternative Name"
    X509v3 Subject Alternative Name:
    IP Address:172.31.29.164, IP Address:127.0.0.1, DNS:localhost, DNS:vp-elk-1

生成证书后,将证书文件分发到其他两个节点上。

Elasticsearch 集群配置文件 ./config/elasticsearch.yml每个节点都要配置 ,修改 node.name 为对应的节点名称; 修改证书路径为对应节点的证书

./config/elasticsearch.yml
cluster.name: vp-elk-cluster

node.name: vp-elk-1 # 其他节点修改为对应值

network.host: 172.31.29.164 # 其他节点修改为对应值
http.port: 9200
transport.port: 9300

discovery.seed_hosts:
- 172.31.29.164
- 172.31.24.61
- 172.31.25.106

cluster.initial_master_nodes:
- vp-elk-1
- vp-elk-2
- vp-elk-3


xpack.security.enabled: true
xpack.security.enrollment.enabled: true
xpack.security.transport.ssl.enabled: true
xpack.security.transport.ssl.verification_mode: certificate
xpack.security.transport.ssl.keystore.path: /usr/share/elasticsearch/config/certs/vp-elk-1/vp-elk-1.p12 # 其他节点修改为对应值
xpack.security.transport.ssl.truststore.path: /usr/share/elasticsearch/config/certs/vp-elk-1/vp-elk-1.p12 # 其他节点修改为对应值

xpack.security.http.ssl.enabled: false

bootstrap.memory_lock: true

Kibana 配置文件 config/kibana.yml ,只需要在一个节点上配置即可。

config/kibana.yml
server.name: kibana
server.host: "0.0.0.0"

server.ssl.enabled: false # Kibana 使用 HTTP 和 ES 通行,ES 已经配置 xpack.security.http.ssl.enabled: false

elasticsearch.hosts:
- http://172.31.29.164:9200
- http://172.31.24.61:9200
- http://172.31.25.106:9200

elasticsearch.username: "kibana_system" # 这里不允许使用 elastic 用户
elasticsearch.password: "YourStrongPassword"

monitoring.ui.container.elasticsearch.enabled: true

Docker Compose 配置文件 docker-compose.yml ,3 台 ES 节点使用同样的配置即可, ES 配置在配置文件在每个节点的 config/elasticsearch.yml 。Kibana 只需要在一台服务器部署即可。

docker-compose.yml
services:

elasticsearch:
image: docker.elastic.co/elasticsearch/elasticsearch:8.12.2
container_name: elasticsearch
network_mode: host
environment:
- ES_JAVA_OPTS=-Xms4g -Xmx4g

volumes:
- ./data/elasticsearch:/usr/share/elasticsearch/data
- ./config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml
- ./config/certs:/usr/share/elasticsearch/config/certs:ro

ulimits:
memlock:
soft: -1
hard: -1
restart: always
mem_limit: 8g



kibana:
image: docker.elastic.co/kibana/kibana:8.12.2
container_name: kibana
restart: always
network_mode: host
depends_on:
- elasticsearch

volumes:
- ./config/kibana.yml:/usr/share/kibana/config/kibana.yml
- ./config/certs:/usr/share/kibana/config/certs:ro
- ./data/kibana:/usr/share/kibana/data

启动

docker compose up -d

elastic 等用户重置密码

# docker compose exec -it elasticsearch bin/elasticsearch-setup-passwords interactive
******************************************************************************
Note: The 'elasticsearch-setup-passwords' tool has been deprecated. This command will be removed in a future release.
******************************************************************************

Initiating the setup of passwords for reserved users elastic,apm_system,kibana,kibana_system,logstash_system,beats_system,remote_monitoring_user.
You will be prompted to enter passwords as the process progresses.
Please confirm that you would like to continue [y/N]y


Enter password for [elastic]:
Reenter password for [elastic]:
Enter password for [apm_system]:
Enter password for [apm_system]:
Reenter password for [apm_system]:
Enter password for [kibana_system]:
Reenter password for [kibana_system]:
...
Changed password for user [beats_system]
Changed password for user [remote_monitoring_user]
Changed password for user [elastic]


重置 elastic 用户密码

# docker compose exec elasticsearch bin/elasticsearch-reset-password -u elastic
This tool will reset the password of the [elastic] user to an autogenerated value.
The password will be printed in the console.
Please confirm that you would like to continue [y/N]y


Password for the [elastic] user successfully reset.
New value: GjJadE-ihZJ+Ddb5SvKs

Elasticsearch 集群常规检查

  1. 首先确认节点是否全部加入集群。

    # GET /
    {
    "name": "vp-elk-1",
    "cluster_name": "vp-elk-cluster",
    "cluster_uuid": "Wvi6Vl5mTsKGlDUTp12xhQ",
    "version": {
    "number": "8.12.2",
    "build_flavor": "default",
    "build_type": "docker",
    "build_hash": "48a287ab9497e852de30327444b0809e55d46466",
    "build_date": "2024-02-19T10:04:32.774273190Z",
    "build_snapshot": false,
    "lucene_version": "9.9.2",
    "minimum_wire_compatibility_version": "7.17.0",
    "minimum_index_compatibility_version": "7.0.0"
    },
    "tagline": "You Know, for Search"
    }
  2. 检查集群健康状态

    # GET /_cluster/health?pretty
    {
    "cluster_name": "vp-elk-cluster",
    "status": "green",
    "timed_out": false,
    "number_of_nodes": 3,
    "number_of_data_nodes": 3,
    "active_primary_shards": 29,
    "active_shards": 59,
    "relocating_shards": 0,
    "initializing_shards": 0,
    "unassigned_shards": 0,
    "delayed_unassigned_shards": 0,
    "number_of_pending_tasks": 0,
    "number_of_in_flight_fetch": 0,
    "task_max_waiting_in_queue_millis": 0,
    "active_shards_percent_as_number": 100
    }
  3. 检查节点状态

    # GET /_cat/nodes?v
    ip heap.percent ram.percent cpu load_1m load_5m load_15m node.role master name
    172.31.25.106 8 59 0 0.00 0.00 0.00 cdfhilmrstw - vp-elk-3
    172.31.24.61 12 60 0 0.03 0.02 0.00 cdfhilmrstw * vp-elk-2
    172.31.29.164 25 60 1 0.02 0.02 0.01 cdfhilmrstw - vp-elk-1
  4. 检查节点角色

    # GET /_cat/nodes?v&h=name,ip,node.role,master
    name ip node.role master
    vp-elk-3 172.31.25.106 cdfhilmrstw -
    vp-elk-2 172.31.24.61 cdfhilmrstw *
    vp-elk-1 172.31.29.164 cdfhilmrstw -

    • m master
    • d data
    • i **ingest
  5. 检查分片分布

    # GET /_cat/shards?v
    index shard prirep state docs store dataset ip node
    .kibana_analytics_8.12.2_001 0 p STARTED 5 2.3mb 2.3mb 172.31.24.61 vp-elk-2
    .kibana_analytics_8.12.2_001 0 r STARTED 5 2.3mb 2.3mb 172.31.29.164 vp-elk-1
    .internal.alerts-observability.apm.alerts-default-000001 0 p STARTED 0 249b 249b 172.31.24.61 vp-elk-2
    .internal.alerts-observability.apm.alerts-default-000001 0 r STARTED 0 249b 249b 172.31.29.164 vp-elk-1
    .ds-.kibana-event-log-ds-2026.03.13-000001 0 p STARTED 1 6.3kb 6.3kb 172.31.25.106 vp-elk-3
  6. 检查索引状态

    # GET /_cat/indices?v
    health status index uuid pri rep docs.count docs.deleted store.size pri.store.size dataset.size
    green open .internal.alerts-observability.logs.alerts-default-000001 QQ1ALFIwTS6Cr1IUjp384w 1 1 0 0 498b 249b 249b
    green open .internal.alerts-observability.threshold.alerts-default-000001 UzpYLZbzTMyK2yCYnmayKw 1 1 0 0 498b 249b 249b
    green open .kibana-observability-ai-assistant-kb-000001 yV9I-sIMQgyf0edNxw1kPA 1 1 0 0 498b 249b 249b
    green open .internal.alerts-observability.apm.alerts-default-000001 0HOJ4bCgT_2X4c29FryFCw 1 1 0 0 498b 249b 249b
    green open .internal.alerts-stack.alerts-default-000001 NJCmcGptQOWG6rd0I259Uw 1 1 0 0 498b 249b 249b
    green open .internal.alerts-observability.slo.alerts-default-000001 rSSFxAYfR0O9L9XXBIpZlA 1 1 0 0 498b 249b 249b
    green open .internal.alerts-ml.anomaly-detection.alerts-default-000001 fT9FJoirRiSMVXx1V3F7dQ 1 1 0 0 498b 249b 249b
    green open .internal.alerts-observability.metrics.alerts-default-000001 E9vjU7WETSebjg8Y_ddPHw 1 1 0 0 498b 249b 249b
  7. 检查 Master 选举

    # GET /_cat/master?v
    id host ip node
    5hG_mSEjRd6Ov-rClowAoQ 172.31.24.61 172.31.24.61 vp-elk-2

    只有一个 Master 就正常

  8. 检查 JVM Heap

    # GET /_cat/nodes?v&h=name,heap.percent
    name heap.percent
    vp-elk-3 20
    vp-elk-2 48
    vp-elk-1 57
  9. 检查磁盘使用情况

    # GET /_cat/allocation?v
    shards disk.indices disk.used disk.avail disk.total disk.percent host ip node node.role
    20 2.8mb 14.1gb 1009.7gb 1023.9gb 1 172.31.29.164 172.31.29.164 vp-elk-1 cdfhilmrstw
    20 754.3kb 11gb 1012.8gb 1023.9gb 1 172.31.25.106 172.31.25.106 vp-elk-3 cdfhilmrstw
    19 2.9mb 11gb 1012.8gb 1023.9gb 1 172.31.24.61 172.31.24.61 vp-elk-2 cdfhilmrstw

  10. 检查线程池情况

    # GET /_cat/thread_pool?v
    node_name name active queue rejected
    vp-elk-3 analyze 0 0 0
    vp-elk-3 auto_complete 0 0 0
    vp-elk-3 azure_event_loop 0 0 0
    vp-elk-3 ccr 0 0 0
    vp-elk-3 cluster_coordination 0 0 0
    ...

    关注 queue、rejected > 0 ,说明集群过载

  11. 检查 Pending Tasks

    # GET /_cluster/pending_tasks?pretty
    {
    "tasks": []
    }
  12. 检查证书

    # GET /_ssl/certificates
    [
    {
    "path": "/usr/share/elasticsearch/config/certs/vp-elk-1/vp-elk-1.p12",
    "format": "PKCS12",
    "alias": "ca",
    "subject_dn": "CN=Elastic Certificate Tool Autogenerated CA",
    "serial_number": "825a4f350b8815940e60d557036edbe205f68a93",
    "has_private_key": false,
    "expiry": "2029-03-11T13:21:08.000Z",
    "issuer": "CN=Elastic Certificate Tool Autogenerated CA"
    },
    {
    "path": "/usr/share/elasticsearch/config/certs/vp-elk-1/vp-elk-1.p12",
    "format": "PKCS12",
    "alias": "vp-elk-1",
    "subject_dn": "CN=vp-elk-1",
    "serial_number": "220b64fa6c86b2145a86c274eb914f9e3b299350",
    "has_private_key": true,
    "expiry": "2029-03-12T01:29:26.000Z",
    "issuer": "CN=Elastic Certificate Tool Autogenerated CA"
    },
    {
    "path": "/usr/share/elasticsearch/config/certs/vp-elk-1/vp-elk-1.p12",
    "format": "PKCS12",
    "alias": "vp-elk-1",
    "subject_dn": "CN=Elastic Certificate Tool Autogenerated CA",
    "serial_number": "825a4f350b8815940e60d557036edbe205f68a93",
    "has_private_key": false,
    "expiry": "2029-03-11T13:21:08.000Z",
    "issuer": "CN=Elastic Certificate Tool Autogenerated CA"
    }
    ]
  13. 查看集群的全局配置

    # GET /_cluster/settings?include_defaults

    这会输出 Elasticsearch 集群的所有配置,包括默认配置。

  14. 查看模版配置

    # GET /_index_template?pretty

    其中可以查看 number_of_shardsnumber_of_replicas ,默认值都是 1

常见错误

Elasticsearch exited unexpectedly, with exit code 137

在 Docker 中 几乎 90% 是被系统 OOM Killer 杀掉(内存不够)。重点检查 mem_limit: 8g , 和 ES_JAVA_OPTS=-Xms8g -Xmx8g

filebeat 上传数据到 elasticsearch 问题汇总

filebeat 上传数据到 elasticsearch 报错

适用版本信息说明

  • filebeat 7
  • elasticsearch 7

filebeat 7.5.2 上传数据到 Elasticsearch 报错:

# journalctl -f -u filebeat
{"type":"illegal_argument_exception","reason":"Validation Failed: 1: this action would add [2] total shards, but this cluster currently has [6924]/[3000] maximum shards open;"}

此错误原因是由于 Elasticsearch 的集群中打开的分片数量超过了集群的最大分片限制。在 Elasticsearch 中,每个索引由多个分片组成,而集群有一个设置的最大分片数限制。这个限制是为了防止分片数过多导致性能问题。

错误消息 {"type":"illegal_argument_exception","reason":"Validation Failed: 1: this action would add [2] total shards, but this cluster currently has [6924]/[3000] maximum shards open;"} 显示当前集群已有 6924 个分片,超过了 3000 个的限制。

要解决这个问题,可以考虑以下几个选项:

  1. 调整 Elasticsearch 集群设置,增加最大分片数限制

    可以通过更改 Elasticsearch 配置来增加最大分片数的限制。但请注意,这可能会导致性能问题,尤其是如果硬件资源有限的话。

    这可以通过修改 cluster.max_shards_per_node 设置来实现

    PUT /_cluster/settings
    {
    "persistent": {
    "cluster.max_shards_per_node": "新的分片数限制"
    }
    }

    获取 Elasticsearch 集群的最大分片数限制

    curl -X GET "http://[your_elasticsearch_host]:9200/_cluster/settings?include_defaults=true&pretty"

  2. 删除一些不必要的索引 :如果有些索引不再需要,可以删除它们来减少分片数。

    curl -X DELETE "localhost:9200/my_index"
    curl -X DELETE "localhost:9200/logstash-2021.11.*"
  3. 合并一些小索引:如果有很多小的索引,可以考虑将它们合并为更大的索引,以减少总分片数。

  4. 优化现有索引的分片策略:可以优化索引的分片数量,例如,通过减少每个索引的主分片数量。

filebeat 错误

filebeat 配置上传数据到 elasticsearch 报错

适用版本信息说明

  • filebeat 7
  • elasticsearch 7

使用以下 filebeat 配置文件

/etc/filebeat/filebeat.yml
filebeat.inputs:
- type: log
paths:
- /home/logs/laravel-2023*
tags: ["admin-log"]
close_timeout: 3h
clean_inactive: 72h
ignore_older: 70h
close_inactive: 5m

output.elasticsearch:
hosts: ["1.56.219.122:9200", "1.57.115.214:9200", "1.52.53.31:9200"]
username: "elastic"
password: "passwd"
index: "logstash-admin-%{+yyyy.MM.dd}"
setup.template.enabled: true
setup.template.name: "logstash-admin"
setup.template.pattern: "logstash-admin-*"

filebeat 启动后报错,elasticsearch 上未创建相应的索引,关键错误信息 Failed to connect to backoff(elasticsearch(http://1.57.115.214:9200)): Connection marked as failed because the onConnect callback failed: resource 'filebeat-7.5.2' exists, but it is not an alias

journalctl -f -u filebeat
INFO [index-management] idxmgmt/std.go:269 ILM policy successfully loaded.
ERROR pipeline/output.go:100 Failed to connect to backoff(elasticsearch(http://1.57.115.214:9200)): Connection marked as failed because the onConnect callback failed: resource 'filebeat-7.5.2' exists, but it is not an alias
INFO pipeline/output.go:93 Attempting to reconnect to backoff(elasticsearch(http://1.57.115.214:9200)) with 3 reconnect attempt(s)
INFO elasticsearch/client.go:753 Attempting to connect to Elasticsearch version 7.6.2
INFO [index-management] idxmgmt/std.go:256 Auto ILM enable success.
INFO [index-management.ilm] ilm/std.go:138 do not generate ilm policy: exists=true, overwrite=false
INFO [index-management] idxmgmt/std.go:269 ILM policy successfully loaded.
ERROR pipeline/output.go:100 Failed to connect to backoff(elasticsearch(http://1.56.219.122:9200)): Connection marked as failed because the onConnect callback failed: resource 'filebeat-7.5.2' exists, but it is not an alias
INFO pipeline/output.go:93 Attempting to reconnect to backoff(elasticsearch(http://1.56.219.122:9200)) with 3 reconnect attempt(s)

这表明 Filebeat 无法正常连接到 Elasticsearch 集群。出现这个问题的主要原因可能为:

  • 索引/别名冲突: Filebeat 试图创建或使用一个名为 filebeat-7.5.2 的索引或别名,但这个资源在 Elasticsearch 中已存在且不是一个别名。解决方法为 删除或重命名冲突索引

  • ILM 配置问题

    使用此配置文件,解决 索引/别名冲突 问题后,filebeat 运行正常,但是 Elasticsearch 上未创建配置中的索引 logstash-admin-*,而是将数据上传到了索引 filebeat-7.5.2-*。这个问题是由 ILM 导致,可以禁用 ILM。参考以下配置,禁用 ILM (setup.ilm.enabled: false)

    /etc/filebeat/filebeat.yml
    filebeat.inputs:
    - type: log
    paths:
    - /home/logs/laravel-2023*
    tags: ["admin-log"]
    close_timeout: 3h
    clean_inactive: 72h
    ignore_older: 70h
    close_inactive: 5m

    output.elasticsearch:
    hosts: ["1.56.219.122:9200", "1.57.115.214:9200", "1.52.53.31:9200"]
    username: "elastic"
    password: "passwd"
    index: "logstash-admin-%{+yyyy.MM.dd}"
    setup.ilm.enabled: false
    setup.template.enabled: true
    setup.template.name: "logstash-admin"
    setup.template.pattern: "logstash-admin-*"

版本信息

  • Ubuntu 22.04.5 LTS
  • Elasticsearch v9.3.1
  • Kibana v9.3.1
  • Fluent Bit v4.2.2

在 Elasticsearch 8.x 和 9.x 版本中,Enrollment Token(注册令牌)机制是深度绑定 SSL 的,

Docker Compose 部署 EFK

为项目创建以下目录,分别用于存放配置文件和数据:

mkdir config/{fluent-bit,kibana,elasticsearch} -p

mkdir data/{fluent-bit,kibana,elasticsearch} -p

项目整体目录如下:

# tree
.
├── config
│ ├── elasticsearch
│ ├── fluent-bit
│ │ └── fluent-bit.conf
│ └── kibana
├── data
│ ├── elasticsearch
│ ├── fluent-bit
│ └── kibana
└── docker-compose.yml

fluent-bit.conf 示例配置如下:

fluent-bit.conf
[SERVICE]
Flush 1
Log_Level info
Daemon off

[INPUT]
Name cpu
Tag cpu_usage

[INPUT]
Name forward
Listen 0.0.0.0
Port 24224

[OUTPUT]
Name es
Match *
Host elasticsearch
Port 9200
# 要配置 ES 用户密码才能同步数据
HTTP_User elastic
HTTP_Passwd changeme
Index fluentbit
Type _doc
Suppress_Type_Name On

docker-compose.yml 配置如下

docker-compose.yml
services:
elasticsearch:
image: docker.elastic.co/elasticsearch/elasticsearch:9.3.1
container_name: elasticsearch
environment:
- node.name=elasticsearch
- discovery.type=single-node
- bootstrap.memory_lock=true
- "ES_JAVA_OPTS=-Xms512m -Xmx512m"
- xpack.security.enabled=true
- xpack.security.enrollment.enabled=true
- xpack.security.transport.ssl.enabled=false
ulimits:
memlock:
soft: -1
hard: -1
volumes:
- ./data/elasticsearch:/usr/share/elasticsearch/data # 核心:数据持久化
ports:
- "19200:9200"
networks:
- efk-net

kibana:
image: docker.elastic.co/kibana/kibana:9.3.1
container_name: kibana
environment:
- ELASTICSEARCH_HOSTS=http://elasticsearch:9200
- ELASTICSEARCH_USERNAME=kibana_system # 使用账户名密码认证 ES,密码使用命令重置 docker compose exec -it elasticsearch bin/elasticsearch-reset-password -u kibana_system
- ELASTICSEARCH_PASSWORD=dHCC5hm-lwK1Ifoz=E3I # 密码无需使用 单引号或者双引号
volumes:
- ./data/kibana:/usr/share/kibana/data
ports:
- "5601:5601"
depends_on:
- elasticsearch
networks:
- efk-net

fluent-bit:
image: fluent/fluent-bit:4.2.2
container_name: fluent-bit
volumes:
- ./config/fluent-bit/fluent-bit.conf:/fluent-bit/etc/fluent-bit.conf
# 如果你想采集宿主机的系统日志,可以加上:
- /var/log:/var/log:ro
depends_on:
- elasticsearch
networks:
- efk-net

networks:
efk-net:
driver: bridge

如遇启动失败,请查看日志,启动正常后,登录 Kibana 链接 <KIBANA_IP>:5601

看到这个界面说明你的 Elasticsearch 已经成功启动了。这是 Elastic 9.x 系列的新安全特性: 由于启用了安全验证,Kibana 启动后需要一个“准入许可证”(Enrollment Token)来和 Elasticsearch 握手

你可以选择:生成 Token彻底关闭验证 或者使用密码验证,本示例中使用 密码验证

  1. 生成 相关密码

    1. 为管理员用户 elastic 生成密码(重置密码)

      # docker compose exec -it elasticsearch /usr/share/elasticsearch/bin/elasticsearch-reset-password -u elastic
      This tool will reset the password of the [elastic] user to an autogenerated value.
      The password will be printed in the console.
      Please confirm that you would like to continue [y/N]y


      Password for the [elastic] user successfully reset.
      New value: xf52=nGPAf3TBOIbMuKR
    2. kibana_system 生成密码
      docker compose exec -it elasticsearch bin/elasticsearch-reset-password -u kibana_system

  2. 彻底关闭验证(最快,推荐用于开发环境)

    1. 点击你截图页面下方的 Configure manually
    2. 在地址栏输入: http://elasticsearch:9200
      xpack.security.enabled: false
      # kibana 环境变量
      ELASTICSEARCH_HOSTS: http://elasticsearch:9200

常见错误总结

This is a superuser account that cannot write to system indices that Kibana needs to function

Kibana 不能配置使用 ES 管理员账户 elastic 去认证,否则无法启动

docker-compose.yml
kibana:
image: docker.elastic.co/kibana/kibana:9.3.1
container_name: kibana
environment:
- ELASTICSEARCH_HOSTS=http://elasticsearch:9200
- ELASTICSEARCH_USERNAME=kibana_system ## 这里不能使用 elastic 账户,否则 kibana 无法启动
- ELASTICSEARCH_PASSWORD='dHCC5hm-lwK1Ifoz=E3I'

环境信息

  • Centos 7

ssh 免密登陆

在需要免密码登陆的场景下,可以配置 ssh 密钥登陆。配置步骤如下

  1. 在本地服务器上面执行命令生成密钥对
    $ ssh-keygen 
    Generating public/private rsa key pair.
    Enter file in which to save the key (/home/testuser/.ssh/id_rsa):
    Enter passphrase (empty for no passphrase):
    Enter same passphrase again:
    Your identification has been saved in /home/testuser/.ssh/id_rsa.
    Your public key has been saved in /home/testuser/.ssh/id_rsa.pub.
    The key fingerprint is:
    SHA256:Lzvl8GbOQETBVcTf8lf0Qk9KUQAESs9h8wARud+iQrk [email protected]
    The key's randomart image is:
    +---[RSA 2048]----+
    | .BBB*=.o+.|
    | oo= =. o o|
    | o.o .+ *.|
    | .. = =|
    | .S. . +.|
    | o...+ . o|
    | . .o*.. .|
    | E o== |
    | ..=o |
    +----[SHA256]-----+
    以上命令生成了公私密钥对,分别存储在了 /home/testuser/.ssh/id_rsa.pub/home/testuser/.ssh/id_rsa 中。
  2. 在本地服务器上面执行命令将其公钥添加到目标主机的 /home/testuser/.ssh/authorized_keys。或者手动拷贝公钥追加到目标主机的 .ssh/authorized_keys
    $ ssh-copy-id -p 30000 [email protected]
    /bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/home/testuser/.ssh/id_rsa.pub"
    The authenticity of host '[172.31.30.115]:30000 ([172.31.30.115]:30000)' can't be established.
    ECDSA key fingerprint is SHA256:vKD5th2QpWYv/hmt+180BsENDHWNcJdKiEBOH06h/K8.
    ECDSA key fingerprint is MD5:bf:8c:b9:e6:31:92:1f:a9:b6:7b:8f:50:d7:10:9e:fd.
    Are you sure you want to continue connecting (yes/no)? yes
    /bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
    /bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new [email protected]'s password:

    Number of key(s) added: 1

    Now try logging into the machine, with: "ssh -p '30000' '[email protected]'"
    and check to make sure that only the key(s) you wanted were added.
  3. 在本地服务器上面验证可以免密登陆到目标服务器。

如果要配置双向免密,将以上步骤反过来操作一遍即可

常见配置

登录服务器,经常遇见以下提示信息,说明有主机一直在尝试暴力破解用户名密码

There were 696 failed login attempts since the last successful login.

查看登录失败的用户名和 ip 地址

$ grep "Failed password for invalid user " /var/log/secure | awk '{print $11,$13}' | sort | uniq -c | sort -k1 -n
3 wangli 47.74.0.77
3 work 47.74.0.77
3 yt 47.74.0.77
3 yx 47.74.0.77
3 yyz 47.74.0.77
3 zabbix 47.74.0.77
3 zd 47.74.0.77
3 zhangfan 47.74.0.77
3 zxy 47.74.0.77
4 client003 47.74.0.77
4 client004 47.74.0.77
4 dell 47.74.0.77
4 ftpuser 47.74.0.77
4 inspur 47.74.0.77
4 wang 47.74.0.77
5 git 47.74.0.77
5 nagios 47.74.0.77
5 testuser 47.74.0.77
6 omnisky 47.74.0.77
7 oracle 47.74.0.77
8 jenkins 47.74.0.77
10 hadoop 47.74.0.77
10 postgres 47.74.0.77
11 ubuntu 47.74.0.77
11 user 47.74.0.77
12 admin 47.74.0.77
15 test 47.74.0.77

阅读全文 »

OpenClaw ,包括 OpenCode 等都是是开源社区针对官方 Claude Code 打造的全能型、无限制开源替代方案。

OpenClaw 安装部署

  • OpenClaw v2026.3.8
  • Node.js v22.22.1

OpenClaw 依赖 Node.js 22 或更高版本。可以参考以下命令安装 Node.js

curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash
source ~/.bashrc

nvm install 22
nvm use 22
nvm alias default 22

安装 OpenClaw

curl -fsSL https://openclaw.ai/install.sh | bash


初始化与配置 ,安装完成后,你需要运行 onboard 向导来配置 API Key(如 Anthropic, OpenAI 或本地的 Ollama)以及通信渠道。

openclaw onboard --install-daemon

配置渠道(以 Telegram 为例)

openclaw channels login telegram

查看 OpenClaw 安装的 Skills

openclaw skills list

安装完成后,其配置和常用文件位于 ~/.openclaw/

# tree .openclaw/
.openclaw/
├── agents
│ └── main
│ ├── agent
│ │ └── auth-profiles.json
│ └── sessions
│ ├── 6a0afd9a-145e-4d81-8c06-470b1fff0be9.jsonl
│ └── sessions.json
├── canvas
│ └── index.html
├── completions
│ ├── openclaw.bash
│ ├── openclaw.fish
│ ├── openclaw.ps1
│ └── openclaw.zsh
├── cron
│ └── jobs.json
├── devices
│ ├── paired.json
│ └── pending.json
├── identity
│ ├── device-auth.json
│ └── device.json
├── logs
│ └── config-audit.jsonl
├── openclaw.json # 主配置文件
├── openclaw.json.bak
├── update-check.json
└── workspace
├── AGENTS.md
├── BOOTSTRAP.md
├── HEARTBEAT.md
├── IDENTITY.md
├── SOUL.md
├── TOOLS.md
└── USER.md

交互方式

在 2026.3 版本中,OpenClaw 不再是一个简单的本地脚本,而是一个 客户端-服务端 体系。你现在的身份是管理员,你需要通过 TUI(终端用户界面) 或者 Agent 命令来与后台的 龙虾(Lobster) 进行对话。

GUI 交互

在无 GUI 的服务器上安装后,可以参考 openclaw dashboard 的输出并配合 SSH Tunnel ( ssh -N -L 18789:127.0.0.1:18789 root@<host> )在本地(如 MacOS)启动 UI

# openclaw dashboard

🦞 OpenClaw 2026.3.8 (3caab92) — Type the command with confidence—nature will provide the stack trace if needed.

Dashboard URL: http://127.0.0.1:18789/#token=6e03b40c7c4bdabd657b5d88a06c05d467f8b86373fc79d7
Copy to clipboard unavailable.
No GUI detected. Open from your computer:
ssh -N -L 18789:127.0.0.1:18789 root@<host>
Then open:
http://localhost:18789/
http://localhost:18789/#token=6e03b40c7c4bdabd657b5d88a06c05d467f8b86373fc79d7
Docs:
https://docs.openclaw.ai/gateway/remote
https://docs.openclaw.ai/web/control-ui

运行以下命令让 OpenClaw 的后端网关真正开始监听端口,这会监听本地端口 127.0.0.1:18789

openclaw gateway --port 18789

在本地访问 http://localhost:18789/#token=6e03b40c7c4bdabd657b5d88a06c05d467f8b86373fc79d7

终端交互 (TUI - Terminal User Interface)

在 Linux 服务器中,可以直接使用 openclaw tui 在服务器本地或通过 SSH 直接与 Agent 聊天。

即时通讯软件 (Messaging Channels)

支持平台 : WhatsApp, Telegram, Discord, Slack, Signal, iMessage 等。

交互逻辑

  1. 在服务器上配置 Channel(如 openclaw channels login telegram )。
  2. 扫码或输入 Bot Token。
  3. 在手机端对机器人说话,它会自动调用后端 Gateway 处理并回传结果。

场景 : 移动办公。比如在 WhatsApp 发一句“帮我订明天下午两点的会议室”,它会自动操作你的日历。

自动化与调度 (Cron & Webhooks)

这是一种 非即时 的交互方式。

  • Cron : 你可以设置定时任务( openclaw cron add ... ),让 Agent 每天早上 8 点自动给你发一份“今日天气与邮件摘要”。

  • Webhooks : 外部系统触发。例如 GitHub 有新的 PR 时,触发 OpenClaw 自动进行代码审计。

OpenClaw 常用配置

OpenClaw 主配置文件默认为 ~/.openclaw/openclaw.json

Gateway 配置

OpenClaw 通过 Gateway 控制 API 服务如何暴露、谁能访问、允许执行哪些设备命令。

~/.openclaw/openclaw.json
{
"gateway": {
"port": 18789, // OpenClaw API 网关监听的端口,openclaw gateway --port 18789 可以自定义端口
"mode": "local", // Gateway 的运行模式。local 监听127.0.0.1 ; lan 局域网访问; public 公网访问; meth 多节点协同;
"bind": "loopback", // API 服务绑定的网络接口。loopback 等价于 127.0.0.1
"auth": { // API 访问认证方式。调用 API 必须带 token,
"mode": "token", // none 无认证; token Token 认证; oauth OAuth 认证; mtls 证书认证;
"token": "6e03b40c7c4bdabd657b5d88a06c05d467f8b86373fc79d7"
},
"tailscale": { // Tailscale 是一种内网穿透技术(基于 Wireguard)
"mode": "off",
"resetOnExit": false
},
"nodes": { // 设备能力权限控制
"denyCommands": [ // 命令黑名单,禁止 Agent 执行这些设备操作
"camera.snap", // 摄像头, 拍照
"camera.clip", // 录视频
"screen.record", // 屏幕, 录屏
"contacts.add", // 联系人, 添加联系人
"calendar.add", // 日历,添加日历
"reminders.add", // 提醒,创建提醒
"sms.send" // 短信,发送短信
]
}
}
}

修改默认 Model

  • cli 方式修改

    # openclaw config set agents.defaults.model.primary google/gemini-3-flash-preview

    🦞 OpenClaw 2026.3.8 (3caab92) — I read logs so you can keep pretending you don't have to.

    Config overwrite: /root/.openclaw/openclaw.json (sha256 e47a2fbf77c84c04dade91d8a5eb8afa95bdc06cd9dc6b85d6b35fc922c7799d -> 7645629694be7eb0eb6fac1157634033149bc442967e9d1f1dac73327e40bd83, backup=/root/.openclaw/openclaw.json.bak)
    Updated agents.defaults.model.primary. Restart the gateway to apply.

    它会自动修改主配置文件 ~/.openclaw/openclaw.json 并在更改之前备份。修改后重启 Gateway 生效

  • 手动修改配置文件

    ~/.openclaw/openclaw.json
    {
    "meta": {
    "lastTouchedVersion": "2026.3.8",
    "lastTouchedAt": "2026-03-11T08:55:06.020Z"
    },

    "agents": {
    "defaults": {
    "model": {
    "primary": "google/gemini-3-flash-preview"
    },
    "workspace": "/root/.openclaw/workspace",
    "compaction": {
    "mode": "safeguard"
    },
    "maxConcurrent": 4,
    "subagents": {
    "maxConcurrent": 8
    }
    }
    }
    }

安全管控

在 OpenClaw AI 2026.3.8 中,Agent 默认是具备 文件读写、Shell 执行、网络访问等 能力 的。如果不做安全限制,可能会对系统造成不可逆的灾难后果。

在生成环境中,建议使用 Docker 运行 OpenClaw 。使其对宿主机文件系统只读,防止无意间修改线上环境。

目前 OpenClaw 默认配置中已经有 内置权限禁止部分危险操作 ,如果要限制其他命令,可以在 gateway.nodes.denyCommands 中添加即可。

gateway.nodes.denyCommands 黑名单 只对通过 Gateway 调用的命令生效,如 API 调用、远程客户端、agent 在 gateway 模式下的执行

如果你在本机直接运行 openclaw tui ,TUI 是 本地 Agent 执行,绕过了 Gateway

本地运行下,agent 拥有 full access 权限 ,主要受以下配置控制

agents.defaults.model
agents.defaults.workspace
commands.native / commands.nativeSkills
{
"gateway": {
"port": 18789, // OpenClaw API 网关监听的端口,openclaw gateway --port 18789 可以自定义端口
"mode": "local", // Gateway 的运行模式。local 监听127.0.0.1 ; lan 局域网访问; public 公网访问; meth 多节点协同;
"bind": "loopback", // API 服务绑定的网络接口。loopback 等价于 127.0.0.1
"auth": { // API 访问认证方式。调用 API 必须带 token,
"mode": "token", // none 无认证; token Token 认证; oauth OAuth 认证; mtls 证书认证;
"token": "6e03b40c7c4bdabd657b5d88a06c05d467f8b86373fc79d7"
},
"tailscale": {
"mode": "off",
"resetOnExit": false
},
"nodes": { // 设备能力权限控制
"denyCommands": [ // 禁止 Agent 执行这些设备操作。这些命令要小心使用。比如配置 "file.delete“ 和 "shell.exec" 是不会阻止文件被删除的
"camera.snap", // 摄像头, 拍照
"camera.clip", // 录视频
"screen.record", // 屏幕, 录屏
"contacts.add", // 联系人, 添加联系人
"calendar.add", // 日历,添加日历
"reminders.add", // 提醒,创建提醒
"sms.send", // 短信,发送短信

"shell.exec", // 不能执行 shell 命令
"file.delete", // 禁止删除文件, 只使用这个无效
"file.write",
"file.move",
"network.fetch" // 不能下载文件
]
}
}
}

Google Antigravity IDE

  • Trae 也可以依此操作配置

本示例演示 Google Antigravity AI 在运维场景中的使用方法。假如需要让 Google Antigravity AI 远程 SSH 连接到目标服务器并利用其 AI Agent 定位运行问题,可以参考以下步骤:

  1. 建立 SSH 远程连接 。Antigravity 基于 VS Code 内核,因此其连接方式与 VS Code 保持一致,但强化了 AI 对远程环境的感知。

    1. 安装插件 。确保已在 Antigravity 中安装了 Remote - SSH 扩展。

      1. 定位到 Setting -> Extensions (或者左侧边栏)中,在顶部搜索框中输入 @installed remote - ssh ,如果列表中出现了 Remote - SSH(通常由 Microsoft 发布),说明已经安装。如果没有任何显示,说明尚未安装。
      2. 如果没有安装,在搜索框中搜索 Remote - SSH,找到由 Microsoft 发布的版本(Antigravity 完美兼容 VS Code 市场插件),点击 Install

        或者直接发送需求给 Antigravity 让其自动安装

    2. 配置主机 。在 IDE 侧边栏的 Remote Explorer(远程资源管理器) 中添加并连接服务器。

      如果是首次连接,Antigravity 会在目标服务器上安装一个小型的服务端组件(Server Component),以便 AI Agent 能直接在服务器环境下运行。

  2. 打开项目目录 ,连接成功后,点击 Open Folder(打开文件夹) ,选择你运行服务所在的代码目录或配置目录(如 /etc/nginx 或你的后端代码路径)。

  3. 连接成功后,你不需要像以前那样手动翻阅数 GB 的日志。你可以通过侧边栏的 Chat 面板(Ctrl + L)指挥 AI。

    1. 自动日志分析 (Log Auditing)

      • 指令示例 :查看 /var/log 下最近 5 分钟的系统错误日志,找出导致我的 Java 应用崩溃的原因。

      • AI 行为: Agent 会自动执行 tail -n 100grep 命令,捕获堆栈信息(Stack Trace),并结合项目代码分析是 OOM(内存溢出)、端口冲突还是权限问题

    2. 如果你发现服务无法访问(例如 404 或 502)

      • 指令示例 :检查 8080 端口是否在监听,并测试 Nginx 反向代理到该端口的连通性。

      • AI 行为 :Agent 会执行 netstat -tunlpcurl -I localhost:8080 ,如果发现端口没启动,它会尝试查看启动脚本(如 docker-compose.ymlsystemd 配置)来定位根源。

  4. 闭环修复 (The “Fix” Loop)

    这是 Antigravity 区别于普通 IDE 的地方:

    • 生成修复计划 (The Plan)

      当 Agent 定位到问题(例如:K8s 配置的 resources.limits 太小导致 Pod 被杀)时,它会生成一个 Plan Artifact。

    • 审批修改

      它会展示修改后的代码或配置文件。你只需点击 Apply ,它就会在服务器上直接修改文件。

    • 验证结果

      你可以紧接着说:”修改后重新启动服务,并尝试用内置浏览器访问,确认首页能正常加载。”
      Antigravity 会启动内置浏览器,通过 SSH 隧道访问远程服务,截图反馈给你看。

例如处理 K8s 集群问题:如果你在服务器上配置了 kubectl ,你可以对 Antigravity 说:”帮我列出所有 Pending 状态的 Pod,并分析它们的事件日志,看看是不是节点资源不足。” 它能像一个初级运维工程师一样帮你完成繁琐的查询。

.agent/rules

生成环境中,AI 所做的操作一定要得到审批。否则会产生不可预期的结果

不是所有的 AI 工具都会遵循此规则,使用之前一定要确认清楚。比如 Trae 就不会加载 .agent/rules 文件去读取规则。

为了防止 AI 在服务器上乱改,你可以在项目中创建一个 .agent/rules 文件,写明:”严禁直接修改生产数据库” 或 “修改配置前必须先备份旧文件”。Agent 在执行任务时会强制遵守这些规则

关于 .agent/rules 的生效范围(作用域):

  • 项目级规则(最推荐) : 放在你项目代码的根目录下。规则仅对当前打开的特定项目生效。
  • 全局(Global)规则 : 如果你希望在打开任何项目文件夹时,AI 智能体都遵循一套通用的逻辑。通常存放在用户家目录的配置文件夹中
    • Windows : %USERPROFILE%\.antigravity\rules
    • Linux : ~/.antigravity/rules

如果要知道目前使用的 rules 都有哪些,可以直接让 AI 进行汇总

快速创建并测试 ,你不需要手动去文件夹里新建,直接在 Antigravity 的 Chat 面板里对 AI 下令即可:

指令请给出创建全局规则的步骤

如果您希望为您使用的 AI Agent 配置跨所有项目生效的全局规则,通常可以通过以下步骤完成(具体取决于您使用的编辑器客户端):

1. 通过编辑器的 AI 设置配置(最常见且推荐)
大部分 AI 辅助编辑器(如 Cursor、Windsurf 或相关 VS Code 插件)都支持在界面中直接配置全局系统提示词 (System Prompts) 或规则:

步骤:
打开编辑器的全局设置面板(通常快捷键为 Ctrl + , 或 Cmd + ,)。
搜索 Rules, Rules for AI, 或对应 AI 助手的名称(如 Agent Rules)。
在对应的文本框中,输入您期望的全局规则。例如:

1. 禁止以 root 用户执行操作
2. 切换到用户 wind
3. 执行任何变更操作都必须得到审批确认才能执行

保存设置。此后无论打开哪个项目,Agent 都会优先加载这些全局规则。

2. 在用户主目录下创建全局规则文件
部分 AI 助手会自动读取用户主目录(Home 目录 ~)下的特定隐藏文件作为全局指令。

步骤:
切换到您的宿主机主目录:cd ~
创建全局规则文件。根据具体的插件约定,通常是 ~/.agent/rules、~/.cursorrules 或 ~/.windsurfrules 等。
将规则写入该文件:

mkdir -p ~/.agent
echo "1. 禁止以 root 用户执行操作" > ~/.agent/rules
echo "2. 切换到用户 wind" >> ~/.agent/rules
echo "3. 执行任何变更操作都必须得到审批确认才能执行" >> ~/.agent/rules

3. 使用全局 Workflows(工作流)

如果您希望在所有项目中都可以随时调用某个标准化的“规则校验流程”,可以使用全局的 Workflows 功能。

步骤:
在全局或项目的 .agents/workflows/(或 _agents/workflows/)目录下创建 Markdown 格式的流程文件。
例如创建一个 .agents/workflows/enforce-rules.md:

---
description: 确保并校验 Agent 遵循基础安全规则
---
1. 检查当前是否为 root 用户,如果是则拒绝操作并提示用户。
2. 确保后续命令以 `su - wind -c` 或类似方式作为 wind 用户执行。
3. 在进行任何系统变更前,暂停并等待用户审批。

Claude Code

对于无法配置 SSH(例如内网穿透、防火墙严格限制或云厂商限制)的服务器,Claude Code 是目前最顶级的 终端代理(Terminal Agent) 方案

Claude Code 的配置与使用

Claude Code 的优势在于它是一个 CLI 工具,可以直接安装在目标服务器上。它不需要 SSH 隧道,因为它通过 HTTPS 与 Anthropic 的服务器通信,只要服务器能访问外网(或通过代理访问),就能工作。

  • 安装步骤(服务器端) 。在你的 Linux 服务器终端执行:

    curl -fsSL https://claude.ai/install.sh | bash

    部分地区下载有限制,如 HK,可以在可用地区下载脚本上传到服务器后安装

    或者使用 npm

    npm install -g @anthropic-ai/claude-code

  • 配置与初始化

    1. 登录 :输入 claude 启动,按照提示完成 OAuth 登录(会给出一个 URL 和授权码)。
      Select login method:

      ❯ 1. Claude account with subscription · Pro, Max, Team, or Enterprise

      2. Anthropic Console account · API usage billing

      3. 3rd-party platform · Amazon Bedrock, Microsoft Foundry, or Vertex AI

  • 执行 claude 命令运行

服务器上运行 gemini cli

Gemini 在服务器运维场景下有一个独特的优势:超长上下文窗口(Context Window) 。相比 Claude,Gemini 能够一次性“吞下”更多的日志文件或整个 Kubernetes 命名空间下的所有配置(YAML),从而提供更具全局观的分析。

  1. 安装 Google AI CLI (基于 Node.js)

    如果还未按照 Node.js , 可以使用以下命令( nvm 管理 Node.js 版本 )安装最新版本(版本太低的话, gemini 不支持)

    curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash
    source ~/.bashrc

    nvm install 20
    nvm use 20
    nvm alias default 20

    安装 Node.js 后安装 gemini-cli

    # 安装
    npm install -g @google/gemini-cli

    # 配置 API Key (从 Google AI Studio 免费获取)
    export GEMINI_API_KEY="你的_API_KEY"

    # 开始对话
    gemini

    参考以下步骤,获取 API Key:

    1. 打开浏览器,访问 Google AI Studio

    2. 进入页面后,点击左侧导航栏顶部的 Get API key 按钮(通常带有一个钥匙图标)。

    3. 在打开的界面中,你会看到 Create API key 的选项:

      • Create API key in new project :如果你是第一次使用,选这个。Google 会在你的 Google Cloud 控制台中自动创建一个名为 Generative Language Client 的项目。
    4. 立即复制并保存这串密钥。

  2. 使用命令 gemini 运行

PostgreSQL 常用命令

命令 功能描述
\l 列出所有数据库
\c 数据库名,切换当前连接的数据库 (Connect)
\dt 列出当前数据库中所有的表 (Describe Tables)
\d 表名,查看指定表的结构(列名、类型、索引等)
\du 列出所有角色/用户
\dn 列出所有模式 (Schema)
\df 列出所有函数
\x 开启/关闭扩展显示模式(当列很多时,这会让查询结果按行显示,非常清晰)
\? 查看所有反斜杠命令的帮助
  • 创建数据库CREATE DATABASE db_name;

  • 删除数据库DROP DATABASE db_name;

  • 导出数据库 (终端执行)pg_dump -U 用户名 数据库名 > 备份文件.sql

  • 导入数据库 (终端执行) : psql -U 用户名 数据库名 < 备份文件.sql

Amazon WorkSpaces 主要支持两种核心串流协议:

  • **WSP(Amazon WorkSpaces Streaming Protocol)**,基于 NICE DCV(DCV 专门为高性能图形处理(如 CAD、3D 渲染)和低延迟交互设计) 技术。是 AWS 近年大力推广的云原生协议,旨在提供更现代化的用户体验。

    • 网络适应性强 :在网络条件不稳定或高延迟的环境下表现更好。
    • 双向音视频支持 :原生支持 网络摄像头 (Webcam) 透传,非常适合视频会议(如 Teams, Zoom)。
    • 防火墙友好 :通常通过 TCP/UDP 端口 443 运行,更容易穿透企业防火墙。
    • Web Access :如果你习惯使用浏览器访问桌面,WSP 的兼容性和性能远超 PCoIP(已经不支持 Web Access)。
    • 认证支持 :支持更高级的身份验证方式,如 WebAuthn 和智能卡。
  • PCoIP(传统协议) : 这是 WorkSpaces 最早采用的协议,技术非常成熟,由 Teradici 开发。

    • 优点:

      • 图形渲染精准 :在处理高对比度、像素密集型的图形任务(如图像编辑)时,色彩表现更精准。

      • 终端设备广泛 :支持 PCoIP Zero Client(零客户机)硬件,以及包括 iPad 和 Android 在内的更广泛的移动端 App。

      • 成熟稳定 :作为老牌协议,在极端负载下的稳定性经过了长期验证。

    • 缺点:

      • 音视频功能弱 :原生 PCoIP 客户端通常不支持网络摄像头透传。

      • 网络要求高 :对网络延迟较敏感,一旦丢包,体验下降明显。

      • Web 访问限制 :已不支持。

制作镜像

为统一 AWS Workspaces 中的用户桌面系统和软件环境,建议自制镜像,预装常用软件,配置相关权限。自制桌面镜像请参考以下步骤:

  1. 先启动一台基础版的 WorkSpace。

  2. 以管理员身份登录,手动安装所有必要软件,对系统进行必要配置,如语言、地区、输入法等。

    如果要从 Windows WorkSpace 创建映像,请在运行创建进程之前使用位于 C:\Program Files\Amazon\ImageChecker.exe 中的映像检查器验证映像。

  3. 完成配置后,回到 AWS WorkSpaces 控制台,选择该桌面。

  4. 点击 Actions -> Create Image(创建镜像)

  5. 镜像创建成功后,选择该镜像并点击 Actions -> Create Bundle(创建捆绑包)

    镜像创建成功后,可在 Amazon WorkSpaces -> WorkSpaces -> Image(映像) 中查看

后续操作 : 以后为新员工开通桌面时,直接选择这个 自定义捆绑包 ,所有人的软件环境将完全一致。

配置 Workspace 云桌面无管理员权限

如果要全局配置,使 Directory 中的用户登陆云桌面后不是管理员权限,可以通过 AWS WorkSpaces 的目录设置(Directory Settings)取消用户的本地管理员权限 。实施步骤参考:

  1. 登录 AWS WorkSpaces 控制台

  2. 在左侧导航栏选择 Directories(目录)

  3. 选择对应的目录 ID,点击 目录名称进入查看详情页。

  4. 找到 Local administrator setting(本地用户管理员权限) 选项。

  5. 取消勾选 Enable local administrator setting(启用本地管理员设置)

结果: 用户将作为标准用户登录,无法修改系统配置或安装需要管理员权限的软件。

控制台修改后,只对新部署的桌面生效

要使已存在的桌面也生效,可以使用以下方法:

  • 重新构建(Rebuild):系统会根据当前的目录(Directory)设置(即已禁用的管理员权限)重新初始化 C 盘。C 盘会被重置。虽然 D 盘(用户数据)会保留,但用户自行安装在 C 盘的软件、系统设置、浏览器书签(若未同步)等都会丢失。执行前必须通知员工备份。
  • 通过组策略(GPO)强制回收(推荐用此方法):如果不希望重置员工的 C 盘,可以通过 Windows 域控的组策略强制移除用户在 Administrators 组中的身份。

控制 AWS Workspace 客户端设备类型

如果要控制 AWS Workspace 桌面只能从某些设备登陆,可以修改 Directory 中的 问权限的设备类型

如果使用 Amazon Workspace Client,则只能使用一个账户登陆,如果要同时登陆不同的账户,可以使用 Web Access

默认情况下,Web Access 登陆 Workspace 后因为浏览器安全限制原因,没有使用本地系统剪切板权限,无法在云桌面和本地之间粘贴复制。如果想要在本地和 workspace 云桌面之间粘贴复制(前提是未做其他限制,如 GPO 禁止粘贴),只需配置浏览器权限,允许使用剪切板即可。操作方式为,在网站左上角允许使用剪切板,具体操作如图:

AWS Workspaces 中的 AD 域管理

AWS Workspaces 使用的 AD 通常有以下两种:

  • AWS Managed Microsoft AD : AWS 托管的 Microsoft AD 域控服务。
  • Simple AD : 本质上是基于 Samba 4 的兼容方案

无论哪种 AD,都不支持直接通过 AWS 控制台管理,必须通过一台 Windows 管理机(EC2 或 WorkSpace)远程操作。

以下步骤以管理 Simple AD 为例提供参考步骤:

  1. 启动一台 Windows Server 实例(推荐)或一台现有的 WorkSpace。

  2. 确保这台机器已经加入到您的 Simple AD 域名下。方便起见最好是部署在 Directory 中 Workspace 云桌面,其已经在域中。

  3. 以管理员账户登陆并安装工具:

    1. 在服务器管理器中,点击 添加角色和功能

    2. 功能 列表中,勾选 组策略(Group Policy Management)管理工具 以及 远程服务器管理工具 (Remote Server Administration Tools,RSAT) -> 角色管理工具(Role Administration Tools) -> AD DS 和 AD LDS 工具

      如果 Directory 配置了 禁用本地管理员设置 ,使用新部署的 Workspace 桌面会不具备管理员权限,无法安装工具。只需要有 域管理员账户密码即可解决 。在任务栏或开始菜单找到 Server Manager (服务器管理器) ,选择 Run as different user (以其他用户身份运行)

安装完成后,即可打开 Active Directory Users and Computers 工具查看 AD 域中的用户和计算机信息

要管理组策略,使用 Group Policy Management 工具

有些由 AWS WorkSpaces 的串流协议控制的功能,如 控制在 Workspace 云桌面和本地之间复制或传输文件 等,Windows 默认是不存在这些策略的,需要手动导入 AWS 提供的模板。AWS 定义的策略官方文档(Manage your Windows WorkSpaces in WorkSpaces Personal)

不同的云桌面串流协议(WSP(基于 DCV)、PCoIP)需要使用不同的组策略管理模板文件 ,要注意区分,具体可查看官方文档说明

使用 DCV WorkSpaces 时特有的组策略设置,必须将 DCV 的组策略管理模板 wsp.admxwsp.adml 文件添加到目录的域控制器的 WorkSpaces 中央存储区。

以下步骤参考官方文档 为 DCV(WSP 协议) 安装组策略管理模板文件

  1. 在正在运行的 Windows WorkSpace 中,复制 C:\Program Files\Amazon\WSP 目录中的 wsp.admxwsp.adml 文件。

  2. 在目录管理 WorkSpace 或已加入 WorkSpaces 目录的 Amazon EC2 实例上,打开 Windows 文件资源管理器,然后在地址栏中输入贵组织的完全限定域名 (FQDN),例如 \\example.com

  3. 打开 sysvol 文件夹。

  4. 打开带有 FQDN 名称的文件夹。

  5. 打开 Policies 文件夹。您现在应该位于 \\FQDN\sysvol\FQDN\Policies 中。

  6. 如果该文件尚不存在,请创建一个名为 PolicyDefinitions 的文件夹。

  7. 打开 PolicyDefinitions 文件夹。

  8. wsp.admx 文件复制到 \\FQDN\sysvol\FQDN\Policies\PolicyDefinitions 文件夹中。

  9. PolicyDefinitions 文件夹中创建名为 en-US 的文件夹。

  10. 打开 en-US 文件夹。

  11. wsp.adml 文件复制到 \\FQDN\sysvol\FQDN\Policies\PolicyDefinitions\en-US 文件夹中。

验证管理模板文件是否已正确安装

  1. 在目录管理 WorkSpace 或加入 WorkSpaces 目录的 Amazon EC2 实例上,打开组策略管理工具 ( gpmc.msc )。

  2. 展开 Forest(Forest:FQDN)。

  3. 展开域(Domains)。

  4. 展开您的 FQDN(例如, example.com )。

  5. 展开组策略对象(Group Policy Objects)。

  6. 选择默认域策略(Default Domain Policy),打开(右键单击)菜单,然后选择 编辑(Edit)

  7. 在组策略管理编辑器中,依次选择 计算机配置->策略->管理模板->Amazon 和 DCV

  8. 现在,您可以使用此 DCV 组策略对象来修改使用 DCV WorkSpaces 时特有的组策略设置。

执行以上操作后,再次打开组策略编辑器,会发现组策略中只剩 AWS DCV 相关的策略,AD 默认的所有策略都看不到了,这是因为中央存储(Central Store)的配置不完整导致的。

当你创建了中央存储(在 \\domain\SYSVOL\domain\Policies\PolicyDefinitions 创建了文件夹)后,组策略管理编辑器(GPMC)会强制只从该网络位置读取模板,而不再读取本地 C:\Windows\PolicyDefinitions 下的系统自带模板。如果你的中央存储文件夹里只放了 Amazon 的 wsp.admx/adml ,那么所有 Windows 原生的策略(如控制面板、网络、系统设置等)就会全部消失。


需要将本地域控制器上的所有原生 Windows 策略模板手动复制到中央存储中

  1. 在域控制器上打开:C:\Windows\PolicyDefinitions
  2. 全选该文件夹下的所有 .admx 文件(包含几百个文件,如 Search.admx , TerminalServer.admx 等)。
  3. 将它们复制到中央存储路径:\\<FQDN>\SYSVOL\<FQDN>\Policies\PolicyDefinitions\ (注:请确保你之前放 wsp.admx 的地方就在这里)。
  4. 将 ADML 语言文件(如 en-US )也同样复制过去。

环境信息

  • Centos 7
  • Prometheus Server 2.4
  • Node Exporter v1.4.0
  • Grafana v9.2.5

安装

在 Docker 中安装 Prometheus Server

创建 Prometheus Server 配置文件,如 /root/prometheus/prometheus.yml,内容如下 [1]

/data/prometheus/prometheus.yml
# my global config
global:
scrape_interval: 15s # Set the scrape interval to every 15 seconds. Default is every 1 minute.
evaluation_interval: 15s # Evaluate rules every 15 seconds. The default is every 1 minute.
# scrape_timeout is set to the global default (10s).

# Alertmanager configuration
alerting:
alertmanagers:
- static_configs:
- targets:
# - alertmanager:9093

# Load rules once and periodically evaluate them according to the global 'evaluation_interval'.
rule_files:
# - "first_rules.yml"
# - "second_rules.yml"

# A scrape configuration containing exactly one endpoint to scrape:
# Here it's Prometheus itself.
scrape_configs:
# The job name is added as a label `job=<job_name>` to any timeseries scraped from this config.
- job_name: 'prometheus'

# metrics_path defaults to '/metrics'
# scheme defaults to 'http'.

static_configs:
- targets: ['localhost:9090']

使用 Docker 启动时挂载此文件,作为 Prometheus Server 的配置文件,之后需要修改配置,可以直接修改此文件。

docker run -d -p 9090:9090 \
--name prometheus \
-v /root/prometheus/prometheus.yml:/etc/prometheus/prometheus.yml \
prom/prometheus

启动后,可以通过 $Prometheus_IP:9090 访问 Prometheus Server UI

阅读全文 »

中国大陆地区部署不可用

IPSec 协议

使用 Docker 部署命令如下

docker run -d     --name ikev2-vpn     --restart=always     --cap-add=NET_ADMIN     -e "VPN_IPSEC_PSK=StrongPSK123"     -e "VPN_USER=myuser"     -e "VPN_PASSWORD=MyPass123"     -p 500:500/udp     -p 4500:4500/udp     hwdsl2/ipsec-vpn-server

在 iPhone 上前往 设置 -> 通用 -> VPN 与设备管理 -> VPN -> 添加 VPN 配置

  • 类型: IPsec
  • 描述随便填: (如 MyVPN)
  • 服务器 :
  • 本地 ID : 留空
  • 用户名 : myuser
  • 密码 : MyPass123
  • 密钥 : StrongPSK123

L2TP 协议

使用 Docker 部署命令如下

docker run -d   --name ikev2-vpn-l2tp   --restart=always   --cap-add=NET_ADMIN   --device=/dev/ppp   -e "VPN_IPSEC_PSK=StrongPSK123"   -e "VPN_USER=myuser"   -e "VPN_PASSWORD=MyPass123"   -p 500:500/udp   -p 4500:4500/udp   -p 1701:1701/udp   hwdsl2/ipsec-vpn-server

在 iPhone 上前往 设置 -> 通用 -> VPN 与设备管理 -> VPN -> 添加 VPN 配置

  • 类型: L2TP
  • 描述随便填: (如 MyVPN)
  • 服务器 :
  • 本地 ID : 留空
  • 用户名 : myuser
  • 密码 : MyPass123
  • 密钥 : StrongPSK123

Docker 部署步骤

创建配置文件 config.json

config.json
{
"log": {
"loglevel": "debug", /* 为了观察运行情况或者定位问题,可以开启debug 日志 */
"access": "/dev/stdout",
"error": "/dev/stdout"
},
"inbounds": [{
"port": 443,
"protocol": "vless",
"settings": {
"clients": [
{
"id": "c4187394-5865-446d-9d8d-3f6c179416b0(UID 替换为实际值)",
"flow": "xtls-rprx-vision"
}
],
"decryption": "none"
},
"streamSettings": {
"network": "tcp",
"security": "reality",
"realitySettings": {
"show": false,
"dest": "www.microsoft.com:443",
"xver": 0,
"serverNames": ["www.microsoft.com"],
"privateKey": "mD0OUR8tFvOypHQre6yGgsZs2w-JecH4zkXB9_TY-k8(私钥)",
"shortIds": ["a1b2c3d4"]
}
}
}],
"outbounds": [{"protocol": "freedom"}]
}

  • "id": "c4187394-5865-446d-9d8d-3f6c179416b0(UID 替换为实际值)" 可以自行生成
  • "dest": "www.microsoft.com:443" 伪装的网站地址
  • "privateKey": "mD0OUR8tFvOypHQre6yGgsZs2w-JecH4zkXB9_TY-k8(私钥)" 私钥,公司钥对可以使用如下命令生成
    # docker run --rm teddysun/xray xray x25519
    PrivateKey: iBKDmvNMfFOAzNPOLRlnJLzoaYbHKs9RFatpW1ELeks
    Password: OV_SMIonfy1cEzxnDGZff9x0HeuhuqLyrIj0dLqAaHw
    Hash32: 1fEp1041YBnLfSvQYVsRfvGJEA8ZV_LjqFGtQKwaWG0

    • PrivateKey 对应私钥( privateKey
    • Password 对应公钥( Public Key ),要发送给客户端使用

正常启动后,在客户端如下配置:

  • 类型: VLESS

  • 地址(Address): <SERVER IP>

  • 端口(Port): 443 # 对应配置文件中的 inbounds.port

  • UUID: <UID> # 对应配置文件中的 inbounds.settings.clients.id

  • 流(Flow): xtls-rprx-vision # 对应配置文件中的 inbounds.settings.clients.flow

  • 传输协议(Transport protocol(network)): TCP # 对应配置文件中的 inbounds.streamSettings.network

  • TLS/安全: Reality # 对应配置文件中的 inbounds.streamSettings.security

  • 加密(Encryption): none # 对应配置文件中的 inbounds.settings.decryption

  • SNI: www.microsoft.com # 对应配置文件中的 inbounds.streamSettings.realitySettings.dest

  • 短 ID(Short ID): a1b2c3d4 # 对应配置文件中的 inbounds.streamSettings.realitySettings.shortIds

  • 公钥(Public key、密码、Password): <公钥> # docker run --rm teddysun/xray xray x25519 命令生成的 Password

为了方便客户端导入,可以为配置生成以下链接,其中包含了客户端链接所需的参数:

vless://<UID>@<SERVER IP>:<Port>?encryption=none&flow=xtls-rprx-vision&security=reality&sni=www.microsoft.com&fp=chrome&pbk=<Public Key or Password>&sid=a1b2c3d4#Shanghai_MS_Reality

大多数客户端都支持从粘贴板复制以上内容自动导入配置。

Windows 中使用 v2rayN 连接 xray server

  • v2rayN 版本: v7.18.0

Windows 下载 v2rayN ,将其解压后,运行程序 v2rayN.exe 即可打开程序。复制配置链接( vless://<UID>@<SERVER IP>:<Port>?encryption=none&flow=xtls-rprx-vision&security=reality&sni=www.microsoft.com&fp=chrome&pbk=<Public Key or Password>&sid=a1b2c3d4#Shanghai_MS_Reality ),在 v2rayN 主界面点击 Configuration -> Import Share Links from clipboard 即可自动导入配置

默认情况下, v2rayN 会测试到 google.com 的连接来验证服务端是否正常,国内服务器此测试必定失败,因此可以修改此测试目标。参考以下步骤:

  1. 导航到 Settings -> v2rayN settings: Speed Ping Test URL ,此处默认值为 google.com ,将其改为国内服务器可以访问的地址如 https://www.baidu.com

要验证 xray server 工作正常,可以在 v2rayN 客户端进行 延迟检测(Test real delay) 。右键要检测的 xray server 选择 Test real delay

如果能够获取到延迟数据,说明 xray 工作正常,如果未获取到延迟数据,可以登陆服务器,通过命令 docker logs 检查服务端日志

Keycloak 是一个开源的身份和访问管理(IAM)解决方案。

Keycloak 官网链接

Kubernetes 中部署 Keycloak

  • Kubernetes 1.35
  • Kustomize Version: v5.7.1
  • Keycloak 26.x
  • Aurora RDS PostgreSQL

参考官方文档在 Kubernetes 中部署 Keycloak

下载 Keycloak 配置文件: https://raw.githubusercontent.com/keycloak/keycloak-quickstarts/refs/heads/main/kubernetes/keycloak.yaml 并修改数据库相关配置,本示例使用 AWS Aurora PostgreSQL:

keycloak.yaml
## 要连接 RDS PostgreSQL,需要设置这些核心环境变量:
- name: KC_DB
value: postgres
- name: KC_DB_URL_HOST
value: <RDS_ENDPOINT>
- name: KC_DB_URL_DATABASE
value: <DB_NAME>
- name: KC_DB_USERNAME
valueFrom:
secretKeyRef:
name: keycloak-db-secret
key: username
- name: KC_DB_PASSWORD
valueFrom:
secretKeyRef:
name: keycloak-db-secret
key: password

本示例使用 Kustomize 部署,文档结构如下:

$ tree
.
├── base
│ ├── ingresses.yaml
│ ├── kustomization.yaml
│ ├── services.yaml
│ └── statefulset.yaml
└── overlays
├── dev
└── prod
└── kustomization.yaml

base/statefulset.yaml 内容如下,主要参考官网安装文档(https://raw.githubusercontent.com/keycloak/keycloak-quickstarts/refs/heads/main/kubernetes/keycloak.yaml

base/statefulset.yaml
apiVersion: apps/v1
# Use a stateful setup to ensure that for a rolling update Pods are restarted with a rolling strategy one-by-one.
# This prevents losing in-memory information stored redundantly in two Pods.
kind: StatefulSet
metadata:
name: keycloak
labels:
app: keycloak
spec:
serviceName: keycloak-discovery
# Run with one replica to save resources, or with two replicas to allow for rolling updates for configuration changes
replicas: 2
selector:
matchLabels:
app: keycloak
template:
metadata:
labels:
app: keycloak
spec:
containers:
- name: keycloak
image: quay.io/keycloak/keycloak:26.5.4
args: ["start"]
env:
# 初始管理员账户和密码
- name: KC_BOOTSTRAP_ADMIN_USERNAME
value: "admin"
- name: KC_BOOTSTRAP_ADMIN_PASSWORD
value: "admin"
# In a production environment, add a TLS certificate to Keycloak to either end-to-end encrypt the traffic between
# the client or Keycloak, or to encrypt the traffic between your proxy and Keycloak.
# Respect the proxy headers forwarded by the reverse proxy
# In a production environment, verify which proxy type you are using, and restrict access to Keycloak
# from other sources than your proxy if you continue to use proxy headers.
- name: KC_PROXY_HEADERS
value: "xforwarded"
- name: KC_HTTP_ENABLED
value: "true"
# In this explorative setup, no strict hostname is set.
# For production environments, set a hostname for a secure setup.
- name: KC_HOSTNAME_STRICT
value: "false"
- name: KC_HEALTH_ENABLED
value: "true"
- name: 'KC_CACHE'
value: 'ispn'
# Passing the Pod's IP primary address to the JGroups clustering as this is required in IPv6 only setups
- name: POD_IP
valueFrom:
fieldRef:
fieldPath: status.podIP
# Instruct JGroups which DNS hostname to use to discover other Keycloak nodes
# Needs to be unique for each Keycloak cluster
- name: KC_CACHE_EMBEDDED_NETWORK_BIND_ADDRESS
value: '$(POD_IP)'
- name: 'KC_DB_URL_DATABASE'
value: 'keycloak'
- name: 'KC_DB_URL_HOST'
value: '<RDS_endpoint>'
- name: 'KC_DB'
value: 'postgres'
# In a production environment, use a secret to store username and password to the database
- name: 'KC_DB_PASSWORD'
value: '<RDS_PASSWORD>'
- name: 'KC_DB_USERNAME'
value: '<RDS_USERNAME>'
ports:
- name: http
containerPort: 8080
- name: jgroups
containerPort: 7800
- name: jgroups-fd
containerPort: 57800
startupProbe:
httpGet:
path: /health/started
port: 9000
periodSeconds: 1
failureThreshold: 600
readinessProbe:
httpGet:
path: /health/ready
port: 9000
periodSeconds: 10
failureThreshold: 3
livenessProbe:
httpGet:
path: /health/live
port: 9000
periodSeconds: 10
failureThreshold: 3
resources:
limits:
cpu: 2000m
memory: 2000Mi
requests:
cpu: 500m
memory: 1700Mi

base/services.yaml 内容如下:

base/services.yaml
apiVersion: v1
kind: Service
metadata:
name: keycloak
labels:
app: keycloak
spec:
ports:
- protocol: TCP
port: 8080
targetPort: http
name: http
## 主要用于 ALB 健康检查
- name: management
port: 9000
targetPort: 9000
selector:
app: keycloak
type: ClusterIP
---
apiVersion: v1
kind: Service
metadata:
labels:
app: keycloak
name: keycloak-discovery
spec:
selector:
app: keycloak
clusterIP: None
type: ClusterIP

base/ingresses.yaml 内容如下:

base/ingresses.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
alb.ingress.kubernetes.io/healthcheck-path: /health/ready
alb.ingress.kubernetes.io/healthcheck-port: "9000" # 健康检查(Health Check)端口和 web 端口(8080)不同
alb.ingress.kubernetes.io/scheme: internet-facing
alb.ingress.kubernetes.io/target-type: ip
alb.ingress.kubernetes.io/listen-ports: '[{"HTTP": 80}, {"HTTPS": 443}]' # admin console 必须使用 https
alb.ingress.kubernetes.io/certificate-arn: arn:aws:acm:ap-east-1::certificate/f2cd4604-4791-43dd-8d33-545210272f1c
name: keycloak-web-ingress
spec:
ingressClassName: alb
rules:
- http:
paths:
- backend:
service:
name: keycloak
port:
number: 8080
path: /
pathType: Prefix
host: keycloak.example.com

base/kustomization.yaml 内容如下:

base/kustomization.yaml
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization

resources:
- statefulset.yaml
- services.yaml
- ingresses.yaml

overlays/prod/kustomization.yaml 内容如下

overlays/prod/kustomization.yaml
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization

namespace: keycloak

resources:
- ../../base

执行以下命令查看最终生成的配置:

$ kubectl kustomize overlays/prod/

ArgoCD 是目前 Kubernetes 生态中最流行的 GitOps 持续交付(CD)工具。它的核心理念是将 Git 仓库视为集群状态的“唯一真理来源”。

ArgoCD 的核心工作原理

  • 声明式管理 :你不在集群里手动运行 kubectl ,而是将所有的资源清单(YAML、Helm、Kustomize)存放在 Git 中管理。
  • 同步与漂移检测 :ArgoCD 会持续监控 Git 仓库和 EKS 集群。如果两者状态不一致(即发生“漂移”),它会报警或自动将集群恢复到 Git 定义的状态。

Argo CD 核心概念说明

ArgoCD Application 删除时的 Propagation Policy

在 Argo CD 中,当你删除一个 Application 时,Propagation Policy(传播策略) 决定了该应用下属的 Kubernetes 资源(如 Deployment, Service, ConfigMap 等) 应该如何处理。本质上是调用了 Kubernetes API 的删除机制,Argo CD 利用 K8s 的 Finalizer 机制来实现这一逻辑

策略名称 行为描述 结果
Foreground Cascade(前台级联) 最常用。先删除子资源,最后删除 Application 本身。 集群资源被彻底清理,最安全。
Background Cascade(后台级联) 立即删除 Application,子资源在后台由 K8s 垃圾回收机制静默删除。 最终结果同上,但 Application 对象消失得更快。
Orphan (Non-cascading ,孤儿模式) 只删壳,不删内容。只删除 Application 对象,保留集群里的实际资源。 资源继续运行,不再受 Argo CD 管控。
这通常用于 迁移场景 :你只想让 Argo CD 不再管这个应用,但不想让业务停掉。

在 Kubernetes 集群中安装 ArgoCD

# kubectl create namespace argocd
namespace/argocd created

# kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml --server-side
customresourcedefinition.apiextensions.k8s.io/applications.argoproj.io serverside-applied
customresourcedefinition.apiextensions.k8s.io/applicationsets.argoproj.io serverside-applied
customresourcedefinition.apiextensions.k8s.io/appprojects.argoproj.io serverside-applied
serviceaccount/argocd-application-controller serverside-applied
serviceaccount/argocd-applicationset-controller serverside-applied
serviceaccount/argocd-dex-server serverside-applied
serviceaccount/argocd-notifications-controller serverside-applied
serviceaccount/argocd-redis serverside-applied
serviceaccount/argocd-repo-server serverside-applied
serviceaccount/argocd-server serverside-applied
role.rbac.authorization.k8s.io/argocd-application-controller serverside-applied
role.rbac.authorization.k8s.io/argocd-applicationset-controller serverside-applied
role.rbac.authorization.k8s.io/argocd-dex-server serverside-applied
role.rbac.authorization.k8s.io/argocd-notifications-controller serverside-applied
role.rbac.authorization.k8s.io/argocd-redis serverside-applied
role.rbac.authorization.k8s.io/argocd-server serverside-applied
clusterrole.rbac.authorization.k8s.io/argocd-application-controller serverside-applied
clusterrole.rbac.authorization.k8s.io/argocd-applicationset-controller serverside-applied
clusterrole.rbac.authorization.k8s.io/argocd-server serverside-applied
rolebinding.rbac.authorization.k8s.io/argocd-application-controller serverside-applied
rolebinding.rbac.authorization.k8s.io/argocd-applicationset-controller serverside-applied
rolebinding.rbac.authorization.k8s.io/argocd-dex-server serverside-applied
rolebinding.rbac.authorization.k8s.io/argocd-notifications-controller serverside-applied
rolebinding.rbac.authorization.k8s.io/argocd-redis serverside-applied
rolebinding.rbac.authorization.k8s.io/argocd-server serverside-applied
clusterrolebinding.rbac.authorization.k8s.io/argocd-application-controller serverside-applied
clusterrolebinding.rbac.authorization.k8s.io/argocd-applicationset-controller serverside-applied
clusterrolebinding.rbac.authorization.k8s.io/argocd-server serverside-applied
configmap/argocd-cm serverside-applied
configmap/argocd-cmd-params-cm serverside-applied
configmap/argocd-gpg-keys-cm serverside-applied
configmap/argocd-notifications-cm serverside-applied
configmap/argocd-rbac-cm serverside-applied
configmap/argocd-ssh-known-hosts-cm serverside-applied
configmap/argocd-tls-certs-cm serverside-applied
secret/argocd-notifications-secret serverside-applied
secret/argocd-secret serverside-applied
service/argocd-applicationset-controller serverside-applied
service/argocd-dex-server serverside-applied
service/argocd-metrics serverside-applied
service/argocd-notifications-controller-metrics serverside-applied
service/argocd-redis serverside-applied
service/argocd-repo-server serverside-applied
service/argocd-server serverside-applied
service/argocd-server-metrics serverside-applied
deployment.apps/argocd-applicationset-controller serverside-applied
deployment.apps/argocd-dex-server serverside-applied
deployment.apps/argocd-notifications-controller serverside-applied
deployment.apps/argocd-redis serverside-applied
deployment.apps/argocd-repo-server serverside-applied
deployment.apps/argocd-server serverside-applied
statefulset.apps/argocd-application-controller serverside-applied
networkpolicy.networking.k8s.io/argocd-application-controller-network-policy serverside-applied
networkpolicy.networking.k8s.io/argocd-applicationset-controller-network-policy serverside-applied
networkpolicy.networking.k8s.io/argocd-dex-server-network-policy serverside-applied
networkpolicy.networking.k8s.io/argocd-notifications-controller-network-policy serverside-applied
networkpolicy.networking.k8s.io/argocd-redis-network-policy serverside-applied
networkpolicy.networking.k8s.io/argocd-repo-server-network-policy serverside-applied
networkpolicy.networking.k8s.io/argocd-server-network-policy serverside-applied

  • --server-side 选项用于解决可能的报错: The CustomResourceDefinition "applicationsets.argoproj.io" is invalid: metadata.annotations: Too long: may not be more than 262144 bytes

等待 ArgoCD 相关 Pod 运行正常

# kubectl get pods -n argocd
NAME READY STATUS RESTARTS AGE
argocd-application-controller-0 1/1 Running 0 6m11s
argocd-applicationset-controller-77475dfcf-qzvsf 1/1 Running 1 (3m47s ago) 6m15s
argocd-dex-server-6485c5ddf5-4ms4f 1/1 Running 0 6m14s
argocd-notifications-controller-758f795776-4n5rb 1/1 Running 0 6m14s
argocd-redis-6cc4bb5db5-svpwm 1/1 Running 0 6m13s
argocd-repo-server-c76cf57cd-pv8sb 1/1 Running 0 6m12s
argocd-server-6f85b59c87-zhmqh 1/1 Running 0 6m12s

创建 Ingress 对外开放 ArgoCD UI,本示例中 IngressClass 为 AWS alb

argocd_ingress.yml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: argocd
namespace: argocd
annotations:
alb.ingress.kubernetes.io/scheme: internet-facing
alb.ingress.kubernetes.io/target-type: ip

spec:
ingressClassName: alb
rules:
- host: argocd.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: argocd-server
port:
number: 80


创建并检查 Ingress

# kubectl apply -f argocd_ingress.yml 
ingress.networking.k8s.io/argocd configured

# kubectl get ingresses -A
NAMESPACE NAME CLASS HOSTS ADDRESS PORTS AGE
argocd argocd alb argocd.example.com k8s-argocd-argocd-8e8cb.ap-east-1.elb.amazonaws.com 80 8m22s

ArgoCD Pod 强制开启了 TLS (HTTPS),而 ALB 却在使用 HTTP 进行健康检查。会因为健康检查失败无法访问

在集群中的 Pod 中尝试请求 argocd-server Pod 的地址,可以看到默认返回了重定向到 HTTPS 的响应,ALB 会因为证书问题对 Pod 健康检查失败

# curl -Iv 172.31.68.215:8080
> HEAD / HTTP/1.1
> Host: 172.31.68.215:8080
> User-Agent: curl/8.18.0
> Accept: */*
>

HTTP/1.1 307 Temporary Redirect
Location: https://172.31.68.215:8080/


可以配置 ArgoCD 接受 HTTP 协议请求。 修改 ArgoCD Server 启动参数 ,执行命令 kubectl edit deployment argocd-server -n argocd 编辑 argocd-server 的 Deployment,在启动命令( command )中添加 --insecure 参数。

containers:
- args:
- /usr/local/bin/argocd-server
- --insecure

修改后等待 Pod 自动重启

$ kubectl get pods -A
NAMESPACE NAME READY STATUS RESTARTS AGE
argocd argocd-server-6ff754765c-pt5z6 0/1 Running 0 18s

再次观察 ALB 的 Target 健康检查状态

ArgeCD 可以正常访问后,执行以下命令获取初始 admin 账户的密码

kubectl get secret argocd-initial-admin-secret -n argocd -o jsonpath="{.data.password}" | base64 -d

ArgoCD UI 常用操作

创建 Project

Project 可以实现资源或者 APP 的逻辑隔离,可以通过 Project 限制 APP 对以下资源的使用:

  • SOURCE REPOSITORIES :限制该 Project 下的 Application 只能从指定的 Git Reop 或者 Helm 仓库拉取配置(Manifest)。防止越权拉取。
  • SCOPED REPOSITORIES : 只允许属于 Project 的 APP 从指定的 Reop 拉取代码(Manifest)
  • DESTINATIONS / SCOPED CLUSTERS: 限制属于 Project 的 APP 只能部署到指定的 Kubernetes 集群((Server URL/Name))和 Namespace。支持通配符。例如限制只能部署到 in-clusterdev-* 命名空间。
  • cluster resource allow list / cluster resource deny list : Kubernetes Cluster 范围内允许/拒绝使用的资源,针对 非命名空间资源(如 ClusterRole, CustomResourceDefinition, Namespace, StorageClass)
  • namespace resource allow list / namespace resource deny list : Namespace 范围的资源限制/允许,针对 命名空间资源(如 Deployment, Service, Secret, ConfigMap)

多用户与权限控制

Argo CD 有两个核心组件控制权限:

  • argocd-server(认证)

  • argocd-rbac-cm(授权)

Argo CD 支持三种用户方式

  1. 本地用户(不推荐生产)

  2. SSO(推荐生产) ,支持:

    • GitHub

    • GitLab

    • Azure AD

    • Google

    • OIDC

    • LDAP

    • Okta

    • Keycloak

    1. Kubernetes RBAC 模式(高级) 。可以让 ServiceAccount 调用 Argo API。

Kustomize 是专为 Kubernetes 设计的声明式配置管理工具,允许用户通过分层和声明式方式定制和管理应用程序配置,无需直接修改原始清单文件。Kustomize 已集成到 kubectl ,成为 Kubernetes 原生配置管理方案。

Kustomize 提供多种声明式配置管理能力,适用于复杂的 Kubernetes 应用场景:

  • 配置合并与分层管理

    Kustomize 采用 基础配置( base覆盖配置( overlay 的分层架构:

    • 基础配置(base) :应用的通用资源定义
    • 覆盖配置(overlay) :针对特定环境或需求的定制,支持修改、添加或删除基础内容
  • 声明式配置与复用

    Kustomize 使用 YAML 格式的 kustomization.yaml 文件描述定制规则,支持:

    • 资源引用与组合
    • 名称前后缀统一管理
    • 标签与注释批量添加
    • 环境变量与配置映射替换
    • 镜像标签动态修改

    通过组件与补丁(patches),实现配置的复用与跨项目共享,降低维护成本。

  • 多环境配置管理

    Kustomize 天然支持多环境部署,可为开发、测试、生产等环境创建专属覆盖(overlay)配置,实现一套基础配置适配多环境。

关键特性

  • 无模板定制 :无需模板语言即可修改清单
  • 基于覆盖(overlay)的配置 :通过补丁实现变体
  • 资源生成 :自动生成 ConfigMapsSecrets
  • 资源转换 :内置或自定义转换器
  • 插件系统 :支持多种插件扩展,扩展资源生成与转换能力。插件类型包括:
    • Generators :如 ConfigMapGeneratorSecretGenerator
    • Transformers :如 PatchTransformerNamespaceTransformer
    • Validators :资源校验插件
  • 变量替换 :运行时数据注入

自 Kubernetes 1.14 起,Kustomize 已内置于 kubectl ,提供原生配置管理能力。 kubectl 内置 Kustomize 版本随 Kubernetes 版本变化。

$ kubectl version --client
Client Version: v1.35.0
Kustomize Version: v5.7.1

Kustomize 相关常用命令

直接应用配置:

kubectl apply -k overlays/dev
kubectl apply --kustomize overlays/dev

预览生成的清单:

kubectl kustomize overlays/prod

查看配置差异:

kubectl diff -k overlays/prod

删除应用的资源:

kubectl delete -k overlays/dev
阅读全文 »

将源站的内容主动预取到 CDN 节点,用户首次访问可直接命中缓存,即提升首次访问速度,又能有效缓解源站压力。

  • 数据格式:请求和响应都支持 json/xml,xml 的参数与 json 的参数基本一致,json 的参数是驼峰分隔,xml 的参数是“-”分隔,详见示例。
  • 限制说明:每个账号的预取并发是 10,调高并发会增加回源的压力,请联系技术支持人员评估。
阅读全文 »

场景

远程登录 windows 失败,报错:

由于没有远程桌面授权服务器可以提供许可证,远程会话连接已断开,请跟服务器管理员联系

解决方法

  1. 打开 cmd,执行以下命令远程登录无法登录的 Windows 主机
    mstsc /v:1.1.1.1 /admin
  2. 打开注册表


3. 找到路径: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\RCM\GracePeriod.如果超过120天后RCM下面会有一个GracePeriod,先备份这项注册表,再删除除了默认的的注册表项。

  1. 重启电脑后生效.

HCL AppScan(原名IBM Security AppScan)是原IBM的Rational软件部门的一组网络安全测试和监控工具,2019年被HCL技术公司收购。AppScan旨在在开发过程中对Web应用程序的安全漏洞进行测试。

阅读全文 »