12 KiB
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
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
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 :
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 :
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 :
sudo systemctl restart apache2
3. Installation de MariaDB
Si MariaDB n'est pas deja installe pour l'autre site :
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
sudo mysql -u root -p
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
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_attemptsnecessaire au rate limiting de connexion durci (voiradmin/admin_auth.phpetadmin/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/ :
# 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 :
SHOW TABLES;
DESCRIBE login_attempts;
5. Déploiement des fichiers applicatifs
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/ :
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) :
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 :
<VirtualHost *:80>
ServerName netmonster.votre-domaine.tld
DocumentRoot /var/www/netmonster
<Directory /var/www/netmonster>
AllowOverride All
Require all granted
</Directory>
<Directory /var/www/netmonster/uploads>
<FilesMatch "\.php$">
Require all denied
</FilesMatch>
</Directory>
<Directory /var/www/netmonster/config>
Require all denied
</Directory>
<FilesMatch "\.(sql|md)$">
Require all denied
</FilesMatch>
ErrorLog ${APACHE_LOG_DIR}/netmonster_error.log
CustomLog ${APACHE_LOG_DIR}/netmonster_access.log combined
</VirtualHost>
Le bloc <Directory /var/www/netmonster/uploads> 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 <Directory /var/www/netmonster/config> interdit tout acces HTTP direct au dossier contenant les cles Turnstile.
Activation
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 :
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 :
$pdo = new PDO(
'mysql:host=localhost;dbname=netmonster;charset=utf8mb4',
'netmonster_user',
'un_mot_de_passe_fort',
[PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION]
);
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 :
php -r "echo password_hash('votre_mot_de_passe', PASSWORD_DEFAULT), PHP_EOL;"
sudo mysql -u netmonster_user -p netmonster
INSERT INTO admin_users (username, password_hash, role)
VALUES ('votre_login', '<hash_genere_ci-dessus>', '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.
- Verifiez que
php-curlest installe (voir etape 2) :php -m | grep -i curl - Creez un compte gratuit sur dash.cloudflare.com (aucune carte bancaire requise), menu Turnstile > Add site, renseignez
netmonster.votre-domaine.tld. - Copiez le modele fourni et remplissez vos cles :
sudo cp /var/www/netmonster/config/turnstile.example.php /var/www/netmonster/config/turnstile.php sudo nano /var/www/netmonster/config/turnstile.php - Dans
turnstile.php, passezTURNSTILE_ENABLEDatrueet renseignezTURNSTILE_SITE_KEY/TURNSTILE_SECRET_KEY. - Protégez le fichier :
sudo chmod 640 /var/www/netmonster/config/turnstile.php sudo chown www-data:www-data /var/www/netmonster/config/turnstile.php - Verifiez que
config/turnstile.phpest 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) :
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)
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.phpet 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.phpavec un fichier.ntmde test, vérifiez l'apercu de regroupement. - Validez le site importé via
/admin/review.php, vérifiez son apparition dans/admin/edit_site.phpet 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 tablelogin_attemptss'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.