Skip to content

chevinou/zilnik

Repository files navigation

📦 Zilnik — Gestion des stocks et consommables

License: AGPL v3 PHP MariaDB Docker

Zilnik est une application web open source de gestion de stocks de consommables. Elle est conçue pour être déployée facilement dans n'importe quel environnement d'entreprise, avec un support natif de trois méthodes d'authentification : SSO (SAML), Active Directory (LDAP) et comptes locaux.


✨ Fonctionnalités

  • Tableau de bord — Vue synthétique : total produits, unités en stock, alertes, ruptures, 12 derniers mouvements, répartition par catégorie
  • Gestion des produits — Recherche plein texte, filtres par catégorie et état de stock, tri par colonne, mouvements rapides inline (+/−)
  • Historique des mouvements — Traçabilité complète avec filtre par type, période, produit et utilisateur
  • Catégories personnalisables — Emoji et couleur par catégorie
  • Export CSV — Compatible Excel (BOM UTF-8, séparateur ;), respecte les filtres actifs
  • Gestion des accès — Panneau d'administration pour autoriser / révoquer les utilisateurs
  • Thème clair / sombre — Basculement en un clic, mémorisé par navigateur
  • Trois méthodes d'auth — SSO SAML, LDAP/AD, comptes locaux en base

🔐 Méthodes d'authentification

Sélectionnez une méthode en définissant AUTH_METHOD dans config.php ou via la variable d'environnement AUTH_METHOD.

Valeur Description
sso SAML via token-exchange (Azure AD / Entra ID, ADFS, Shibboleth, ...)
ldap Active Directory ou tout annuaire LDAP/LDAPS
local Comptes stockés en base de données (mots de passe bcrypt)

Accès autorisé : quelle que soit la méthode, la première connexion d'un utilisateur crée son compte avec le statut refusé. Un administrateur doit l'autoriser depuis le panneau /admin_users.php ou via SQL :

UPDATE users SET autorise = 1 WHERE mail = 'prenom.nom@exemple.fr';

🚀 Installation sur un serveur web

Prérequis

  • PHP 8.0 ou supérieur
  • Extensions PHP : pdo_mysql, session, json, mbstring
  • Pour LDAP : extension ldap
  • MySQL 5.7+ ou MariaDB 10.4+
  • Serveur web Apache (recommandé) ou Nginx

1. Déposer les fichiers

# Apache / Nginx
cp -r zilnik/ /var/www/html/zilnik/

# Permissions
find /var/www/html/zilnik -type d -exec chmod 755 {} \;
find /var/www/html/zilnik -type f -exec chmod 644 {} \;
chown -R www-data:www-data /var/www/html/zilnik

2. Créer la base de données

mysql -u root -p -e "CREATE DATABASE zilnik CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;"
mysql -u root -p -e "CREATE USER 'zilnik'@'localhost' IDENTIFIED BY 'motdepasse';"
mysql -u root -p -e "GRANT ALL PRIVILEGES ON zilnik.* TO 'zilnik'@'localhost'; FLUSH PRIVILEGES;"
mysql -u root -p zilnik < install.sql

3. Configurer l'application

Éditez config.php et adaptez les sections correspondant à votre méthode d'auth :

// ── Base de données
define('DB_HOST', 'localhost');
define('DB_NAME', 'zilnik');
define('DB_USER', 'zilnik');
define('DB_PASS', 'motdepasse');

// ── Méthode d'authentification : 'sso' | 'ldap' | 'local'
define('AUTH_METHOD', 'sso');

// ── SSO (si AUTH_METHOD = 'sso')
define('SSO_LOGIN_URL',          'https://sso.exemple.fr/saml/index.php');
define('SSO_LOGOUT_URL',         'https://sso.exemple.fr/saml/logoutSSO.php');
define('SSO_TOKEN_EXCHANGE_URL', 'https://sso.exemple.fr/saml/token_exchange.php');

// ── LDAP (si AUTH_METHOD = 'ldap')
define('LDAP_HOST',      'ldap://dc.exemple.fr');
define('LDAP_BASE_DN',   'dc=exemple,dc=fr');
define('LDAP_BIND_DN',   'cn=svc-zilnik,ou=services,dc=exemple,dc=fr');
define('LDAP_BIND_PASS', 'motdepasse');

Sécurité : n'ajoutez jamais config.php avec vos secrets dans un dépôt public. Utilisez .gitignore ou les variables d'environnement.

4. Créer le premier compte (méthode local uniquement)

php bin/create-user.php \
  --mail=admin@exemple.fr \
  --prenom=Admin \
  --nom=Zilnik \
  --service="Informatique" \
  --password=MonMotDePasse

5. Configuration Apache (optionnel)

Activez mod_rewrite et autorisez .htaccess :

<Directory /var/www/html/zilnik>
    AllowOverride All
</Directory>

6. Configuration Nginx (optionnel)

