Translation quality & format preservation: - Word: merge adjacent same-format runs into one unit (sentence-level coherence like inline-tag handling); translate comments/balloons; dedupe textbox collection (was translated twice); RTL no longer overrides center/justify alignment; CJK/Arabic font hints (eastAsia/cs) - PPTX: chart translations now actually reach the output file (ChartPart.blob is read-only — rewrite chart XML in the saved ZIP); CJK typeface hints (a:ea) - Excel: sheet renames no longer break references — rewrite cell formulas (3D/quoted), defined names, data validations, cond. formats - PDF: bold/italic honored (hebo/heit/hebi); table cells never merge; unchanged blocks left untouched (typography preserved, fixes duplicate hyperlinks); attempted/changed stats + route gate now cover PDF; CJK font paths; scanned PDFs via Mistral OCR (detection + admin settings) Features: - formality param (formal/informal) + automatic regional-variant prompts - output_mode=bilingual docx (source above translation) - per-user translation memory on Redis (falls back to LRU), context-hashed - QA report + 0-100 confidence score in job status; L0 on by default - OpenAI-compatible providers: whole chunk in ONE numbered-JSON request (~15x fewer calls) with per-item fallback; base prompt always present (custom prompt no longer replaces translation instructions) Infra & marketing alignment: - plan-based engine gating + vision gating (closes paid-engine leak); /providers/available filtered per plan; 107 languages exposed - zh-CN/zh-TW validation fixed; libmagic disabled on Windows (native crash) - admin: Mistral OCR settings + engine status dashboard; httpx<0.28 pin (TestClient breakage); Prometheus test fixture fixed - marketing docs aligned with code (PDF+OCR, retention, engines, pricing) - security: .env.ionos/.env.production/provider_settings.json removed Tests: 1173 passed / 0 failed (6 network tests deselected: free Google endpoint temporarily blocked from this machine)
6.7 KiB
Auto-héberger son outil de traduction de documents : guide Docker complet
Article SEO « self-hosted » — brouillon complet. Capture l'audience développeurs/homelab. Basé sur le déploiement réel du projet (Docker Compose, Postgres, Redis).
Introduction
Un outil de traduction de documents posé sur un SaaS pose toujours la même question : où vont mes fichiers ? Pour les documents confidentiels (compta, juridique, RH, brevets), l'auto-hébergement est la seule réponse qui tienne.
Ce guide montre comment monter une pile complète de traduction de documents — API, base, cache, interface — sur votre propre infrastructure, avec Docker. (Le projet dont on s'inspire est open source : Office Translator / Wordly.art.)
Architecture cible
[Client web / API]
│
[Nginx (reverse proxy, TLS)]
│
[FastAPI (Python 3.11+, port 8000)]
├── [PostgreSQL] ← utilisateurs, glossaires, quotas
├── [Redis] ← rate limiting (token bucket), files
└── [Fichiers] ← uploads / outputs (volume local)
│
[Next.js (port 3000)] ← interface
Points clés :
- FastAPI asynchrone pour l'API de traduction (Swagger sur
/docs) - PostgreSQL pour les données structurées, Redis pour le rate limiting par IP et les files
- Nginx devant pour le TLS et le reverse proxy
- Volumes persistants pour les fichiers (suppression automatique au TTL, ex. 60 min)
1. Prérequis
- Une machine Linux (VPS, serveur physique, ou même un NAS)
- Docker + Docker Compose installés
- Un domaine pointant vers la machine (pour le TLS)
- Les clés API de vos moteurs de traduction (au minimum Google ; DeepL, OpenRouter, OpenAI, x.ai/Zai selon vos besoins)
2. Déploiement
2.1 Cloner et configurer
git clone <URL_DU_DÉPÔT> /opt/wordly # dépôt à adapter (miroir public recommandé)
cd /opt/wordly
cp .env.example .env
Dans .env, renseignez au minimum :
# Moteurs — le Google « classic » (gratuit) ne demande AUCUNE clé.
# Clés optionnelles pour les moteurs payants :
GOOGLE_CLOUD_API_KEY=...
# ou DEEPL_API_KEY, OPENROUTER_API_KEY, OPENAI_API_KEY...
# Optionnel : OCR Mistral pour les PDF scannés
# MISTRAL_API_KEY=...
# Sécurité
SECRET_KEY=<générer une clé longue et aléatoire>
CORS_ORIGINS=https://wordly.example
APP_ENV=production
Sécurité :
CORS_ORIGINSne doit jamais être*en production — l'application le refuse et refuse de démarrer. GénérezSECRET_KEYavecopenssl rand -hex 32.
2.2 Lancer la pile
docker compose up -d --build
Ça démarre :
- L'API sur
:8001côté hôte (mappée sur le 8000 du conteneur ; docs Swagger surhttp://localhost:8001/docs) - L'interface sur
:3000 - Postgres + Redis en interne
2.3 Mettre Nginx devant (TLS)
server {
listen 443 ssl http2;
server_name wordly.example;
ssl_certificate /etc/letsencrypt/live/wordly.example/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/wordly.example/privkey.pem;
# Headers de sécurité (HSTS, CSP)
add_header Strict-Transport-Security "max-age=63072000" always;
add_header X-Content-Type-Options nosniff always;
location / {
proxy_pass http://127.0.0.1:3000;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
location /api/ {
proxy_pass http://127.0.0.1:8001;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
Renouvelez le certificat avec certbot renew (cron).
3. Exploitation
Surveillance
GET /health— état de l'API, des moteurs, de la base et du cache- Prometheus + Grafana (fournis en
docker-compose.monitoring.yml) pour les métriques système et applicatives
Sauvegarde (non négociable)
La base Postgres et le répertoire de fichiers sont votre patrimoine. Deux couches :
- Sauvegarde quotidienne de la base :
docker compose exec db sh -c 'pg_dump -U ${POSTGRES_USER:-translate} ${POSTGRES_DB:-translate_db}' | gzip > /backups/wordly-$(date +%F).sql.gz - Réplication vers un NAS/autre site via
rsync+ SSH (le projet fournit un plan de sauvegarde automatique et une procédure de restauration en ~20 min, y compris bascule sur un serveur de secours)
Règle d'or : une sauvegarde qu'on n'a jamais restaurée est une sauvegarde qui n'existe pas. Testez la restauration au moins une fois par trimestre.
Nettoyage automatique
Les fichiers uploadés sont supprimés automatiquement après leur TTL (60 min par défaut). Le nettoyage est orchestré côté application ; surveillez le disque quand même (un gros fichier en attente peut saturer le volume).
4. Durcissement
CORS_ORIGINSrestreint à vos domainesSECRET_KEYunique et stockée en variable d'environnement (jamais dans le repo)- Pas de port Postgres/Redis exposé publiquement (réseau Docker interne uniquement)
- Rate limiting actif (token bucket dans Redis, par IP client)
- Fail2ban sur SSH si l'accès serveur passe par SSH
- Mises à jour de Docker + des images (vulnérabilités)
- Monitoring des disques, CPU et mémoire (Grafana)
5. Coût vs SaaS
| Poste | Self-hosted (VPS 4 vCPU / 8 Go) | SaaS |
|---|---|---|
| Infrastructure | ~40–80 €/mois | Inclus |
| Coût par page | Coût des API uniquement | Coût API + marge |
| Maîtrise des données | Totale | Partagée |
| Maintenance | À votre charge | À charge de l'éditeur |
| Mises à jour / sécurité | À votre charge | À charge de l'éditeur |
Le self-hosted gagne quand les données sont sensibles ou quand le volume est énorme. Il perd quand vous n'avez personne pour faire la maintenance — dans ce cas, le SaaS est souvent plus fiable en pratique, même si les fichiers transigent avec un tiers.
Conclusion
Auto-héberger une pile de traduction de documents, c'est 1 h de déploiement et une vraie responsabilité d'exploitation. Avec Docker Compose, Postgres, Redis et Nginx, l'architecture tient sur une seule machine ; ce qui coûte ensuite, c'est la discipline (sauvegardes, durcissement, mises à jour).
Si les documents sont confidentiels, cette discipline se paie d'elle-même.
Métadonnées SEO
- Title : « Auto-héberger un outil de traduction de documents : guide Docker 2026 »
- Meta description : « FastAPI, Postgres, Redis, Nginx : déployez une pile de traduction de documents sur votre propre infra. Sauvegardes, durcissement, coût vs SaaS. »
- Mots-clés : auto héberger traduction, docker traduction documents, self hosted translation
- URL : /blog/auto-heberger-traduction-documents-docker