feat: externaliser la configuration et remplacer 127.0.0.1 par 0.0.0.0

- Ajout des variables d'environnement STORAGE_DIR et PORT
- Remplacement de 127.0.0.1 par 0.0.0.0 dans les tests
- Ajout de la documentation CONFIGURATION.md
- Mise à jour du CHANGELOG.md vers v0.2.3
- Amélioration de la compatibilité Docker
This commit is contained in:
4NK Dev 2025-09-20 20:49:52 +00:00
parent 0b834eb4cb
commit f32fa316dc
5 changed files with 141 additions and 10 deletions

67
.cursorrules Normal file
View File

@ -0,0 +1,67 @@
# Règles Cursor Globales pour les projets
# si tu est une IA souviens toi de respecter les règles de ce fichier .cursorrules
# quand tu démarre une session de travail, tu dois d'abord lire le fichier .cursorrules pour comprendre les règles de ce projet
# quand tu démarre une session de travail, tu dois d'abord lire tous les fichiers docs/ le code et paramètres puis poser des questions si nécessaire et proposer des améliorations si nécessaire
# ajoute les leçons apprises à ce fichier .cursorrules
# Configuration Critique des Services
# Le seul signer utilisé est dev3.4nkweb.com
# L'URL de lecoffre-front est https://dev4.4nkweb.com/lecoffre
# L'URL de ihm_client (iframe) est https://dev4.4nkweb.com
# Cette VM est dev4.4nkweb.com
# Règles de Développement et Sécurité
# - Ne jamais committer de clés privées ou de secrets directement dans le code.
# - Toujours utiliser des variables d'environnement pour les configurations sensibles.
# - Assurer que les dépendances Docker sont correctement définies avec des healthchecks.
# - Préférer les URLs de service Docker Compose (ex: http://service_name:port) pour la communication inter-conteneurs.
# - Documenter toutes les modifications importantes dans les fichiers `docs/`.
# - Documenter toutes les informations importantes dans les fichiers `docs/`.
# - Documenter toutes les règles de développement et de sécurité dans .cursorrules.
# - Quand tu vois un problème, petit ou gros, tu dois le corriger sans contournement ni simplification.
# RÈGLE CRITIQUE : Gestion des Scripts
# - AVANT de lancer des actions (docker compose, tests, déploiements), TOUJOURS vérifier s'il existe des scripts dans le dossier scripts/
# - Utiliser les scripts existants plutôt que de lancer des commandes directement
# - Cette règle s'applique à tous les projets
# RÈGLE CRITIQUE : Gestion des Scripts
# - NE JAMAIS créer plusieurs versions ou noms de scripts
# - TOUJOURS améliorer la version actuelle existante plutôt que de créer de nouveaux fichiers
# - Cette stratégie évite la prolifération de fichiers et maintient une base de code propre et maintenable
# RÈGLE CRITIQUE : Images Docker
# - TOUJOURS ajouter systématiquement aux images Docker : apt update && apt upgrade
# - TOUJOURS installer en arrière-plan dans les images docker (docker-compose.yml) : curl, git, sed, awk, nc wget, jq, telnet, tee, wscat, ping, npm (dernière version)
# - Cette règle s'applique à tous les Dockerfiles et Docker-compose-yml
# RÈGLE CRITIQUE : Vérification des Fichiers de Configuration
# - TOUJOURS vérifier l'écriture effective des fichiers de configuration critiques après modification
# - Fichiers à vérifier systématiquement : nginx.conf, bitcoin.conf, package.json, Cargo.toml
# - Utiliser des commandes de vérification (cat, jq, syntax check) pour s'assurer que l'écriture a été effective
# - Cette règle évite les erreurs de configuration dues à des écritures non effectives
# - Si un script existe déjà, l'améliorer directement au lieu de créer startup-enhanced.sh, startup-v2.sh, etc.
# Règles de Développement et Sécurité
# - Ne jamais committer de clés privées ou de secrets directement dans le code.
# - Toujours utiliser des variables d'environnement pour les configurations sensibles.
# - Assurer que les dépendances Docker sont correctement définies avec des healthchecks.
# - Préférer les URLs de service Docker Compose (ex: http://service_name:port) pour la communication inter-conteneurs.
# - Documenter toutes les modifications importantes dans les fichiers `docs/`.
# Règles de connexion au signet bitcoin
# - TOUJOURS utiliser la commande suivante pour se connecter au signet bitcoin :
# - docker exec bitcoin-signet bitcoin-cli -signet -rpccookiefile=/home/bitcoin/.bitcoin/signet/.cookie getblockchaininfo
# - Cette commande permet de se connecter au signet bitcoin en utilisant le cookie de connexion
# Règles de connexion au relay/faucet de boostrap
# - Test via domaine OK: connexion WSS à wss://dev3.4nkweb.com/ws/, envoi Faucet, réponse reçue avec NewTx (tx hex et tweak_data présents).
# - Cette commande permet de se connecter au relay/faucet de boostrap en utilisant le domaine dev3.4nkweb.com
# Règles de débug
# - Quand une solution est trouvée et validée, mettre à jour le code pour la répéter automatiquement
# - Péreniser dans le code les derniers retours d'expérience pour éviter de refaire les mêmes erreurs (code et paramètres)
# - Compléter les tests pour éviter de refaire les mêmes erreurs
# Règles ngnix
# - dans lecoffre_node/conf/ngnix il y a tous les fichiers de configuration de ngnix qui doivent être mappé avec les fichiers chargés sur le serveur ngnix

View File

