| .forgejo/workflows | ||
| app | ||
| docs | ||
| skills/afriktecksilo | ||
| static | ||
| templates | ||
| tests | ||
| tools | ||
| vendor | ||
| .gitignore | ||
| afriktecksilo.service | ||
| AGENTS.md | ||
| CAHIER-DES-CHARGES.md | ||
| install.sh | ||
| LICENSE | ||
| README.md | ||
| requirements-dev.txt | ||
| requirements.txt | ||
| TUTORIEL.md | ||
AfrikTeckSilo — cockpit de stockage robuste sur Debian
Application web 100 % native (service systemd) : un système de stockage robuste, utilisable en datacenter, qui expose le stockage à l'infrastructure (SMB/NFS, iSCSI, S3) avec une vraie machinerie interne (RAID/ZFS, spares, scrub, snapshots, monitoring).
- Backend : Python 3 + FastAPI, SQLite (SQLAlchemy), Jinja2 + CSS/JS maison (aucun CDN, aucune étape de build).
- Structure MVC : layout principal (
templates/base.html) + vues injectées ; fonctionnalités en modules indépendants (app/modules/) isolés au chargement (un module en échec ne bloque pas les autres). - Sécurité : service local, sessions, mots de passe
pbkdf2, commandes système en allow-list stricte (jamais de shell), journal d'audit.
État : P0 (squelette)
- Authentification admin + sessions + changement de mot de passe.
- Tableau de bord (système, disques, alertes, journal).
- Disques en lecture seule : inventaire
lsblk+ SMART de base. - Centre d'alertes (lecture/accusé), export/import de config (JSON), API santé.
- Service systemd + script d'installation.
Installation
Dépôt privé Forgejo : clone, puis installe.
apt-get install -y git
git clone http://10.0.3.88:3000/root/afriktecksilo.git /opt/afriktecksilo
cd /opt/afriktecksilo
sudo AFRIKTECKSILO_ADMIN_PASSWORD='mot-de-passe-solide' ./install.sh
# -> http://<IP>:8000/ (compte admin)
Port personnalisé : sudo PORT=8080 AFRIKTECKSILO_ADMIN_PASSWORD='...' ./install.sh.
Guide complet (2ᵉ nœud, réplication, MAJ) : docs/DEPLOIEMENT.md.
Architecture
app/
main.py point d'entree FastAPI
db.py / models.py SQLite (users, sessions, settings, alerts, audit)
auth.py pbkdf2 + sessions
executor.py allow-list de commandes (pas de shell)
modules/
__init__.py chargement isole + etat de sante
core.py dashboard, auth, alertes, reglages, export/import
disks.py inventaire + SMART (lecture seule en P0)
templates/ base.html (layout) + vues
static/ style.css responsive + app.js minimal
Interface (P1)
- Sidebar (opérations : dashboard, disques, RAID, spares, remplacement, alertes, paramètres) fixe, navbar (fil d'Ariane, thème, export, user), panneau contextuel à droite, contenu central scrollable.
- Dark (défaut) + light, persistance locale, animations subtiles,
responsive (sidebar repliable sur mobile),
prefers-reduced-motionrespecté. - 100 % codé main, sans CDN (aucune dépendance externe).
État : P1 + P2 + P3 + V2
-
Pools unifiés (RAID, ZFS, disques montés) avec préparation en un clic.
-
Partages dynamiques : pool → dataset auto (
<pool>/shares/<nom>) + SMB et/ou NFS sur le même dataset. -
ZFS : mirror/raidz2/raidz3 (stripe/raidz1 refusés), scrub, snapshots, rollback, datasets, destruction confirmée. Active
contribsi besoin. -
iSCSI (LIO) : cibles + LUNs fichier sur les pools, CHAP, ACL initiateurs, modèle régénéré (idempotent) ; testé avec initiateur réel (
iscsiadm+ CHAP + mkfs + écriture/lecture). -
Objet S3 (Garage natif, Deuxfleurs) : binaire officiel + service systemd, données sur pool, bucket + clé créés, test PUT+GET réel.
-
Gating façon TrueNAS : partages, iSCSI et S3 grisés sans pool monté (dégrisés automatiquement après création RAID/ZFS) ; création RAID/ZFS grisée sans disques libres.
-
Formatage
ext4/xfs+ montage (/etc/fstabpar UUID) avec garde-fous. -
RAID mdadm : création RAID1/6/10 (RAID5/0 refusés), état, fail/remove/add, scrub,
mdadm.conf+ initramfs persistés. Les arrays pré-existants (créés hors app) sont affichés et gérables. -
Disques utilisés non cliquables (système, en RAID, montés, partitionnés, avec FS) : pastille d'état, on se concentre sur les disponibles.
-
Spares : pool + assignation (rebuild auto du noyau).
-
Assistant de remplacement : fail → retrait → ajout + historique.
-
Utilisateurs : comptes système + Samba, groupes, mots de passe.
-
Partages SMB (bloc géré, validé par
testparmavant restart) et exports NFS (exportfs) ; chemins restreints à/mnt/et/srv/. -
2FA TOTP (stdlib, sans dépendance) : enrôlement + login en 2 étapes.
-
Durcissement : headers sécurité, anti-CSRF (origine), rate-limit login, purge sessions, base
0600. -
Mises à jour : Debian (liste + apply) et application (git + restart), backup auto de la config avant chaque MAJ.
-
Notifications : webhook + email (en option : Telegram, ntfy), désactivées par défaut, test intégré, envoi auto sur alerte critique.
-
Métriques : courbes natives (CPU, mémoire, réseau ↓/↑, I/O par disque, température SMART) échantillonnées depuis
/procet le SMART, rendues en sparklines SVG maison (aucune dépendance, aucun CDN) ; timer systemd toutes les 5 min, purge auto > 7 jours. Fonctionne aussi sur disques virtuels (CPU/mémoire/réseau/I/O ; température si SMART exposé).
Tests
Suite pytest (base SQLite temporaire, isolée du système) + pyflakes (noms
non définis) ; lancée à chaque push/PR par Forgejo Actions.
pip install -r requirements.txt -r requirements-dev.txt
bash tools/ci.sh # pyflakes + pytest
# ou
python -m pytest -q # ~59 tests
Couverture : chargement des 21 modules, inventaire/format des 56 outils MCP, réponses des outils de lecture, fonctions partagées UI+MCP (utilisateurs, spares, notifications, remplacement, métriques) et pages web protégées.
Roadmap
- Plan de développement complet P0 → P3 : docs/PLAN-DEVELOPPEMENT.md.
- Lisez le TUTORIEL pour le guide complet.
Licence
MIT.