# Déploiement — hébergement mutualisé (OVH / Infomaniak)

Mise en production de **caisse-resto** sur un mutualisé avec **accès SSH**.

## Principe : un seul domaine

Le front React est **compilé en fichiers statiques** et déposé dans le dossier
`backend/public` de Laravel. Laravel sert ce front pour les URL applicatives
(`/`, `/caisse`, `/produits`…) et l'API répond sous **`/api`**.

- ✅ Un seul domaine, **aucun CORS**, un seul dossier web à configurer.
- Le front appelle l'API en **chemin relatif** (`/api`) → rien à coder en dur,
  réutilisable tel quel pour chaque restaurant.

> **Doc root du domaine → `backend/public`** (jamais la racine du projet :
> ça garderait `.env` et `vendor/` accessibles publiquement).

Règles d'or :
- Le **code** (dont les migrations) voyage par **Git**.
- Le **schéma** se (re)construit avec `php artisan migrate --force`.
- Les **données** ne sont **jamais** copiées entre local et prod (chaque
  environnement a sa base). On ne pousse **jamais** le `.env` réel ni `vendor/`.

## Prérequis côté hébergeur

- **PHP 8.2+** (sélecteur de version dans le panel).
- **SSH + Composer + Git** (offres OVH Perso/Pro/Performance).
- **Une base MySQL** (créée dans le panel → hôte / base / user / mot de passe).
- **SSL Let's Encrypt** activé (obligatoire : les tokens transitent).
- Pas de Node.js requis en prod : le front est **construit en local**.

---

## 1. Première mise en ligne (une fois)

**a) Base + domaine (panel OVH)**
1. Créer la base MySQL, noter les identifiants.
2. Configurer le domaine (ou sous-domaine) et régler son **dossier racine sur
   `caisse-resto/backend/public`** (fonction *Multisite* chez OVH).
3. Activer le **SSL**.

**b) Code + config (en SSH)**
```bash
cd ~                       # ou le dossier de ton espace web
git clone https://github.com/spinoops/caisse-resto.git
cd caisse-resto/backend
composer install --no-dev --optimize-autoloader

cp .env.production.example .env      # puis remplir (voir §3)
php artisan key:generate
php artisan migrate --seed --force   # tables + import de la carte + tables par défaut
php artisan config:cache
php artisan route:cache
```

**c) Front** : depuis ta machine locale (voir §2, il fait le build + l'envoi).

**d) Droits d'écriture** (si besoin) :
```bash
chmod -R ug+rw storage bootstrap/cache
```

**e) Comptes** : connecte-toi (terminal `admin@baseapp.test` / `password`),
puis **change immédiatement** le mot de passe gérant et attribue les PIN dans
*Administration → Utilisateurs*.

---

## 2. À chaque mise à jour

Le plus simple : le script fourni, **depuis ta machine locale** :
```bash
SSH_HOST="user@sshcloud.ovh.net" REMOTE_DIR="~/caisse-resto" ./scripts/deploy.sh
```
Il **build le front**, met à jour le **code sur le serveur** (git pull +
composer + `migrate --force` + caches), puis **envoie le front** dans
`backend/public`.

À la main, si tu préfères :
```bash
# local
git push
npm --prefix frontend run build
rsync -avz frontend/dist/ user@host:~/caisse-resto/backend/public/

# serveur (SSH)
cd ~/caisse-resto && git pull --ff-only
cd backend && composer install --no-dev --optimize-autoloader
php artisan migrate --force
php artisan config:cache && php artisan route:cache
```

> `migrate --force` **ajoute/modifie** les tables sans toucher aux données.
> Ne jamais copier la base locale par-dessus la prod.

---

## 3. Fichier `.env` de prod (points importants)

```env
APP_ENV=production
APP_DEBUG=false
APP_URL=https://ton-domaine.tld        # le domaine unique (front + API)
FRONTEND_URL=https://ton-domaine.tld   # identique en mono-domaine

DB_HOST=...                            # base MySQL de l'hébergeur
DB_DATABASE=...
DB_USERNAME=...
DB_PASSWORD=...
```
Voir `backend/.env.production.example` pour le fichier complet.

---

## Variante : 2 domaines séparés (front / API)

Possible aussi (ex. `caisse.dom.tld` pour le front, `api.dom.tld` pour l'API) :
1. `frontend/.env.production` → `VITE_API_URL=https://api.dom.tld`
2. Doc root : le front sur `frontend/dist`, l'API sur `backend/public`.
3. Autoriser le front dans le CORS (`config/cors.php` + `FRONTEND_URL`).

Le mono-domaine reste recommandé sur mutualisé (plus simple, pas de CORS).

## Sauvegardes de la base

La commande intégrée sauvegarde la base en `storage/app/backups/*.sql.gz`
(mysqldump si disponible, sinon export 100 % PHP) avec **rotation** :

```bash
php artisan db:backup --keep=14
```

À planifier dans le **cron du panel** de l'hébergeur (OVH / Infomaniak),
au choix :

```bash
# Option A (recommandée) : le scheduler Laravel, chaque minute —
# il déclenche db:backup tous les jours à 03:30.
php /chemin/vers/caisse-resto/backend/artisan schedule:run

# Option B : cron direct, une fois par jour (ex. 03:30)
php /chemin/vers/caisse-resto/backend/artisan db:backup --keep=14
```

> Pense aussi à télécharger ponctuellement une sauvegarde hors serveur
> (les backups vivent sur le même hébergement). Restauration :
> `gunzip < backup-….sql.gz | mysql -u USER -p BASE`.

## Rappels sécurité

- `APP_DEBUG=false`, `APP_ENV=production`.
- Changer le mot de passe gérant **et** le PIN par défaut avant l'ouverture.
- Ne jamais committer le `.env` réel. Telescope ne se charge qu'en local.