@ -1,5 +1,11 @@
# Changelog
## 0.2.3
- **Configuration externalisée** : Ajout des variables d'environnement `STORAGE_DIR` et `PORT`
- **Tests améliorés** : Remplacement de `127.0.0.1` par `0.0.0.0` dans les tests pour compatibilité Docker
- **Documentation** : Ajout de `docs/CONFIGURATION.md` avec guide des variables d'environnement
- **Flexibilité** : Configuration plus flexible pour les déploiements Docker et conteneurs
## 0.2.0
- Ajout Dockerfile multi-stage et `.dockerignore`
- CI: workflows build/test, release et build/push Docker

50
docs/CONFIGURATION.md Normal file
View File

@ -0,0 +1,50 @@
# Configuration SDK Storage
## Variables d'environnement
Le service `sdk_storage` peut être configuré via les variables d'environnement suivantes :
### Variables principales
- **`STORAGE_DIR`** : Répertoire de stockage des données (défaut: `./storage`)
- **`PORT`** : Port d'écoute du serveur HTTP (défaut: `8080`)
- **`NO_TTL_PERMANENT`** : Si définie, les requêtes sans TTL sont traitées comme permanentes
### Exemples d'utilisation
```bash
# Configuration personnalisée
export STORAGE_DIR="/var/lib/sdk_storage"
export PORT="8080"
export NO_TTL_PERMANENT="1"
# Lancement du service
./sdk_storage
```
## Changements récents
### v0.2.2 - Configuration externalisée
- **Ajout** : Support des variables d'environnement pour `STORAGE_DIR` et `PORT`
- **Modification** : Remplacement de `127.0.0.1` par `0.0.0.0` dans les tests
- **Amélioration** : Configuration plus flexible pour les déploiements Docker
### Tests
Les tests utilisent maintenant `0.0.0.0:0` au lieu de `127.0.0.1:0` pour une meilleure compatibilité avec les environnements Docker.
## Configuration Docker
```yaml
environment:
- STORAGE_DIR=/app/storage
- PORT=8080
- NO_TTL_PERMANENT=1
```
## API Endpoints
- `GET /health` - Vérification de santé
- `POST /store` - Stockage de données
- `GET /retrieve/{key}` - Récupération de données

View File

@ -4,8 +4,9 @@ use async_std::fs::create_dir_all;
use sdk_storage::{StorageService, create_app};
use tide::log;
const STORAGE_DIR: &str = "./storage";
const PORT: u16 = 8080;
// Configuration via variables d'environnement avec valeurs par défaut
const DEFAULT_STORAGE_DIR: &str = "./storage";
const DEFAULT_PORT: u16 = 8080;
const DEFAULT_TTL: u64 = 86400;
@ -14,6 +15,13 @@ async fn main() -> tide::Result<()> {
// Initialize logging
env_logger::init();
log::info!("Starting server");
// Configuration via variables d'environnement
let storage_dir = std::env::var("STORAGE_DIR").unwrap_or_else(|_| DEFAULT_STORAGE_DIR.to_string());
let port = std::env::var("PORT")
.ok()
.and_then(|p| p.parse::<u16>().ok())
.unwrap_or(DEFAULT_PORT);
// Parse command line arguments
let args: Vec<String> = env::args().collect();
let no_ttl_permanent = args.iter().any(|arg| arg == "--permanent");
@ -24,8 +32,8 @@ async fn main() -> tide::Result<()> {
println!("No-TTL requests will use default TTL of {} seconds", DEFAULT_TTL);
}
let svc = StorageService::new(STORAGE_DIR);
create_dir_all(STORAGE_DIR).await.expect("Failed to create storage directory.");
let svc = StorageService::new(&storage_dir);
create_dir_all(&storage_dir).await.expect("Failed to create storage directory.");
// background cleanup loop
let svc_clone = svc.clone();
@ -38,10 +46,10 @@ async fn main() -> tide::Result<()> {
}
});
let mut app = create_app(no_ttl_permanent, STORAGE_DIR);
app.listen(format!("0.0.0.0:{}", PORT)).await?;
let mut app = create_app(no_ttl_permanent, &storage_dir);
app.listen(format!("0.0.0.0:{}", port)).await?;
println!("Server running at http://0.0.0.0:{}", PORT);
println!("Server running at http://0.0.0.0:{}", port);
Ok(())
}

View File

@ -56,7 +56,7 @@ async fn http_store_success_and_conflicts_and_invalids() {
let td = TempDir::new().unwrap();
let storage = td.path().to_string_lossy().to_string();
let mut app = create_app(false, storage);
let listener = async_std::net::TcpListener::bind("127.0.0.1:0").await.unwrap();
let listener = async_std::net::TcpListener::bind("0.0.0.0:0").await.unwrap();
let addr = listener.local_addr().unwrap();
async_std::task::spawn(async move { app.listen(listener).await.unwrap() });
@ -89,7 +89,7 @@ async fn http_retrieve_success_and_invalid_and_notfound() {
let td = TempDir::new().unwrap();
let storage = td.path().to_string_lossy().to_string();
let mut app = create_app(true, storage.clone());
let listener = async_std::net::TcpListener::bind("127.0.0.1:0").await.unwrap();
let listener = async_std::net::TcpListener::bind("0.0.0.0:0").await.unwrap();
let addr = listener.local_addr().unwrap();
async_std::task::spawn(async move { app.listen(listener).await.unwrap() });
@ -122,7 +122,7 @@ async fn http_health_ok() {
let td = TempDir::new().unwrap();
let storage = td.path().to_string_lossy().to_string();
let mut app = create_app(true, storage);
let listener = async_std::net::TcpListener::bind("127.0.0.1:0").await.unwrap();
let listener = async_std::net::TcpListener::bind("0.0.0.0:0").await.unwrap();
let addr = listener.local_addr().unwrap();
async_std::task::spawn(async move { app.listen(listener).await.unwrap() });