9Router 云部署实战:VPS、Docker 与 Nginx 反向代理全流程指南

9Router 云部署实战:VPS、Docker 与 Nginx 反向代理全流程指南 9Router 云部署实战VPS、Docker 与 Nginx 反向代理全流程指南【免费下载链接】9routerUnlimited FREE AI coding. Connect Claude Code, Codex, Cursor, Cline, Copilot, Antigravity to FREE Claude/GPT/Gemini via 40 providers. Auto-fallback, RTK -40% tokens, never hit limits.项目地址: https://gitcode.com/GitHub_Trending/9r/9router本文以 9Router 的云端部署为主线系统讲解如何将 9Router 部署到 VPS 或 Docker 容器中实现远程访问与生产环境长期运行从环境准备、依赖安装、环境变量配置到 PM2 进程守护、Docker Compose 编排、Nginx 反向代理与 HTTPS 加密再到防火墙、备份、监控与故障排查。读完本文你将掌握一套可直接照抄到生产服务器的完整部署与运维方案并理解 9Router 的端口约定、数据目录机制和登录鉴权在部署环节的真实行为。部署前必读9Router 的端口、端点与数据目录在开始任何部署之前先厘清 9Router 在仓库中的真实运行约定这决定了后续所有配置的正确性Web 面板与 API 服务仓库根目录的 package.json 中dev与start脚本默认监听20127端口而 Dockerfile 通过ENV PORT20128将生产容器端口设置为20128docker-compose.yml与 start.sh 也统一映射20128。当前仓库以20128 为生产/容器默认端口文档与 README 中面板地址为http://localhost:20128/dashboardOpenAI 兼容 API 端点为http://localhost:20128/v1。原部署文档中出现的 3000 端口属于旧约定部署时请以 20128或你通过PORT环境变量覆盖的值为准。API 路径重写next.config.mjs 将/v1/:path*、/responses、/v1beta等路径统一 rewrite 到内部/api/*处理器因此客户端Claude Code、Codex、Cursor 等只需把 Base URL 指向http://服务器:20128/v1。数据目录src/lib/dataDir.js 表明DATA_DIR未设置时默认为~/.9routerLinux/macOSDocker 镜像内则固定为/app/data。数据库、jwt-secret密钥文件、设置等都存放在该目录备份时只需备份它。VPS 部署全流程前置条件Ubuntu 20.04 或同类 Linux 发行版Node.js 20 及以上当前仓库依赖 Next.js 16见 package.json建议使用 LTS 版本Gitroot 或 sudo 权限步骤 1克隆仓库当前仓库根目录即应用本体package.json中 name 为9router-app克隆后无需再进入app子目录git clone https://gitcode.com/GitHub_Trending/9r/9router.git cd 9router步骤 2安装依赖npm install说明better-sqlite3被放在optionalDependencies中见 package.json即使服务器缺少编译工具导致该原生模块安装失败运行时也会自动回退到sql.js纯 JS 实现不会阻断安装。步骤 3构建生产包npm run buildpackage.json 中build为next build --webpacknext.config.mjs 配置了output: standalone构建产物可直接用于 standalone 运行这也是 Docker 镜像的基础。步骤 4配置环境变量创建.env文件或直接 export 变量export JWT_SECRETyour-secure-secret-change-this-to-random-string export INITIAL_PASSWORDyour-secure-password export DATA_DIR/var/lib/9router export NODE_ENVproduction环境变量一览变量默认值说明JWT_SECRET自动生成生产环境务必自行设置用于签署面板登录 JWT tokenINITIAL_PASSWORD123456面板登录初始密码仅首次/未在设置中改密时生效DATA_DIR~/.9router数据库与数据文件存储路径NODE_ENVdevelopment部署时应设为productionENABLE_REQUEST_LOGSfalse开启请求/响应调试日志排查问题时使用源码级说明来自 src/lib/auth/dashboardSession.js若未设置JWT_SECRET服务会尝试读取DATA_DIR/jwt-secret文件文件不存在时用crypto.randomBytes(32)自动生成并写入该文件权限0600。自动生成的密钥随数据目录走换机器或删数据目录后 token 会全部失效这也是生产环境建议显式设置JWT_SECRET的原因。登录 token 采用 HS256 签名有效期 24 小时Cookie 为httpOnly并依据x-forwarded-proto或AUTH_COOKIE_SECUREtrue自动决定是否启用Secure标记这正好与后文 Nginx 终结 HTTPS 配合。在 src/app/api/auth/login/route.js 中INITIAL_PASSWORD仅在没有存储密码时作为兜底一旦在面板中设置过密码将以 bcrypt 哈希校验为准。若远程客户端使用默认密码登录接口会返回mustChangePassword强制先改密再使用面板。步骤 5创建数据目录sudo mkdir -p /var/lib/9router sudo chown $USER:$USER /var/lib/9router步骤 6启动应用npm run start启动后服务默认监听20127端口如需改为20128可叠加环境变量PORT20128 HOSTNAME0.0.0.0 npm run start步骤 7用 PM2 守护生产进程PM2 能保持应用常驻并在崩溃时自动重启# 全局安装 PM2 npm install -g pm2 # 用 PM2 启动 9Router pm2 start npm --name 9router -- start # 保存 PM2 进程配置 pm2 save # 配置开机自启 pm2 startup # 执行上方命令输出的指令即可PM2 常用管理命令# 查看日志 pm2 logs 9router # 重启应用 pm2 restart 9router # 停止应用 pm2 stop 9router # 查看状态 pm2 status # 监控资源占用 pm2 monitDocker 部署选项 1使用仓库内置 Dockerfile仓库根目录已提供生产级多阶段 Dockerfile其关键设计值得了解基础镜像为node:22-alpine构建阶段额外安装python3 make g linux-headers以支持原生模块编译基于next build的 standalone 产物构建运行镜像体积更小运行阶段以custom-server.js作为入口CMD [node, custom-server.js]该文件见 custom-server.js会剥除客户端伪造的X-Forwarded-For等头仅信任来自本机回环反向代理的转发头防止攻击者伪造 IP 绕过登录限流EXPOSE 20128内置/entrypoint.sh在容器启动时自动修正挂载卷的属主权限。构建与运行# 构建镜像 docker build -t 9router . # 运行容器 docker run -d \ --name 9router \ -p 20128:20128 \ -e JWT_SECRETyour-secure-secret-change-this \ -e INITIAL_PASSWORDyour-secure-password \ -v 9router-data:/app/data \ 9router仓库另附 start.sh封装了「停旧容器 → 删旧容器 → 重建 → 运行」的完整更新流程可直接参考。选项 2自建 Dockerfile文档示例方案若希望按自己的镜像规范来构建可以参考以下等效 DockerfileFROM node:20-alpine WORKDIR /app # 复制依赖清单 COPY package*.json ./ # 仅安装生产依赖 RUN npm ci --onlyproduction # 复制应用源码 COPY . . # 构建应用 RUN npm run build # 暴露端口 EXPOSE 20128 # 设置环境变量 ENV NODE_ENVproduction ENV DATA_DIR/app/data # 创建数据目录 RUN mkdir -p /app/data # 启动应用 CMD [npm, run, start]构建与运行# 构建镜像 docker build -t 9router . # 运行容器 docker run -d \ --name 9router \ -p 20128:20128 \ -e JWT_SECRETyour-secure-secret-change-this \ -e INITIAL_PASSWORDyour-secure-password \ -v 9router-data:/app/data \ 9router选项 3Docker Compose 编排仓库根目录自带 docker-compose.yml直接基于官方镜像decolua/9router:latest并附带 headroom 服务9Router 的 token 优化组件监听 8787通过HEADROOM_URL联动适合一键启动完整环境# 启动全部服务 docker-compose up -d # 查看日志 docker-compose logs -f # 停止全部服务 docker-compose down # 重新构建并重启 docker-compose up -d --build也可以按以下等效配置自行编写注意端口按当前仓库约定修正为 20128version: 3.8 services: 9router: image: decolua/9router:latest container_name: 9router ports: - 20128:20128 environment: - NODE_ENVproduction - JWT_SECRETyour-secure-secret-change-this - INITIAL_PASSWORDyour-secure-password - DATA_DIR/app/data volumes: - 9router-data:/app/data restart: unless-stopped volumes: 9router-data:Nginx 反向代理与 HTTPS为什么需要 NginxSSL/TLS 终结域名绑定与虚拟主机管理负载均衡扩展安全加固隐藏后端端口、统一入口步骤 1安装 Nginxsudo apt update sudo apt install nginx步骤 2编写 Nginx 配置创建/etc/nginx/sites-available/9routerserver { listen 80; server_name your-domain.com; # HTTP 跳转 HTTPS return 301 https://$server_name$request_uri; } server { listen 443 ssl http2; server_name your-domain.com; # SSL 证书可用 certbot 生成 ssl_certificate /etc/letsencrypt/live/your-domain.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/your-domain.com/privkey.pem; # SSL 配置 ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers HIGH:!aNULL:!MD5; ssl_prefer_server_ciphers on; # 面板与首页代理到 9Router Web 服务 location / { proxy_pass http://localhost:20128; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection upgrade; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_cache_bypass $http_upgrade; # SSE 支持 —— 流式响应关键配置 proxy_buffering off; proxy_read_timeout 86400; } # OpenAI 兼容 API 端点 location /v1 { proxy_pass http://localhost:20128; proxy_http_version 1.1; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; # SSE 支持 —— 流式响应关键配置 proxy_buffering off; proxy_read_timeout 86400; } }端口说明此处proxy_pass指向20128Docker 与生产默认端口。若你通过npm run start直接运行默认 20127请相应改为http://localhost:20127。X-Forwarded-Proto必须正确传递9Router 会据此给登录 Cookie 打上Secure标记见 src/lib/auth/dashboardSession.js。步骤 3启用站点# 创建符号链接 sudo ln -s /etc/nginx/sites-available/9router /etc/nginx/sites-enabled/ # 测试配置语法 sudo nginx -t # 重载 Nginx sudo systemctl reload nginx步骤 4用 Lets Encrypt 签发 SSL 证书# 安装 certbot sudo apt install certbot python3-certbot-nginx # 获取证书并自动改写 Nginx 配置 sudo certbot --nginx -d your-domain.com # 自动续期默认已配置验证续期流程 sudo certbot renew --dry-run生产环境安全加固1. 更换默认凭据重要部署前必须修改JWT_SECRET与INITIAL_PASSWORD# 生成强随机 JWT 密钥 openssl rand -base64 32 # 将输出值填入 JWT_SECRET export JWT_SECRETgenerated-secret-here配合 src/app/api/auth/login/route.js 的源码行为一并理解安全边界默认密码123456只在「未设置存储密码」时生效远程登录且仍在使用默认密码时接口会强制要求改密同一 IP 连续失败会触发登录限流返回 429 与Retry-After头。即便如此公网环境也务必在第一时间改掉默认密码。2. 配置防火墙# 放行 SSH sudo ufw allow 22/tcp # 放行 HTTP/HTTPS使用 Nginx 时 sudo ufw allow 80/tcp sudo ufw allow 443/tcp # 若未使用反向代理放行 9Router 端口 sudo ufw allow 20128/tcp # 启用防火墙 sudo ufw enable3. 限制面板访问如果只需要 API 而无需对外暴露 Web 面板可以只放行 API 端口、把面板端口仅对 localhost 开放# 仅允许本机访问面板 sudo ufw deny 20128/tcp # 若面板与 API 同端口则通过 Nginx location 层面控制更稳妥的做法是在 Nginx 层面对面板路径做 IP 白名单或通过 SSH 隧道访问面板ssh -L 20128:localhost:20128 useryour-server.com # 浏览器打开 http://localhost:20128 即可4. 定期更新# 更新系统软件包 sudo apt update sudo apt upgrade -y # 更新 9Router cd /path/to/9router git pull npm install npm run build pm2 restart 9routerDocker 部署下对应为docker-compose pull docker-compose up -d --build5. 备份策略数据全在DATA_DIR如/var/lib/9router备份它即可# 手动打包备份 tar -czf 9router-backup-$(date %Y%m%d).tar.gz /var/lib/9router # 写入 crontab 实现每日自动备份 0 2 * * * tar -czf /backups/9router-$(date \%Y\%m\%d).tar.gz /var/lib/9router监控与运维应用状态检查# PM2 状态 pm2 status # 查看最近 100 行日志 pm2 logs 9router --lines 100 # 资源监控 pm2 monitNginx 日志# 访问日志 sudo tail -f /var/log/nginx/access.log # 错误日志 sudo tail -f /var/log/nginx/error.log系统资源# CPU 与内存 htop # 磁盘占用 df -h # 端口监听确认重点核对 20127/20128 与 443 netstat -tulpn | grep -E 20127|20128|443故障排查应用无法启动# 查看应用日志 pm2 logs 9router # 检查端口是否被占用 sudo lsof -i :20128 sudo lsof -i :20127 # 核对注入的环境变量 pm2 env 9routerNginx 502 Bad Gateway# 确认 9Router 在运行 pm2 status # 查看 Nginx 错误日志 sudo tail -f /var/log/nginx/error.log # 校验 Nginx 配置 sudo nginx -tSSE 流式响应不生效确认 Nginx 配置中proxy_buffering off已开启且proxy_read_timeout足够大如86400。9Router 的对话与推理输出依赖 SSE 长连接所有/v1流式请求都走这条链路关闭缓冲是必须项。Permission Denied 错误数据目录属主或权限不正确导致写入失败# 修正数据目录权限 sudo chown -R $USER:$USER /var/lib/9router chmod 755 /var/lib/9routerDocker 场景下可依赖内置/entrypoint.sh自动修正挂载卷属主若自定义镜像请确保容器内用户对/app/data有写权限。下一步接入 Provider、Combo 与工具完成部署后可继续配置核心能力连接 Provider订阅导入在面板中添加并管理 40 免费 Provider 的登录凭证配置 Combo 自动切换组合多个 Provider 实现自动回退彻底摆脱限流工具与集成Cursor 等将 Claude Code、Codex、Cursor、Cline 等客户端指向你部署好的https://your-domain.com/v1端点。【免费下载链接】9routerUnlimited FREE AI coding. Connect Claude Code, Codex, Cursor, Cline, Copilot, Antigravity to FREE Claude/GPT/Gemini via 40 providers. Auto-fallback, RTK -40% tokens, never hit limits.项目地址: https://gitcode.com/GitHub_Trending/9r/9router创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考