server {
    listen 80;
    server_name zilnik.exemple.fr;
    root /var/www/html/zilnik;
    index index.php;

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    location ~ \.php$ {
        fastcgi_pass unix:/run/php/php8.3-fpm.sock;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }

    # Sécurité : bloquer config.php et install.sql
    location ~* ^/(config\.php|install\.sql|bin/) {
        deny all;
    }
}

🐳 Installation via Docker

Démarrage rapide

# Clonez le dépôt
git clone https://github.com/chevinou/zilnik.git
cd zilnik

# Copiez et adaptez docker-compose.yml (au minimum les mots de passe et l'URL SSO)
cp docker-compose.yml docker-compose.local.yml
nano docker-compose.local.yml

# Démarrez les services
docker compose -f docker-compose.local.yml up -d

# Suivez les logs
docker compose logs -f app

L'application est accessible sur http://localhost:8080.

Variables d'environnement disponibles

Variable Défaut Description
APP_NAME Zilnik Nom affiché dans l'interface
APP_SLOGAN Sous-titre de l'application
AUTH_METHOD sso sso / ldap / local
DB_HOST db Hôte MySQL
DB_PORT 3306 Port MySQL
DB_NAME zilnik Nom de la base
DB_USER zilnik Utilisateur MySQL
DB_PASS Mot de passe MySQL
SSO_LOGIN_URL URL de connexion IdP
SSO_LOGOUT_URL URL de déconnexion IdP
SSO_TOKEN_EXCHANGE_URL URL token_exchange de l'IdP
SSO_SSL_VERIFY true Vérification SSL vers l'IdP
LDAP_HOST ldap:// ou ldaps://
LDAP_PORT 389 Port LDAP
LDAP_BASE_DN Base DN de recherche
LDAP_BIND_DN DN du compte de service
LDAP_BIND_PASS Mot de passe du compte de service
LDAP_ATTR_MAIL mail Attribut adresse e-mail
LDAP_ATTR_NOM sn Attribut nom
LDAP_ATTR_PRENOM givenName Attribut prénom
LDAP_ATTR_SERVICE department Attribut service/département
LDAP_USER_FILTER (mail=%s) Filtre de recherche LDAP

Créer un compte (méthode local via Docker)

docker compose exec app php bin/create-user.php \
  --mail=admin@exemple.fr \
  --prenom=Admin \
  --nom=Zilnik \
  --password=MonMotDePasse

Personnaliser le logo

Montez votre logo dans le conteneur :

volumes:
  - ./mon-logo.png:/var/www/html/img/logo.png:ro

🗂️ Structure des fichiers

zilnik/
├── SSO/
│   ├── authSSO.php         ← Page de connexion / callback SSO
│   ├── logoutSSO.php       ← Déconnexion SSO
│   └── config.php          ← Pont de config (charge config.php racine)
│
├── bin/
│   └── create-user.php     ← Script CLI de création de compte local
│
├── includes/
│   ├── auth.php            ← Garde d'auth unifié (SSO / LDAP / local)
│   ├── db.php              ← Connexion PDO
│   ├── functions.php       ← Fonctions utilitaires
│   ├── layout_start.php    ← En-tête HTML, CSS, sidebar
│   └── layout_end.php      ← Pied de page, JS global, modals
│
├── img/
│   └── logo.png            ← Logo de l'application (remplaçable)
│
├── index.php               ← Tableau de bord
├── produits.php            ← Liste des produits
├── produit_form.php        ← Formulaire ajout / édition produit
├── mouvements.php          ← Historique des mouvements
├── categories.php          ← Gestion des catégories
├── admin_users.php         ← Gestion des accès utilisateurs
├── ajax.php                ← API AJAX interne
├── export.php              ← Export CSV
├── login.php               ← Connexion LDAP / local
├── logout.php              ← Déconnexion unifiée
├── acces_refuse.php        ← Page d'accès refusé
├── config.php              ← ⚙️ Configuration centrale
├── install.sql             ← Schéma de base de données
├── .htaccess               ← Sécurité Apache
├── Dockerfile              ← Image Docker
└── docker-compose.yml      ← Stack complète (app + base)

🛡️ Sécurité

  • Toutes les pages sont protégées par le garde d'authentification (includes/auth.php)
  • Les requêtes SQL utilisent des requêtes préparées PDO (protection injection SQL)
  • Les sorties HTML sont systématiquement échappées avec htmlspecialchars()
  • Le fichier config.php et install.sql sont bloqués par .htaccess
  • Les mots de passe locaux sont hachés en bcrypt via password_hash()
  • Les en-têtes X-Frame-Options, X-Content-Type-Options et Referrer-Policy sont positionnés

🤝 Contribution

Les contributions sont les bienvenues ! Ouvrez une issue ou une pull request.


📄 Licence

Ce projet est distribué sous la licence GNU Affero General Public License v3.0 (AGPL-3.0).
Voir https://www.gnu.org/licenses/agpl-3.0 pour le texte complet.

About

Application web open source de gestion de stocks et consommables — Authentification SSO (SAML), LDAP/Active Directory ou comptes locaux — Déployable sur serveur web ou via Docker

Topics

Resources

License

Contributing

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors