# Configuration

Guide complet de configuration d'Ackify via variables d'environnement.

## Variables Obligatoires

Ces variables sont **requises** pour démarrer Ackify :

```bash
# URL publique de votre instance (utilisée pour OAuth callbacks)
APP_DNS=sign.your-domain.com
ACKIFY_BASE_URL=https://sign.your-domain.com

# Nom de votre organisation (affiché dans l'interface)
ACKIFY_ORGANISATION="Your Organization Name"

# Configuration PostgreSQL
POSTGRES_USER=ackifyr
POSTGRES_PASSWORD=your_secure_password
POSTGRES_DB=ackify

# OAuth2 Provider
ACKIFY_OAUTH_PROVIDER=google  # ou github, gitlab, ou vide pour custom
ACKIFY_OAUTH_CLIENT_ID=your_oauth_client_id
ACKIFY_OAUTH_CLIENT_SECRET=your_oauth_client_secret

# Secret pour chiffrer les cookies de session (générer avec: openssl rand -base64 32)
ACKIFY_OAUTH_COOKIE_SECRET=your_base64_encoded_secret_key
```

## Variables Optionnelles

### Serveur

```bash
# Adresse d'écoute HTTP (défaut: :8080)
ACKIFY_LISTEN_ADDR=:8080

# Niveau de logs: debug, info, warn, error (défaut: info)
ACKIFY_LOG_LEVEL=info
```

### Sécurité & OAuth2

```bash
# Restreindre l'accès à un domaine email spécifique
ACKIFY_OAUTH_ALLOWED_DOMAIN=@company.com

# Activer l'auto-login silencieux (défaut: false)
ACKIFY_OAUTH_AUTO_LOGIN=false

# URL de logout personnalisée (optionnel)
ACKIFY_OAUTH_LOGOUT_URL=https://your-provider.com/logout

# Scopes OAuth2 personnalisés (défaut: openid,email,profile)
ACKIFY_OAUTH_SCOPES=openid,email,profile
```

### Méthodes d'Authentification

**Important** : Au moins UNE méthode d'authentification doit être activée (OAuth ou MagicLink).

```bash
# Forcer l'activation/désactivation d'OAuth (défaut: auto-détecté depuis les credentials)
ACKIFY_AUTH_OAUTH_ENABLED=true

# Activer l'authentification MagicLink sans mot de passe (défaut: false)
# Nécessite que ACKIFY_MAIL_HOST soit configuré
ACKIFY_AUTH_MAGICLINK_ENABLED=true
```

**Auto-détection** :
- **OAuth** est automatiquement activé si `ACKIFY_OAUTH_CLIENT_ID` et `ACKIFY_OAUTH_CLIENT_SECRET` sont définis
- **MagicLink** nécessite une activation explicite avec `ACKIFY_AUTH_MAGICLINK_ENABLED=true` + configuration SMTP
- **Service SMTP/Email** est automatiquement activé quand `ACKIFY_MAIL_HOST` est configuré (indépendant de MagicLink)

**Note** : SMTP et MagicLink sont deux fonctionnalités distinctes :
- **SMTP** = Service d'envoi de rappels email aux signataires attendus (auto-détecté)
- **MagicLink** = Authentification sans mot de passe par email (nécessite activation explicite + SMTP)

### Administration

```bash
# Liste d'emails admin (séparés par virgules)
ACKIFY_ADMIN_EMAILS=admin@company.com,admin2@company.com

# Restreindre la création de documents aux admins uniquement (défaut: false)
ACKIFY_ONLY_ADMIN_CAN_CREATE=false
```

Les admins ont accès à :
- Dashboard admin (`/admin`)
- Gestion des métadonnées documents
- Tracking des signataires attendus
- Envoi de rappels email
- Suppression de documents

Quand `ACKIFY_ONLY_ADMIN_CAN_CREATE` est activé :
- ✅ Seuls les utilisateurs admin peuvent créer de nouveaux documents
- ✅ Les utilisateurs non-admin verront un message d'erreur lors d'une tentative de création
- ✅ Les deux endpoints API (`POST /documents` et `GET /documents/find-or-create`) sont protégés

