# Inventory — Guide de Déploiement

Guide pour déployer l'application sur un serveur de production.

## Architecture de production

```
inventory.malio-dev.fr/     → Frontend Nuxt (fichiers statiques servis par Nginx)
inventory.malio-dev.fr/api  → Backend Symfony (PHP-FPM derrière Nginx)
```

| Composant | Technologie | Emplacement serveur |
|-----------|-------------|---------------------|
| Backend | Symfony 8 + API Platform | `/var/www/Inventory/` |
| Frontend | Nuxt 4 (site statique) | `/var/www/Inventory/frontend/.output/public/` |
| Base de données | PostgreSQL 16 | Base `inventory` |

### Schéma simplifié

```
Navigateur
    ↓ HTTPS
Nginx (reverse proxy)
    ├── /api/*  → PHP-FPM (Symfony)  → PostgreSQL
    └── /*      → Fichiers statiques (Nuxt build)
```

---

## Prérequis serveur

- **OS** : Ubuntu/Debian
- **PHP** : 8.4 avec extensions : pgsql, intl, zip, gd, mbstring, curl
- **Node.js** : 20+
- **Nginx**
- **PostgreSQL** : 16
- **Composer**

### Vérification des prérequis

```bash
php -v                    # PHP 8.4+
php -m | grep -E 'pgsql|intl|zip|gd|mbstring'
node -v                   # Node 20+
nginx -v
psql --version
composer --version
```

---

## Déploiement initial

### 1. Cloner le projet

```bash
cd /var/www
sudo git clone --recurse-submodules gitea@gitea.malio.fr:MALIO-DEV/Inventory.git Inventory
sudo chown -R malio:malio Inventory
cd Inventory
git checkout master
git submodule update --init --recursive
```

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

```bash
sudo -u postgres psql

CREATE DATABASE inventory OWNER ferme_user;
GRANT ALL PRIVILEGES ON DATABASE inventory TO ferme_user;
\q
```

Importer le dump :
```bash
# Copier le dump depuis le PC local
scp backup_v1.0.0_clean.sql malio@192.168.0.159:/tmp/

# Importer
psql -U ferme_user -h 127.0.0.1 -d inventory -f /tmp/backup_v1.0.0_clean.sql
```

### 3. Configurer le backend Symfony

```bash
cd /var/www/Inventory

# Installer les dépendances (sans les outils de dev)
composer install --no-dev --optimize-autoloader

# Créer le fichier de configuration locale
cat > .env.local << 'EOF'
APP_ENV=prod
APP_DEBUG=0
APP_SECRET=CHANGE_ME

DATABASE_URL="postgresql://ferme_user:fermerecette@127.0.0.1:5432/inventory?serverVersion=16"

CORS_ALLOW_ORIGIN='^https?://inventory\.malio-dev\.fr$'
EOF

# Générer un secret aléatoire
sed -i "s/CHANGE_ME/$(openssl rand -hex 32)/" .env.local

# Permissions pour le dossier var/ (cache, logs)
sudo chown -R www-data:www-data var/
sudo chmod -R 775 var/

# Vider le cache
php bin/console cache:clear --env=prod

# Appliquer les migrations (si première installation ou mise à jour)
php bin/console doctrine:migrations:migrate --no-interaction
```

### 4. Configurer le frontend Nuxt

```bash
cd /var/www/Inventory/frontend

# Permissions
sudo chown -R malio:malio .

# Installer les dépendances
npm install

# Créer le fichier d'environnement
cat > .env << 'EOF'
NUXT_PUBLIC_API_BASE_URL=http://inventory.malio-dev.fr/api
EOF

# Générer le site statique
npx nuxi generate
```

### 5. Configurer Nginx

```bash
sudo nano /etc/nginx/sites-available/inventory
```

