# Guide de Déploiement

Ce guide explique comment déployer **PrimeFaces Freya Extension** en production.

## 📦 Build de Production

### 1. Compiler le projet

```bash
# Nettoyer et compiler
mvn clean install

# Compiler sans les tests (plus rapide)
mvn clean install -DskipTests

# Compiler avec profil de production
mvn clean install -Pproduction
```

### 2. Vérifier les artefacts

Les artefacts sont générés dans :
```
runtime/target/primefaces-freya-extension-runtime-1.0.0-SNAPSHOT.jar
integration-tests/target/primefaces-freya-extension-integration-tests-1.0.0-SNAPSHOT.jar
```

## 🚀 Déploiement sur différentes plateformes

### Quarkus en mode JVM

```bash
cd integration-tests

# Build
mvn clean package

# Lancer
java -jar target/quarkus-app/quarkus-run.jar
```

### Quarkus en mode natif

```bash
cd integration-tests

# Build natif (nécessite GraalVM)
mvn clean package -Pnative

# Lancer
./target/primefaces-freya-extension-integration-tests-1.0.0-SNAPSHOT-runner
```

### Docker

#### Créer l'image Docker

```bash
cd integration-tests

# Build avec Docker
mvn clean package -Dquarkus.container-image.build=true

# Ou utiliser le Dockerfile
docker build -f src/main/docker/Dockerfile.jvm -t primefaces-freya-extension:latest .
```

#### Lancer le conteneur

```bash
docker run -i --rm -p 8080:8080 primefaces-freya-extension:latest
```

#### Docker Compose

```yaml
version: '3.8'

services:
  app:
    image: primefaces-freya-extension:latest
    ports:
      - "8080:8080"
    environment:
      - QUARKUS_PROFILE=prod
      - QUARKUS_HTTP_PORT=8080
    restart: unless-stopped
```

### Kubernetes

#### Deployment YAML

```yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: primefaces-freya-extension
spec:
  replicas: 3
  selector:
    matchLabels:
      app: primefaces-freya-extension
  template:
    metadata:
      labels:
        app: primefaces-freya-extension
    spec:
      containers:
      - name: app
        image: primefaces-freya-extension:latest
        ports:
        - containerPort: 8080
        env:
        - name: QUARKUS_PROFILE
          value: "prod"
        resources:
          requests:
            memory: "256Mi"
            cpu: "250m"
          limits:
            memory: "512Mi"
            cpu: "500m"
---
apiVersion: v1
kind: Service
metadata:
  name: primefaces-freya-extension
spec:
  selector:
    app: primefaces-freya-extension
  ports:
  - port: 80
    targetPort: 8080
  type: LoadBalancer
```

### Serveur d'applications (WildFly, Tomcat, etc.)

```bash
# Build WAR
mvn clean package -Dquarkus.package.type=legacy-jar

# Déployer sur WildFly
cp target/*.war $WILDFLY_HOME/standalone/deployments/

# Déployer sur Tomcat
cp target/*.war $TOMCAT_HOME/webapps/
```

## ⚙️ Configuration de Production

### application.properties (Production)

```properties
# Mode production
quarkus.faces.project-stage=Production
quarkus.faces.state-saving-method=server

# Logging
quarkus.log.level=INFO
quarkus.log.console.enable=true
quarkus.log.console.format=%d{HH:mm:ss} %-5p [%c{2.}] (%t) %s%e%n

# HTTP
quarkus.http.port=8080
quarkus.http.host=0.0.0.0
quarkus.http.cors=true

# PrimeFaces
primefaces.THEME=freya
primefaces.FONT_AWESOME=true
primefaces.CLIENT_SIDE_VALIDATION=true
primefaces.MOVE_SCRIPTS_TO_BOTTOM=true
primefaces.SUBMIT=partial
primefaces.UPLOADER=auto

# Cache
quarkus.http.enable-compression=true
quarkus.http.compress-media-types=text/html,text/css,application/javascript

# Security (si applicable)
quarkus.http.ssl.certificate.file=/path/to/certificate.crt
quarkus.http.ssl.certificate.key-file=/path/to/private.key
```

## 🔒 Sécurité

### 1. HTTPS

Toujours utiliser HTTPS en production :

```properties
quarkus.http.ssl-port=8443
quarkus.http.insecure-requests=redirect
```

### 2. Headers de sécurité

```properties
quarkus.http.header."X-Frame-Options".value=DENY
quarkus.http.header."X-Content-Type-Options".value=nosniff
quarkus.http.header."X-XSS-Protection".value=1; mode=block
quarkus.http.header."Strict-Transport-Security".value=max-age=31536000; includeSubDomains
```

### 3. CSP (Content Security Policy)

```properties
quarkus.http.header."Content-Security-Policy".value=default-src 'self'; script-src 'self' 'unsafe-inline'; style-src 'self' 'unsafe-inline'
```

## 📊 Monitoring

### Health Checks

```properties
quarkus.smallrye-health.root-path=/health
```

Endpoints disponibles :
- `/health` - Health check global
- `/health/live` - Liveness probe
- `/health/ready` - Readiness probe

### Metrics

```properties
quarkus.micrometer.enabled=true
quarkus.micrometer.export.prometheus.enabled=true
```

Endpoint : `/metrics`

## 🔧 Optimisations

### 1. Minification des ressources

```properties
primefaces.MOVE_SCRIPTS_TO_BOTTOM=true
primefaces.SUBMIT=partial
```

### 2. Compression

```properties
quarkus.http.enable-compression=true
```

### 3. Cache

```xml
<!-- Dans web.xml -->
<context-param>
    <param-name>javax.faces.FACELETS_REFRESH_PERIOD</param-name>
    <param-value>-1</param-value>
</context-param>
```

## 📈 Performance

### Recommandations JVM

```bash
java -Xms256m -Xmx512m \
     -XX:+UseG1GC \
     -XX:MaxGCPauseMillis=200 \
     -jar target/quarkus-app/quarkus-run.jar
```

### Mode natif (meilleure performance)

```bash
# Build natif
mvn clean package -Pnative

# Temps de démarrage : ~0.05s
# Mémoire : ~50MB
```

## 🌐 Reverse Proxy (Nginx)

```nginx
server {
    listen 80;
    server_name example.com;
    
    location / {
        proxy_pass http://localhost:8080;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}
```

## 📝 Checklist de déploiement

- [ ] Tests passent (`mvn test`)
- [ ] Build réussit (`mvn clean install`)
- [ ] Configuration de production validée
- [ ] HTTPS configuré
- [ ] Headers de sécurité configurés
- [ ] Health checks fonctionnels
- [ ] Logs configurés
- [ ] Monitoring en place
- [ ] Backup configuré
- [ ] Documentation à jour

## 🆘 Dépannage

### Problème : Application ne démarre pas

```bash
# Vérifier les logs
tail -f logs/application.log

# Vérifier le port
netstat -an | grep 8080
```

### Problème : Ressources non chargées

Vérifier que les ressources Freya sont accessibles :
- `/resources/freya-layout/css/layout-light.css`
- `/resources/freya-layout/css/primeicons.css`

### Problème : Performance lente

1. Activer la compression
2. Utiliser le mode natif
3. Augmenter la mémoire JVM
4. Vérifier les requêtes N+1

## 📧 Support

Pour toute question sur le déploiement :
- Email : contact@lions.dev
- GitHub Issues : https://github.com/lions-dev/primefaces-freya-extension/issues

