# Installation sur cPanel

Guide pas à pas pour faire tourner l'agent comptable sur un hébergement cPanel.
Compte environ 45 minutes la première fois.

---

## 0. Vérifier que ton hébergement le supporte

Avant tout, connecte-toi à cPanel et cherche ces trois choses :

| À chercher | Où | Si absent |
|---|---|---|
| **Setup Node.js App** | section *Software* | ton hébergement ne fait pas tourner Node. Il te faut un VPS, ou un hébergeur mutualisé avec CloudLinux. |
| **MySQL Databases** | section *Databases* | idem |
| **SSL/TLS Status** ou *Let's Encrypt* | section *Security* | Meta refuse un webhook en HTTP. Il te faut un certificat. |

Dans *Setup Node.js App*, vérifie que la liste des versions propose **Node 20 ou
plus**. En dessous, l'app ne démarre pas.

> Si *Setup Node.js App* n'existe pas, arrête-toi ici — le reste ne servira à
> rien. Un petit VPS (Contabo, Hetzner, OVH à ~5 €/mois) est plus adapté et
> revient souvent moins cher qu'un mutualisé qui supporte Node.

---

## 1. Créer le sous-domaine

cPanel → **Domains** → *Create A New Domain*.

- Domaine : `compta.tondomaine.ma`
- Décoche *Share document root* et laisse le dossier proposé
  (`/home/USER/compta.tondomaine.ma`).

Remplace `USER` par ton nom d'utilisateur cPanel partout dans ce guide.

---

## 2. Créer la base de données

cPanel → **MySQL Databases**.

1. *Create New Database* : nom `compta` → cPanel crée **`USER_compta`**.
2. *Add New User* : nom `compta`, mot de passe fort → **`USER_compta`**.
3. *Add User To Database* → coche **ALL PRIVILEGES**.

Note les trois valeurs, tu en auras besoin :

```
DB_HOST=localhost
DB_NAME=USER_compta
DB_USER=USER_compta
DB_PASSWORD=le_mot_de_passe
```

> cPanel préfixe **toujours** avec ton nom d'utilisateur. Si tu écris `compta`
> au lieu de `USER_compta` dans le `.env`, tu auras `ER_BAD_DB_ERROR`.

---

## 3. Envoyer les fichiers

cPanel → **File Manager**.

1. Crée un dossier `compta` à la racine de ton home (`/home/USER/compta`).
   **Pas dans `public_html`** : le dossier contient ton `.env` et les
   pièces justificatives de tes factures.
2. Entre dedans → *Upload* → envoie `whatsapp-compta-ma.zip`.
3. Clic droit sur le zip → *Extract*.
4. Le zip contient un dossier `whatsapp-compta/` : remonte son contenu d'un
   niveau pour que `package.json` soit directement dans `/home/USER/compta/`,
   puis supprime le dossier vide et le zip.

Tu dois obtenir :

```
/home/USER/compta/
    app.js
    package.json
    src/
    public/
    sql/
    test/
```

---

## 4. Créer l'application Node

cPanel → **Setup Node.js App** → *Create Application*.

| Champ | Valeur |
|---|---|
| Node.js version | **20** ou plus |
| Application mode | **Production** |
| Application root | `compta` |
| Application URL | `compta.tondomaine.ma` |
| Application startup file | `app.js` |

Clique **Create**.

> `app.js` et pas `src/server.js` : cPanel charge le fichier avec `require()`,
> et `src/server.js` ne démarre que s'il est lancé comme programme principal.
> `app.js` existe justement pour ça.

---

## 5. Les variables d'environnement

Deux façons. **Choisis-en une seule**, sinon tu ne sauras plus laquelle gagne.

### Option A — fichier `.env` (recommandé, plus lisible)

File Manager → `/home/USER/compta/` → *+ File* → nom `.env` → clic droit → *Edit*.

```ini
WHATSAPP_TOKEN=EAAxxxxxxxxxxxx
WHATSAPP_PHONE_NUMBER_ID=123456789012345
WHATSAPP_VERIFY_TOKEN=choisis_un_mot_de_passe
WHATSAPP_APP_SECRET=xxxxxxxxxxxxxxxx
ALLOWED_NUMBERS=2126XXXXXXXX

ANTHROPIC_API_KEY=sk-ant-xxxxxxxx

DB_HOST=localhost
DB_PORT=3306
DB_NAME=USER_compta
DB_USER=USER_compta
DB_PASSWORD=ton_mot_de_passe_mysql

PUBLIC_URL=https://compta.tondomaine.ma
DASHBOARD_PASSWORD=un_autre_mot_de_passe
EXPORT_SECRET=une_longue_chaine_aleatoire

INTERNAL_CRON=false

COMPANY_NAME=Ma Societe SARL
COMPANY_ICE=000000000000000
TVA_REGIME=mensuel
TIMEZONE=Africa/Casablanca
```

