diff --git a/.cursorrules b/.cursorrules new file mode 100644 index 0000000..09c08db --- /dev/null +++ b/.cursorrules @@ -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 diff --git a/CHANGELOG.md b/CHANGELOG.md index f9f6381..41aba12 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -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 diff --git a/docs/CONFIGURATION.md b/docs/CONFIGURATION.md new file mode 100644 index 0000000..ebe63ba --- /dev/null +++ b/docs/CONFIGURATION.md @@ -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 diff --git a/src/main.rs b/src/main.rs index 236fd23..223f9cb 100644 --- a/src/main.rs +++ b/src/main.rs @@ -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::().ok()) + .unwrap_or(DEFAULT_PORT); + // Parse command line arguments let args: Vec = 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(()) } diff --git a/tests/http_api.rs b/tests/http_api.rs index 2e41498..d7bc3b6 100644 --- a/tests/http_api.rs +++ b/tests/http_api.rs @@ -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() });