Rust Deploy
DevOps & Securityrust-deployRust Deploy is an Agent Skill for devops & security published in the nixopus/nixopus repository on GitHub: a SKILL.md instruction file an AI agent can load to do this task.
Build and deploy Rust applications — version detection, release binaries, cargo-chef, and Dockerfile patterns. Use when deploying a Rust project, or when Cargo.toml is detected.
QUICK START
How to use this skill
Bring this guide into your coding agent with a prompt tailored to the tool you use.
- Open your project in Codex.
- Copy and paste the prompt below.
- Review files and risks before approving any action.
Prompt to paste
Inspect the Agent Skill at https://github.com/nixopus/nixopus/blob/HEAD/api/skills/rust-deploy/SKILL.md and all supporting files. Report provenance, permissions, scripts, dependencies, and security risks. Propose an exact installation into .agents/skills/rust-deploy, but wait for my approval before writing files or running scripts.
Copying this prompt does not install or run the skill. Review third-party files before use.
Rust Deployment
Detection
Project is Rust if Cargo.toml or cargo.toml exists.
Versions
Rust version priority:
rust-toolchain.toml→toolchain.channelCargo.toml→package.rust-version.rust-versionfileCargo.toml→package.edition(maps to minimum Rust version)- Defaults to latest stable (1.89)
Build
Build Command
cargo build --release- Binary:
target/release/<package-name> - Package name from
Cargo.toml→[package].name
Entry Resolution
- Binary crate:
src/main.rs - Multi-binary:
src/bin/<name>.rs→ binary name matches filename - Library + binary:
[bin]section inCargo.toml
Output
- Build output:
target/release/<name> - Start command:
./bin/<project-name>or./target/release/<name>
Runtime Variables
| Variable | Purpose |
|---|---|
ROCKET_ADDRESS | Rocket bind address (use 0.0.0.0 for containers) |
PORT | Port for web servers (default 8080) |
Port Detection
PORTin.env/.env.example- Source code patterns:
:8080,bind,TcpListenerinmain.rs - Default: 8080
Framework / Library Detection
| Crate | Category |
|---|---|
axum | Web |
actix-web | Web |
rocket | Web |
warp | Web |
tokio | Async runtime |
tower | Middleware |
Install Stage Optimization
Copy in order:
Cargo.toml,Cargo.locksrc/(or full source)
BuildKit Caching
| Cache key | Path |
|---|---|
cargo_registry | ~/.cargo/registry |
cargo_git | ~/.cargo/git |
cargo_target | target/ |
Base Images
| Stage | Image |
|---|---|
| Build | rust:1.89-bookworm or rust:1.89-alpine |
| Runtime | debian:bookworm-slim or gcr.io/distroless/cc |
For Alpine build: may need musl-dev for fully static binary.
Dockerfile Patterns
Multi-Stage (Debian)
FROM rust:1.89-bookworm AS build
WORKDIR /app
COPY Cargo.toml Cargo.lock ./
RUN mkdir src && echo "fn main() {}" > src/main.rs
RUN cargo build --release
COPY src ./src
RUN touch src/main.rs && cargo build --release
FROM debian:bookworm-slim
RUN apt-get update && apt-get install -y ca-certificates && rm -rf /var/lib/apt/lists/*
WORKDIR /app
COPY --from=build /app/target/release/<binary-name> .
EXPOSE 8080
CMD ["./<binary-name>"]
Cargo Chef (faster layer cache)
FROM rust:1.89-bookworm AS chef
RUN cargo install cargo-chef
FROM chef AS planner
WORKDIR /app
COPY . .
RUN cargo chef prepare --recipe-path recipe.json
FROM chef AS build
WORKDIR /app
COPY --from=planner /app/recipe.json .
RUN cargo chef cook --release --recipe-path recipe.json
COPY . .
RUN cargo build --release
FROM debian:bookworm-slim
RUN apt-get update && apt-get install -y ca-certificates && rm -rf /var/lib/apt/lists/*
WORKDIR /app
COPY --from=build /app/target/release/<binary-name> .
EXPOSE 8080
CMD ["./<binary-name>"]
Simple (no chef)
FROM rust:1.89-bookworm AS build
WORKDIR /app
COPY . .
RUN cargo build --release
FROM debian:bookworm-slim
RUN apt-get update && apt-get install -y ca-certificates && rm -rf /var/lib/apt/lists/*
WORKDIR /app
COPY --from=build /app/target/release/<binary-name> .
EXPOSE 8080
CMD ["./<binary-name>"]
Gotchas
- The dummy
main.rstrick (echo "fn main() {}" > src/main.rs) caches dependency compilation, buttouch src/main.rsis needed afterward to invalidate the binary build cache Cargo.lockmust be committed for binary crates — without it, dependency versions are resolved fresh on every build- Alpine builds need
musl-dev, but crates using OpenSSL also needopenssl-devandpkgconfig - Rust builds are memory-intensive —
cargo build --release -j 2limits parallelism to avoid OOM kills in resource-constrained environments - Cargo chef
preparerequires the full source tree — it scans code to compute the dependency recipe