Documentation J+SERVICES Guides Référence API

Contrat API - assistance admin VPN depuis l’app SSH

Date : 2026-09-17 Pour : app SSH / portail d’assistance admin Statut : admin uniquement, derriere requireAdminAuth.

1. Objectif

L’app SSH peut proposer un mode admin pour rechercher un client, voir ses slots VPN et ouvrir le bundle d’assistance d’un slot precis.

Le serveur garantit que le script est toujours derive d’un allocation_id exact. Le router_serial n’est jamais une source de verite pour servir un script admin, car un client peut deplacer son routeur entre plusieurs slots.

2. Recherche parc

Route existante :

GET /admin/api/accounts?search=<email-ou-nom>&limit=50

La reponse expose users[]. Pour chaque client, les allocations VPN sont dans user.vpns[] et dans user.resources[] avec type: "VPN".

Champs a consommer cote app SSH :

{
  "id": "allocation-id",
  "type": "VPN",
  "name": "MikroTik VPN",
  "host": "vpn.mikhmoai.com",
  "status": "ACTIVE",
  "tunnel_status": "CONNECTED",
  "router_tunnel_ip": "10.255.x.x",
  "locked_router_identity": "Router",
  "locked_router_model": "hAP ax3",
  "locked_router_serial": "SERIAL",
}

3. Bundle d’assistance par slot

GET /admin/api/catalog/remote-access/{allocationId}/assistance-bundle
GET /admin/api/catalog/remote-access/{allocationId}/assistance-bundle?include_script=1

Sans include_script=1, le serveur renvoie seulement un apercu masque. Avec include_script=1, le champ script.content contient le script RouterOS complet pour intervention manuelle. Cette action est tracee par evenement ADMIN_ASSISTANCE_BUNDLE_SERVED.

Le portail utilise POST /admin/api/catalog/remote-access/{allocationId}/manual-script pour WireGuard RouterOS v7. Cet endpoint fournit un bootstrap admin à coller une fois sur le routeur cible. Il transfère explicitement l’allocation, renouvelle son pair WG et libère les associations de serial concurrentes ; il peut couper l’ancien routeur lié au slot. Voir le contrat de reprise manuelle pour ses garanties et limites.

Reponse :

{
  "success": true,
  "data": {
    "allocation_id": "uuid",
    "client_id": "uuid",
    "bundle_version": "2026-09-06",
    "active_transport": "WIREGUARD",
    "primary_protocol": "WIREGUARD",
    "selected_protocol": "WIREGUARD",
    "public_host": "vpn.mikhmoai.com",
    "endpoint": { "host": "vpn.mikhmoai.com", "port": 51820 },
    "peer_public_key_fingerprint": "sha256-prefix",
    "tunnel": {
      "router_tunnel_ip": "10.255.x.x",
      "status": "CONNECTED",
      "last_seen_at": "date-ou-null",
    },
    "router_lock": {
      "identity": "nom-routeur",
      "serial": "serial",
      "model": "modele",
      "is_locked": true,
    },
    "protocols": [
      {
        "profile_id": "uuid",
        "protocol": "WIREGUARD",
        "status": "ACTIVE",
        "has_routeros_script": true,
        "has_configuration_blob": true,
        "has_credentials": true,
        "transport_plane": "INDUSTRIAL_WG",
      },
    ],
    "script": {
      "protocol": "WIREGUARD",
      "available": true,
      "redacted": ":interface wireguard add private-key=\"***\" ...",
      "content": null,
      "revealed": false,
    },
  },
}

4. Garanties serveur

5. Cas non erreurs

6. Deviations assumees

Le backend ne cree pas une nouvelle route de recherche dediee a l’app SSH. La recherche reutilise /admin/api/accounts, deja protegee par la session admin et deja alignee avec le panneau web.