温馨提示×

Debian Rust如何部署应用

小樊
35
2025-12-24 21:31:10
栏目: 编程语言

在 Debian 上部署 Rust 应用的实用路线


一 准备与构建

  • 安装 Rust 工具链(推荐用 rustup):
    • 执行:curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
    • 加载环境:source $HOME/.cargo/env
    • 验证:rustc --versioncargo --version
  • 获取代码并构建发布版:
    • 示例:git clone <repo> && cd <repo>
    • 构建:cargo build --release
    • 可执行文件位于:target/release/<binary_name>

二 部署与运行方式

  • 方式 A 手动部署 + systemd(通用、可控)

    • 拷贝可执行文件到运行目录(示例):/opt/myapp/
    • 创建 systemd 服务文件:/etc/systemd/system/myapp.service
      [Unit]
      Description=My Rust App
      After=network.target
      
      [Service]
      Type=simple
      User=www-data
      Group=www-data
      ExecStart=/opt/myapp/myapp
      WorkingDirectory=/opt/myapp
      Restart=always
      StandardOutput=journal
      StandardError=journal
      
      [Install]
      WantedBy=multi-user.target
      
    • 启用与启动:
      • sudo systemctl daemon-reload
      • sudo systemctl enable --now myapp
      • 查看状态:sudo systemctl status myapp
      • 查看日志:sudo journalctl -u myapp -f
    • 如监听 8080 等端口,放行防火墙(示例):sudo ufw allow 8080/tcp
  • 方式 B 打包为 .deb 并安装(便于在多台机器标准化分发)

    • 安装打包工具:cargo install cargo-deb
    • 在项目根目录生成包:cargo deb(产物位于 target/debian/
    • 安装包:sudo dpkg -i target/debian/*.deb
    • 修复依赖:sudo apt-get -f install
    • 需要保留调试符号可用:cargo deb --separate-debug-symbols
  • 方式 C Git 推送即部署(Piku 轻量 PaaS)

    • 服务器安装 Piku:curl https://piku.github.io/get | sh
    • 本地配置 SSH 公钥后,添加应用并推送:
      • git remote add piku piku@<server>:<app>
      • git push piku main
    • 适合快速上线与多项目托管,内置 systemd 进程守护与反向代理集成。

三 自动化发布脚本示例

  • 目标:拉代码 → 构建 → 备份旧版 → 发布新版 → 重启服务 → 健康检查
  • 示例脚本(按实际路径与项目名调整):
    #!/usr/bin/env bash
    set -e
    
    PROJECT_NAME="myapp"
    CODE_DIR="/data/deploy/rust/git/$PROJECT_NAME"
    BIN_DIR="/data/deploy/rust/bin/$PROJECT_NAME"
    BACKUP_DIR="/data/deploy/rust/backup/${PROJECT_NAME}-$(date +'%Y%m%d%H%M%S.%N')"
    SERVICE_NAME="$PROJECT_NAME"
    
    cd "$CODE_DIR" || { echo "代码目录不存在: $CODE_DIR"; exit 1; }
    
    echo "拉取最新代码..."
    git pull || { echo "Git 拉取失败"; exit 1; }
    
    echo "编译发布版..."
    cargo build --release || { echo "编译失败"; exit 1; }
    
    echo "备份旧版本..."
    mkdir -p "$BACKUP_DIR"
    if [ -f "$BIN_DIR/$PROJECT_NAME" ]; then
      rsync -a --ignore-existing "$BIN_DIR/$PROJECT_NAME" "$BACKUP_DIR/"
    fi
    
    echo "发布新版本..."
    mkdir -p "$BIN_DIR"
    rsync -a --delete "target/release/$PROJECT_NAME" "$BIN_DIR/"
    
    echo "重启服务..."
    sudo systemctl restart "$SERVICE_NAME" || { echo "服务重启失败"; exit 1; }
    
    sleep 2
    sudo systemctl status "$SERVICE_NAME" --no-pager || { echo "服务状态异常"; exit 1; }
    
    echo "部署完成"
    
  • 赋予执行权限:chmod +x deploy.sh && ./deploy.sh

四 生产要点与排错清单

  • 运行身份与目录权限:建议以非 root用户(如 www-data)运行,二进制与工作目录属主保持一致,避免权限过宽。
  • 日志与故障排查:优先使用 journald 记录日志(StandardOutput/Error=journal),排查用 journalctl -u <svc> -f -b;必要时补充文件日志便于归档。
  • 端口与防火墙:确保应用监听的端口(如 8080)已在云安全组与 ufw 放行;若使用反向代理(Nginx),应用可绑定 127.0.0.1:PORT 提升安全性。
  • 零停机发布:脚本中先备份旧版再替换,配合 systemctl restart 实现快速切换;对要求更高的场景可引入蓝绿发布/金丝雀与健康检查脚本。
  • 资源与构建:Rust 静态编译产物体积小、启动快;如多机部署,优先采用 .deb 或制品仓库分发,减少构建差异与环境漂移。

0