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.
- 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
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.phpou via SQL :UPDATE users SET autorise = 1 WHERE mail = 'prenom.nom@exemple.fr';
- 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
# 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/zilnikmysql -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É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.phpavec vos secrets dans un dépôt public. Utilisez.gitignoreou les variables d'environnement.
php bin/create-user.php \
--mail=admin@exemple.fr \
--prenom=Admin \
--nom=Zilnik \
--service="Informatique" \
--password=MonMotDePasseActivez mod_rewrite et autorisez .htaccess :
<Directory /var/www/html/zilnik>
AllowOverride All
</Directory>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;
}
}# 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 appL'application est accessible sur http://localhost:8080.
| 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 |
docker compose exec app php bin/create-user.php \
--mail=admin@exemple.fr \
--prenom=Admin \
--nom=Zilnik \
--password=MonMotDePasseMontez votre logo dans le conteneur :
volumes:
- ./mon-logo.png:/var/www/html/img/logo.png:rozilnik/
├── 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)
- 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.phpetinstall.sqlsont 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-OptionsetReferrer-Policysont positionnés
Les contributions sont les bienvenues ! Ouvrez une issue ou une pull request.
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.