AI浏览器上线实战:从服务器初始化到HTTPS、备份与安全加固全流程部署命令
AI浏览器 生产环境部署指南|附完整命令
在 AI 应用快速落地的背景下,“AI 浏览器”正在成为企业内部知识检索、网页自动化、智能问答、任务代理和数据采集的重要入口。它通常不是一个单纯的浏览器,而是由 前端 Web 界面、后端 API 服务、AI 模型调用层、浏览器自动化执行环境、数据库、缓存、对象存储、反向代理与监控系统 共同组成的一套生产级应用。
本文将以一个典型的 AI 浏览器项目为例,讲解如何在 Linux 服务器上完成生产环境部署。内容覆盖服务器准备、Docker 安装、项目目录规划、环境变量配置、Nginx 反向代理、HTTPS 证书、Docker Compose 编排、服务启动、日志查看、升级回滚与安全加固,并附上完整命令。
说明:本文命令以 Ubuntu 22.04 LTS 为例,其他 Linux 发行版可根据包管理器适当调整。
一、AI 浏览器生产架构说明
一个较完整的 AI 浏览器生产环境通常包含以下模块:
| 模块 | 作用 |
|---|---|
| Web 前端 | 用户访问入口,例如聊天界面、网页浏览器界面、任务面板 |
| API 后端 | 处理用户请求、鉴权、任务调度、AI 调用 |
| Browser Worker | 负责运行无头浏览器,如 Chromium / Playwright / Puppeteer |
| Redis | 缓存、任务队列、会话状态 |
| PostgreSQL | 存储用户、任务、历史记录、配置等数据 |
| 对象存储 | 保存截图、文件、网页快照,可使用 MinIO 或云厂商 OSS |
| Nginx | 反向代理、HTTPS、静态资源服务 |
| LLM Provider | OpenAI、Claude、Gemini、本地大模型或私有模型网关 |
| 监控日志 | Prometheus、Grafana、Loki 或基础日志方案 |
生产部署的核心目标是:
- 服务稳定运行;
- 支持自动重启;
- 支持 HTTPS;
- 敏感配置不写死在代码中;
- 具备日志排查能力;
- 可升级、可回滚;
- 有基本安全策略。
二、服务器配置建议
如果只是内部小规模使用,建议最低配置如下:
| 场景 | CPU | 内存 | 磁盘 |
|---|---|---|---|
| 测试环境 | 2 核 | 4 GB | 40 GB |
| 小型生产 | 4 核 | 8 GB | 80 GB |
| 中型生产 | 8 核 | 16 GB | 200 GB |
| 高频浏览器自动化 | 8 核以上 | 32 GB 以上 | 300 GB 以上 |
AI 浏览器中最消耗资源的通常不是普通 API,而是 Browser Worker。如果大量任务同时打开网页、截图、解析 DOM 或执行自动化操作,内存会增长很快。因此建议将浏览器执行服务与主 API 服务拆开部署,后续可水平扩展 Worker 节点。
三、初始化服务器环境
首先登录服务器。
ssh root@your-server-ip
更新系统软件包:
apt update && apt upgrade -y
安装常用工具:
apt install -y \
curl \
wget \
git \
vim \
htop \
unzip \
ufw \
ca-certificates \
gnupg \
lsb-release \
software-properties-common
设置时区:
timedatectl set-timezone Asia/Shanghai
timedatectl status
创建普通部署用户,避免长期使用 root 运行项目:
adduser deploy
usermod -aG sudo deploy
切换到部署用户:
su - deploy
四、安装 Docker 与 Docker Compose
生产环境推荐使用 Docker Compose 进行服务编排,便于统一管理前端、后端、数据库、Redis 和浏览器 Worker。
安装 Docker 官方源:
sudo apt update
sudo apt install -y ca-certificates curl gnupg
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | \
sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] \
https://download.docker.com/linux/ubuntu \
$(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
安装 Docker:
sudo apt update
sudo apt install -y \
docker-ce \
docker-ce-cli \
containerd.io \
docker-buildx-plugin \
docker-compose-plugin
将当前用户加入 docker 用户组:
sudo usermod -aG docker $USER
重新登录后验证:
docker version
docker compose version
如果不想重新登录,也可以执行:
newgrp docker
五、规划项目目录
推荐将生产应用统一放在 /opt 或部署用户家目录下。这里以 /opt/ai-browser 为例。
sudo mkdir -p /opt/ai-browser
sudo chown -R deploy:deploy /opt/ai-browser
cd /opt/ai-browser
创建目录结构:
mkdir -p \
nginx/conf.d \
nginx/certs \
postgres/data \
redis/data \
minio/data \
logs/api \
logs/worker \
uploads \
backups
建议最终目录如下:
/opt/ai-browser
├── docker-compose.yml
├── .env
├── nginx
│ ├── conf.d
│ │ └── ai-browser.conf
│ └── certs
├── postgres
│ └── data
├── redis
│ └── data
├── minio
│ └── data
├── uploads
├── logs
│ ├── api
│ └── worker
└── backups
六、准备环境变量文件
创建 .env 文件:
cd /opt/ai-browser
vim .env
写入以下内容,并根据实际情况修改:
# 基础配置
APP_ENV=production
APP_NAME=ai-browser
APP_PORT=3000
API_PORT=8080
DOMAIN=ai.example.com
# 数据库配置
POSTGRES_DB=ai_browser
POSTGRES_USER=ai_browser_user
POSTGRES_PASSWORD=PleaseChangeThisStrongPassword
POSTGRES_HOST=postgres
POSTGRES_PORT=5432
# Redis 配置
REDIS_HOST=redis
REDIS_PORT=6379
REDIS_PASSWORD=PleaseChangeRedisPassword
# JWT / Session 密钥
JWT_SECRET=PleaseChangeJwtSecretAtLeast32Chars
SESSION_SECRET=PleaseChangeSessionSecretAtLeast32Chars
# AI 模型配置
LLM_PROVIDER=openai
OPENAI_API_KEY=sk-xxxxxxxxxxxxxxxxxxxxxxxx
OPENAI_BASE_URL=https://api.openai.com/v1
OPENAI_MODEL=gpt-4o-mini
# 浏览器 Worker 配置
BROWSER_HEADLESS=true
BROWSER_CONCURRENCY=3
BROWSER_TIMEOUT_MS=60000
# 对象存储 MinIO
MINIO_ROOT_USER=minioadmin
MINIO_ROOT_PASSWORD=PleaseChangeMinioPassword
MINIO_BUCKET=ai-browser
# 文件上传
UPLOAD_DIR=/app/uploads
MAX_UPLOAD_SIZE_MB=50
# 日志级别
LOG_LEVEL=info
修改权限,避免敏感配置被其他用户读取:
chmod 600 .env
注意:生产环境中不要把
.env提交到 Git 仓库。API Key、数据库密码、JWT 密钥必须通过环境变量或密钥管理服务管理。
七、编写 Docker Compose 文件
创建 docker-compose.yml:
vim docker-compose.yml
写入以下内容:
services:
nginx:
image: nginx:1.25-alpine
container_name: ai-browser-nginx
restart: always
ports:
- "80:80"
- "443:443"
volumes:
- ./nginx/conf.d:/etc/nginx/conf.d
- ./nginx/certs:/etc/nginx/certs
- ./uploads:/var/www/uploads
depends_on:
- web
- api
networks:
- ai-browser-net
web:
image: your-registry/ai-browser-web:latest
container_name: ai-browser-web
restart: always
env_file:
- .env
expose:
- "3000"
networks:
- ai-browser-net
api:
image: your-registry/ai-browser-api:latest
container_name: ai-browser-api
restart: always
env_file:
- .env
expose:
- "8080"
volumes:
- ./uploads:/app/uploads
- ./logs/api:/app/logs
depends_on:
- postgres
- redis
- minio
networks:
- ai-browser-net
worker:
image: your-registry/ai-browser-worker:latest
container_name: ai-browser-worker
restart: always
env_file:
- .env
shm_size: "1gb"
volumes:
- ./uploads:/app/uploads
- ./logs/worker:/app/logs
depends_on:
- api
- redis
networks:
- ai-browser-net
postgres:
image: postgres:16-alpine
container_name: ai-browser-postgres
restart: always
environment:
POSTGRES_DB: ${POSTGRES_DB}
POSTGRES_USER: ${POSTGRES_USER}
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
volumes:
- ./postgres/data:/var/lib/postgresql/data
expose:
- "5432"
networks:
- ai-browser-net
redis:
image: redis:7-alpine
container_name: ai-browser-redis
restart: always
command: >
redis-server
--appendonly yes
--requirepass ${REDIS_PASSWORD}
volumes:
- ./redis/data:/data
expose:
- "6379"
networks:
- ai-browser-net
minio:
image: minio/minio:latest
container_name: ai-browser-minio
restart: always
command: server /data --console-address ":9001"
environment:
MINIO_ROOT_USER: ${MINIO_ROOT_USER}
MINIO_ROOT_PASSWORD: ${MINIO_ROOT_PASSWORD}
volumes:
- ./minio/data:/data
expose:
- "9000"
- "9001"
networks:
- ai-browser-net
networks:
ai-browser-net:
driver: bridge
这里的 your-registry/ai-browser-web:latest、your-registry/ai-browser-api:latest、your-registry/ai-browser-worker:latest 需要替换成你自己的镜像地址。
如果你的项目是从源码部署,也可以改成 build 方式,例如:
web:
build:
context: ./frontend
dockerfile: Dockerfile
但生产环境更推荐使用 CI/CD 构建镜像,然后在服务器拉取固定版本镜像。
八、配置 Nginx 反向代理
创建 Nginx 配置:
vim nginx/conf.d/ai-browser.conf
如果暂时没有 HTTPS 证书,可先使用 HTTP 配置:
server {
listen 80;
server_name ai.example.com;
client_max_body_size 50m;
location / {
proxy_pass http://web:3000;
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;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
location /api/ {
proxy_pass http://api:8080/;
proxy_http_version 1.1;
proxy_connect_timeout 60s;
proxy_send_timeout 120s;
proxy_read_timeout 120s;
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;
}
location /uploads/ {
alias /var/www/uploads/;
autoindex off;
}
}
将 ai.example.com 替换为你的真实域名。
九、配置防火墙
开启 UFW:
sudo ufw allow OpenSSH
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw enable
查看状态:
sudo ufw status
生产环境中不建议直接开放 PostgreSQL、Redis、MinIO 内部端口。如果确实需要外部访问,应限制来源 IP:
sudo ufw allow from 你的固定IP to any port 5432 proto tcp
十、首次启动服务
进入项目目录:
cd /opt/ai-browser
拉取镜像:
docker compose pull
启动服务:
docker compose up -d
查看容器状态:
docker compose ps
查看日志:
docker compose logs -f nginx
docker compose logs -f api
docker compose logs -f worker
docker compose logs -f postgres
docker compose logs -f redis
如果服务启动正常,可以测试接口:
curl -I http://127.0.0.1
或者从本地浏览器访问:
http://ai.example.com
十一、初始化数据库
不同项目的数据库迁移命令可能不同。下面给出常见方式。
如果后端是 Node.js 项目,可能是:
docker compose exec api npm run migrate
docker compose exec api npm run seed
如果使用 Prisma:
docker compose exec api npx prisma migrate deploy
docker compose exec api npx prisma db seed
如果是 Python 项目,可能是 Alembic:
docker compose exec api alembic upgrade head
如果是 Django:
docker compose exec api python manage.py migrate
docker compose exec api python manage.py collectstatic --noinput
创建管理员账号的命令通常类似:
docker compose exec api npm run create-admin
或者:
docker compose exec api python manage.py createsuperuser
你需要根据项目实际技术栈替换对应命令。
十二、配置 HTTPS 证书
生产环境必须使用 HTTPS。这里推荐使用 Certbot 自动签发 Let’s Encrypt 证书。
先安装 Certbot:
sudo apt install -y certbot
由于当前 Nginx 在 Docker 容器内运行,最简单的方式是先临时停止 Nginx 容器,让 Certbot 使用 80 端口签发证书:
cd /opt/ai-browser
docker compose stop nginx
签发证书:
sudo certbot certonly --standalone \
-d ai.example.com \
--email admin@example.com \
--agree-tos \
--no-eff-email
证书默认位于:
/etc/letsencrypt/live/ai.example.com/
复制证书到项目目录:
sudo cp /etc/letsencrypt/live/ai.example.com/fullchain.pem /opt/ai-browser/nginx/certs/fullchain.pem
sudo cp /etc/letsencrypt/live/ai.example.com/privkey.pem /opt/ai-browser/nginx/certs/privkey.pem
sudo chown -R deploy:deploy /opt/ai-browser/nginx/certs
chmod 600 /opt/ai-browser/nginx/certs/privkey.pem
修改 Nginx 配置:
vim /opt/ai-browser/nginx/conf.d/ai-browser.conf
替换为 HTTPS 配置:
server {
listen 80;
server_name ai.example.com;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl http2;
server_name ai.example.com;
ssl_certificate /etc/nginx/certs/fullchain.pem;
ssl_certificate_key /etc/nginx/certs/privkey.pem;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers on;
client_max_body_size 50m;
location / {
proxy_pass http://web:3000;
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 https;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
location /api/ {
proxy_pass http://api:8080/;
proxy_http_version 1.1;
proxy_connect_timeout 60s;
proxy_send_timeout 120s;
proxy_read_timeout 120s;
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 https;
}
location /uploads/ {
alias /var/www/uploads/;
autoindex off;
}
}
重新启动 Nginx:
cd /opt/ai-browser
docker compose up -d nginx
测试 HTTPS:
curl -I https://ai.example.com
十三、配置证书自动续期
Let’s Encrypt 证书有效期通常为 90 天,需要定期续期。
创建续期脚本:
sudo vim /usr/local/bin/renew-ai-browser-cert.sh
写入:
#!/usr/bin/env bash
set -e
DOMAIN="ai.example.com"
APP_DIR="/opt/ai-browser"
cd "$APP_DIR"
docker compose stop nginx
certbot renew --standalone
cp /etc/letsencrypt/live/$DOMAIN/fullchain.pem $APP_DIR/nginx/certs/fullchain.pem
cp /etc/letsencrypt/live/$DOMAIN/privkey.pem $APP_DIR/nginx/certs/privkey.pem
chown -R deploy:deploy $APP_DIR/nginx/certs
chmod 600 $APP_DIR/nginx/certs/privkey.pem
docker compose up -d nginx
授权执行:
sudo chmod +x /usr/local/bin/renew-ai-browser-cert.sh
加入定时任务:
sudo crontab -e
添加:
0 3 * * 1 /usr/local/bin/renew-ai-browser-cert.sh >> /var/log/renew-ai-browser-cert.log 2>&1
这表示每周一凌晨 3 点执行一次续期检查。
十四、浏览器 Worker 的生产注意事项
AI 浏览器往往需要运行 Chromium。生产环境中需要特别关注以下几点:
1. 设置 shm_size
无头浏览器在 Docker 中运行时容易因为 /dev/shm 太小导致崩溃,因此 Compose 中建议配置:
shm_size: "1gb"
2. 控制并发
不要无限制启动浏览器实例。可以通过环境变量控制:
BROWSER_CONCURRENCY=3
如果服务器内存为 8GB,建议从 2 到 3 开始测试;如果是 16GB,可根据实际情况提升到 5 到 8。
3. 设置任务超时
网页加载、AI 分析、截图等任务都应设置超时,避免任务永久挂起:
BROWSER_TIMEOUT_MS=60000
4. 禁止访问内网敏感地址
如果 AI 浏览器允许用户输入 URL,就必须防止 SSRF 风险。例如应禁止访问:
127.0.0.1
localhost
169.254.169.254
10.0.0.0/8
172.16.0.0/12
192.168.0.0/16
否则攻击者可能通过浏览器代理访问云服务器元数据接口或内部管理系统。
十五、日志查看与问题排查
查看所有服务日志:
cd /opt/ai-browser
docker compose logs -f
查看最近 200 行 API 日志:
docker compose logs --tail=200 api
查看 Worker 错误:
docker compose logs --tail=300 worker | grep -i error
查看容器资源占用:
docker stats
进入 API 容器:
docker compose exec api sh
进入 PostgreSQL:
docker compose exec postgres psql -U ai_browser_user -d ai_browser
进入 Redis:
docker compose exec redis redis-cli -a PleaseChangeRedisPassword
测试 Redis:
PING
如果页面打不开,按以下顺序排查:
- 域名是否解析到服务器 IP;
- 防火墙是否开放 80 和 443;
- Nginx 容器是否正常;
- Web 容器是否正常;
- Nginx 配置里的 upstream 地址是否正确;
- HTTPS 证书路径是否正确;
- 后端 API 是否返回 500;
- 数据库连接配置是否正确;
- Redis 密码是否一致;
- LLM API Key 是否有效。
十六、数据备份方案
生产环境必须备份数据库和重要文件。创建备份脚本:
vim /opt/ai-browser/backups/backup.sh
写入:
#!/usr/bin/env bash
set -e
APP_DIR="/opt/ai-browser"
BACKUP_DIR="$APP_DIR/backups"
DATE=$(date +"%Y%m%d_%H%M%S")
cd "$APP_DIR"
mkdir -p "$BACKUP_DIR/$DATE"
docker compose exec -T postgres pg_dump \
-U ai_browser_user \
-d ai_browser \
> "$BACKUP_DIR/$DATE/postgres.sql"
tar -czf "$BACKUP_DIR/$DATE/uploads.tar.gz" uploads
tar -czf "$BACKUP_DIR/$DATE/minio.tar.gz" minio/data
find "$BACKUP_DIR" -maxdepth 1 -type d -mtime +14 -exec rm -rf {} \;
echo "Backup completed: $BACKUP_DIR/$DATE"
授权:
chmod +x /opt/ai-browser/backups/backup.sh
手动执行一次:
/opt/ai-browser/backups/backup.sh
加入定时任务:
crontab -e
添加:
30 2 * * * /opt/ai-browser/backups/backup.sh >> /opt/ai-browser/backups/backup.log 2>&1
这表示每天凌晨 2:30 自动备份。
十七、版本升级与回滚
生产环境升级前建议先备份:
cd /opt/ai-browser
./backups/backup.sh
拉取新镜像:
docker compose pull
滚动重启服务:
docker compose up -d
查看状态:
docker compose ps
查看日志:
docker compose logs -f api
如果升级失败,需要回滚到上一个镜像版本。最佳实践是不要使用 latest,而是使用明确版本号,例如:
image: your-registry/ai-browser-api:v1.2.3
回滚时修改为旧版本:
image: your-registry/ai-browser-api:v1.2.2
然后执行:
docker compose pull
docker compose up -d
如果数据库迁移不可逆,必须从备份恢复。因此重大版本升级前一定要备份数据库。
十八、安全加固建议
1. 禁止 root 直接 SSH 登录
编辑 SSH 配置:
sudo vim /etc/ssh/sshd_config
修改:
PermitRootLogin no
PasswordAuthentication no
重启 SSH:
sudo systemctl restart ssh
注意:关闭密码登录前,请确认 SSH Key 登录已经配置成功。
2. 设置更强密码
.env 中的以下字段必须使用强随机字符串:
POSTGRES_PASSWORD=
REDIS_PASSWORD=
JWT_SECRET=
SESSION_SECRET=
MINIO_ROOT_PASSWORD=
可以用命令生成:
openssl rand -base64 32
3. 限制管理入口
如果开放 MinIO 控制台、后台管理系统或调试接口,应使用 IP 白名单或额外认证,不建议直接暴露到公网。
4. 设置请求体大小
避免大文件攻击:
client_max_body_size 50m;
5. 增加访问频率限制
可在 Nginx 中加入限流配置,例如:
limit_req_zone $binary_remote_addr zone=api_limit:10m rate=5r/s;
然后在 API location 中使用:
limit_req zone=api_limit burst=20 nodelay;
6. 保护 AI Key
不要把 OpenAI、Claude、Gemini 等 Key 暴露到前端。前端只能请求自己的后端 API,由后端统一调用模型服务。
十九、常用运维命令汇总
进入项目目录:
cd /opt/ai-browser
启动全部服务:
docker compose up -d
停止全部服务:
docker compose down
重启某个服务:
docker compose restart api
查看服务状态:
docker compose ps
查看实时日志:
docker compose logs -f
查看 API 日志:
docker compose logs -f api
查看 Worker 日志:
docker compose logs -f worker
查看资源占用:
docker stats
拉取最新镜像:
docker compose pull
重新部署:
docker compose up -d
清理无用镜像:
docker image prune -f
查看磁盘空间:
df -h
查看目录占用:
du -sh /opt/ai-browser/*
备份数据库:
docker compose exec -T postgres pg_dump \
-U ai_browser_user \
-d ai_browser \
> /opt/ai-browser/backups/postgres_$(date +%Y%m%d_%H%M%S).sql
恢复数据库:
cat /opt/ai-browser/backups/postgres.sql | \
docker compose exec -T postgres psql \
-U ai_browser_user \
-d ai_browser
二十、总结
AI 浏览器的生产部署并不只是“把应用跑起来”,而是要同时考虑 服务编排、HTTPS、数据库持久化、浏览器 Worker 稳定性、日志排查、备份恢复、安全加固和后续升级。对于企业内部使用场景,Docker Compose 已经能够满足大多数中小规模部署需求;如果访问量继续增长,可以进一步迁移到 Kubernetes,将 API、Worker、Redis、PostgreSQL 和对象存储拆分成更标准的云原生架构。
本文提供的部署方案适合以下场景:
- 企业内部 AI 浏览器;
- 私有化智能网页助手;
- 带浏览器自动化能力的 AI Agent;
- 基于 Playwright / Puppeteer 的网页分析系统;
- 需要 LLM 调用、网页截图、任务队列和文件存储的生产应用。
如果你是首次上线,建议按以下顺序执行:
# 1. 初始化服务器
apt update && apt upgrade -y
# 2. 安装 Docker
docker version
docker compose version
# 3. 创建项目目录
mkdir -p /opt/ai-browser
# 4. 编写 .env
vim /opt/ai-browser/.env
# 5. 编写 docker-compose.yml
vim /opt/ai-browser/docker-compose.yml
# 6. 编写 Nginx 配置
vim /opt/ai-browser/nginx/conf.d/ai-browser.conf
# 7. 启动服务
cd /opt/ai-browser
docker compose up -d
# 8. 查看状态
docker compose ps
# 9. 配置 HTTPS
certbot certonly --standalone -d ai.example.com
# 10. 配置备份和续期
crontab -e
只要按本文流程完成部署,你就可以得到一个具备生产基础能力的 AI 浏览器运行环境。后续再根据业务规模逐步增加监控、告警、灰度发布、多节点 Worker 和容灾备份,即可支撑更复杂的企业级使用场景。