# 宿主机部署

Python 服务使用虚拟环境安装依赖,再由 systemd 管理进程。 下面以 Linux 服务器中的 Web 服务 orders 为例,项目目录为 /opt/orders,部署环境为 pro。

# 准备业务项目

将业务代码和配置复制到服务器,目录应包含:

/opt/orders/
├── orders/
├── pyproject.toml
├── README.md
├── config.yml
└── config_pro.yml

MVC 项目的视图、静态文件也需一并部署。 确认 pyproject.toml 中框架依赖已固定为实际存在的 tag,见版本与安装。

# 安装运行环境

服务器需安装 Python 3.11+、venv 支持和 Git。使用业务专用账户运行服务:

sudo useradd --system --home-dir /opt/orders --shell /usr/sbin/nologin orders
sudo chown -R orders:orders /opt/orders

sudo -u orders python3 -m venv /opt/orders/.venv
cd /opt/orders
sudo -u orders /opt/orders/.venv/bin/python -m pip install '.[components]'

components 为模板提供的标准组件可选依赖,纯 Web 项目也可只安装 .。 使用 uv 等工具管理项目时,在部署环境按业务锁文件安装相同版本的依赖。

# 配置生产环境

修改 /opt/orders/config_pro.yml:

yuanboot:
  application:
    name: orders
    server:
      address: ":8080"
  logging:
    level: INFO
    json: true
    console: true

基础配置中的环境变量引用由部署环境提供。 需要单独保存变量时,创建 /etc/orders.env,例如:

YUANBOOT_PROFILE=pro
YUANBOOT_PORT=8080

# 编写 systemd 服务

创建 /etc/systemd/system/orders.service:

[Unit]
Description=orders Python service
After=network-online.target
Wants=network-online.target

[Service]
Type=simple
User=orders
Group=orders
WorkingDirectory=/opt/orders
Environment=PYTHONUNBUFFERED=1
Environment=YUANBOOT_PROFILE=pro
EnvironmentFile=-/etc/orders.env
ExecStart=/opt/orders/.venv/bin/yuanbootctl-python run --profile pro --workers 2
Restart=on-failure
RestartSec=5
TimeoutStopSec=30

[Install]
WantedBy=multi-user.target

WorkingDirectory 决定 pyproject.toml、配置文件和相对路径的读取位置。 ExecStart 必须指向业务虚拟环境的解释器。部署时不使用 --reload。 多 worker 会分别运行后台服务;有独占后台任务时使用单 worker,或将任务拆成独立 Console 服务。

# 启动与管理

sudo systemctl daemon-reload
sudo systemctl enable --now orders
sudo systemctl status orders
sudo journalctl -u orders -f

检查服务:

curl -f http://127.0.0.1:8080/actuator/health/readiness
curl -f http://127.0.0.1:8080/actuator/health/detail

# 更新服务

更新业务代码、框架依赖或配置后,重新安装项目并重启:

sudo systemctl stop orders
# 将新业务版本复制到 /opt/orders,保留部署配置。
cd /opt/orders
sudo -u orders /opt/orders/.venv/bin/python -m pip install --upgrade '.[components]'
sudo systemctl start orders
sudo systemctl status orders

修改 service 文件后先执行 sudo systemctl daemon-reload。 更新后检查健康状态和业务接口,日志通过 journalctl 查看。

# Console 与 gRPC

Console 和 gRPC 服务将 ExecStart 改为:

ExecStart=/opt/orders/.venv/bin/yuanbootctl-python run --profile pro

这两类项目通过 pyproject.toml 的 Console 入口启动,不使用 Web 的 --workers 参数。 gRPC 端口在 config_pro.yml 的 yuanboot.grpc.address 中配置。