Héberger un microservice Rust sur Hetzner pour 6 €/mois (Docker + CI)
Hébergement prod pas cher pour API Axum en Rust : Hetzner CX22, Docker, Caddy, GitHub Actions, Postgres. 6 €/mois, TLS, déploiements sans downtime.
Pas besoin de Kubernetes à 80 €/mois pour ta première API Rust. Je fais tourner des petits services Axum sur un CX22 Hetzner à 6 € avec Docker et Caddy : TLS, déploiements auto, ~5k rps de marge.
Transparence : les liens ci-dessous sont affiliés. Tu paies pareil, je touche une petite commission qui finance les articles gratuits. J’utilise exactement ce setup moi-même. Alternative : DigitalOcean si tu préfères leur DX.
Pourquoi Hetzner ?
- CX22 : 2 vCPU / 4 Go / 40 Go pour ~6 €/mois (Falkenstein/Nuremberg)
- NVMe rapides et pas chers, bon réseau vers l’UE et les US
- Tu échanges la magie managée contre du contrôle. Parfait pour des petits binaires Rust.
Besoin de US uniquement ou de Postgres managé ? Prends DigitalOcean ou Fly.io. Besoin de pas cher et rapide en Europe ? Hetzner gagne.
👉 20 € de crédit Hetzner ici (remplace YOURCODE dans config.toml)
1. Dockerfile (multi-stage, minuscule)
FROM rust:1.82-slim AS build
WORKDIR /app
COPY Cargo.toml Cargo.lock ./
COPY src ./src
COPY migrations ./migrations
RUN apt-get update && apt-get install -y pkg-config libssl-dev \
&& cargo build --release
FROM debian:bookworm-slim
RUN apt-get update && apt-get install -y ca-certificates libssl3 \
&& rm -rf /var/lib/apt/lists/*
COPY --from=build /app/target/release/rust-tasks-api /usr/local/bin/api
COPY --from=build /app/migrations ./migrations
ENV RUST_LOG=info ADDR=0.0.0.0:8080
EXPOSE 8080
CMD ["/usr/local/bin/api"]
Image de ~30 à 50 Mo. Les binaires Rust quasi statiques adorent les images slim.
2. Compose et Caddy (TLS en 5 min)
# compose.yaml
services:
api:
image: ghcr.io/you/rust-tasks-api:latest
env_file: .env
restart: unless-stopped
caddy:
image: caddy:2-alpine
ports: ["80:80", "443:443"]
volumes: ["./Caddyfile:/etc/caddy/Caddyfile", "caddy_data:/data"]
restart: unless-stopped
volumes: { caddy_data: {} }
# Caddyfile
api.yourdomain.com {
reverse_proxy api:8080
}
Caddy gère Let’s Encrypt tout seul. Pas de danse certbot avec nginx.
3. Déploiement CI (GitHub Actions)
name: deploy
on: { push: { branches: [main] } }
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: docker/login-action@v3
with:
registry: ghcr.io
username: YOUR_GITHUB_USERNAME
password: GHCR_TOKEN_AS_SECRET
- uses: docker/build-push-action@v6
with: { push: true, tags: ghcr.io/YOU/rust-tasks-api:latest }
- name: pull and restart on VPS
uses: appleboy/ssh-action@v1
with:
host: HETZNER_HOST_AS_SECRET
username: root
key: HETZNER_SSH_KEY_AS_SECRET
script: |
cd /opt/api && docker compose pull && docker compose up -d
docker image prune -f
Push sur main, en ligne en ~2 min. Assez zéro-downtime pour une v1 (tu ajouteras du blue/green plus tard).
4. Postgres : où ?
- Démarre sur le même VPS avec Docker (
postgres:16-alpine, volume monté). OK jusqu’à ~10k utilisateurs. - Pour grandir, prends le Postgres managé Hetzner ou un CX22 séparé pour la BDD. Règle
max_connectionsselon ton pool (12 à 20 par instance d’API). - Backups :
pg_dumpquotidien vers une Storage Box Hetzner etpgbackresthebdo. Teste les restaurations !
Détail des coûts
- VPS CX22 : ~6 €/mois
- Domaine : ~12 €/an
- Backups (Storage Box 100 Go) : ~1 €/mois
- Total : ~8 €/mois pour une vraie API TLS qui encaisse des milliers de rps
Compare : K8s managé + LB + BDD managée, 60 à 150 €/mois pour le même trafic.
Checklist de durcissement
- UFW : autorise 22/80/443 uniquement, clés SSH, fail2ban
- Caddy vers l’API sur réseau Docker privé, pas d’exposition directe du 8080
RUST_LOG=info, logs JSON,/healthet Uptime Kuma- Surveille le disque (les logs Docker !) : rotation
max-size: "10m"
Ensuite : ajoute
/metricsPrometheus avec des alertes, puis lis le guide latence p99 avant de scaler.