Files
admin-netmonster-db/INSTALL.md
T
2026-10-21 22:25:03 +02:00

327 lines
12 KiB
Markdown

# 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
<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>
<DirectoryMatch "/\.git">
Require all denied
</DirectoryMatch>
<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
```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', '<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.
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.