Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Docker

ssh-keygen -t ed25519 -f ./host_ed25519 -N ""   # la cle d'hote
sudo chown 65532 host_ed25519                   # lisible par l'utilisateur de l'image
docker run -d --name craft-file-gate \
  -v ./config.toml:/config/config.toml:ro \
  -v ./host_ed25519:/config/host_ed25519:ro \
  -v ./roles.toml:/config/roles.toml:ro -v ./users.toml:/config/users.toml:ro \
  -v data:/data \
  -p 2222:2222 -p 8080:8080 -p 8081:8081 \
  craftogether/craft-file-gate:latest

config.toml reprend le demarrage rapide avec ce qu’un conteneur change : des ecoutes sur 0.0.0.0, un chemin de cle relatif au repertoire de config.toml, la console par compte et mot de passe (les portes sont publiees), stockage et comptes dans leurs propres fichiers. docker run --rm craftogether/craft-file-gate:latest config schema > config.schema.json ecrit a cote le schema que nomme #:schema (Verifier une configuration) ; l’image le porte a /usr/share/craft-file-gate/config.schema.json.

#:schema ./config.schema.json
[sftp]
listen = "0.0.0.0:2222"
host_keys = ["host_ed25519"]        # /config/host_ed25519

[auth.methods]
local = { enabled = true }          # les comptes de users.toml
jwt = { enabled = false }           # sans fournisseur d'identite

[admin]
listen = "0.0.0.0:8080"             # API de fichiers, explorateur
control_listen = "0.0.0.0:8081"     # console, /admin, sondes, /metrics

[[admin.roles]]                     # un compte [[users]] avec authorities = ["admins"]
name = "admins"
permissions = ["overview", "sessions", "kick", "bans", "unban", "config", "logs", "audit", "revoke", "grant"]

[admin.ban]
max_failures = 5

[api]
enabled = true

[api.ban]
max_failures = 5

[api.ui]
enabled = true

Le premier montage et son ACL : roles.toml ([[backends]], [[roles]]) et users.toml ([[users]]), a cote de config.toml, sont pris sans etre declares.

#:schema ./config.schema.json
[[backends]]                        # roles.toml
name = "donnees"
type = "local"
root = "/data"                      # le volume data:/data

[[roles]]
name = "utilisateurs"

[[roles.mounts]]
backend = "donnees"
home_dir = "/{username}"            # alice voit /data/alice comme sa racine /
create_home = true

[[roles.mounts.acl]]
path = "/"
rights = ["read", "write", "list", "delete", "rename"]
recursive = true
#:schema ./config.schema.json
[[users]]                           # users.toml
username = "alice"
password_hash = "$argon2id$..."     # sortie de hash-password (plus bas)
authorities = ["utilisateurs", "admins"]   # ses fichiers, et la console

La console : http://hote:8081/, l’explorateur : http://hote:8080/files (Session de console, Explorateur).

ImageContenuUtilisateurHEALTHCHECK
:latestdistroless statique, sans shell65532 (nonroot)oui
:alpineAlpine, avec un shell pour le diagnostic65534 (nobody)oui
:scratchle binaire seul, sans magasin de certificatsaucun declare : posez --user 65532non

L’image expose 2222 (SFTP) et 8080 ; control_listen en publie un troisieme. Le HEALTHCHECK lance craft-file-gate healthcheck sur /config/config.toml. ENTRYPOINT est le binaire seul, la commande --config /config/config.toml ; le binaire traite SIGTERM en PID 1.

  • Montez en lecture seule (:ro) les fichiers auxquels le serveur se fie : configuration, utilisateurs, roles, cle d’hote, paire TLS (Securite).
  • /data appartient dans l’image a son utilisateur, et un volume nomme en herite ; un repertoire de l’hote monte a sa place doit lui appartenir : sudo chown 65532 data (65534 pour :alpine).
  • :scratch n’a aucune racine de certificats : une connexion TLS sortante (S3, JWKS, OTLP, Knox) demande un bundle monte et SSL_CERT_FILE.
  • Les sous-commandes passent telles quelles : echo -n 'mot-de-passe' | docker run -i --rm craftogether/craft-file-gate hash-password.
  • Gardez le delai d’arret de Docker au-dessus de celui du serveur : docker stop -t 90. Voir Arret.

Docker Compose

services:
  craft-file-gate:
    image: craftogether/craft-file-gate:latest
    restart: unless-stopped
    stop_grace_period: 90s
    ports:
      - "2222:2222"   # SFTP
      - "8080:8080"   # API de fichiers, explorateur
      - "8081:8081"   # console, /admin, sondes, metriques
    volumes:
      - ./config.toml:/config/config.toml:ro
      - ./roles.toml:/config/roles.toml:ro
      - ./users.toml:/config/users.toml:ro
      - ./host_ed25519:/config/host_ed25519:ro
      - data:/data

volumes:
  data:

Les features du binaire

Chaque type de backend et chaque porte est une feature Cargo, toutes actives par defaut. Les binaires et les images publies les portent toutes, et k8s. Un binaire construit avec moins de features refuse au demarrage la table d’une porte ou le type d’un backend qu’il ne porte pas, en nommant la feature.

FeatureBackend ou porte
backend-locallocal ; requise (etat, verrous et bans du serveur vivent sur le disque local)
backend-sftpsftp (proxy)
backend-s3s3
backend-webhdfswebhdfs
door-sftpla porte SFTP, [sftp]
door-restl’API REST de fichiers et l’explorateur, [api]
k8sbans et revocations partages par ConfigMap, cle de session dans un Secret ; hors defaut dans une construction sur mesure

La console, les sondes et /metrics n’ont pas de feature : tout binaire les porte.

Sous-commandes (hash-password, verify-password, healthcheck) : Le fichier de configuration.