Translator-API / README.md
NathMen12's picture
Update README.md
b8ae72a verified
|
Raw
History Blame Contribute Delete
10.2 kB
---
title: Translator-API
emoji: πŸ’»
colorFrom: purple
colorTo: gray
sdk: docker
pinned: true
---
# 🌐 Translator API
> **Alternative gratuite Γ  Google Translate** β€” API REST sans clΓ©, auto-hΓ©bergΓ©e, avec dashboard admin temps rΓ©el.
[![Node.js](https://img.shields.io/badge/Node.js-18+-green.svg)](https://nodejs.org/)
[![Docker](https://img.shields.io/badge/Docker-ready-blue.svg)](https://docker.com/)
[![License](https://img.shields.io/badge/License-MIT-yellow.svg)](LICENSE)
---
## ✨ Fonctionnalités
| FonctionnalitΓ© | Description |
|---|---|
| πŸ†“ **Gratuit & Sans clΓ© API** | Pas d'inscription, pas de quota mensuel |
| ⚑ **Rate limiting** | 30 requΓͺtes/minute par IP |
| 🌍 **100+ langues** | Support complet ISO 639-1 + détection auto |
| πŸ“Š **Dashboard Admin** | MΓ©triques CPU/RAM temps rΓ©el, logs, graphiques 120s |
| βš–οΈ **Architecture distribuΓ©e** | Central (API + 1 core) + Workers (1 core) |
| πŸ” **Auth admin sΓ©curisΓ©e** | Code d'accΓ¨s via variables d'environnement |
| 🐳 **Docker ready** | Déploiement 1-click sur HuggingFace Spaces |
| πŸ“š **Wiki intΓ©grΓ©** | Exemples JS, Python, Java, cURL |
---
## πŸš€ DΓ©marrage rapide
### Option 1 : Docker Compose (RecommandΓ©)
```bash
# 1. Cloner le repo
git clone https://github.com/NathMen12/Translator-API.git
cd Translator-API
# 2. Configurer les secrets
cp .env.example .env
# Γ‰diter .env avec votre ADMIN_ACCESS_CODE
# 3. Lancer
docker-compose up -d
# 4. AccΓ©der Γ  l'API
curl -X POST http://localhost:7820/translate \
-H "Content-Type: application/json" \
-d '{"text": "Bonjour le monde", "source": "fr", "target": "en"}'
```
### Option 2 : DΓ©veloppement local
```bash
# Installer les dΓ©pendances
npm install
# Lancer le central (terminal 1)
npm run dev:central
# Lancer le worker (terminal 2)
npm run dev:worker
# Test
curl -X POST http://localhost:7820/translate \
-H "Content-Type: application/json" \
-d '{"text": "Hello", "target": "fr"}'
```
---
## 🌐 Déploiement sur HuggingFace Spaces
1. **Fork ce repo** sur votre GitHub
2. **CrΓ©ez un Space** sur [huggingface.co/new-space](https://huggingface.co/new-space)
- SDK: **Docker**
- Hardware: **CPU Basic (2 vCPU, 16 GB RAM)** βœ…
- Visibility: Public ou Private
3. **Ajoutez les Secrets** dans Settings β†’ Repository secrets :
- `ADMIN_ACCESS_CODE` = votre mot de passe admin fort
- `TAILSCALE_API_KEY` = (optionnel) pour dΓ©couverte workers
4. **Push** β†’ Le Space build et dΓ©ploie automatiquement !
> ⚠️ Le port **7820** est exposé. HuggingFace Spaces mappe automatiquement sur le port 7860 en externe.
---
## πŸ“– Utilisation de l'API
### Endpoint principal
```
POST /translate
Content-Type: application/json
{
"text": "Bonjour le monde",
"source": "fr", // optionnel, dΓ©faut: "auto"
"target": "en" // optionnel, dΓ©faut: "fr"
}
```
### RΓ©ponse
```json
{
"translatedText": "Hello world",
"source": "fr",
"target": "en",
"duration": 245
}
```
### Codes d'erreur
| Code | Signification |
|------|--------------|
| 200 | Succès |
| 400 | RequΓͺte invalide (texte manquant, trop long >5000 chars) |
| 429 | Rate limit dΓ©passΓ© (30 req/min/IP) |
| 500 | Erreur serveur |
---
## πŸ’» Exemples d'intΓ©gration
### JavaScript / TypeScript
```javascript
// Fetch API (navigateur / Node 18+)
async function translate(text, source = 'auto', target = 'fr') {
const res = await fetch('https://VOTRE_SPACE.hf.space/translate', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ text, source, target })
});
if (!res.ok) throw new Error((await res.json()).error);
return res.json();
}
// Utilisation
translate('Bonjour', 'fr', 'es').then(r => console.log(r.translatedText)); // "Hola"
```
### Python
```python
import requests
def translate(text, source='auto', target='fr', base_url='https://VOTRE_SPACE.hf.space'):
resp = requests.post(f'{base_url}/translate',
json={'text': text, 'source': source, 'target': target}, timeout=30)
resp.raise_for_status()
return resp.json()
# Usage
print(translate('Hello world', 'en', 'fr')['translatedText']) # "Bonjour le monde"
```
### Java (HttpClient 11+)
```java
var client = HttpClient.newHttpClient();
var body = "{\"text\":\"Bonjour\",\"source\":\"fr\",\"target\":\"en\"}";
var request = HttpRequest.newBuilder()
.uri(URI.create("https://VOTRE_SPACE.hf.space/translate"))
.header("Content-Type", "application/json")
.POST(HttpRequest.BodyPublishers.ofString(body))
.build();
var response = client.send(request, HttpResponse.BodyHandlers.ofString());
// Parse JSON pour obtenir translatedText
```
### cURL
```bash
curl -X POST https://VOTRE_SPACE.hf.space/translate \
-H "Content-Type: application/json" \
-d '{"text": "Bonjour", "source": "fr", "target": "en"}'
```
> πŸ“– **Plus d'exemples** : Visitez `/wiki` sur votre instance dΓ©ployΓ©e !
---
## πŸ” Panel Admin
AccΓ©dez Γ  `https://VOTRE_SPACE.hf.space/admin` et entrez votre `ADMIN_ACCESS_CODE`.
### Onglets disponibles :
| Onglet | Contenu |
|--------|---------|
| πŸ–₯️ **Machines** | CPU/RAM temps rΓ©el (central + workers), jobs actifs |
| πŸ“ˆ **RequΓͺtes (120s)** | Graphique requΓͺtes/minute, stats, taux actuel |
| πŸ“‹ **Logs** | DerniΓ¨res traductions : IP, durΓ©e, langues, entrΓ©e/sortie |
---
## βš™οΈ Configuration
### Central (`central/settings.json`)
```json
{
"port": 7820,
"rateLimit": { "maxRequestsPerMinutePerIP": 30, "windowMs": 60000 },
"scanLocalWorkers": true,
"metricsWindowSeconds": 120,
"maxLocalJobs": 4
}
```
### Worker (`worker/settings.json`)
```json
{
"maxConcurrentJobs": 2,
"centralHost": "localhost",
"centralPort": 7820
}
```
### Variables d'environnement (Secrets)
| Variable | Requis | Description |
|----------|--------|-------------|
| `ADMIN_ACCESS_CODE` | βœ… | Mot de passe admin (fort !) |
| `TAILSCALE_API_KEY` | ❌ | Clé API Tailscale pour auto-découverte workers |
| `PORT` | ❌ | Port d'écoute (défaut: 7820) |
---
## πŸ—οΈ Architecture
```
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ HUGGINGFACE SPACE β”‚
β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚
β”‚ β”‚ CENTRAL β”‚ β”‚ WORKER β”‚ β”‚
β”‚ β”‚ (1.5 CPU / 12GB) │◄───│ (0.5 CPU / 4GB) β”‚ β”‚
β”‚ β”‚ β€’ Express API β”‚ WS β”‚ β€’ Translation β”‚ β”‚
β”‚ β”‚ β€’ Rate Limiting β”‚ β”‚ β€’ Job Queue β”‚ β”‚
β”‚ β”‚ β€’ Job Dispatch β”‚ β”‚ β€’ Metrics Push β”‚ β”‚
β”‚ β”‚ β€’ Admin Dashboard β”‚ β”‚ β”‚ β”‚
β”‚ β”‚ β€’ Metrics Storage β”‚ β”‚ β”‚ β”‚
β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
```
- **Central** : Gère l'API HTTP, rate limiting, dispatch vers workers, dashboard
- **Worker** : Se connecte en WebSocket, exΓ©cute les traductions, pousse mΓ©triques
- **Communication** : WebSocket natif (ws) pour faible latence
---
## πŸ“¦ Structure du projet
```
Translator-API/
β”œβ”€β”€ central/ # Machine centrale
β”‚ β”œβ”€β”€ src/index.js # Serveur Express + WS + Admin
β”‚ β”œβ”€β”€ settings.json # Config centrale
β”‚ β”œβ”€β”€ public/ # Frontend statique
β”‚ β”‚ β”œβ”€β”€ index.html # Page d'accueil + test
β”‚ β”‚ β”œβ”€β”€ admin.html # Dashboard admin (Chart.js)
β”‚ β”‚ └── wiki.html # Documentation intΓ©grΓ©e
β”‚ └── secrets/ # .env (ignorΓ© par git)
β”œβ”€β”€ worker/ # Worker de traduction
β”‚ β”œβ”€β”€ src/index.js # Client WS + file d'attente
β”‚ └── settings.json # Config worker
β”œβ”€β”€ shared/ # Code partagΓ© (futur)
β”œβ”€β”€ wiki/ # Docs markdown (source)
β”œβ”€β”€ Dockerfile # Multi-stage build
β”œβ”€β”€ docker-compose.yml # Orchestration locale
β”œβ”€β”€ .env.example # Template secrets
└── package.json # DΓ©pendances root
```
---
## πŸ› οΈ DΓ©veloppement
```bash
# Installer tout
npm run install:all
# Central en mode watch
npm run dev:central
# Worker en mode watch
npm run dev:worker
# Tests
npm test
```
### Logs
- Central : `central/logs/central.log`
- Worker : `worker/logs/worker.log`
---
## πŸ”’ SΓ©curitΓ©
- **Pas de clΓ© API publique** β€” Protection par rate limiting IP
- **Admin protΓ©gΓ©** β€” Code fort dans variable d'environnement (pas dans le code)
- **Secrets HF Spaces** β€” StockΓ©s chiffrΓ©s, injectΓ©s au runtime
- **Non-root Docker** β€” User `nodejs` (UID 1001)
- **Helmet/CORS** β€” Configurables selon besoins
---
## πŸ“ Licence
MIT License β€” Voir [LICENSE](LICENSE)
---
## 🀝 Contribution
1. Fork le projet
2. CrΓ©ez une branche (`git checkout -b feature/amazing`)
3. Committez (`git commit -m 'Add amazing feature'`)
4. Push (`git push origin feature/amazing`)
5. Ouvrez une Pull Request
---
## πŸ™ Remerciements
- [@vitalets/google-translate-api](https://github.com/vitalets/google-translate-api) β€” Moteur de traduction
- [Chart.js](https://www.chartjs.org/) β€” Graphiques admin
- [HuggingFace Spaces](https://huggingface.co/spaces) β€” HΓ©bergement gratuit
---
<div align="center">
<strong>Fait avec ❀️ par <a href="https://github.com/NathMen12">NathMen12</a></strong>
<br>
<a href="https://github.com/NathMen12/Translator-API">⭐ Star sur GitHub</a> β€’
<a href="https://github.com/NathMen12/Translator-API/issues">πŸ› Signaler un bug</a> β€’
<a href="https://github.com/NathMen12/Translator-API/discussions">πŸ’¬ Discussions</a>
</div>