部署指南
部署架构
flowchart TB
Internet -->|HTTPS| Nginx
Nginx -->|反向代理| API["Cloud API (8766 HTTP)"]
Nginx -->|反向代理| WS["Cloud WS (8765 WS)"]
Nginx -->|反向代理| Console["Console (8770)"]
Nginx -->|反向代理| Site["Public Site (8771)"]
环境要求
| 组件 | 版本要求 |
|---|---|
| Python | ≥ 3.11 |
| 操作系统 | Ubuntu 22.04 / Debian 12 / Windows Server 2022 |
| Nginx(推荐) | ≥ 1.24 |
| Supervisor(推荐) | ≥ 4.2 |
生产部署步骤
1. 准备环境
# Ubuntu / Debian
apt update && apt install -y python3 python3-pip python3-venv nginx supervisor
# 创建运行用户
useradd -r -s /bin/false janpnp
2. 部署代码
# 创建目录
mkdir -p /opt/janpnp/web-server
chown janpnp:janpnp /opt/janpnp/web-server
# 以 janpnp 用户部署
su - janpnp -c "
cd /opt/janpnp/web-server
git clone <repo-url> .
# 创建虚拟环境并安装依赖
cd api
python3 -m venv venv
source venv/bin/activate
pip install -r requirements.txt
# 复制并编辑环境变量
cp .env.example .env
"
3. 配置环境变量
编辑 api/.env,参考以下生产配置:
CLOUD_ENV=production
CLOUD_WS_HOST=127.0.0.1
CLOUD_WS_PORT=8765
CLOUD_HTTP_HOST=127.0.0.1
CLOUD_HTTP_PORT=8766
CLOUD_DEVICE_TOKEN=<生成一个 64 字符随机字符串>
CLOUD_JWT_SECRET=<生成一个至少 32 字符随机字符串>
CLOUD_AUTH_USERS={"admin":{"password":"<强密码>","role":"admin","display_name":"JanPNP 管理员"}}
CLOUD_CORS_ORIGINS=https://janpnp.otodone.com,https://console.janpnp.otodone.com
CLOUD_FIRMWARE_DIR=/opt/janpnp/web-server/api/firmware
CLOUD_LOG_DIR=/var/log/janpnp
CLOUD_FIRMWARE_UPLOAD_MAX_BYTES=2097152
# 微信小程序(可选)
WECHAT_APP_ID=your-wechat-app-id
WECHAT_APP_SECRET=your-wechat-app-secret
安全警告:生产环境必须修改
CLOUD_JWT_SECRET、CLOUD_DEVICE_TOKEN和CLOUD_AUTH_USERS中的默认值。配置文件中的config.validate_production_config()会在CLOUD_ENV=production时自动校验。
4. 配置 Supervisor
创建 /etc/supervisor/conf.d/janpnp-cloud.conf:
[program:janpnp-cloud]
command=/opt/janpnp/web-server/api/venv/bin/python server.py
directory=/opt/janpnp/web-server/api
user=janpnp
autostart=true
autorestart=true
startretries=3
stderr_logfile=/var/log/janpnp/cloud.err.log
stdout_logfile=/var/log/janpnp/cloud.out.log
environment=CLOUD_ENV="production"
# 创建日志目录
mkdir -p /var/log/janpnp
chown janpnp:janpnp /var/log/janpnp
# 加载配置
supervisorctl reread && supervisorctl update
5. 配置 Nginx 反向代理
创建 /etc/nginx/sites-available/api.janpnp.otodone.com:
server {
listen 443 ssl http2;
server_name api.janpnp.otodone.com;
ssl_certificate /etc/ssl/certs/janpnp/fullchain.pem;
ssl_certificate_key /etc/ssl/private/janpnp/privkey.pem;
# HTTP API
location / {
proxy_pass http://127.0.0.1:8766;
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 /api/v1/firmware/ {
proxy_pass http://127.0.0.1:8766;
proxy_buffering on;
proxy_buffer_size 8k;
proxy_buffers 8 64k;
proxy_max_temp_file_size 0;
}
}
# WebSocket 子域名
server {
listen 443 ssl http2;
server_name ws.janpnp.otodone.com;
ssl_certificate /etc/ssl/certs/janpnp/fullchain.pem;
ssl_certificate_key /etc/ssl/private/janpnp/privkey.pem;
location / {
proxy_pass http://127.0.0.1:8765;
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_read_timeout 300s;
proxy_send_timeout 300s;
}
}
同样为 Console 和 Site 服务配置独立 Nginx virtual host。
6. 启动服务
预期响应:
7. 部署 Console 与 Site
Console 和 Site 同为 aiohttp 静态文件服务,部署方式与 Cloud API 类似:
# Console
cd /opt/janpnp/web-server/console
python3 -m venv venv
source venv/bin/activate
pip install -r requirements.txt
# 启动(同样通过 Supervisor 管理)
python app.py
# Site(官方网站)
cd /opt/janpnp/web-server/home
python3 -m venv venv
source venv/bin/activate
pip install -r requirements.txt
python app.py
运维命令
# Supervisor 管理
supervisorctl status # 查看所有服务状态
supervisorctl restart janpnp-cloud # 重启云网关
supervisorctl tail -f janpnp-cloud # 查看实时日志
# 日志查看
tail -f /var/log/janpnp/cloud.out.log
tail -f /var/log/janpnp/cloud.err.log
# Nginx
nginx -t # 测试配置
nginx -s reload # 重载配置
构建验证
发布前至少执行:
# 启动服务并验证健康检查
python server.py &
curl http://127.0.0.1:8766/api/v1/health
# 运行冒烟测试
python tools/smoke_test.py
# 使用模拟设备验证端到端流程
python tools/mock_device.py --device-id test-001 &
curl http://127.0.0.1:8766/api/v1/devices
验收项包括:
- 服务正常启动
- 设备可注册
- API 路由可达
- 固件清单可读
- CORS 头正确
- JWT 认证生效