Einleitung: Warum fortgeschrittenes Deployment von Rust auf einem VPS notwendig ist
\nDie Entwicklung in Rust ist nur die eine Hälfte der Arbeit. Die zweite, nicht weniger wichtige Hälfte ist das zuverlässige und sichere Deployment. Grundlegende Methoden wie manuelle Kompilierung und Start über cargo run sind für die Produktion ungeeignet. Auf fortgeschrittenem Niveau sind Automatisierung, Prozessisolierung, Überwachung und die Gewährleistung hoher Verfügbarkeit erforderlich.
In diesem Artikel werden wir behandeln, wie das Deployment einer Rust-Anwendung auf einem VPS mit Docker, CI/CD (GitHub Actions), systemd für den Autostart und Nginx als Reverse Proxy eingerichtet wird. Alle Codebeispiele sind in Rust und Bash gegeben.
\n\n1. Vorbereitung des VPS und der Umgebung
\n1.1. Grundlegende Serverkonfiguration
\nAngenommen, Sie haben einen VPS mit Ubuntu 22.04 LTS. Aktualisieren Sie zunächst die Pakete und installieren Sie die notwendigen Werkzeuge:
\nsudo apt update && sudo apt upgrade -y\nsudo apt install -y curl git build-essential pkg-config libssl-dev\nInstallieren Sie Rust über rustup:
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh\nsource $HOME/.cargo/env\nrustc --version # Überprüfung\n1.2. Installation von Docker
\nDocker sorgt für Isolierung und Reproduzierbarkeit der Umgebung:
\nsudo apt install -y docker.io\nsudo systemctl enable --now docker\nsudo usermod -aG docker $USER\nnewgrp docker\n1.3. Installation von Nginx
\nNginx fungiert als Reverse Proxy und Lastverteiler:
\nsudo apt install -y nginx\nsudo systemctl enable --now nginx\n\n2. Containerisierung der Rust-Anwendung mit Docker
\n2.1. Multi-Stage-Build
\nUm die Image-Größe zu reduzieren, verwenden wir einen Multi-Stage-Build. Erstellen Sie eine Dockerfile im Projektstammverzeichnis:
# Build-Stufe\nFROM rust:1.75-slim-bookworm AS builder\nWORKDIR /app\nCOPY Cargo.toml Cargo.lock ./\nCOPY src ./src\nRUN cargo build --release\n\n# Finale Stufe\nFROM debian:bookworm-slim\nRUN apt update && apt install -y ca-certificates && rm -rf /var/lib/apt/lists/*\nWORKDIR /app\nCOPY --from=builder /app/target/release/my_app .\nEXPOSE 8080\nCMD ["./my_app"]\nHier ist my_app der Name Ihrer Binärdatei. Stellen Sie sicher, dass in Cargo.toml name = "my_app" angegeben ist.
2.2. Build und Start des Containers
\ndocker build -t my_app:latest .\ndocker run -d --name my_app -p 8080:8080 my_app:latest\nÜberprüfen Sie, ob die Anwendung antwortet:
\ncurl http://localhost:8080\n\n3. Einrichtung von Autostart und Überwachung (systemd + Docker Compose)
\n3.1. Docker Compose zur Verwaltung der Dienste
\nErstellen Sie eine docker-compose.yml:
version: '3.8'\nservices:\n app:\n image: my_app:latest\n restart: always\n ports:\n - "127.0.0.1:8080:8080"\n environment:\n - RUST_LOG=info\n healthcheck:\n test: ["CMD", "curl", "-f", "http://localhost:8080/health"]\n interval: 30s\n timeout: 10s\n retries: 3\nBeachten Sie: ports ist an 127.0.0.1 gebunden, sodass externe Anfragen nur über Nginx erfolgen.
3.2. Systemd-Unit zur Verwaltung des Dienstes
\nErstellen Sie die Datei /etc/systemd/system/my_app.service:
[Unit]\nDescription=My Rust Application\nAfter=docker.service\nRequires=docker.service\n\n[Service]\nType=oneshot\nRemainAfterExit=yes\nWorkingDirectory=/opt/my_app\nExecStart=/usr/bin/docker compose up -d\nExecStop=/usr/bin/docker compose down\nUser=deploy\nGroup=deploy\n\n[Install]\nWantedBy=multi-user.target\nAktivieren und starten Sie:
\nsudo systemctl daemon-reload\nsudo systemctl enable my_app\nsudo systemctl start my_app\n\n