Storage: - Add S3 and local storage providers for document uploads - Support file upload with checksum calculation - Fix S3 upload for non-TLS connections (MinIO) Document viewer: - Add PDF.js-based viewer with scroll tracking - Implement checksum verification on document load - Add reader options (read mode, download, require full read) - Auto-detect read completion for signed documents API: - Add document upload endpoint with storage integration - Add proxy endpoint for stored documents - Extend document metadata with storage and reader fields
6.5 KiB
Stockage de Documents
Uploadez et stockez des documents directement dans Ackify.
Vue d'Ensemble
Ackify supporte optionnellement le stockage de documents, permettant aux utilisateurs d'uploader des fichiers directement au lieu de fournir des URLs externes. Les documents sont stockés de manière sécurisée et servis via des endpoints API authentifiés.
Options de stockage :
- Désactivé (par défaut) - Les utilisateurs fournissent des URLs de documents
- Système de fichiers local - Documents stockés sur le serveur
- Compatible S3 - AWS S3, MinIO, Wasabi, DigitalOcean Spaces, etc.
Types de Fichiers Supportés
| Type | Extensions | Types MIME |
|---|---|---|
.pdf |
application/pdf |
|
| Images | .png, .jpg, .jpeg, .gif, .webp |
image/* |
| Office | .doc, .docx |
application/msword, application/vnd.openxmlformats-* |
| Texte | .txt |
text/plain |
| HTML | .html, .htm |
text/html |
Configuration
Stockage Local
Stockez les documents sur le système de fichiers du serveur via un volume Docker.
ACKIFY_STORAGE_TYPE=local
ACKIFY_STORAGE_LOCAL_PATH=/data/documents
ACKIFY_STORAGE_MAX_SIZE_MB=50
Volume Docker Compose :
services:
ackify-ce:
volumes:
- ackify_storage:/data/documents
volumes:
ackify_storage:
Stockage Compatible S3
Fonctionne avec tout fournisseur de stockage compatible S3.
ACKIFY_STORAGE_TYPE=s3
ACKIFY_STORAGE_MAX_SIZE_MB=50
ACKIFY_STORAGE_S3_ENDPOINT=https://s3.amazonaws.com
ACKIFY_STORAGE_S3_BUCKET=ackify-documents
ACKIFY_STORAGE_S3_ACCESS_KEY=votre_access_key
ACKIFY_STORAGE_S3_SECRET_KEY=votre_secret_key
ACKIFY_STORAGE_S3_REGION=us-east-1
ACKIFY_STORAGE_S3_USE_SSL=true
MinIO (S3 Auto-hébergé)
MinIO est une solution de stockage compatible S3 open-source populaire.
ACKIFY_STORAGE_TYPE=s3
ACKIFY_STORAGE_S3_ENDPOINT=http://minio:9000
ACKIFY_STORAGE_S3_BUCKET=ackify-documents
ACKIFY_STORAGE_S3_ACCESS_KEY=minioadmin
ACKIFY_STORAGE_S3_SECRET_KEY=minioadmin
ACKIFY_STORAGE_S3_REGION=us-east-1
ACKIFY_STORAGE_S3_USE_SSL=false
Docker Compose avec MinIO :
services:
minio:
image: minio/minio:latest
environment:
MINIO_ROOT_USER: minioadmin
MINIO_ROOT_PASSWORD: minioadmin
volumes:
- minio_data:/data
ports:
- "9000:9000"
- "9001:9001"
command: server /data --console-address ":9001"
healthcheck:
test: ["CMD", "mc", "ready", "local"]
interval: 10s
timeout: 5s
retries: 5
volumes:
minio_data:
Utilisation
Interface Utilisateur
Quand le stockage est activé, un bouton d'upload apparaît à côté du champ URL :
- Cliquez sur le bouton upload (ou glissez-déposez)
- Sélectionnez un fichier depuis votre ordinateur
- Le nom et la taille du fichier sont affichés
- Cliquez sur "Upload" pour soumettre
Fonctionnalités :
- Barre de progression pendant l'upload
- Titre automatique depuis le nom de fichier
- Validation du type de fichier
- Respect de la limite de taille
Endpoints API
Upload de Document
POST /api/v1/documents/upload
Content-Type: multipart/form-data
X-CSRF-Token: abc123
file: (binaire)
title: Titre optionnel du document
Réponse :
{
"success": true,
"data": {
"doc_id": "abc123",
"title": "document.pdf",
"storage_key": "abc123/document.pdf",
"storage_provider": "local",
"file_size": 1048576,
"mime_type": "application/pdf",
"checksum": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
"checksum_algorithm": "SHA-256",
"created_at": "2025-01-07T12:00:00Z",
"is_new": true
}
}
Obtenir le Contenu du Document
GET /api/v1/storage/{docId}/content
Retourne le fichier document avec l'en-tête Content-Type approprié.
Note : Nécessite une session authentifiée.
Sécurité
Authentification
- Tous les endpoints de stockage nécessitent une authentification
- Les documents ne sont accessibles qu'aux utilisateurs authentifiés
- Protection CSRF sur l'endpoint d'upload
Vérification de Checksum
- Checksum SHA-256 calculé automatiquement à l'upload
- Stocké dans les métadonnées du document
- Garantit l'intégrité du fichier
Validation des Fichiers
- Type de fichier vérifié contre les types MIME autorisés
- Taille du fichier validée contre
ACKIFY_STORAGE_MAX_SIZE_MB - Nom de fichier assaini pour éviter les traversées de chemin
Schéma de Base de Données
Les documents uploadés ajoutent des champs à la table documents :
ALTER TABLE documents ADD COLUMN storage_key TEXT;
ALTER TABLE documents ADD COLUMN storage_provider TEXT;
ALTER TABLE documents ADD COLUMN file_size BIGINT;
ALTER TABLE documents ADD COLUMN mime_type TEXT;
Bonnes Pratiques
Choix du Stockage
| Scénario | Stockage Recommandé |
|---|---|
| Déploiement serveur unique | Local |
| Plusieurs serveurs / scaling | S3 |
| Environnement isolé | Local |
| Déploiement cloud-native | S3 |
| Développement / tests | Local ou MinIO |
Sauvegarde
Stockage local :
- Inclure le volume
ackify_storagedans la stratégie de backup - Utiliser
docker-volume-backupou outils similaires
Stockage S3 :
- Configurer le versioning du bucket
- Activer la réplication cross-région si nécessaire
- Utiliser les politiques de cycle de vie pour la rétention
Performance
- Activer SSL S3 en production (
ACKIFY_STORAGE_S3_USE_SSL=true) - Utiliser des endpoints S3 régionaux pour une latence réduite
- Considérer un CDN pour les documents fréquemment accédés
Limitations
- Taille maximum de fichier : configurable, 50MB par défaut
- Pas de scan antivirus (à implémenter au niveau infrastructure)
- Pas de génération d'aperçu de document
- Pas de compression automatique
Dépannage
L'upload échoue avec "Storage not configured"
Assurez-vous que ACKIFY_STORAGE_TYPE est défini à local ou s3.
Erreurs de connexion S3
- Vérifiez le format de l'URL endpoint (inclure
http://ouhttps://) - Vérifiez l'access key et la secret key
- Vérifiez que le bucket existe et est accessible
- Vérifiez que le paramètre SSL correspond à l'endpoint
Erreur fichier trop volumineux
Augmentez ACKIFY_STORAGE_MAX_SIZE_MB ou réduisez la taille du fichier.
Permission refusée (stockage local)
Assurez-vous que le conteneur a accès en écriture au chemin de stockage :
docker exec ackify-ce ls -la /data/documents