Files
Nexus/docs/project/deploy.md
T

511 lines
14 KiB
Markdown
Raw Normal View History

# Nexus 部署指南 — Ubuntu 20.04 / 22.04 / 24.04
> **项目**: Nexus — 服务器运维管理平台
> **版本**: 6.0.0
> **技术栈**: Python 3.12+ / FastAPI / Async SQLAlchemy / MySQL 8.4 / Redis 7 / PHP 8.2+ / Nginx
> **生产域名**: 由 `NEXUS_CORS_ORIGINS` 环境变量配置(示例: `api.synaglobal.vip`
> **网站目录**: 由 `NEXUS_DEPLOY_PATH` 环境变量配置(示例: `/www/wwwroot/api.synaglobal.vip`
> **更新日期**: 2026-05-20
---
## 1. 系统依赖修复(⚠️ 首先运行)
Ubuntu 服务器部署时经常缺少编译和运行依赖。**在安装任何服务之前,先运行以下命令修复所有基础依赖:**
### 1.1 一键修复脚本
```bash
#!/bin/bash
# Nexus — Ubuntu 系统依赖一键修复脚本
# 适用于 Ubuntu 20.04 / 22.04 / 24.04
# 用法: sudo bash fix-deps.sh
set -e
echo "===== Nexus 系统依赖修复 ====="
# 更新软件源
apt update
# ── 核心编译工具 ──
apt install -y \
build-essential \
cmake \
autoconf \
automake \
libtool \
pkg-config \
gcc \
g++ \
make \
git \
curl \
wget \
unzip \
ca-certificates \
gnupg
# ── 通用开发库(所有组件共享)──
apt install -y \
libssl-dev \
libxml2-dev \
libcurl4-openssl-dev \
zlib1g-dev \
libpcre3-dev \
libpcre2-dev \
libbz2-dev \
libzip-dev \
liblz4-dev \
libzstd-dev \
liblzma-dev \
libffi-dev \
libncurses5-dev \
libncursesw5-dev \
libreadline-dev \
libsqlite3-dev \
libicu-dev \
libbrotli-dev
# ── Nginx 专用依赖 ──
apt install -y \
libgd-dev \
libgeoip-dev \
libxslt1-dev
# ── PHP 8.x 专用依赖 ──
apt install -y \
libonig-dev \
libsodium-dev \
libargon2-dev \
libjpeg-dev \
libpng-dev \
libfreetype6-dev \
libwebp-dev \
libgmp-dev \
libtidy-dev \
libpq-dev \
default-libmysqlclient-dev
# ── MySQL 8.4 专用依赖 ──
apt install -y \
bison \
gperf \
libevent-dev \
libnuma-dev \
libaio-dev \
protobuf-compiler \
libprotobuf-dev
# ── Python 3.12+ 专用依赖 ──
apt install -y \
libgdbm-dev \
libgdbm-compat-dev \
libmpdec-dev \
uuid-dev
# ── Redis 7 专用依赖 ──
apt install -y \
libjemalloc-dev
echo "===== 依赖修复完成 ====="
```
### 1.2 手动逐项安装(如果脚本不适用)
按组件分类的依赖列表:
#### 通用依赖(所有组件都需要)
```bash
sudo apt install -y build-essential cmake autoconf automake libtool pkg-config \
gcc g++ make git curl wget unzip ca-certificates gnupg \
libssl-dev libxml2-dev libcurl4-openssl-dev zlib1g-dev \
libpcre3-dev libpcre2-dev libbz2-dev libzip-dev \
liblz4-dev libzstd-dev liblzma-dev libffi-dev \
libncurses5-dev libncursesw5-dev libreadline-dev \
libsqlite3-dev libicu-dev libbrotli-dev
```
#### Nginx 专用
```bash
sudo apt install -y libgd-dev libgeoip-dev libxslt1-dev
```
#### PHP 8.x 专用
```bash
sudo apt install -y libonig-dev libsodium-dev libargon2-dev \
libjpeg-dev libpng-dev libfreetype6-dev libwebp-dev \
libgmp-dev libtidy-dev libpq-dev default-libmysqlclient-dev
```
#### MySQL 8.4 专用
```bash
sudo apt install -y bison gperf libevent-dev libnuma-dev \
libaio-dev protobuf-compiler libprotobuf-dev
```
#### Python 3.12+ 专用
```bash
sudo apt install -y libgdbm-dev libgdbm-compat-dev \
libmpdec-dev uuid-dev
```
#### Redis 专用
```bash
sudo apt install -y libjemalloc-dev
```
---
## 2. 服务安装
### 2.1 Nginx
```bash
# 方式 A: apt 直接安装(推荐)
sudo apt install -y nginx
# 方式 B: 编译安装(需要更多自定义模块时)
# 编译依赖已在 1.1 中安装
wget http://nginx.org/download/nginx-1.26.2.tar.gz
tar -xzf nginx-1.26.2.tar.gz
cd nginx-1.26.2
./configure --prefix=/usr/local/nginx \
--with-http_ssl_module \
--with-http_v2_module \
--with-http_realip_module \
--with-http_gzip_static_module \
--with-http_brotli_module \
--with-stream \
--with-stream_ssl_module
make && sudo make install
```
### 2.2 MySQL 8.4 LTS
```bash
# 方式 A: apt 安装(推荐 — MySQL 官方 APT 源)
wget https://dev.mysql.com/get/mysql-apt-config_0.8.33-1ubuntu_all.deb
sudo dpkg -i mysql-apt-config_0.8.33-1ubuntu_all.deb
# 在配置界面选择 mysql-8.4-lts
sudo apt update
sudo apt install -y mysql-server mysql-client
# 安全初始化
sudo mysql_secure_installation
# 方式 B: 宝塔面板一键安装
# 在宝塔面板 → 软件商店 → MySQL 8.4 → 安装
```
### 2.3 Redis 7
```bash
# 方式 A: apt 安装
sudo apt install -y redis-server
# 方式 B: 编译安装(最新版本)
wget https://github.com/redis/redis/archive/refs/tags/7.4.2.tar.gz
tar -xzf 7.4.2.tar.gz
cd redis-7.4.2
make MALLOC=jemalloc
sudo make install
# 启动
redis-server --daemonize yes
```
### 2.4 PHP 8.2+
```bash
# 方式 A: apt 安装(Ubuntu 22.04+ 默认有 PHP 8.1
sudo apt install -y php8.2 php8.2-fpm php8.2-cli \
php8.2-mysql php8.2-redis php8.2-gd php8.2-mbstring \
php8.2-xml php8.2-zip php8.2-curl php8.2-bz2 \
php8.2-intl php8.2-opcache php8.2-json php8.2-readline
# 如果需要 PHP 8.3(更新版本):
sudo add-apt-repository -y ppa:ondrej/php
sudo apt update
sudo apt install -y php8.3 php8.3-fpm php8.3-cli \
php8.3-mysql php8.3-redis php8.3-gd php8.3-mbstring \
php8.3-xml php8.3-zip php8.3-curl php8.3-bz2 \
php8.3-intl php8.3-opcache
# 方式 B: 宝塔面板安装
# 宝塔面板 → 软件商店 → PHP 8.2/8.3 → 安装
```
### 2.5 Python 3.12+
```bash
# 方式 A: apt 安装(Ubuntu 24.04 默认有 Python 3.12
sudo apt install -y python3.12 python3.12-dev python3.12-venv \
python3-pip python3-venv
# Ubuntu 22.04 需要添加 deadsnakes PPA:
sudo add-apt-repository -y ppa:deadsnakes/ppa
sudo apt update
sudo apt install -y python3.12 python3.12-dev python3.12-venv
# 方式 B: 编译安装
wget https://www.python.org/ftp/python/3.12.7/Python-3.12.7.tar.xz
tar -xf Python-3.12.7.tar.xz
cd Python-3.12.7
./configure --enable-optimizations --with-ensurepip=install
make -j$(nproc)
sudo make altinstall # altinstall 防止覆盖系统 python3
```
---
## 3. Nexus 项目部署
### 3.1 克隆仓库
```bash
cd /opt
git clone http://<GITEA_HOST>/admin/Nexus.git # 替换为实际 Gitea 地址
cd Nexus
```
### 3.2 Python 环境配置
```bash
# 创建虚拟环境
python3.12 -m venv venv
source venv/bin/activate
# 安装 Python 依赖
pip install -r requirements.txt
# 如果 pip 安装遇到编译错误(缺少依赖),回到步骤 1 修复依赖后重新安装
```
### 3.3 配置文件
```bash
# 复制配置模板
cp .env.example .env
# 编辑 .env 文件
nano .env
```
`.env` 必填项(**⚠️ .env 文件不会被提交到 Git,已在 .gitignore 中排除**):
```ini
# ⚠️ SECRET_KEY 必须设置,否则 Nexus 无法启动
NEXUS_SECRET_KEY=<生成一个随机密钥: python3 -c "import secrets; print(secrets.token_urlsafe(32))">
# 数据库连接(aiomysql 驱动)
NEXUS_DATABASE_URL=mysql+aiomysql://Nexus:<你的密码>@127.0.0.1:3306/Nexus
# Redis
NEXUS_REDIS_URL=redis://127.0.0.1:6379/0
# API KeyAgent 认证用)
NEXUS_API_KEY=<生成: python3 -c "import secrets; print(secrets.token_urlsafe(24))">
```
> **⚠️ 安全提示**: `.env` 文件包含密码和密钥,绝不能提交到 Git。项目 `.gitignore` 已排除 `.env`。
### 3.4 创建 MySQL 数据库
```bash
sudo mysql -u root -p
# 在 MySQL 中执行:
CREATE DATABASE Nexus CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'Nexus'@'localhost' IDENTIFIED BY '<你的数据库密码>';
GRANT ALL PRIVILEGES ON Nexus.* TO 'Nexus'@'localhost';
FLUSH PRIVILEGES;
EXIT;
```
> **注意**: Nexus 启动时会自动创建所有数据表(`Base.metadata.create_all`),无需手动建表。
### 3.5 启动 Nexus
```bash
# 方式 A: 直接运行(开发/调试)
source venv/bin/activate
uvicorn server.main:app --host 0.0.0.0 --port 8600
# 方式 B: Supervisor 守护进程(生产环境推荐)
sudo apt install -y supervisor
# 创建 supervisor 配置
sudo nano /etc/supervisor/conf.d/nexus.conf
```
`nexus.conf` 内容:
```ini
[program:nexus]
command=/www/wwwroot/api.synaglobal.vip/venv/bin/uvicorn server.main:app --host 0.0.0.0 --port 8600 --workers 4
directory=/www/wwwroot/api.synaglobal.vip
user=root
autostart=true
autorestart=true
stderr_logfile=/var/log/nexus/error.log
stdout_logfile=/var/log/nexus/access.log
# ⚠️ 不要在这里硬编码密码!Supervisor 配置文件可能被其他用户读取
# 改用 .env 文件方式:uvicorn 会自动读取 .env
```
```bash
sudo supervisorctl reread
sudo supervisorctl update
sudo supervisorctl start nexus
```
### 3.6 Nginx 反向代理配置
```bash
sudo nano /etc/nginx/sites-available/nexus
```
```nginx
server {
listen 80;
server_name api.synaglobal.vip;
# 强制 HTTPS
return 301 https://$server_name$request_uri;
}
server {
listen 443 ssl http2;
server_name api.synaglobal.vip;
# SSL证书(宝塔面板 → 网站 → SSL → Let's Encrypt 一键申请)
# 证书路径在宝塔面板申请后自动生成,以下为宝塔默认路径:
ssl_certificate /www/server/panel/vhost/cert/api.synaglobal.vip/fullchain.pem;
ssl_certificate_key /www/server/panel/vhost/cert/api.synaglobal.vip/privkey.pem;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
# Nexus API
location /api/ {
proxy_pass http://127.0.0.1:8600;
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_read_timeout 300s;
proxy_send_timeout 300s;
}
# Nexus OpenAPI 文档
location /docs {
proxy_pass http://127.0.0.1:8600;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
# Nexus WebSocket
location /ws/ {
proxy_pass http://127.0.0.1:8600;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header X-Real-IP $remote_addr;
}
# Nexus 新前端(Tailwind CSS v4
location /app/ {
root /www/wwwroot/api.synaglobal.vip;
try_files $uri $uri/ /app/login.html;
}
# PHP 页面(旧前端,逐步弃用)
location / {
root /www/wwwroot/api.synaglobal.vip;
index index.php;
try_files $uri $uri/ /index.php?$query_string;
location ~ \.php$ {
fastcgi_pass unix:/tmp/php-cgi-82.sock;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
}
```
```bash
sudo ln -s /etc/nginx/sites-available/nexus /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx
```
---
## 4. 依赖冲突排查
### 4.1 常见问题
| 问题 | 原因 | 解决方案 |
|------|------|----------|
| `pip install` 报错 `libbrotli` | 缺少 `libbrotli-dev` | `sudo apt install -y libbrotli-dev` |
| `pip install` 报错 `libssl` | 缺少 `libssl-dev` | `sudo apt install -y libssl-dev` |
| `pip install` 报错 `libcurl` | 缺少 `libcurl4-openssl-dev` | `sudo apt install -y libcurl4-openssl-dev` |
| PHP `mbstring` 编译失败 | 缺少 `libonig-dev` | `sudo apt install -y libonig-dev` |
| PHP `xml/dom` 编译失败 | 缺少 `libxml2-dev` | `sudo apt install -y libxml2-dev` |
| PHP `zip` 编译失败 | 缺少 `libzip-dev` | `sudo apt install -y libzip-dev` |
| `libcurl4-openssl-dev``libcurl4-nss-dev` 冲突 | 不能同时安装两个 curl dev 包 | `sudo apt remove libcurl4-nss-dev && sudo apt install libcurl4-openssl-dev` |
| MySQL 编译报错缺少 `bison/gperf` | 缺少 MySQL 编译依赖 | `sudo apt install -y bison gperf` |
| Python `decimal` 模块报错 | 缺少 `libmpdec-dev`Python 3.12+ 新依赖) | `sudo apt install -y libmpdec-dev` |
### 4.2 快速检查缺少的依赖
```bash
# 检查某个库是否已安装
dpkg -l | grep libbrotli-dev
apt-cache search libbrotli
# 查看某个 pip 包需要哪些系统依赖
pip show <package-name>
```
---
## 5. 版本兼容性参考
| 组件 | Ubuntu 20.04 | Ubuntu 22.04 | Ubuntu 24.04 | 说明 |
|------|-------------|-------------|-------------|------|
| Python | 3.8 (系统) → 需 deadsnakes PPA 安装 3.12 | 3.10 (系统) → deadsnakes PPA 安装 3.12 | **3.12 (系统)** | 推荐 3.12+ |
| MySQL | 8.0 (系统) → 可手动安装 8.4 | 8.0 (系统) → 可手动安装 8.4 | **8.4 可用** | 推荐 8.4 LTS |
| Redis | 6.x (系统) → 需编译 7.x | 6.x→7.x (系统) | **7.x (系统)** | 推荐 7.0+ |
| PHP | 7.4 (系统) → 需 ondrej PPA 安装 8.2 | 8.1 (系统) → 需 PPA 安装 8.2/8.3 | **8.3 (系统)** | 推荐 8.2+ |
| Nginx | 1.18 (系统) → 可编译最新 | 1.22 (系统) → 可编译最新 | **1.24 (系统)** | 推荐 1.24+ |
---
## 6. 宝塔面板部署(推荐新手)
如果使用宝塔面板,大部分依赖和软件安装可以一键完成:
1. 安装宝塔面板: `wget -O install.sh https://download.bt.cn/install/install-ubuntu_6.0.sh && sudo bash install.sh ed848235`
2. 宝塔面板 → 软件商店 → 安装: Nginx / MySQL 8.4 / Redis 7 / PHP 8.2
3. 创建网站 → 设置根目录为 `/opt/Nexus/web`
4. 配置反向代理 → 将 `/api/` 代理到 `127.0.0.1:8600`
5. SSL → Let's Encrypt 一键申请
> **宝塔面板会自动安装大部分系统依赖**,但 Python pip 依赖仍需手动处理。如果 pip 安装报错,回到步骤 1 安装缺失的 `-dev` 包。
---
## 7. 验证部署
```bash
# 检查 Nexus API 是否运行
curl http://127.0.0.1:8600/docs # 应返回 OpenAPI 文档页面
# 检查数据库连接
curl http://127.0.0.1:8600/api/settings/ # 应返回设置列表(初始为空)
# 检查 HTTPS(域名验证)
curl https://api.synaglobal.vip/docs # 应返回 OpenAPI 文档页面
``