ENbext.dev
DocumentationConfiguration

Traduction automatique depuis l’anglais. Consulter l’original.

Sur cette page

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.

dockerfile
# ── 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 :

dockerfile
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 :

bash
docker pull ghcr.io/bext-dev/bext-server:latest

Docker Composer#

Un fichier de composition prêt pour la production avec bext et Redis :

yaml
# 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 :

bash
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
Attention

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 :

yaml
# 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 :

yaml
# 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 :

yaml
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 :

yaml
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#

Modifier cette page ↗Besoin d’aide ? ↗
Rechercher dans la documentation

Saisissez un sujet, une commande ou une question.