Contenu :
```nginx
server {
    listen 80;
    server_name inventory.malio-dev.fr;

    # Gros fichiers (100MB max pour les uploads de documents)
    client_max_body_size 100M;
    client_body_timeout 300s;
    send_timeout 300s;

    access_log /var/log/nginx/inventory-access.log;
    error_log /var/log/nginx/inventory-error.log;

    # Backend Symfony — toutes les requêtes /api
    location /api {
        root /var/www/Inventory/public;
        try_files $uri /index.php$is_args$args;
    }

    # PHP-FPM (exécute le code PHP)
    location ~ ^/index\.php(/|$) {
        fastcgi_pass unix:/run/php/php-fpm.sock;
        fastcgi_split_path_info ^(.+\.php)(/.*)$;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME /var/www/Inventory/public/index.php;
        fastcgi_param DOCUMENT_ROOT /var/www/Inventory/public;
        fastcgi_read_timeout 300s;
        internal;
    }

    # Frontend statique — tout le reste
    location / {
        root /var/www/Inventory/frontend/.output/public;
        index index.html;
        try_files $uri $uri/ /index.html;    # SPA fallback
    }
}
```

Activer le site :
```bash
sudo ln -s /etc/nginx/sites-available/inventory /etc/nginx/sites-enabled/
sudo nginx -t          # Vérifier la syntaxe
sudo systemctl reload nginx
```

### 6. Vérifier

```bash
curl http://inventory.malio-dev.fr          # Frontend
curl http://inventory.malio-dev.fr/api      # API (doc Swagger)
```

---

## Mises à jour

### Mettre à jour l'application

```bash
cd /var/www/Inventory

# Récupérer les changements
git pull
git submodule update --init --recursive

# Backend
composer install --no-dev --optimize-autoloader
php bin/console doctrine:migrations:migrate --no-interaction
php bin/console cache:clear --env=prod
sudo chown -R www-data:www-data var/

# Frontend
cd frontend
npm install
npx nuxi generate
```

---

## Backup base de données

### Export (faire un backup)

```bash
pg_dump -U ferme_user -h 127.0.0.1 -d inventory \
  --no-owner --no-acl --inserts --column-inserts \
  --clean --if-exists > backup_inventory_$(date +%Y%m%d).sql
```

### Import (restaurer un backup)

```bash
psql -U ferme_user -h 127.0.0.1 -d inventory -f backup_inventory_YYYYMMDD.sql
```

---

## Troubleshooting

### Erreur 502 Bad Gateway

PHP-FPM ne tourne pas ou est crashé :
```bash
systemctl status php8.4-fpm
sudo systemctl restart php8.4-fpm
```

### Erreur 403 Forbidden

Problème de permissions sur les fichiers :
```bash
sudo chown -R www-data:www-data /var/www/Inventory/var/
sudo chmod -R 775 /var/www/Inventory/var/
```

### Erreur API "No route found"

Le cache Symfony est probablement périmé :
```bash
php /var/www/Inventory/bin/console cache:clear --env=prod
```

### Frontend ne se met pas à jour

Les fichiers statiques sont en cache. Rebuilder :
```bash
cd /var/www/Inventory/frontend
rm -rf .output
npx nuxi generate
```

### L'API retourne 401 sur toutes les requêtes

La session PHP ne se crée pas correctement. Vérifier :
```bash
# Vérifier que le dossier de sessions existe et est accessible
ls -la /var/lib/php/sessions/
# Ou vérifier les logs Symfony
tail -f /var/www/Inventory/var/log/prod.log
```

---

## Commandes utiles en production

```bash
# Logs Nginx
tail -f /var/log/nginx/inventory-error.log
tail -f /var/log/nginx/inventory-access.log

# Logs Symfony
tail -f /var/www/Inventory/var/log/prod.log

# Vider le cache Symfony
php /var/www/Inventory/bin/console cache:clear --env=prod

# Rebuild frontend
cd /var/www/Inventory/frontend && npx nuxi generate

# Status des services
systemctl status php8.4-fpm
systemctl status nginx
systemctl status postgresql

# Redémarrer les services
sudo systemctl restart php8.4-fpm
sudo systemctl reload nginx
```
