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).
| Image | Contenu | Utilisateur | HEALTHCHECK |
|---|---|---|---|
:latest | distroless statique, sans shell | 65532 (nonroot) | oui |
:alpine | Alpine, avec un shell pour le diagnostic | 65534 (nobody) | oui |
:scratch | le binaire seul, sans magasin de certificats | aucun declare : posez --user 65532 | non |
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). /dataappartient 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(65534pour:alpine).:scratchn’a aucune racine de certificats : une connexion TLS sortante (S3, JWKS, OTLP, Knox) demande un bundle monte etSSL_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.
| Feature | Backend ou porte |
|---|---|
backend-local | local ; requise (etat, verrous et bans du serveur vivent sur le disque local) |
backend-sftp | sftp (proxy) |
backend-s3 | s3 |
backend-webhdfs | webhdfs |
door-sftp | la porte SFTP, [sftp] |
door-rest | l’API REST de fichiers et l’explorateur, [api] |
k8s | bans 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.