Major changes across backend, frontend, infrastructure: - Provider system with model selection (Google, DeepL, OpenAI, Ollama, Google Cloud) - Admin panel: user management, pricing, settings - Glossary system with CSV import/export - Subscription and tier quota management - Security hardening (rate limiting, API key auth, path traversal fixes) - Docker compose for dev, prod, and IONOS deployment - Alembic migrations for new tables - Frontend: dashboard, pricing page, landing page, i18n (en/fr) - Test suite and verification scripts Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
94 lines
3.9 KiB
Plaintext
94 lines
3.9 KiB
Plaintext
# ============================================================
|
|
# PRODUCTION — Ionos VPS
|
|
# Copiez ce fichier en .env sur le serveur et remplissez TOUT
|
|
# Ne committez JAMAIS ce fichier avec de vraies valeurs
|
|
# ============================================================
|
|
|
|
# ─── Application ────────────────────────────────────────────
|
|
APP_NAME="Office Translator"
|
|
ENV=production
|
|
DEBUG=false
|
|
LOG_LEVEL=INFO
|
|
LOG_FORMAT=json
|
|
|
|
# ─── Domaine & URLs ─────────────────────────────────────────
|
|
# Remplacez par votre vrai domaine (configuré dans Ionos DNS)
|
|
DOMAIN=wordly.art
|
|
NEXT_PUBLIC_API_URL=https://wordly.art
|
|
CORS_ORIGINS=https://wordly.art
|
|
|
|
# ─── Sécurité JWT ─────────────────────────────────────────
|
|
# OBLIGATOIRE — Générez avec :
|
|
# python3 -c "import secrets; print(secrets.token_urlsafe(64))"
|
|
JWT_SECRET_KEY=REMPLACEZ_PAR_UNE_CLE_SECRETE_DE_64_CARACTERES
|
|
|
|
# ─── Admin ──────────────────────────────────────────────────
|
|
ADMIN_USERNAME=admin
|
|
# Hash bcrypt de votre mot de passe admin
|
|
# Générez avec : python3 -c "from passlib.context import CryptContext; print(CryptContext(schemes=['bcrypt']).hash('VotreMotDePasse'))"
|
|
ADMIN_PASSWORD_HASH=REMPLACEZ_PAR_HASH_BCRYPT
|
|
|
|
# ─── Base de données PostgreSQL ─────────────────────────────
|
|
POSTGRES_USER=translate
|
|
# Mot de passe fort — minimum 32 caractères
|
|
# Générez avec : python3 -c "import secrets; print(secrets.token_urlsafe(32))"
|
|
POSTGRES_PASSWORD=REMPLACEZ_PAR_MOT_DE_PASSE_FORT
|
|
POSTGRES_DB=translate_db
|
|
DATABASE_URL=postgresql+asyncpg://translate:REMPLACEZ_PAR_MOT_DE_PASSE_FORT@postgres:5432/translate_db
|
|
|
|
# ─── Redis ──────────────────────────────────────────────────
|
|
REDIS_URL=redis://redis:6379/0
|
|
|
|
# ─── Fournisseurs de traduction ─────────────────────────────
|
|
# Google Translate (gratuit, via deep_translator) — toujours activé
|
|
GOOGLE_TRANSLATE_ENABLED=true
|
|
|
|
# Google Cloud Translation API (payant)
|
|
GOOGLE_CLOUD_ENABLED=false
|
|
GOOGLE_CLOUD_API_KEY=
|
|
|
|
# DeepL
|
|
DEEPL_ENABLED=false
|
|
DEEPL_API_KEY=
|
|
|
|
# OpenRouter (IA)
|
|
OPENROUTER_ENABLED=false
|
|
OPENROUTER_API_KEY=
|
|
OPENROUTER_MODEL=deepseek/deepseek-v3.2
|
|
|
|
# OpenAI
|
|
OPENAI_ENABLED=false
|
|
OPENAI_API_KEY=
|
|
OPENAI_MODEL=gpt-4o-mini
|
|
|
|
# Désactivés en production standard
|
|
OLLAMA_ENABLED=false
|
|
ZAI_API_KEY=
|
|
|
|
# ─── Stripe Paiements ───────────────────────────────────────
|
|
STRIPE_SECRET_KEY=sk_live_REMPLACEZ
|
|
STRIPE_WEBHOOK_SECRET=whsec_REMPLACEZ
|
|
STRIPE_PRICE_STARTER_MONTHLY=price_REMPLACEZ
|
|
STRIPE_PRICE_STARTER_YEARLY=price_REMPLACEZ
|
|
STRIPE_PRICE_PRO_MONTHLY=price_REMPLACEZ
|
|
STRIPE_PRICE_PRO_YEARLY=price_REMPLACEZ
|
|
STRIPE_PRICE_BUSINESS_MONTHLY=price_REMPLACEZ
|
|
STRIPE_PRICE_BUSINESS_YEARLY=price_REMPLACEZ
|
|
|
|
# ─── Fichiers & Limites ─────────────────────────────────────
|
|
MAX_FILE_SIZE_MB=50
|
|
MAX_CONCURRENT_TRANSLATIONS=5
|
|
CLEANUP_ENABLED=true
|
|
FILE_TTL_MINUTES=60
|
|
|
|
# ─── HTTPS / HSTS ───────────────────────────────────────────
|
|
ENABLE_HSTS=true
|
|
LETSENCRYPT_EMAIL=votre-email@wordly.art
|
|
|
|
# ─── Rate limiting ──────────────────────────────────────────
|
|
RATE_LIMIT_ENABLED=true
|
|
RATE_LIMIT_PER_MINUTE=30
|
|
RATE_LIMIT_PER_HOUR=200
|
|
TRANSLATIONS_PER_MINUTE=5
|
|
TRANSLATIONS_PER_HOUR=30
|