Docker
bext est livré sous la forme d'un seul binaire statique, ce qui le rend idéal pour les images Docker minimales. Cette page couvre le Dockerfile officiel, la configuration de docker -compose avec Redis et le renforcement de la production.
Fichier Docker officiel#
Construction en plusieurs étapes : compilez dans l'image Rust, copiez le binaire dans une image d'exécution minimale.
# ── Stage 1: Build ──────────────────────────────────────────────────
FROM rust:1.82-bookworm AS builder
WORKDIR /build
COPY . .
RUN cargo build --release --bin bext-server \
--features "nginx-compat" \
&& strip target/release/bext-server
# ── Stage 2: Runtime ────────────────────────────────────────────────
FROM debian:bookworm-slim
RUN apt-get update && apt-get install -y --no-install-recommends \
ca-certificates \
&& rm -rf /var/lib/apt/lists/*
# Non-root user
RUN groupadd -r bext && useradd -r -g bext -d /app -s /sbin/nologin bext
COPY --from=builder /build/target/release/bext-server /usr/local/bin/bext-server
WORKDIR /app
RUN chown bext:bext /app
USER bext
EXPOSE 3061
HEALTHCHECK --interval=15s --timeout=5s --start-period=10s --retries=3 \
CMD ["bext-server", "health"]
ENTRYPOINT ["bext-server"]
CMD ["run"]
variante alpine#
Pour une image encore plus petite (~ 15 Mo), utilisez Alpine comme base d'exécution. Notez que vous devez construire avec la cible musl :
FROM rust:1.82-bookworm AS builder
WORKDIR /build
COPY . .
RUN rustup target add x86_64-unknown-linux-musl \
&& cargo build --release --target x86_64-unknown-linux-musl --bin bext-server \
&& strip target/x86_64-unknown-linux-musl/release/bext-server
FROM alpine:3.20
RUN apk add --no-cache ca-certificates
RUN addgroup -S bext && adduser -S bext -G bext -h /app
COPY --from=builder /build/target/x86_64-unknown-linux-musl/release/bext-server /usr/local/bin/bext-server
WORKDIR /app
USER bext
EXPOSE 3061
HEALTHCHECK --interval=15s --timeout=5s --start-period=10s --retries=3 \
CMD ["bext-server", "health"]
ENTRYPOINT ["bext-server"]
CMD ["run"]
Image prédéfinie#
Si vous préférez ne pas compiler à partir des sources :
docker pull ghcr.io/bext-dev/bext-server:latest
Docker Composer#
Un fichier de composition prêt pour la production avec bext et Redis :
# docker-compose.yml
services:
bext:
image: ghcr.io/bext-dev/bext-server:latest
ports:
- "80:3061"
- "443:3061"
volumes:
- ./bext.config.toml:/app/bext.config.toml:ro
- ./dist:/app/dist:ro
- ./public:/app/public:ro
- tls-certs:/var/lib/bext/certs
- bext-cache:/var/cache/bext
environment:
- BEXT_LICENSE_KEY=${BEXT_LICENSE_KEY}
- REDIS_URL=redis://redis:6379/0
- BEXT_LOG_LEVEL=info
depends_on:
redis:
condition: service_healthy
healthcheck:
test: ["CMD", "bext-server", "health"]
interval: 15s
timeout: 5s
retries: 3
start_period: 10s
deploy:
resources:
limits:
cpus: "4"
memory: 2G
reservations:
cpus: "1"
memory: 512M
restart: unless-stopped
redis:
image: redis:7-alpine
volumes:
- redis-data:/data
healthcheck:
test: ["CMD", "redis-cli", "ping"]
interval: 10s
timeout: 3s
retries: 3
restart: unless-stopped
volumes:
tls-certs:
bext-cache:
redis-data:
Démarrez la pile :
docker compose up -d
Montages de volumes#
| Monter | But | Mode |
|---|---|---|
bext.config.toml |
Fichier de configuration | Lecture seule ( :ro ) |
dist/ |
Application construite (bundle SSR, actifs statiques) | Lecture seule |
public/ |
Biens publics statiques | Lecture seule |
tls-certs/ |
Stockage des certificats Auto-ACME | Lecture-écriture ( bext écrit les certificats ici) |
bext-cache/ |
Cache d'optimisation d'image, cache de fichiers ISR | Lecture-écriture |
Le volume du certificat TLS doit persister lors des redémarrages du conteneur. Sans cela, bext demande un nouveau certificat à chaque démarrage et atteindra les limites de débit de Let's Encrypt (5 certificats en double par semaine et par domaine).
Pour Auto-TLS, le volume de certificat doit persister lors des redémarrages du conteneur. Sans cela, bext demande un nouveau certificat à chaque démarrage, ce qui peut atteindre les limites de débit de Let's Encrypt.
Passthrough des variables d'environnement#
Transmettez les variables d'environnement au conteneur via environment ou env_file :
# docker-compose.yml
services:
bext:
env_file:
- .env.production
environment:
- BEXT_LICENSE_KEY=${BEXT_LICENSE_KEY}
- BEXT_LOG_LEVEL=info
bext lit les variables d'environnement au démarrage. Voir la page Variables d'environnement pour la liste complète.
Configuration du bilan de santé#
La directive HEALTHCHECK du Dockerfile utilise bext-server health, qui vérifie le pool V8, le cache, la connectivité Redis et l'état du certificat TLS. Pour Kubernetes, utilisez plutôt une sonde HTTP :
# Kubernetes liveness/readiness probe
livenessProbe:
httpGet:
path: /__bext/health
port: 3061
initialDelaySeconds: 10
periodSeconds: 15
readinessProbe:
httpGet:
path: /__bext/health
port: 3061
initialDelaySeconds: 5
periodSeconds: 10
Conseils de production#
Exécuté en tant que non-root. Le Dockerfile ci-dessus crée un utilisateur bext. N’exécutez jamais bext en tant que root en production. Si vous devez vous lier aux ports 80/443 à l'intérieur du conteneur, utilisez --cap-add NET_BIND_SERVICE ou mappez les ports en externe.
Définir les limites des ressources. Définissez toujours les limites du processeur et de la mémoire dans compose ou Kubernetes. Les opérateurs de rendu de bext respectent le nombre de processeurs disponibles et le cache ISR respecte max_entries. Sans limites, un pic de trafic pourrait épuiser l’hébergeur.
Utiliser un système de fichiers en lecture seule. Montez le répertoire de l'application et configurez-le en lecture seule. Seuls le volume de certificat TLS et le volume de cache nécessitent un accès en écriture :
read_only: true
tmpfs:
- /tmp
volumes:
- tls-certs:/var/lib/bext/certs
- bext-cache:/var/cache/bext
Épinglez les balises d’image. Utilisez une balise de version spécifique au lieu de latest pour des déploiements reproductibles :
image: ghcr.io/bext-dev/bext-server:1.4.2
Connectez-vous à la sortie standard. Conserver logging.output = "stdout" dans Docker. Laissez Docker ou votre orchestrateur gérer la collecte et la rotation des journaux.
En rapport#
- Variables d'environnement — liste complète des variables à transmettre via
environment/env_file - bext.config.toml — fichier de configuration monté dans le conteneur
- Indicateurs de construction et de fonctionnalités — choix des fonctionnalités à compiler dans l'image
- Guides : TLS et HTTPS — Persistance du certificat ACME et limites de débit
- Guides : Modes de déploiement —
bext runvsbext servevs mascarade dans des conteneurs