# Installation de l'espace d'administration NetMonster Ce guide cible un serveur **Ubuntu 24.04 LTS (Noble) avec Apache2 deja installe** pour un autre site. NetMonster Admin est ajoute en **complement**, sous un **sous-domaine dedie**, sans perturber le site existant : nouveau virtualhost separe, nouvelle base de donnees dediee. Ubuntu 24.04 fournit nativement **PHP 8.3** et **MariaDB 10.11**, ce qui couvre largement le minimum requis (PHP 8.1+) sans depot tiers. ## 0. Verification de l'existant ```bash apache2 -v php -v mysql --version 2>/dev/null || mariadb --version 2>/dev/null sudo apache2ctl -S ``` La derniere commande liste les virtualhosts deja configures. Notez les ports et `ServerName` deja utilises pour eviter tout conflit. ## 1. Mise à jour du systeme ```bash sudo apt update && sudo apt upgrade -y ``` ## 2. Installation des paquets PHP manquants Apache2 est deja present. Installez PHP (mod_php) et les extensions requises si elles ne le sont pas encore : ```bash sudo apt install -y libapache2-mod-php php php-mysql php-mbstring php-xml php-curl ``` `php-curl` est necessaire uniquement si vous comptez activer le CAPTCHA Cloudflare Turnstile sur la page de connexion (voir etape 9bis) ; installez-le des maintenant pour eviter un aller-retour plus tard. Cette commande installe **PHP 8.3** sur Ubuntu 24.04. Verifiez : ```bash php -v php -m | grep -i curl ``` > Note : mod_php ne permet qu'une seule version de PHP partagee entre tous les sites Apache du serveur. Si l'autre site heberge deja necessite une version differente de PHP, une architecture PHP-FPM avec vhost dedie serait requise a la place — dites-le-moi si c'est votre cas, la configuration differe alors sensiblement de ce guide. Redemarrez Apache pour charger le module : ```bash sudo systemctl restart apache2 ``` ## 3. Installation de MariaDB Si MariaDB n'est pas deja installe pour l'autre site : ```bash sudo apt install -y mariadb-server mariadb-client sudo systemctl enable --now mariadb sudo mysql_secure_installation ``` Si MariaDB est deja present, passez directement a l'etape suivante : vous allez y ajouter une base dediee, sans toucher aux bases existantes. ## 4. Création de la base de données NetMonster ```bash sudo mysql -u root -p ``` ```sql CREATE DATABASE netmonster CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; CREATE USER 'netmonster_user'@'localhost' IDENTIFIED BY 'un_mot_de_passe_fort'; GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, ALTER ON netmonster.* TO 'netmonster_user'@'localhost'; FLUSH PRIVILEGES; EXIT; ``` Ce compte n'a acces qu'a la base `netmonster`, aucun risque pour les bases de l'autre site. ### Installation neuve : un seul fichier a executer ```bash cd /chemin/vers/le/depot/admin/sql mysql -u netmonster_user -p netmonster < install_full_schema.sql ``` Ce fichier unique cree toutes les tables necessaires (`countries`, `operators`, `sites`, `cells`, `staging_cells`, `staging_batches`, `imports`, `admin_users`, `login_attempts`), pré-remplit le Luxembourg (MCC 270) avec POST, LoL, Tango et Orange, et inclut deja : - les parametres radio detailles (`band`, `frequency`, `azimuth`, `bandwidth`, `address_desc`) ; - la contrainte d'unicite corrigee sur `cells` (inclut l'eNB/RNC, evite les faux doublons entre deux antennes distinctes partageant par coincidence le meme Cell ID) ; - la table `login_attempts` necessaire au rate limiting de connexion durci (voir `admin/admin_auth.php` et `admin/login.php`). Ce fichier est idempotent (`IF NOT EXISTS` / `ON DUPLICATE KEY UPDATE`) : l'executer une seconde fois par erreur ne casse rien et ne duplique aucune donnee. ### Mise a jour depuis une installation existante Si votre base a deja ete creee avec une version anterieure du schema (avant la fusion en fichier unique), **n'executez pas** `install_full_schema.sql` — utilisez uniquement les migrations ciblees encore fournies a part dans `admin/sql/` : ```bash # Si votre contrainte uniq_cell ne contient pas encore l'eNB/RNC (sub_id2) : mysql -u netmonster_user -p netmonster < migration_fix_uniq_cell.sql # Si vous n'avez pas encore la table login_attempts (durcissement securite 20/09/2026) : mysql -u netmonster_user -p netmonster < migration_security_hardening.sql ``` Verifiez ensuite que tout est en place : ```sql SHOW TABLES; DESCRIBE login_attempts; ``` ## 5. Déploiement des fichiers applicatifs ```bash sudo mkdir -p /var/www/netmonster sudo chown -R www-data:www-data /var/www/netmonster sudo find /var/www/netmonster -type d -exec chmod 755 {} \; sudo find /var/www/netmonster -type f -exec chmod 644 {} \; ``` Arborescence attendue : ``` /var/www/netmonster/ ├── contribute.php ├── lib/ │ ├── db.php │ ├── csrf.php │ └── ntm_import_to_staging.php ├── config/ │ └── turnstile.php (optionnel, voir etape 9bis — JAMAIS commite dans Git) ├── admin/ │ ├── admin_auth.php │ ├── login.php │ ├── index.php │ ├── review.php │ ├── import_ntm.php │ ├── manual_add.php │ ├── edit_site.php │ ├── countries_settings.php │ ├── export.php │ ├── cellmapper_import.php │ ├── duplicates.php │ ├── import_history.php │ ├── audit_log.php │ ├── backup.php │ ├── operator_sites.php │ ├── map_layers.php │ ├── statistics.php │ ├── data_quality.php │ ├── search_site.php │ ├── _nav.php │ └── assets/ │ ├── theme.css │ └── navigation.css └── uploads/ ``` Créez et protégez le dossier `uploads/` : ```bash sudo mkdir -p /var/www/netmonster/uploads sudo chown www-data:www-data /var/www/netmonster/uploads sudo chmod 750 /var/www/netmonster/uploads ``` Créez et protégez le dossier `config/` (destine a `turnstile.php`, jamais versionne dans Git) : ```bash sudo mkdir -p /var/www/netmonster/config sudo chown www-data:www-data /var/www/netmonster/config sudo chmod 750 /var/www/netmonster/config ``` ## 6. Configuration du sous-domaine (virtualhost Apache) Assurez-vous d'abord que le DNS de `netmonster.votre-domaine.tld` pointe vers l'IP de ce serveur (enregistrement A ou CNAME chez votre registrar/gestionnaire DNS). Créez `/etc/apache2/sites-available/netmonster.conf` : ```apache ServerName netmonster.votre-domaine.tld DocumentRoot /var/www/netmonster AllowOverride All Require all granted Require all denied Require all denied Require all denied Require all denied ErrorLog ${APACHE_LOG_DIR}/netmonster_error.log CustomLog ${APACHE_LOG_DIR}/netmonster_access.log combined ``` Le bloc `` empeche l'execution de PHP dans ce dossier, meme si un fichier malveillant y est depose sous un nom deguise en `.ntm`, en complement de la validation deja faite cote applicatif dans `admin/import_ntm.php`. Le bloc `` interdit tout acces HTTP direct au dossier contenant les cles Turnstile. ### Activation ```bash sudo a2enmod rewrite sudo a2ensite netmonster.conf sudo apache2ctl configtest sudo systemctl reload apache2 ``` `apache2ctl configtest` doit renvoyer `Syntax OK` avant de recharger. Cette verification est importante : une erreur de syntaxe dans le nouveau virtualhost pourrait empecher Apache de redemarrer, ce qui couperait aussi l'acces au site deja en production sur ce serveur. ## 7. Mise en place du HTTPS (recommandé) Une fois le DNS propage et `netmonster.votre-domaine.tld` accessible en HTTP : ```bash sudo apt install -y certbot python3-certbot-apache sudo certbot --apache -d netmonster.votre-domaine.tld ``` `admin/admin_auth.php` détecte automatiquement si la requête est en HTTPS pour activer le flag `secure` sur les cookies de session : aucune configuration manuelle supplementaire n'est necessaire une fois Certbot en place. ## 8. Configuration de la connexion à la base Éditez `/var/www/netmonster/lib/db.php` : ```php $pdo = new PDO( 'mysql:host=localhost;dbname=netmonster;charset=utf8mb4', 'netmonster_user', 'un_mot_de_passe_fort', [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION] ); ``` ```bash sudo chmod 640 /var/www/netmonster/lib/db.php sudo chown www-data:www-data /var/www/netmonster/lib/db.php ``` ## 9. Création du compte administrateur Compte administrateur unique prevu pour cette V1 : ```bash php -r "echo password_hash('votre_mot_de_passe', PASSWORD_DEFAULT), PHP_EOL;" ``` ```bash sudo mysql -u netmonster_user -p netmonster ``` ```sql INSERT INTO admin_users (username, password_hash, role) VALUES ('votre_login', '', 'admin'); ``` ## 9bis. Activation du CAPTCHA Cloudflare Turnstile (optionnel, recommande) Suite au durcissement de securite du 20/09/2026, la page de connexion peut utiliser Cloudflare Turnstile pour bloquer les tentatives de connexion automatisees. **Desactive par defaut** : tant que `config/turnstile.php` n'existe pas, `admin/login.php` fonctionne normalement sans CAPTCHA. 1. Verifiez que `php-curl` est installe (voir etape 2) : ```bash php -m | grep -i curl ``` 2. Creez un compte gratuit sur [dash.cloudflare.com](https://dash.cloudflare.com/) (aucune carte bancaire requise), menu **Turnstile > Add site**, renseignez `netmonster.votre-domaine.tld`. 3. Copiez le modele fourni et remplissez vos cles : ```bash sudo cp /var/www/netmonster/config/turnstile.example.php /var/www/netmonster/config/turnstile.php sudo nano /var/www/netmonster/config/turnstile.php ``` 4. Dans `turnstile.php`, passez `TURNSTILE_ENABLED` a `true` et renseignez `TURNSTILE_SITE_KEY` / `TURNSTILE_SECRET_KEY`. 5. Protégez le fichier : ```bash sudo chmod 640 /var/www/netmonster/config/turnstile.php sudo chown www-data:www-data /var/www/netmonster/config/turnstile.php ``` 6. Verifiez que `config/turnstile.php` est bien ignore par Git (`.gitignore`), pour ne jamais committer vos cles secretes. Laissez `TURNSTILE_FAIL_CLOSED` a `false` (valeur par defaut) sauf si vous exposez cette interface publiquement sans acces de secours : avec `false`, une panne Cloudflare ou une coupure Internet sortante temporaire de la VM ne vous bloque pas l'acces admin (le mot de passe et le rate limiting SQL restent actifs). ## 10. Pare-feu Si `ufw` est deja actif pour le site existant, verifiez simplement que les ports 80/443 sont ouverts (ils le sont deja si l'autre site fonctionne) : ```bash sudo ufw status ``` Aucune regle supplementaire n'est necessaire : NetMonster partage le meme Apache2, donc les memes ports. ## 11. Branchement au contribute.php existant (optionnel) ```php require_once __DIR__ . '/lib/ntm_import_to_staging.php'; $stats = importNtmFileToStaging($uploadedPath, $safeFilename, $countryId); ``` Vous pouvez aussi importer des fichiers `.ntm` directement depuis l'admin via `/admin/import_ntm.php`, sans toucher a `contribute.php`. ## 12. Vérification post-installation - Ouvrez `https://netmonster.votre-domaine.tld/admin/login.php` et connectez-vous. - **Vérifiez que le site existant sur ce meme serveur fonctionne toujours normalement** (test de non-regression apres modification d'Apache). - Vérifiez `/admin/index.php`, `/admin/countries_settings.php` (Luxembourg + 4 operateurs pre-remplis). - Testez `/admin/import_ntm.php` avec un fichier `.ntm` de test, vérifiez l'apercu de regroupement. - Validez le site importé via `/admin/review.php`, vérifiez son apparition dans `/admin/edit_site.php` et sur la carte de `/admin/index.php`. - Testez `/admin/export.php`. - Si vous avez plusieurs echecs de connexion volontaires sur `/admin/login.php`, verifiez que le message de verrouillage apparait bien apres 5 tentatives, et que la table `login_attempts` s'est remplie (`SELECT * FROM login_attempts ORDER BY attempted_at DESC LIMIT 10;`). ## 13. Ajout d'un nouveau pays Utilisez `/admin/countries_settings.php`, aucune modification de fichier n'est necessaire.