> ## Documentation Index
> Fetch the complete documentation index at: https://docs-kit.lucdidion.lu/llms.txt
> Use this file to discover all available pages before exploring further.

# Configuration Nhost

> Setup complet du backend Nhost en production

## Vue d'ensemble

Kit'Asso utilise **Nhost** comme backend-as-a-service, fournissant :

* **PostgreSQL** — Base de données relationnelle
* **Hasura** — API GraphQL auto-générée + permissions
* **Nhost Auth** — Authentification (email/password, JWT)
* **Nhost Storage** — Upload et gestion de fichiers

**Région :** `eu-central-1` (Francfort)

***

## Création du projet

### Nouveau projet Nhost

<Steps>
  <Step title="Créer le projet">
    1. Allez sur [app.nhost.io](https://app.nhost.io)
    2. Cliquez sur **"New Project"**
    3. Remplissez :
       * **Name :** Kit'Asso Production
       * **Region :** Europe (eu-central-1)
       * **Plan :** Free (ou Pro selon les besoins)
  </Step>

  <Step title="Attendre le provisioning">
    Nhost crée automatiquement :

    * Base de données PostgreSQL
    * Instance Hasura (console GraphQL)
    * Service Auth avec JWT
    * Service Storage pour fichiers

    ⏱️ **Durée :** 1-2 minutes
  </Step>

  <Step title="Récupérer les credentials">
    Dans **Settings** → **General** :

    * **Subdomain :** `gqvlmqwbsmkhlllmgbyw` (exemple)
    * **Region :** `eu-central-1`

    Ces deux valeurs suffisent pour configurer le frontend :

    ```bash theme={null}
    VITE_NHOST_SUBDOMAIN=gqvlmqwbsmkhlllmgbyw
    VITE_NHOST_REGION=eu-central-1
    ```
  </Step>
</Steps>

***

## Migrations de base de données

### Via Hasura Console

<Steps>
  <Step title="Ouvrir la console Hasura">
    Dans le dashboard Nhost → **Hasura** → **Open Hasura Console**
  </Step>

  <Step title="Exécuter les migrations SQL">
    Dans l'onglet **SQL** de la console Hasura, exécutez les migrations dans l'ordre chronologique.

    Les migrations sont dans `hasura/migrations/` ou dans les scripts SQL du projet.
  </Step>

  <Step title="Vérifier les tables">
    Dans l'onglet **Data**, vous devez voir les 13 tables principales :

    * `tools`, `categories`, `filters`, `tool_features`
    * `workflows`, `workflow_steps`
    * `tool_packs`, `pack_tools`
    * `quizzes`, `quiz_questions`, `quiz_answers`
    * `quiz_recommendations`, `quiz_responses`
  </Step>
</Steps>

### Via Nhost CLI (alternative)

```bash theme={null}
# Installer Nhost CLI
npm install -g nhost

# Login
nhost login

# Lier au projet
nhost link

# Appliquer les migrations
nhost up
```

***

## Permissions Hasura

Kit'Asso utilise les **permissions Hasura** (pas RLS PostgreSQL) pour contrôler l'accès aux données.

### Rôles

* **public** — Utilisateurs non authentifiés (visiteurs)
* **admin** — Utilisateurs authentifiés (gestionnaires)

### Configuration dans Hasura Console

Pour chaque table, configurez les permissions dans l'onglet **Permissions** :

**Exemple : table `tools`**

| Rôle   | SELECT          | INSERT | UPDATE | DELETE |
| ------ | --------------- | ------ | ------ | ------ |
| public | ✅ Toutes lignes | ❌      | ❌      | ❌      |
| admin  | ✅ Toutes lignes | ✅      | ✅      | ✅      |

**Exemple : table `workflows`**

| Rôle   | SELECT                | INSERT | UPDATE | DELETE |
| ------ | --------------------- | ------ | ------ | ------ |
| public | ✅ `status = 'active'` | ❌      | ❌      | ❌      |
| admin  | ✅ Toutes lignes       | ✅      | ✅      | ✅      |

<Tip>
  Pour les tables avec statut (workflows, packs), le rôle `public` ne voit que les éléments `active`.
</Tip>

***

## Nhost Storage

### Configuration

Le storage est prêt à l'emploi dès la création du projet. Par défaut, un bucket `default` est disponible.

**URL des fichiers :**

```
https://{subdomain}.storage.{region}.nhost.run/v1/files/{fileId}
```

**Exemple concret :**

```
https://gqvlmqwbsmkhlllmgbyw.storage.eu-central-1.nhost.run/v1/files/abc123-def456
```

### Upload depuis le frontend

```typescript theme={null}
import { nhost } from '@/api/client';

const { error, fileMetadata } = await nhost.storage.upload({
  file,           // File object
  bucketId: 'default',
});

if (!error) {
  const url = `https://${subdomain}.storage.${region}.nhost.run/v1/files/${fileMetadata.id}`;
}
```

***

## Authentication

### Configurer Auth

<Steps>
  <Step title="Aller dans Auth Settings">
    Dashboard Nhost → **Auth** → **Settings**
  </Step>

  <Step title="Désactiver les inscriptions publiques">
    **Disable Sign Up :** ✅ Activé

    Seuls les admins créeront des comptes depuis la console Nhost.
  </Step>

  <Step title="Configurer les emails (optionnel)">
    Si besoin de reset password ou magic links, configurez le provider SMTP dans **Auth** → **SMTP Settings**.
  </Step>
</Steps>

### Créer un utilisateur admin

<Steps>
  <Step title="Aller dans Users">
    Dashboard Nhost → **Auth** → **Users** → **Add User**
  </Step>

  <Step title="Créer le user">
    * **Email :** `admin@lucdidion.lu`
    * **Password :** Mot de passe fort
    * **Default Role :** `admin`

    <Warning>
      Le rôle `admin` doit correspondre à celui configuré dans les permissions Hasura.
    </Warning>
  </Step>

  <Step title="Tester la connexion">
    1. Allez sur votre app déployée → `/admin`
    2. Redirigé vers `/login`
    3. Connectez-vous avec les credentials
    4. Vérifiez l'accès au dashboard admin
  </Step>
</Steps>

***

## Performance & Monitoring

### Dashboard Nhost

Le dashboard Nhost fournit :

* **Database Health** — CPU, mémoire, disk usage
* **API Logs** — Requêtes GraphQL avec temps de réponse
* **Auth Logs** — Tentatives de connexion

### Optimisations

* Hasura cache automatiquement les metadata GraphQL
* Les indexes PostgreSQL sont créés via les migrations
* Le connection pooling est géré par Nhost (PgBouncer)

***

## Backups

### Backups automatiques

Nhost crée automatiquement des backups :

* **Free plan :** Backup quotidien, rétention 7 jours
* **Pro plan :** PITR (Point In Time Recovery), rétention 30 jours

### Backup manuel

Via la console Hasura ou `pg_dump` avec les credentials de connexion directe (disponibles dans les settings Nhost).

***

## Sécurité

### Credentials

* **Subdomain + Region** : Safe pour le frontend (identifiants publics)
* **Admin Secret Hasura** : JAMAIS exposé côté client, uniquement pour la console
* **JWT Secret** : Géré automatiquement par Nhost Auth

### Protection GraphQL

Hasura protège automatiquement via :

* Permissions par rôle (public/admin)
* Validation des types GraphQL
* Rate limiting (plan Pro)

***

## Variables d'environnement

### Frontend (Vite)

```bash theme={null}
# .env.local
VITE_NHOST_SUBDOMAIN=gqvlmqwbsmkhlllmgbyw
VITE_NHOST_REGION=eu-central-1
```

<Warning>
  Le code source contient des valeurs par défaut pour le développement.
  En production, définissez ces variables dans votre hébergeur (Hostinger).
</Warning>

### Client Nhost (src/api/client.ts)

```typescript theme={null}
import { createClient } from '@nhost/nhost-js';

const nhostSubdomain = import.meta.env.VITE_NHOST_SUBDOMAIN || 'gqvlmqwbsmkhlllmgbyw';
const nhostRegion = import.meta.env.VITE_NHOST_REGION || 'eu-central-1';

export const nhost = createClient({
  subdomain: nhostSubdomain,
  region: nhostRegion,
});
```

***

## Checklist production

* [ ] Projet Nhost créé en région EU
* [ ] Tables créées via migrations
* [ ] Permissions Hasura configurées par rôle
* [ ] Permissions testées (public vs admin)
* [ ] Storage fonctionnel (upload/download)
* [ ] User admin créé et testé
* [ ] Variables d'environnement dans Hostinger
* [ ] Test complet de l'app en production

***

## Ressources

<CardGroup cols={2}>
  <Card title="Nhost Docs" icon="book" href="https://docs.nhost.io">
    Documentation officielle
  </Card>

  <Card title="Database Schema" icon="database" href="/database/schema">
    Structure des tables
  </Card>

  <Card title="Permissions Hasura" icon="shield" href="/database/rls">
    Configuration des permissions
  </Card>

  <Card title="Hostinger Setup" icon="globe" href="/deployment/hostinger">
    Configuration hébergement frontend
  </Card>
</CardGroup>