### Limitation de Débit (Rate Limiting)

Configuration des limites de requêtes API pour prévenir les abus et contrôler le débit :

```bash
# Limites d'authentification Magic Link (par fenêtre de temps)
ACKIFY_AUTH_MAGICLINK_RATE_LIMIT_EMAIL=3   # Max requêtes par email (défaut: 3)
ACKIFY_AUTH_MAGICLINK_RATE_LIMIT_IP=10     # Max requêtes par IP (défaut: 10)

# Limites API générales (requêtes par minute)
ACKIFY_AUTH_RATE_LIMIT=5          # Endpoints d'authentification (défaut: 5/min)
ACKIFY_DOCUMENT_RATE_LIMIT=10     # Création de documents (défaut: 10/min)
ACKIFY_GENERAL_RATE_LIMIT=100     # Requêtes API générales (défaut: 100/min)

# Import CSV
ACKIFY_IMPORT_MAX_SIGNERS=500     # Max signataires par import CSV (défaut: 500)
```

**Quand ajuster** :
- **Tests/CI** : Augmenter les limites (ex: `1000`) pour éviter les erreurs 429 durant les tests automatisés
- **Trafic élevé** : Augmenter `GENERAL_RATE_LIMIT` pour les charges de production
- **Sécurité** : Réduire `AUTH_RATE_LIMIT` pour prévenir les attaques par force brute

### Journalisation (Logging)

```bash
# Niveau de log : debug, info, warn, error (défaut: info)
ACKIFY_LOG_LEVEL=info

# Format de log : classic ou json (défaut: classic)
ACKIFY_LOG_FORMAT=classic
```

**Formats de log** :
- `classic` : Format lisible pour le développement et déploiements simples
- `json` : JSON structuré pour aggrégateurs de logs (Datadog, ELK, Splunk)

**Exemple de sortie JSON** :
```json
{"time":"2025-11-24T10:00:00Z","level":"INFO","msg":"Server started","port":8080}
```

### Checksums Documents (Optionnel)

Configuration pour le calcul automatique de checksum lors de la création de documents depuis des URLs :

```bash
# Taille maximale de fichier à télécharger pour le calcul de checksum (défaut: 10485760 = 10MB)
ACKIFY_CHECKSUM_MAX_BYTES=10485760

# Timeout pour le téléchargement checksum en millisecondes (défaut: 5000ms = 5s)
ACKIFY_CHECKSUM_TIMEOUT_MS=5000

# Nombre maximum de redirections HTTP à suivre (défaut: 3)
ACKIFY_CHECKSUM_MAX_REDIRECTS=3

# Liste de types MIME autorisés séparés par virgules (défaut inclut PDF, images, docs Office, ODF)
ACKIFY_CHECKSUM_ALLOWED_TYPES=application/pdf,image/*,application/msword,application/vnd.openxmlformats-officedocument.wordprocessingml.document,application/vnd.ms-excel,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,application/vnd.oasis.opendocument.*
```

**Note** : Ces paramètres s'appliquent uniquement lorsque les admins créent des documents via le dashboard admin avec une URL distante. Le système tentera de télécharger et calculer le checksum SHA-256 automatiquement.

**Variables de test** (⚠️ **NE JAMAIS utiliser en production**) :
```bash
# Désactiver la protection SSRF (tests uniquement)
ACKIFY_CHECKSUM_SKIP_SSRF_CHECK=false

# Ignorer la vérification des certificats TLS (tests uniquement)
ACKIFY_CHECKSUM_INSECURE_SKIP_VERIFY=false
```

Ces variables désactivent des protections de sécurité critiques et ne doivent être utilisées **que** dans des environnements de test isolés.

### Row Level Security (RLS)

Ackify utilise PostgreSQL Row Level Security pour l'isolation des données par tenant. Ceci est configuré automatiquement lors des migrations.

```bash
# Mot de passe pour le rôle base de données ackify_app (requis pour RLS)
ACKIFY_APP_PASSWORD=your_secure_app_password
```

