# TRAIL DPS - LOT 3 - Déploiement OVH

## 1. Destination

Le ZIP contient un seul dossier racine `ovh`. Le chemin serveur historique du projet Licence/Tracking doit être fourni explicitement dans `-RemoteRoot` ; il n'est jamais déduit ou inventé par le script.

## 2. Configurations réelles à préparer hors ZIP

Ne jamais remplacer les configurations réelles par les fichiers d'exemple.

### `config/env.local.php`

Reprendre `config/env.local.example.php` et renseigner :

- `internal_api.service_id = traildps-licence` ;
- `internal_api.hmac_key` : secret aléatoire d'au moins 32 octets ;
- `internal_api.allowed_service_ids` : `traildps-workspace` et `traildps-tracking` ;
- `workspace.base_url` : URL racine du Workspace STAGING ;
- `tracking_internal.base_url` : URL racine publique portant `/tracking-internal/v1` ;
- les identifiants réels de la base Licence `synolui94`.

### `tracking_config/env.local.php`

Reprendre `tracking_config/env.local.example.php` et renseigner le **même secret HMAC** :

- `internal_api.service_id = traildps-tracking` ;
- `internal_api.allowed_service_ids = ['traildps-licence']` ;
- `internal_api.hmac_key` identique à celui du domaine Licence.

Le Workspace doit utiliser ce même secret dans `security.internal_hmac_key` et dans le bloc `licence.hmac_key`. Aucun mot de passe, secret HMAC ou fichier `env.local.php` n'est livré dans le ZIP.

## 3. Commande PowerShell exacte

```powershell
Set-ExecutionPolicy -Scope Process -ExecutionPolicy Bypass
$ErrorActionPreference = "Stop"

$Zip = "C:\DEPLOIEMENT\TRAIL_DPS_OVH_LOT3_INCREMENTAL_2026-08-04.zip"
$Ssh = "UTILISATEUR@HOTE_OVH"
$Root = "/CHEMIN/EXACT/DU/PROJET/ovh"
$Tools = Join-Path $env:TEMP ("TRAIL_DPS_LOT3_OVH_TOOLS_" + [guid]::NewGuid().ToString("N"))

New-Item -ItemType Directory -Path $Tools -Force | Out-Null
Expand-Archive -LiteralPath $Zip -DestinationPath $Tools -Force

& (Join-Path $Tools "ovh\scripts\Deploy-Lot3-Ovh.ps1") `
  -ZipPath $Zip `
  -SshTarget $Ssh `
  -RemoteRoot $Root `
  -ApplySchema `
  -MigrateHistoricalLicenses

if ($LASTEXITCODE -ne 0) { throw "Déploiement OVH LOT 3 en échec." }
```

Ne pas utiliser `-SyncWorkspace` avant le déploiement de Workspace STAGING et l'application de sa migration `005`.

## 4. Contrôles après migration OVH

```powershell
ssh.exe $Ssh "cd '$Root' && php tests/lot3_contracts.php"
ssh.exe $Ssh "cd '$Root' && php scripts/lot3_migrate_schema.php --dry-run"
ssh.exe $Ssh "cd '$Root' && php scripts/lot3_migrate_legacy_licenses.php"
ssh.exe $Ssh "cd '$Root' && php scripts/lot3_resolve_sms_subscriptions.php 1000"
ssh.exe $Ssh "cd '$Root' && php scripts/lot3_check_readiness.php"
```

Le script de migration historique sans `--apply` est un contrôle à blanc. Il ne doit plus annoncer de création après l'application réelle.

## 5. Synchronisation après déploiement de Workspace STAGING

```powershell
ssh.exe $Ssh "cd '$Root' && php scripts/lot3_sync_workspace.php"
ssh.exe $Ssh "cd '$Root' && php scripts/lot3_check_readiness.php"
```

## 6. Contrôles fonctionnels

- le nombre de licences historiques avant/après reste identique ;
- aucune clé, empreinte machine, activation ou compteur de réaffectation n'est modifié ;
- chaque licence historique possède un UUID technique, une organisation, une souscription et une période ;
- aucune fusion automatique des clients historiques n'est effectuée ;
- PRO comporte exactement trois licences `INCLUDED` ;
- les licences vendues en supplément sont `ADDITIONAL` et n'augmentent pas les quotas ;
- STARTER et les licences historiques MONOPOSTE conservent collaboration et partage photo désactivés ;
- les regroupements sont planifiés à la période suivante, sauf effet immédiat explicitement demandé et audité ;
- les routes `activate.php`, `check.php` et `rebind.php` restent compatibles ;
- le payload historique est conservé, les objets organisation/souscription sont additifs ;
- les consommations restent en mode `OBSERVATION` et ne bloquent ni SMS ni LIVE ;
- la synthèse SMS est calculée par souscription et le détail conserve la licence émettrice ;
- un SMS non attribuable reste exclu de la facturation automatique ;
- Licence et Tracking n'ouvrent plus de connexion SQL métier croisée.

## 7. Tâches planifiées recommandées

- horaire : `php scripts/lot3_resolve_sms_subscriptions.php 1000` ;
- horaire : `php scripts/lot3_purge_internal_nonces.php` ;
- quotidien : `php scripts/lot3_apply_scheduled_license_changes.php` ;
- quotidien et avant toute opération commerciale : actualisation/synchronisation des consommations.

## 8. Rollback applicatif

La commande exacte et le chemin de sauvegarde sont affichés par le script. Exemple :

```powershell
& (Join-Path $Tools "ovh\scripts\Rollback-Lot3-Remote.ps1") `
  -SshTarget $Ssh `
  -RemoteRoot $Root `
  -BackupRoot "/CHEMIN/AFFICHE/PAR/LE/DEPLOIEMENT"
```

Les migrations sont additives. Le rollback applicatif ne supprime aucune table ni colonne LOT 3.
