Codex + SSH 远程运维实战:让 AI 管你的云服务器

Codex + SSH 远程运维实战:让 AI 管你的云服务器 Codex SSH 远程运维实战让 AI 管你的云服务器从 Docker 部署到数据库调优从日志排查到安全加固——用 Codex CLI 通过 SSH 管理云服务器的完整实战指南。一、为什么用 Codex 做运维传统运维的痛点半夜报警睡眼惺忪敲命令手滑rm -rf的恐惧排查问题要同时盯 5 个终端窗口不熟悉的中间件如 pgvector需要现查文档配置调优参数太多试错成本高Codex 做运维的天然优势终端原生SSH 过去就是它的家不需要任何适配并行处理同时 tail 3 个日志文件 检查进程状态 分析错误模式知识广度Nginx、Docker、PostgreSQL、Redis、JVM……它都懂安全可控所有命令先展示再执行approval modeAGENTS.md 禁止危险操作二、环境准备2.1 服务器配置以 CentOS 7/Ubuntu 22.04 为例CPU: 4 核 内存: 8 GB 磁盘: 40 GB SSD 系统: Ubuntu 22.04 LTS2.2 本地 Codex 连接# 在 Codex CLI 中直接 SSHsshrootyour-server-ip# 或者用跳板机ssh-Jjump-userjump-ip roottarget-ip2.3 先让 Codex 摸清服务器底细连接后第一条指令非常重要——让 AI 先了解环境我检查当前服务器的操作系统、CPU、内存、磁盘、已安装的关键软件Docker、Java、Node.js生成一份环境报告Codex 会自主执行cat/etc/os-release lscpu|head-15free-hdf-hdocker--version2/dev/nulljava-version2/dev/nullnode--version2/dev/null这样后续的所有操作AI 都基于准确的环境信息做决策而不是瞎猜。三、Docker 环境部署3.1 让 Codex 安装 Docker Docker Compose我在这台 Ubuntu 22.04 上安装 Docker CE 和 Docker Compose v2。 使用官方源安装不要用 snap。安装完成后启动 Docker 并设置开机自启。 最后运行 docker run hello-world 验证。Codex 的执行流程# 1. 卸载旧版本apt-getremovedockerdocker-engine docker.io containerd runc# 2. 安装依赖apt-getupdateapt-getinstall-yca-certificatescurlgnupg# 3. 添加 Docker 官方 GPG keyinstall-m0755-d/etc/apt/keyringscurl-fsSLhttps://download.docker.com/linux/ubuntu/gpg|gpg--dearmor-o/etc/apt/keyrings/docker.gpg# 4. 添加仓库echodeb [arch$(dpkg --print-architecture)signed-by/etc/apt/keyrings/docker.gpg] \ https://download.docker.com/linux/ubuntu$(lsb_release-cs)stable|\tee/etc/apt/sources.list.d/docker.list# 5. 安装apt-getupdateapt-getinstall-ydocker-ce docker-ce-cli containerd.io\docker-buildx-plugin docker-compose-plugin# 6. 启动 验证systemctlenabledocker--nowdockerrun--rmhello-world为什么不用手敲Docker 官方安装步骤在不同 Linux 发行版上命令不同。Codex 会自动检测系统版本lsb_release -cs并拼接正确的源地址。光这一步省了 10 分钟查文档的时间。3.2 编写 docker-compose.ymlAIGrader 项目需要 PostgreSQL pgvector Redis。让 Codex 生成编排文件我为 AIGrader 项目编写 docker-compose.yml包含以下服务 1. PostgreSQL 16 pgvector 扩展数据库名 ai_grader用户 ai_grader密码通过环境变量注入 2. Redis 7选择 DB2 3. 两个服务都配置健康检查 4. 数据卷挂载到 /data/postgres 和 /data/redis 5. 网络使用自定义 bridge 网络 aigrader-netCodex 生成的docker-compose.ymlversion:3.8services:postgres:image:pgvector/pgvector:pg16container_name:aigrader-postgresenvironment:POSTGRES_DB:${DB_NAME:-ai_grader}POSTGRES_USER:${DB_USER:-ai_grader}POSTGRES_PASSWORD:${DB_PASSWORD}ports:-5432:5432volumes:-/data/postgres:/var/lib/postgresql/datahealthcheck:test:[CMD-SHELL,pg_isready -U ${DB_USER:-ai_grader} -d ${DB_NAME:-ai_grader}]interval:10stimeout:5sretries:5restart:unless-stoppednetworks:-aigrader-netredis:image:redis:7-alpinecontainer_name:aigrader-rediscommand:redis-server--appendonly yes--databases 16volumes:-/data/redis:/datahealthcheck:test:[CMD,redis-cli,-n,2,ping]interval:10stimeout:5sretries:5restart:unless-stoppednetworks:-aigrader-netnetworks:aigrader-net:driver:bridge然后 Codex 会执行# 创建 .env 文件敏感信息不提交cat.envEOF DB_NAMEai_grader DB_USERai_grader DB_PASSWORDai_grader123 EOF# 创建数据目录mkdir-p/data/postgres /data/redis# 启动dockercompose up-d# 验证dockercomposepsdockercompose logs--tail20四、数据库部署与初始化4.1 让 Codex 初始化数据库 SchemaAIGrader 用 JPA 的ddl-auto: update自动建表但种子数据需要手动导入。我连接到 PostgreSQL 容器执行 backend/src/main/resources/seed.sql 中的种子数据。 先检查 pgvector 扩展是否已启用如果没有则 CREATE EXTENSION vector。 导入后验证每张表的行数。Codex 实操# 进入容器dockerexec-itaigrader-postgresbash# 验证 pgvectorpsql-Uai_grader-dai_grader-cSELECT * FROM pg_extension WHERE extnamevector;# 如果没有则创建psql-Uai_grader-dai_grader-cCREATE EXTENSION IF NOT EXISTS vector;# 导入种子数据psql-Uai_grader-dai_grader-f/path/to/seed.sql# 验证psql-Uai_grader-dai_grader-c SELECT users as tbl, count(*) FROM users UNION ALL SELECT questions, count(*) FROM questions UNION ALL SELECT assignments, count(*) FROM assignments; 4.2 数据库连接池调优我检查当前 PostgreSQL 的最大连接数配置并根据 AIGrader 应用预计 20 并发来建议连接池参数。 修改 Spring Boot 的 application.yml 中的 HikariCP 配置。Codex 分析并建议# 查看当前配置dockerexecaigrader-postgres psql-Uai_grader-dai_grader-cSHOW max_connections;# → 100dockerexecaigrader-postgres psql-Uai_grader-dai_grader-c SELECT count(*) as active FROM pg_stat_activity WHERE state active; 建议的application.yml配置spring:datasource:hikari:maximum-pool-size:10# 20 并发 × 0.5 10经验公式minimum-idle:5# 保持 5 个空闲连接idle-timeout:300000# 5 分钟空闲回收connection-timeout:20000# 20 秒超时max-lifetime:1200000# 20 分钟最大生命周期五、项目部署Spring Boot React5.1 后端部署Dockerfile 构建我为 AIGrader 后端编写多阶段 Dockerfile 第一阶段用 maven:3.9-eclipse-temurin-21 构建 JAR 第二阶段用 eclipse-temurin:21-jre-alpine 运行 构建后推送到 Docker Hub在服务器上拉取并运行。Codex 编写的Dockerfile# 构建阶段 FROM maven:3.9-eclipse-temurin-21 AS builder WORKDIR /app COPY pom.xml . RUN mvn dependency:go-offline -B COPY src ./src RUN mvn package -DskipTests -B # 运行阶段 FROM eclipse-temurin:21-jre-alpine WORKDIR /app COPY --frombuilder /app/target/*.jar app.jar RUN addgroup -S appgroup adduser -S appuser -G appgroup USER appuser EXPOSE 8080 HEALTHCHECK --interval30s --timeout5s --retries3 \ CMD wget -qO- http://localhost:8080/actuator/health || exit 1 ENTRYPOINT [java, -jar, app.jar]服务器上的部署流程# Codex 在服务器上执行dockerbuild-taigrader-backend:latest.# 在前面的 docker-compose.yml 中添加后端服务catdocker-compose.ymlEOF backend: image: aigrader-backend:latest container_name: aigrader-backend environment: SPRING_DATASOURCE_URL: jdbc:postgresql://postgres:5432/ai_grader SPRING_DATASOURCE_USERNAME: ${DB_USER} SPRING_DATASOURCE_PASSWORD: ${DB_PASSWORD} SPRING_DATA_REDIS_HOST: redis SPRING_DATA_REDIS_PORT: 6379 DEEPSEEK_API_KEY: ${DEEPSEEK_API_KEY} JWT_SECRET: ${JWT_SECRET} ports: - 8080:8080 depends_on: postgres: condition: service_healthy redis: condition: service_healthy restart: unless-stopped networks: - aigrader-net EOFdockercompose up-dbackend5.2 前端部署Nginx 静态托管我前端是 React Vite 构建的静态文件。编写 Nginx 配置 1. 静态文件从 /usr/share/nginx/html 提供 2. /api/ 路径反向代理到后端 8080 端口 3. SPA 路由 fallback 到 index.html 4. 启用 gzip 压缩 5. 设置 charset utf-8 6. 配置 SSL如果有证书Codex 生成的nginx.confserver { listen 80; server_name your-domain.com; charset utf-8; gzip on; gzip_types text/plain text/css application/json application/javascript text/xml application/xml; root /usr/share/nginx/html; index index.html; # API 反向代理 location /api/ { proxy_pass http://backend:8080; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_read_timeout 120s; } # SPA fallback location / { try_files $uri $uri/ /index.html; } }然后 Codex 会执行# 构建前端cdfrontendpnpmbuild# 用 Docker 运行 Nginxdockerrun-d--nameaigrader-frontend\-v$(pwd)/dist:/usr/share/nginx/html:ro\-v$(pwd)/nginx.conf:/etc/nginx/conf.d/default.conf:ro\-p80:80\--networkaigrader-net\nginx:alpine六、日志检测与问题排查这是 Codex 做运维最强的场景——AI 天生擅长从海量文本中提取异常模式。6.1 多日志并行监控我同时监控以下日志发现 ERROR 或异常时立刻报告 1. Nginx 访问日志和错误日志 2. Spring Boot 应用日志 3. PostgreSQL 慢查询日志 持续监控 3 分钟。Codex 会并行执行# 终端 1Nginx 日志tail-f/var/log/nginx/access.log /var/log/nginx/error.log|grep--color-EERROR|5[0-9]{2}|4[0-9]{2}# 终端 2应用日志dockerlogs-faigrader-backend21|grep--color-EERROR|Exception|WARN# 终端 3数据库慢查询dockerexecaigrader-postgres psql-Uai_grader-dai_grader-c SELECT pid, now() - pg_stat_activity.query_start AS duration, query FROM pg_stat_activity WHERE state active AND now() - pg_stat_activity.query_start interval 1 seconds; 6.2 典型排查场景一502 Bad Gateway我Nginx 返回 502帮我排查原因。Codex 排查路径# 1. 先看 Nginx 错误日志tail-50/var/log/nginx/error.log# → connect() failed (111: Connection refused) while connecting to upstream# 2. 检查后端是否存活dockerps|grepbackend# → 没运行# 3. 查看后端退出原因dockerlogs--tail50aigrader-backend# → Caused by: java.net.UnknownHostException: redis# 4. 检查 Redisdockerps|grepredis# → 也没运行# 5. 根因Redis 和 PostgreSQL 先于后端崩溃# 修复重启全部服务dockercompose up-d从发现 502 到定位根因Codex 用了不到 30 秒。6.3 典型排查场景二AI 批改接口超时我学生反映提交作业后一直转圈检查 /api/submissions 接口为什么慢。Codex 排查路径# 1. 查看最近的请求日志dockerlogs--since5m aigrader-backend21|grep/api/submissions# 2. 发现 DeepSeek API 调用耗时 15 秒# → DeepSeek API response time: 15234ms# 3. 检查网络curl-w\ntime_total: %{time_total}\nhttps://api.deepseek.com/v1/chat/completions# 4. 建议增加超时时间 添加重试机制Codex 会直接修改配置并建议# application.ymlspring:ai:openai:chat:options:timeout:30s# 默认 10s → 30s七、配置调优7.1 JVM 参数调优我服务器 8G 内存只跑 AIGrader 后端这一个 Java 应用。请给出最优 JVM 参数。Codex 分析并给出# 在 Dockerfile 的 ENTRYPOINT 中java\-Xms2g-Xmx4g\# 初始 2G最大 4G留 4G 给 OS 和其他服务-XX:UseG1GC\# G1 垃圾回收器适合 4G 堆-XX:MaxGCPauseMillis200\# 最大 GC 暂停 200ms-XX:HeapDumpOnOutOfMemoryError\# OOM 时 dump 堆-XX:HeapDumpPath/tmp/heapdump.hprof\-jarapp.jar还会顺带检查当前 GC 情况dockerexecaigrader-backend jstat-gcutil110005# → 显示各代使用率、GC 次数和耗时7.2 Nginx 性能调优我当前服务器 4 核Nginx 作为前端反向代理。请优化 Nginx 配置。Codex 配置# /etc/nginx/nginx.conf user nginx; worker_processes auto; # 自动匹配 CPU 核数 worker_rlimit_nofile 65535; # 最大文件描述符 events { worker_connections 4096; # 每个 worker 的连接数 use epoll; # Linux 下高效事件模型 multi_accept on; # 一次接受多个连接 } http { # 基础优化 sendfile on; tcp_nopush on; tcp_nodelay on; keepalive_timeout 65; types_hash_max_size 2048; # 缓冲区 client_body_buffer_size 128k; client_max_body_size 10m; # 允许 10MB 上传作业附件 # 连接池 upstream backend { server backend:8080; keepalive 32; # 保持 32 个长连接到后端 } # Gzip gzip on; gzip_vary on; gzip_min_length 1024; gzip_comp_level 5; gzip_types text/plain text/css application/json application/javascript text/xml; }7.3 PostgreSQL 参数调优我服务器 8G 内存PostgreSQL 在 Docker 容器中运行。请调优 postgresql.conf。Codex 给出的关键参数# postgresql.conf通过 Docker 环境变量设置 shared_buffers 2GB # 25% 总内存 effective_cache_size 6GB # 75% 总内存 work_mem 64MB # 单查询排序内存 maintenance_work_mem 512MB # VACUUM 维护内存 random_page_cost 1.1 # SSD 环境降低随机读成本 effective_io_concurrency 200 # SSD 并发 IO max_connections 50 # 限制连接数Docker Compose 中添加postgres:command:-c shared_buffers2GB -c effective_cache_size6GB -c work_mem64MB -c maintenance_work_mem512MB -c random_page_cost1.1 -c max_connections50八、安全加固8.1 让 Codex 做安全审计我对这台服务器进行基本的安全审计检查 SSH 配置、防火墙状态、开放端口、Docker 安全配置。Codex 审计清单# SSH 配置grep-E^PermitRootLogin|^PasswordAuthentication|^Port/etc/ssh/sshd_config# 建议PermitRootLogin no, PasswordAuthentication no仅密钥登录# 防火墙ufw status verbose# 建议只开放 22, 80, 443# 开放端口ss-tlnp# 检查 Redis 是否绑定到 0.0.0.0危险# Docker 安全dockerinfo|grep-ERoot Dir|Cgroupdockerrun--rmaquasec/trivy image aigrader-backend:latest8.2 一键生成安全配置我生成 ufw 规则、SSH 加固配置、Redis 安全配置、Docker 非 root 运行配置。Codex 执行# UFW 防火墙ufw default deny incoming ufw default allow outgoing ufw allow22/tcp# SSHufw allow80/tcp# HTTPufw allow443/tcp# HTTPSufw--forceenable# SSH 加固cat/etc/ssh/sshd_configEOF PermitRootLogin prohibit-password PasswordAuthentication no MaxAuthTries 3 ClientAliveInterval 300 ClientAliveCountMax 2 EOFsystemctl reload sshd# Redis 安全绑定到 Docker 内部网络不暴露外网# docker-compose.yml 中去掉 ports只保留内部网络通信# Docker 非 root 用户Dockerfile 中已添加 appuser九、运维 Checklist 模板每次新项目部署时直接把这个 Checklist 丢给 Codex帮我完成以下运维任务 □ 检查系统环境OS/CPU/内存/磁盘 □ 安装 Docker Docker Compose □ 编写 docker-compose.ymlPostgreSQL Redis 应用 □ 初始化数据库建表 种子数据 □ 构建后端 Docker 镜像并推送 □ 编写 Nginx 配置反向代理 SPA gzip □ 启动全部服务 □ 配置防火墙规则 □ 进行基本安全审计 □ 配置日志轮转 □ 设置自动健康检查 □ 配置监控告警CPU 80% / 内存 90% / 磁盘 85%十、总结Codex 运维的三个层次层次一命令执行者我重启 NginxCodex 就是个高级systemctl帮你敲命令。这层价值不大。层次二问题诊断者我用户反馈访问慢帮我查Codex 并行检查 CPU、内存、磁盘 IO、数据库慢查询、应用日志综合诊断。这层已经超过大多数初级运维。层次三架构决策者我我的应用日均 DAU 1000现在一切正常。如果 DAU 涨到 10000我需要做什么Codex 从连接池、缓存策略、数据库索引、负载均衡、CDN 等多维度给出扩容方案。这层是真正的AI 运维专家。关键心法越模糊的问题Codex 越能发挥价值——因为它可以自由收集信息、建立关联、给出方案。你给它的空间越大它越能干。下一篇预告《约束即代码AGENTS.md 深度设计指南》— 三层约束体系的设计方法论从行为边界到代码规范到任务调度让你的 AI Agent 永远不跑偏。