Skip to content

SFTPGo

Serveur de fichiers personnel accessible via HTTPS avec SSO Authelia (OIDC).

Accès

Interface URL / Adresse Auth
Web client https://files.ncls.ltd/web/client/login OIDC Authelia
Admin OIDC https://files.ncls.ltd/web/admin/login OIDC Authelia (nico uniquement)
Admin local http://192.168.1.106:8080 Compte local (LAN / VPN)
SFTP 192.168.1.106:2022 Clé SSH / mdp local
WebDAV https://files.ncls.ltd/dav/ Basic Auth (mdp local SFTPGo)

L'interface admin OIDC (/web/admin/login) est accessible sur https://files.ncls.ltd pour les utilisateurs ayant une entité admin dans la BDD SFTPGo (nico). Le rôle est déterminé par implicit_roles — SFTPGo vérifie si le username OIDC est un admin ou user dans sa propre base, ce qui permet à nico d'utiliser les deux interfaces.

L'interface admin local (port 8080) est accessible sur le LAN uniquement (non exposé via Caddy). Via VPN WireGuard depuis l'extérieur.

L'interface web (port 8090) est proxifiée via Caddy (LXC 103). L'authentification est gérée nativement par SFTPGo via OIDC Authelia — pas de gateway Authelia pour cette application.

Le WebDAV (port 8091) utilise le daemon webdavd de SFTPGo avec le préfixe /dav (SFTPGO_WEBDAVD__BINDINGS__0__PREFIX=/dav). Ce préfixe est nécessaire pour éviter que Caddy retourne un WWW-Authenticate: Basic sur / et déclenche la boîte de dialogue native du navigateur.

Installation

  • LXC : LXC 106
  • Image : drakkan/sftpgo:v2.7.1
  • Compose : /mnt/lxc-data/106-storage/docker-compose.yml
  • Données : /mnt/lxc-data/106-storage/sftpgo/data/ (BDD SQLite, clés SFTP)
  • Config : /mnt/lxc-data/106-storage/sftpgo/config/

Stockage

SFTPGo est monté sur le pool ZFS storage — voir HDD Storage.

/storage/               ← /mnt/storage sur l'hôte
├── alice/              ← home dir alice
│   ├── drive/
│   ├── photos/
│   └── archives/
├── nico/               ← home dir nico
│   ├── drive/
│   ├── photos/
│   └── archives/
├── family/             ← virtual folder /family (rw) pour alice + nico
│   ├── drive/
│   └── archives/
└── shared/             ← virtual folder /shared (ro) pour guests

Groupes et Permissions

Groupe Type Membres Configuration
owners primaire alice, nico home_dir = /storage/%username%, permissions *
owners-shared secondaire alice, nico virtual folder /family [rw], /.snapshots [ro]
guests secondaire virtual folder /shared [ro], permissions list,dl

Virtual folders définis dans SFTPGo admin → Folders :

Nom Path
family /storage/family
snapshots /storage/.zfs/snapshot
shared /storage/shared

Utilisateurs

Compte Groupes Rôle
alice owners (primary), owners-shared Utilisatrice normale
nico owners (primary), owners-shared User + Admin SFTPGo via OIDC (implicit_roles)

OIDC Authelia

Provider : Authelia (https://auth.ncls.ltd)

SFTPGo utilise preferred_username comme champ d'identification de l'utilisateur. Le rôle (admin ou client) est déterminé par implicit_roles : SFTPGo vérifie si le username OIDC correspond à une entité admin ou user dans sa propre base. Nico possédant les deux entités, il peut se connecter aux deux interfaces.

  • /web/admin/login → vérifie existence comme admin SFTPGo → nico ✅
  • /web/client/login → vérifie existence comme user SFTPGo → nico ✅, alice ✅

Config SFTPGo (docker-compose.yml) :

SFTPGO_HTTPD__BINDINGS__0__OIDC__IMPLICIT_ROLES=true
SFTPGO_HTTPD__BINDINGS__0__OIDC__USERNAME_FIELD=preferred_username
SFTPGO_HTTPD__BINDINGS__0__OIDC__SCOPES=openid,profile,email

Config Authelia (configuration.yml) :

claims_policies:
  sftpgo_policy:
    id_token:
      - preferred_username
      - email

clients:
  - client_id: sftpgo
    claims_policy: sftpgo_policy
    scopes: [openid, profile, email]
    token_endpoint_auth_method: client_secret_post

Note : la config Authelia est intentionnellement minimale. Un système plus complexe (user_attribute CEL + custom_claims + scope dédié) avait été tenté pour transmettre un claim de rôle, mais s'est avéré inutile une fois implicit_roles compris — voir §2.5 du rapport d'avancement.

Montage WebDAV Windows / macOS

Le WebDAV requiert un mot de passe local SFTPGo (pas l'OIDC). À définir dans l'admin SFTPGo → Users → champ Password.

Windows 11 (PowerShell) :

# Correctif registre si « Accès refusé » (une seule fois, en administrateur)
Set-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Services\WebClient\Parameters" `
  -Name "BasicAuthLevel" -Value 2
Restart-Service WebClient

# Mapper le lecteur réseau
net use Z: https://files.ncls.ltd/dav /user:nico <mot_de_passe_local> /persistent:yes

# Optionnel — autoriser les uploads > 50 MB
Set-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Services\WebClient\Parameters" `
  -Name "FileSizeLimitInBytes" -Value 0xFFFFFFFF
Restart-Service WebClient

macOS : Finder → Aller → Se connecter au serveur (⌘K) → https://files.ncls.ltd/dav

SFTPGo gère nativement des liens de partage publics avec token + expiration + mot de passe optionnel. Interface web → Share / Create link. Aucun compte SFTPGo requis pour les destinataires.

Snapshots ZFS

Le dossier /.snapshots expose les snapshots ZFS de l'espace personnel (via /storage/.zfs/snapshot). Accessible en lecture seule pour alice et nico via le groupe owners-shared.