# Déploiement de Darsouk sur o2switch

Darsouk est une application **Next.js 15 (Node.js)**. o2switch permet d'héberger une appli
Node via cPanel (**Setup Node.js App**, propulsé par Phusion Passenger). Base de données
**SQLite** (fichier sur le disque persistant) et **uploads** stockés localement — aucun
service externe requis, sauf le SMTP pour les e-mails (fourni par o2switch).

---

## 1. Pré-requis sur o2switch
- Un hébergement o2switch avec **cPanel**.
- Node.js **20+** disponible (cPanel › *Setup Node.js App* › *Node.js version*).
- Un (sous-)domaine pointant vers le dossier de l'appli.
- Une **boîte mail** (cPanel › *Comptes de messagerie*) pour l'envoi SMTP, ex. `no-reply@votre-domaine.dz`.

## 2. Envoyer les fichiers
Uploadez le contenu du dossier **`app/`** (pas le dossier parent) dans un répertoire hors
`public_html`, par exemple `~/darsouk`. **N'uploadez pas** `node_modules/` ni `.next/`
(ils seront générés sur le serveur). Conservez bien `package.json`, `server.js`, `src/`,
`public/`, `next.config.js`, `tsconfig.json`.

> Astuce : un `git clone` ou un upload SFTP du dossier `app/` fonctionne très bien.

## 3. Créer l'application Node dans cPanel
cPanel › **Setup Node.js App** › **Create Application** :
- **Node.js version** : 20 (ou plus récent)
- **Application mode** : `Production`
- **Application root** : `darsouk` (le dossier où vous avez uploadé `app/`)
- **Application URL** : votre domaine / sous-domaine
- **Application startup file** : `server.js`

Validez. cPanel crée un environnement virtuel Node et affiche une commande
`source …/bin/activate` (utile pour le terminal SSH).

## 4. Variables d'environnement
Dans l'écran de l'appli (section *Environment variables*), ajoutez (voir `.env.example`) :

| Variable | Exemple | Rôle |
|---|---|---|
| `APP_URL` | `https://votre-domaine.dz` | liens des e-mails (reset mot de passe…) |
| `SMTP_HOST` | `mail.votre-domaine.dz` | serveur SMTP o2switch |
| `SMTP_PORT` | `465` | port (465 = SSL) |
| `SMTP_USER` | `no-reply@votre-domaine.dz` | identifiant boîte mail |
| `SMTP_PASS` | `••••••••` | mot de passe boîte mail |
| `SMTP_FROM` | `Darsouk <no-reply@votre-domaine.dz>` | expéditeur |
| `NODE_ENV` | `production` | (souvent déjà défini par Passenger) |
| `NEXT_SERVER_ACTIONS_ENCRYPTION_KEY` | `openssl rand -hex 32` | **stabilise les Server Actions entre redéploiements** |

> Sans les variables `SMTP_*`, l'appli fonctionne mais **journalise** les e-mails au lieu de les envoyer.

## 5. Installer et builder (terminal SSH)
```bash
# activez l'environnement Node de l'appli (commande fournie par cPanel)
source /home/USER/nodevenv/darsouk/20/bin/activate
cd ~/darsouk

npm install            # installe les dépendances (compile better-sqlite3)
npm run build          # build de production Next.js
```
Le dossier `data/` (base SQLite) et `public/uploads/` (photos) sont créés automatiquement
au premier lancement ; ils sont **persistants** sur o2switch.

## 6. Démarrer / redémarrer
Dans cPanel › Setup Node.js App, cliquez sur **Restart**. Passenger lance `server.js`
(qui écoute sur le port fourni par `PORT`). Visitez votre domaine 🎉.

> **À chaque mise à jour du code** : `npm install` (si deps changées) → `npm run build` → **Restart**.

---

## Notes importantes
- **Temps réel (messagerie/notifications)** : l'appli utilise le SSE (`/api/stream`). Si
  Passenger/Apache met le flux en tampon, le client **bascule automatiquement en polling**
  (rafraîchissement périodique) — aucune action requise, juste un léger délai.
- **Sauvegardes** : sauvegardez régulièrement le fichier `data/darsouk.db` (+ `-wal`/`-shm`)
  et le dossier `public/uploads/`. Ce sont toutes vos données.
- **Permissions** : `data/` et `public/uploads/` doivent être accessibles en écriture par
  l'utilisateur de l'appli (c'est le cas par défaut sur o2switch).
- **HTTPS** : activez le certificat (Let's Encrypt via cPanel). Les cookies de session sont
  marqués `secure` automatiquement en production.
- **Montée en charge** : SQLite + uploads locaux conviennent à un trafic petit/moyen sur une
  seule instance. Pour scaler horizontalement, il faudrait migrer vers Postgres + stockage
  objet (S3/R2) et un pub/sub Redis pour le SSE — non nécessaire pour démarrer.

## Démo / réinitialisation des données
Pour repartir d'une base vierge : supprimez le dossier `data/` puis redémarrez l'appli.
Les comptes, annonces, réservations, messages, avis et notifications seront réinitialisés.