Si *File Manager* cache le fichier : *Settings* → coche **Show Hidden Files**.

### Option B — l'interface cPanel

Dans *Setup Node.js App*, section **Environment variables**, ajoute-les une
par une. Plus fastidieux, mais ça survit à une manipulation de fichiers.

### Les deux réglages qui comptent

**`INTERNAL_CRON=false`** — obligatoire sur cPanel. Passenger endort
l'application quand personne ne s'en sert ; un planificateur interne ne partirait
jamais. Les tâches passent par le Cron Job de cPanel (étape 9).

**`ALLOWED_NUMBERS`** — ta serrure. Laissé vide, n'importe quel numéro qui tombe
sur ton WhatsApp peut écrire dans ta comptabilité. Mets-y tes numéros, format
international sans `+` : `212612345678`.

---

## 6. Installer les dépendances

Dans *Setup Node.js App*, sur ta ligne d'application, bouton **Run NPM Install**.

Ça prend une ou deux minutes. Si le bouton ne fait rien, passe par le terminal :

cPanel → **Terminal**. Copie d'abord la commande d'activation affichée en haut
de la page *Setup Node.js App* (bouton *Copy* à côté de
`source /home/USER/nodevenv/compta/20/bin/activate`), colle-la, puis :

```bash
cd ~/compta
npm install
```

> **Pas de Terminal chez ton hébergeur ?** Le bouton *Run NPM Install* suffit
> pour cette étape, et l'étape 7 a une solution de rechange.

---

## 7. Créer les tables

### Avec le Terminal

```bash
source /home/USER/nodevenv/compta/20/bin/activate
cd ~/compta
npm run migrate
```

Tu dois voir `Base prete. Societe #1`.

### Sans Terminal — par phpMyAdmin

1. cPanel → **phpMyAdmin** → sélectionne `USER_compta` à gauche.
2. Onglet **Import** → *Choisir un fichier* → `sql/schema.sql` (télécharge-le
   depuis File Manager) → **Exécuter**.
3. Onglet **SQL**, puis colle ceci en remplaçant les valeurs :

```sql
INSERT INTO societes (nom, ice, tva_regime, exercice_debut)
VALUES ('Ma Societe SARL', '000000000000000', 'mensuel', '01-01');

INSERT INTO utilisateurs (societe_id, telephone, role)
VALUES (1, '212612345678', 'admin');
```

---

## 8. Démarrer et vérifier

*Setup Node.js App* → **Restart**.

Puis, dans ton navigateur :

```
https://compta.tondomaine.ma/health
```

Tu dois voir `{"ok":true,"at":"..."}`.

Si tu vois une erreur, lis `/home/USER/compta/stderr.log` dans File Manager.
Le tableau de l'étape 11 couvre les cas courants.

Active ensuite le certificat : cPanel → **SSL/TLS Status** → coche le
sous-domaine → *Run AutoSSL*. Vérifie que `https://` fonctionne — sans lui,
l'étape suivante échouera.

Le dashboard est sur `https://compta.tondomaine.ma` (mot de passe :
`DASHBOARD_PASSWORD`).

---

## 9. Les tâches planifiées

cPanel → **Cron Jobs**. Il te faut le chemin exact de node, visible dans la
commande d'activation de *Setup Node.js App* :

```
/home/USER/nodevenv/compta/20/bin/node
```

Ajoute ces quatre tâches (`Add New Cron Job`, *Common Settings* → `Once Per Week`
puis ajuste les champs) :

| Quand | Réglage cron | Commande |
|---|---|---|
| Lundi 8h | `0 8 * * 1` | `/home/USER/nodevenv/compta/20/bin/node /home/USER/compta/src/scripts/cron.js hebdo` |
| Le 1er à 9h | `0 9 1 * *` | `... /src/scripts/cron.js mensuel` |
| Les 15 et 18 à 9h | `0 9 15,18 * *` | `... /src/scripts/cron.js tva` |
| Jeudi 10h | `0 10 * * 4` | `... /src/scripts/cron.js impayes` |

