# Installation sur une VM de test (Proxmox, sans nom de domaine) Ce guide déploie l'espace d'administration NetMonster sur une VM **Ubuntu 24.04 LTS + Nginx**, hébergée sur votre hyperviseur **Proxmox**, accessible directement via l'IP de la VM sur votre réseau (LAN ou Tailscale), sans domaine ni certificat HTTPS. > **Note de coherence** : votre serveur de **production** tourne sur Ubuntu 24.04 + **Apache2** (voir `INSTALL.md`), tandis que cette VM de **test** utilise Ubuntu 24.04 + **Nginx**. C'est intentionnel et sans consequence : le code PHP de NetMonster Admin est identique et fonctionne a l'identique sur les deux stacks web, seule la configuration du serveur (virtualhost Apache vs bloc server Nginx) differe. Gardez seulement a l'esprit que cette VM ne reproduit pas exactement le routage par sous-domaine prevu en production (ici vous accedez via l'IP de la VM, en prod ce sera `netmonster.votre-domaine.tld`) : testez la logique fonctionnelle ici, et validez le sous-domaine + HTTPS uniquement sur la prod ou un environnement de pre-prod dedie si vous en avez un. Pour le déploiement définitif, référez-vous a `INSTALL.md`. ## 1. Prérequis de la VM Proxmox - Une VM Ubuntu 24.04 LTS fraîchement installee (serveur minimal suffit, pas besoin d'environnement graphique). - Réseau en mode **bridge** (vmbr0) pour un acces direct depuis votre LAN, ou rattachee a votre **tailnet Tailscale** si vous préférez ne pas l'exposer sur le LAN. - Au moins 1 vCPU, 1 Go de RAM et 10 Go de disque (ressources minimales, ajustez selon la charge de test prevue). - Si vous utilisez cloud-init pour le provisioning Proxmox, veillez a activer l'agent QEMU (`qemu-guest-agent`) pour recuperer facilement l'IP depuis l'interface Proxmox. Récupérez l'adresse IP de la VM (affichee dans l'onglet **Summary** de Proxmox si l'agent QEMU est actif, ou directement depuis la VM) : ```bash ip a ``` ## 2. Mise à jour et installation des paquets ```bash sudo apt update && sudo apt upgrade -y sudo apt install -y nginx php-fpm php-mysql php-mbstring php-xml php-curl mariadb-server mariadb-client curl unzip sudo systemctl enable --now nginx php8.3-fpm mariadb ``` Ubuntu 24.04 fournit nativement **PHP 8.3** et **MariaDB 10.11**, comme en production — c'est un des avantages de tester sur la meme distribution que la prod plutot que sur une distribution differente. `php-curl` est installe des maintenant pour permettre de tester le CAPTCHA Cloudflare Turnstile si besoin (voir etape 8bis) ; il n'est pas obligatoire si vous ne testez pas cette fonctionnalite. Verifiez la version du socket PHP-FPM installee (utile pour l'etape 6) : ```bash ls /run/php/ ``` Vous devriez voir `php8.3-fpm.sock` (adaptez le nom dans la config Nginx si votre version differe). ## 3. Sécurisation minimale de MariaDB ```bash sudo mysql_secure_installation ``` ## 4. Création de la base de données : un seul fichier a executer ```bash sudo mysql -u root -p ``` ```sql CREATE DATABASE netmonster CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; CREATE USER 'netmonster_user'@'localhost' IDENTIFIED BY 'test_password'; GRANT ALL PRIVILEGES ON netmonster.* TO 'netmonster_user'@'localhost'; FLUSH PRIVILEGES; EXIT; ``` Importez le schema complet en une seule commande : ```bash mysql -u netmonster_user -ptest_password netmonster < /tmp/netmonster_admin/admin/sql/install_full_schema.sql ``` Ce fichier unique cree toutes les tables (deja avec les colonnes de parametres radio bande/frequence/azimut/largeur, la contrainte d'unicite corrigee sur `cells`, la table `login_attempts` pour le rate limiting du login, et l'ENUM `source` de `staging_cells` incluant `cellmapper_import`), et pré-remplit le Luxembourg + ses 4 operateurs. Il est idempotent : l'executer une seconde fois par erreur ne casse rien. ## 5. Déploiement rapide des fichiers Transferez d'abord le depot sur la VM (via `scp`, un partage Proxmox, ou un `git clone` direct sur la VM), puis : ```bash sudo mkdir -p /var/www/netmonster sudo cp -r /tmp/netmonster_admin/* /var/www/netmonster/ sudo mkdir -p /var/www/netmonster/uploads sudo mkdir -p /var/www/netmonster/config sudo chown -R www-data:www-data /var/www/netmonster sudo chmod -R 755 /var/www/netmonster sudo chmod 750 /var/www/netmonster/uploads sudo chmod 750 /var/www/netmonster/config ``` Vérifiez que l'arborescence deployee correspond a celle-ci (voir aussi `README.md`) : ``` /var/www/netmonster/ ├── lib/ (db.php, csrf.php, ntm_import_to_staging.php) ├── config/ (turnstile.php — optionnel, voir etape 8bis) ├── 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, assets/navigation.css) └── uploads/ ``` ## 6. Configuration Nginx sans domaine ```bash sudo tee /etc/nginx/sites-available/netmonster-test <<'EOF' server { listen 80 default_server; server_name _; root /var/www/netmonster; index index.php; location / { try_files $uri $uri/ =404; } location ~ \.php$ { include snippets/fastcgi-php.conf; fastcgi_pass unix:/run/php/php8.3-fpm.sock; } location ~* ^/admin/.*\.(sql|md)$ { deny all; } location ^~ /config/ { deny all; } location ^~ /uploads/ { location ~ \.php$ { deny all; return 403; } } # Interdire l'accès à tout dossier ou fichier .git location ~ /\.git { deny all; return 404; } } EOF sudo rm -f /etc/nginx/sites-enabled/default sudo ln -s /etc/nginx/sites-available/netmonster-test /etc/nginx/sites-enabled/ sudo nginx -t sudo systemctl reload nginx ``` Adaptez `php8.3-fpm.sock` si l'etape 2 a installe une autre version de PHP-FPM. Le bloc `location ^~ /config/ { deny all; }` interdit tout acces HTTP direct au dossier destine a `turnstile.php`, meme en test. ## 7. Configuration de la connexion à la base Éditez `/var/www/netmonster/lib/db.php` avec `test_password` (voir etape 4). ## 8. Création d'un compte admin de test ```bash php -r "echo password_hash('test1234', PASSWORD_DEFAULT), PHP_EOL;" ``` ```sql INSERT INTO admin_users (username, password_hash, role) VALUES ('admin', '', 'admin'); ``` ## 8bis. Test du CAPTCHA Cloudflare Turnstile (optionnel) Le rate limiting de connexion (table `login_attempts`) est actif par defaut des que le schema SQL est importe. Le CAPTCHA Turnstile, lui, reste **desactive** tant que `config/turnstile.php` n'existe pas — vous pouvez ignorer cette section pour un test rapide. Pour le tester malgre l'absence de nom de domaine public : 1. Sur [dash.cloudflare.com](https://dash.cloudflare.com/) (compte gratuit), menu **Turnstile > Add site**. Si la VM est accessible uniquement via Tailscale ou votre LAN, ajoutez le nom d'hote local ou l'IP en mode test (Cloudflare accepte des domaines/hotes de test comme `localhost`) — sinon utilisez temporairement le hostname Tailscale de la VM si vous avez active **Tailscale Funnel** dessus. 2. Copiez le modele et renseignez 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 ``` 3. Passez `TURNSTILE_ENABLED` a `true`, renseignez les deux cles. 4. Protegez le fichier : ```bash sudo chmod 640 /var/www/netmonster/config/turnstile.php sudo chown www-data:www-data /var/www/netmonster/config/turnstile.php ``` 5. Rechargez `/admin/login.php` : le widget CAPTCHA doit apparaitre sous le formulaire. Pour desactiver a nouveau : repassez `TURNSTILE_ENABLED` a `false`, ou supprimez `config/turnstile.php`. ## 9. Accès depuis votre machine Recuperez l'IP de la VM (onglet Summary dans Proxmox, ou `ip a` dans la VM), puis ouvrez directement : ``` http://IP_DE_LA_VM/admin/login.php ``` Si la VM est rattachee a votre tailnet (recommande, coherent avec votre usage habituel de Tailscale pour Proxmox), utilisez plutot l'IP ou le nom Tailscale de la VM, accessible depuis n'importe lequel de vos appareils sans configuration reseau supplementaire : ``` http://IP_TAILSCALE_DE_LA_VM/admin/login.php ``` Connectez-vous avec `admin` / `test1234`. > Sur une session HTTP simple, `admin/admin_auth.php` desactive automatiquement le flag `secure` des cookies de session (detecte l'absence de HTTPS) : la connexion fonctionne normalement sans configuration supplementaire. Ce flag s'activera seul une fois la prod en HTTPS (voir `INSTALL.md`, etape Certbot). > Si vous avez teste plusieurs mots de passe incorrects par erreur, la connexion peut se retrouver temporairement bloquee (5 echecs sur le meme compte+IP, ou 30 echecs sur l'IP en 15 minutes). Videz la table de test si besoin : `DELETE FROM login_attempts;` ## 10. Génération de données de démonstration Pour visualiser rapidement le regroupement par site dans `/admin/review.php`, insérez quelques lignes factices en staging : ```sql INSERT INTO staging_cells (tech, mcc, mnc, operator_guess, cell_id, area_code, sub_id, sub_id2, band, frequency, azimuth, bandwidth, lat, lon, location_desc, address_desc, arfcn, source, status) VALUES ('4G', '270', '01', (SELECT id FROM operators WHERE mcc='270' AND mnc='01'), 43, 3006, 23, 4620, 'B7', '700MHz', 280, '10MHz', 49.492048, 6.116873, 'eNB ID 4620 - LTE B7 700Mhz - 280° - 10Mhz - E25 Echangeur Burange/Hellange, Dudelange', 'E25 Echangeur Burange/Hellange, Dudelange', 6200, 'ntm_import', 'pending'), ('4G', '270', '01', (SELECT id FROM operators WHERE mcc='270' AND mnc='01'), 44, 3006, 45, 4620, 'B7', '700MHz', 40, '10MHz', 49.492048, 6.116873, 'eNB ID 4620 - LTE B7 700Mhz - 40° - 10Mhz - E25 Echangeur Burange/Hellange, Dudelange', 'E25 Echangeur Burange/Hellange, Dudelange', 6200, 'ntm_import', 'pending'), ('3G', '270', '77', (SELECT id FROM operators WHERE mcc='270' AND mnc='77'), 987654, 3002, 45, 210, NULL, NULL, NULL, NULL, 49.6100, 6.1350, 'Antenne test peripherie', 'Antenne test peripherie', 10700, 'ntm_import', 'pending'); ``` Rechargez `/admin/review.php` : les deux premieres lignes (meme eNB 4620) doivent se regrouper dans le meme site, la troisieme rester isolee. Validez le premier groupe pour tester ensuite `/admin/edit_site.php` (le site valide doit y apparaitre) et `/admin/export.php`. ## 11. Test de l'upload manuel de fichier .ntm Créez un petit fichier de test sur votre machine : ``` 4G;270;99;12;3010;5001;18;49.610000;6.130000;eNB ID 5001 - LTE B20 800Mhz - 90° - 10Mhz - Test upload manuel;6300 ``` Enregistrez-le en `test.ntm`, puis deposez-le via `/admin/import_ntm.php` en selectionnant le Luxembourg comme pays. Verifiez que l'apercu de regroupement s'affiche et que la ligne apparait ensuite dans `/admin/review.php`. ## 12. Test de l'import CellMapper (optionnel) Pour tester `/admin/cellmapper_import.php`, utilisez un export JSON CellMapper (voir la documentation de la page pour le format attendu : cle `responseData` avec `RAT`, `siteID`, `regionID`, `cells`, `channels`). Renseignez le MCC/MNC de l'operateur Luxembourgeois de votre choix (ex: `270` / `01` pour POST) puisqu'ils ne sont pas presents dans le JSON source. ## 13. Snapshot Proxmox (recommande avant tests destructifs) Avant de tester des actions irreversibles (suppression de site, fusion de doublons, purge d'historique), prenez un snapshot de la VM depuis l'interface Proxmox (**VM > Snapshots > Take Snapshot**). Cela permet de revenir instantanement a un etat propre sans repasser par toute la procedure d'installation : ```bash # Depuis le noeud Proxmox (CLI), si vous preferez la ligne de commande : qm snapshot avant_tests_destructifs ``` Pour restaurer : ```bash qm rollback avant_tests_destructifs ``` ## 14. Nettoyage après les tests Si vous ne conservez pas la VM pour des tests futurs (sinon, un snapshot "etat propre" suffit, voir etape 13) : ```bash sudo mysql -u root -p -e "DROP DATABASE netmonster;" sudo rm -rf /var/www/netmonster ``` Ou plus simplement, supprimez la VM depuis Proxmox si elle a ete creee uniquement pour ce test ponctuel.