Files
2026-10-21 22:23:43 +02:00

12 KiB

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) :

ip a

2. Mise à jour et installation des paquets

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) :

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

sudo mysql_secure_installation

4. Création de la base de données : un seul fichier a executer

sudo mysql -u root -p
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 :

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 :

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

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

php -r "echo password_hash('test1234', PASSWORD_DEFAULT), PHP_EOL;"
INSERT INTO admin_users (username, password_hash, role) VALUES ('admin', '<hash>', '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 (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 :
    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 :
    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 :

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 :

# Depuis le noeud Proxmox (CLI), si vous preferez la ligne de commande :
qm snapshot <VMID> avant_tests_destructifs

Pour restaurer :

qm rollback <VMID> 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) :

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.