Import
This commit is contained in:
commit
6ae10c6f64
3 files changed
+729
No files matched your search
+323
@@ -0,0 +1,323 @@
|
||||
# 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>
|
||||
|
||||
<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.
|
||||
Reference in new issue
Block a user