在 Debian 上部署 Rust 应用的实用路线
一 准备与构建
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | shsource $HOME/.cargo/envrustc --version、cargo --versiongit clone <repo> && cd <repo>cargo build --release二 部署与运行方式
方式 A 手动部署 + systemd(通用、可控)
/opt/myapp/[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-reloadsudo systemctl enable --now myappsudo systemctl status myappsudo journalctl -u myapp -fsudo ufw allow 8080/tcp。方式 B 打包为 .deb 并安装(便于在多台机器标准化分发)
cargo install cargo-debcargo deb(产物位于 target/debian/)sudo dpkg -i target/debian/*.debsudo apt-get -f installcargo deb --separate-debug-symbols。方式 C Git 推送即部署(Piku 轻量 PaaS)
curl https://piku.github.io/get | shgit remote add piku piku@<server>:<app>git push piku main三 自动化发布脚本示例
#!/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。四 生产要点与排错清单
StandardOutput/Error=journal),排查用 journalctl -u <svc> -f -b;必要时补充文件日志便于归档。systemctl restart 实现快速切换;对要求更高的场景可引入蓝绿发布/金丝雀与健康检查脚本。