**Fonctionnement** :
- L'outil `migrate` crée un rôle non-superuser `ackify_app` avant d'exécuter les migrations
- L'application se connecte à PostgreSQL avec ce rôle
- Les policies RLS filtrent automatiquement toutes les requêtes par tenant
- Aucune fuite de données possible même si le code applicatif oublie le filtrage tenant

Voir [Row Level Security](configuration/rls.md) pour la documentation détaillée.

## Configuration Avancée

### OAuth2 Providers

Voir [OAuth Providers](configuration/oauth-providers.md) pour la configuration détaillée de :
- Google OAuth2
- GitHub OAuth2
- GitLab OAuth2 (public + self-hosted)
- Custom OAuth2 provider

### Email (SMTP)

Voir [Email Setup](configuration/email-setup.md) pour configurer l'envoi de rappels email.

## Exemple Complet

Exemple de `.env` pour une installation en production :

```bash
# Application
APP_DNS=sign.company.com
ACKIFY_BASE_URL=https://sign.company.com
ACKIFY_ORGANISATION="ACME Corporation"
ACKIFY_LOG_LEVEL=info
ACKIFY_LISTEN_ADDR=:8080

# Base de données
POSTGRES_USER=postgres
POSTGRES_PASSWORD=super_secure_password_123
POSTGRES_DB=ackify

# RLS (Row Level Security)
ACKIFY_APP_PASSWORD=another_secure_password_456

# OAuth2 (Google)
ACKIFY_OAUTH_PROVIDER=google
ACKIFY_OAUTH_CLIENT_ID=123456789-abc.apps.googleusercontent.com
ACKIFY_OAUTH_CLIENT_SECRET=GOCSPX-xyz123
ACKIFY_OAUTH_ALLOWED_DOMAIN=@company.com

# Sécurité
ACKIFY_OAUTH_COOKIE_SECRET=ZXhhbXBsZV9iYXNlNjRfc2VjcmV0X2tleQ==

# Administration
ACKIFY_ADMIN_EMAILS=admin@company.com,cto@company.com

# Email (optionnel - omettre MAIL_HOST pour désactiver)
ACKIFY_MAIL_HOST=smtp.gmail.com
ACKIFY_MAIL_PORT=587
ACKIFY_MAIL_USERNAME=noreply@company.com
ACKIFY_MAIL_PASSWORD=app_specific_password
ACKIFY_MAIL_FROM=noreply@company.com
ACKIFY_MAIL_FROM_NAME="Ackify - ACME"
ACKIFY_MAIL_TEMPLATE_DIR=templates/emails
ACKIFY_MAIL_DEFAULT_LOCALE=fr

# Checksums Documents (optionnel - pour auto-checksum depuis URLs)
ACKIFY_CHECKSUM_MAX_BYTES=10485760
ACKIFY_CHECKSUM_TIMEOUT_MS=5000
ACKIFY_CHECKSUM_MAX_REDIRECTS=3
```

## Validation de la Configuration

Après modification du `.env`, redémarrer :

```bash
docker compose restart ackify-ce
```

Vérifier les logs :

```bash
docker compose logs -f ackify-ce
```

Tester le health check :

```bash
curl http://localhost:8080/api/v1/health
```

## Variables de Production

**Checklist sécurité production** :

- ✅ Utiliser HTTPS (`ACKIFY_BASE_URL=https://...`)
- ✅ Générer des secrets forts (64+ caractères)
- ✅ Configurer RLS avec un mot de passe fort (`ACKIFY_APP_PASSWORD`)
- ✅ Restreindre le domaine OAuth (`ACKIFY_OAUTH_ALLOWED_DOMAIN`)
- ✅ Configurer les emails admin (`ACKIFY_ADMIN_EMAILS`)
- ✅ Utiliser PostgreSQL avec SSL en production
- ✅ Logger en mode `info` (pas `debug`)
- ✅ Sauvegarder régulièrement la base de données

Voir [Deployment](deployment.md) pour plus de détails sur le déploiement en production.