> **L'heure du cron est celle du serveur**, souvent en UTC. Le Maroc est à
> UTC+1. Si ton serveur est en UTC, écris `0 7 * * 1` pour recevoir le résumé à
> 8h heure marocaine. Vérifie avec `date` dans le Terminal.

Pour tester tout de suite sans attendre :

```bash
source /home/USER/nodevenv/compta/20/bin/activate
cd ~/compta
node src/scripts/cron.js tva
```

---

## 10. Brancher WhatsApp

Sur **developers.facebook.com**, dans ton app → *WhatsApp* → *Configuration* :

- **URL de rappel** : `https://compta.tondomaine.ma/webhook`
- **Token de vérification** : exactement ce que tu as mis dans
  `WHATSAPP_VERIFY_TOKEN`
- Clique **Vérifier et enregistrer** — l'app doit déjà tourner (étape 8).
- Abonne-toi au champ **messages**.
- Passe l'app en mode **Live**.

Envoie une photo de facture depuis un numéro de `ALLOWED_NUMBERS`. L'agent
répond « Facture reçue, je la lis... ».

Le détail de la création de l'app Meta et du **token permanent** est dans le
`README.md`, §4. Ne te sers pas du token affiché par défaut : il meurt au bout
de 24 heures.

---

## 11. Quand ça ne marche pas

| Symptôme | Cause | Solution |
|---|---|---|
| Page blanche ou 503 | l'app n'a pas démarré | lis `stderr.log`, puis *Restart* |
| `ER_BAD_DB_ERROR` | préfixe cPanel oublié | `DB_NAME=USER_compta`, pas `compta` |
| `ER_ACCESS_DENIED` | user pas rattaché à la base | *MySQL Databases* → *Add User To Database* → ALL PRIVILEGES |
| `Cannot find module 'express'` | `npm install` pas passé | *Run NPM Install*, ou `npm install` dans le venv |
| Meta : « Échec de la validation » | app arrêtée, HTTP au lieu de HTTPS, ou token différent | teste `/health` en `https://`, recompare le token |
| Webhook OK mais aucune réponse | numéro non autorisé | ajoute-le à `ALLOWED_NUMBERS`, puis *Restart* |
| Facture lue mais pas de message | `WHATSAPP_TOKEN` expiré | refais un token permanent (README §4) |
| « ANTHROPIC_API_KEY manquante » | clé absente ou `.env` mal placé | le `.env` va dans `/home/USER/compta/`, à côté de `package.json` |
| Aucun rappel ne part | `INTERNAL_CRON` pas à `false`, ou chemin de node faux | teste la commande à la main dans le Terminal |
| Lien d'export « invalide ou expiré » | `EXPORT_SECRET` différent entre le cron et l'app | mets la même valeur, une seule fois, dans le `.env` |
| Les modifs du code ne prennent pas | Passenger garde l'ancienne version | *Restart*, ou `touch ~/compta/tmp/restart.txt` |

### Vérifier que l'hébergeur laisse sortir les appels

Certains mutualisés bloquent les connexions sortantes. Dans le Terminal :

```bash
curl -s -o /dev/null -w "%{http_code}\n" https://api.anthropic.com
curl -s -o /dev/null -w "%{http_code}\n" https://graph.facebook.com
```

Deux codes HTTP (401, 400, 200 — peu importe lequel) : c'est bon. Si ça reste
bloqué ou renvoie `000`, l'hébergeur filtre le sortant et rien ne marchera :
demande-lui d'ouvrir, ou passe sur un VPS.

---

## 12. Après l'installation

**Protège le dossier des pièces.** `/home/USER/compta/storage/` contient tes
factures. Il est hors de `public_html`, donc déjà inaccessible depuis le web —
ne le déplace pas dedans.

**Sauvegarde.** Cron Job hebdomadaire :

```bash
mysqldump -u USER_compta -p'MOT_DE_PASSE' USER_compta | gzip > ~/backups/compta_$(date +\%F).sql.gz
```

Crée `~/backups` avant, et note le `\%` — cron interprète `%` autrement.
Sauvegarde aussi `storage/` : l'administration fiscale peut réclamer les pièces
justificatives.

**Surveille l'espace disque.** Chaque facture photographiée pèse 1 à 3 Mo. Mille
factures par an, c'est 2 à 3 Go.

**Après chaque modification du `.env` ou du code** : *Setup Node.js App* →
**Restart**. Sans ça, Passenger continue de servir l'ancienne version.
