在 Debian 上部署 Rust 项目的实用流程
一 准备与构建
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | shsource $HOME/.cargo/envrustc --version、cargo --versionrust-toolchain.toml:
[toolchain] channel = "1.75.0"(按项目锁定版本)cargo build --release,产物在 target/release/cargo build --release --target x86_64-unknown-linux-gnu[profile.release] opt-level = 3; lto = true; codegen-units = 1; panic = "abort"strip 移除调试符号二 部署方式与选择
| 方式 | 适用场景 | 关键命令或要点 |
|---|---|---|
| 手动拷贝可执行文件 | 简单服务、快速上线 | scp target/release/your_app user@ip:/opt/your_app && chmod +x /opt/your_app |
| systemd 托管 | 长期运行、开机自启、日志与重启管理 | 创建 /etc/systemd/system/your_app.service,使用 systemctl enable/start/status your_app |
| 打包为 .deb | 多机分发、版本化、依赖管理 | 使用 cargo-deb 生成 .deb,dpkg -i 安装,依赖问题用 apt-get -f install 修复 |
scp target/release/myapp user@server:/opt/myapp && ssh user@server "chmod +x /opt/myapp"/etc/systemd/system/myapp.service:[Unit]
Description=My Rust App
After=network.target
[Service]
ExecStart=/opt/myapp
WorkingDirectory=/opt
User=www-data
Restart=always
StandardOutput=journal
StandardError=journal
[Install]
WantedBy=multi-user.target
systemctl daemon-reload && systemctl enable --now myapp && systemctl status myappjournalctl -u myapp -fcargo install cargo-deb(建议 Rust ≥ 1.63)cargo deb(产物在 target/debian/*.deb)sudo dpkg -i target/debian/*.deb;若依赖缺失:sudo apt-get -f install--separate-debug-symbols,或在 Cargo.toml 设置 [profile.release] debug = true三 上线与运维要点
sudo ufw allow 8080/tcp(或按实际端口调整)User=www-data),仅授予必要目录与端口权限journalctl -u your_app -f 实时查看;必要时在 systemd 中配置 StandardOutput/StandardError 写入文件/opt/myapp_v2),先 systemctl stop myapp → 切换软链 ln -sfn /opt/myapp_v2 /opt/myapp → systemctl start myapp四 自动化部署脚本模板
deploy.sh(按实际路径与项目名调整)#!/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')"
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 "$PROJECT_NAME" || { echo "服务重启失败"; exit 1; }
echo "健康检查..."
sleep 2
systemctl is-active --quiet "$PROJECT_NAME" || { echo "服务未正常运行"; exit 1; }
echo "部署完成"
chmod +x deploy.sh;按需加入回滚、通知与更多健康检查逻辑。五 配置管理与安全建议