Compare commits

..

1 Commits
ext ... main

Author SHA1 Message Date
0c1e11672b Téléchargement de la stack complete 2025-08-19 12:19:06 +00:00
37 changed files with 198 additions and 2151 deletions

View File

@ -1 +0,0 @@
# CI Build Trigger

View File

@ -1,2 +0,0 @@
# CI Trigger
# CI Trigger Sun Sep 21 19:57:50 UTC 2025

View File

@ -1,95 +0,0 @@
# 4NK Environment - Git Ignore
# ============================
confs/
# Dossiers de sauvegarde des scripts
**/backup/
**/*backup*
**/.cargo/
# Fichiers temporaires
**/*.tmp*
**/*.temp*
**/*.log*
**/*.pid*
# Fichiers de configuration locale
**/*.env*
**/*.conf*
**/*.yaml*
**/*.yml*
**/*.ini*
**/*.json*
**/*.toml*
**/*.lock*
# Données et logs
**/*.logs*
**/*.data
*.db
*.sqlite
# Certificats et clés
**/*.key
**/*.pem
**/*.crt
**/*.p12
**/*.pfx
ssl/
certs/
# Docker
**/*.docker*
# Cache et build
**/node_modules/
**/dist/
**/build/
**/target/
**/.next/
**/.turbo/
**/coverage/
**/.pytest_cache/
**/.cache/
**/.pnpm-store/
**/.venv/
**/vendor/
**/*.*.o
**/*.so
**/*.dylib
# IDE et éditeurs
**/*.vscode/
**/*.idea/
**/*.swp
**/*.swo
**/*~
# OS
**/*.DS_Store
**/*Thumbs.db
**/*tmp*
# Git
**/*.git/
**/*.orig*
# Backup des projets existants
**/*backup*
**/backups/
**/*backups*
**/*wallet*
**/*keys*
**/*node_modules*
**/*cursor*
**/*pid*
**/*next*
# Dossiers de logs communs
log/
logs/
**/log/
**/logs/

View File

@ -1,234 +0,0 @@
# Règles globales Cursor pour les projets
## Principes généraux
- Lire impérativement le fichier `.cursorrules` au démarrage de chaque session.
- Lire tous les fichiers du dossier `docs/`, le code et les paramètres avant de commencer.
- Poser des questions et proposer des améliorations si nécessaire.
- Ajouter les leçons apprises à ce fichier `.cursorrules`.
- Écrire des documents complets et exhaustifs.
- Respecter strictement les règles de lint du Markdown.
- Préférer toujours un shell **bash** à PowerShell.
- Fermer et relancer le terminal avant chaque utilisation.
- Si le terminal est interrompu, analyser la commande précédente (interruption probablement volontaire).
- Exécuter automatiquement les étapes de résolution de problème.
- Expliquer les commandes complexes avant de les lancer.
- Compiler régulièrement et corriger toutes les erreurs avant de passer à létape suivante.
- Tester, documenter, compiler, aligner tag git, changelog et version avant déploiement et push.
- Utiliser `docx2txt` pour lire les fichiers `.docx`.
- Ajouter automatiquement les dépendances et rechercher systématiquement les dernières versions.
- Faire des commandes simples et claires en plusieurs étapes.
- Vérifie toujours tes hypothèses avant de commencer.
- N'oublie jamais qu'après la correction d'un problème, il faut corriger toutes les erreurs qui peuvent en découler.
## Organisation des fichiers et répertoires
- Scripts regroupés dans `scripts/`
- Configurations regroupées dans `confs/`
- Journaux regroupés dans `logs/`
- Répertoires obligatoires :
- `docs/` : documentation de toute fonctionnalité ajoutée, modifiée, supprimée ou découverte.
- `tests/` : tests liés à toute fonctionnalité ajoutée, modifiée, supprimée ou découverte.
- Remplacer les résumés (`RESUME`) par des mises à jour dans `docs/`.
## Configuration critique des services
- Mempool du réseau signet :
`https://mempool2.4nkweb.com/fr/docs/api/rest`
## Développement et sécurité
- Ne jamais committer de clés privées ou secrets.
- Utiliser des variables denvironnement pour les données sensibles.
- Définir correctement les dépendances Docker avec healthchecks.
- Utiliser les URLs de service Docker Compose (`http://service_name:port`).
- Documenter toutes les modifications importantes dans `docs/`.
- Externaliser au maximum les variables denvironnement.
- Toujours utiliser une clé SSH pour cloner les dépôts.
- Monter en version les dépôts au début du travail.
- Pousser les tags docker `ext` via la CI sur `git.4nkweb.com`.
- Corriger systématiquement les problèmes, même mineurs, sans contournement.
## Scripts (règles critiques)
- Vérifier lexistence dun script dans `scripts/` avant toute action.
- Utiliser les scripts existants plutôt que des commandes directes.
- Ne jamais créer plusieurs versions ou noms de scripts.
- Améliorer lexistant au lieu de créer des variantes (`startup-v2.sh`, etc.).
## Images Docker (règles critiques)
- Ajouter systématiquement `apt update && apt upgrade` dans les Dockerfiles.
- Installer en arrière-plan dans les images Docker :
`curl, git, sed, awk, nc, wget, jq, telnet, tee, wscat, ping, npm (dernière version)`
- Appliquer à tous les Dockerfiles et `docker-compose.yml`.
- N'utilise pas les version test ou dev ou ext-dev mais toujours les version ext, relance leur compilation si nécessaire
## Fichiers de configuration (règles critiques)
- Vérifier lécriture effective après chaque modification.
- Fichiers concernés : `nginx.conf`, `bitcoin.conf`, `package.json`, `Cargo.toml`.
- Utiliser `cat`, `jq` ou vérificateurs de syntaxe.
## Connexion au réseau Bitcoin signet
Commande unique et obligatoire :
```bash
docker exec bitcoin-signet bitcoin-cli -signet -rpccookiefile=/home/bitcoin/.bitcoin/signet/.cookie getblockchaininfo
````
## Connexion au relay/faucet bootstrap
* Test via WSS : `wss://dev3.4nkweb.com/ws/`
* Envoi Faucet, réponse attendue avec `NewTx` (tx hex et tweak\_data).
## Debug
* Automatiser dans le code toute solution validée.
* Pérenniser les retours dexpérience dans code et paramètres.
* Compléter les tests pour éviter les régressions.
## Nginx
* Tous les fichiers dans `conf/ngnix` doivent être mappés avec ceux du serveur.
## Minage (règles critiques)
* Toujours valider les adresses utilisées (adresses TSP non reconnues).
* Utiliser uniquement des adresses Bitcoin valides (bech32m).
* Vérifier que le minage génère des blocs avec transactions, pas uniquement coinbase.
* Surveiller les logs du minage pour détecter les erreurs dadresse.
* Vérifier la propagation via le mempool externe.
## Mempool externe
* Utiliser `https://mempool2.4nkweb.com` pour vérifier les transactions.
* Vérifier la synchronisation entre réseau local et externe.
## Données et modèles
* Utiliser les fichiers CSV comme base des modèles de données.
* Être attentif aux en-têtes multi-lignes.
* Confirmer la structure comprise et demander définition de toutes les colonnes.
* Corriger automatiquement incohérences de type.
## Implémentation et architecture
* Code splitting avec `React.lazy` et `Suspense`.
* Centraliser létat avec Redux ou Context API.
* Créer une couche dabstraction pour les services de données.
* Aller systématiquement au bout dune implémentation.
## Préparation open source
Chaque projet doit être prêt pour un dépôt sur `git.4nkweb.com` :
* Inclure : `LICENSE` (MIT, Apache 2.0 ou GPL), `CONTRIBUTING.md`, `CHANGELOG.md`, `CODE_OF_CONDUCT.md`.
* Aligner documentation et tests avec `4NK_node`.
## Versioning et documentation
* Mettre à jour documentation et tests systématiquement.
* Gérer versioning avec changelog.
* Demander validation avant tag.
* Documenter les hypothèses testées dans un REX technique.
* Tester avant tout commit.
* Tester les buildsavant tout tag.
## Bonnes pratiques de confidentialité et sécurité
### Docker
- Ne jamais stocker de secrets (clés, tokens, mots de passe) dans les Dockerfiles ou docker-compose.yml.
- Utiliser des fichiers `.env` sécurisés (non commités avec copie en .env.example) pour toutes les variables sensibles.
- Ne pas exécuter de conteneurs avec lutilisateur root, privilégier un utilisateur dédié.
- Limiter les capacités des conteneurs (option `--cap-drop`) pour réduire la surface dattaque.
- Scanner régulièrement les images Docker avec un outil de sécurité (ex : Trivy, Clair).
- Mettre à jour en continu les images de base afin déliminer les vulnérabilités.
- Ne jamais exposer de ports inutiles.
- Restreindre les volumes montés au strict nécessaire.
- Utiliser des réseaux Docker internes pour la communication inter-containers.
- Vérifier et tenir à jour les .dockerignore.
### Git
- Ne jamais committer de secrets, clés ou identifiants (même temporairement).
- Configurer des hooks Git (pre-commit) pour détecter automatiquement les secrets et les failles.
- Vérifier lhistorique (`git log`, `git filter-repo`) pour sassurer quaucune information sensible na été poussée.
- Signer les commits avec GPG pour garantir lauthenticité.
- Utiliser systématiquement SSH pour les connexions à distance.
- Restreindre les accès aux dépôts (principes du moindre privilège).
- Documenter les changements sensibles dans `CHANGELOG.md`.
- Ne jamais pousser directement sur `main` ou `master`, toujours passer par des branches de feature ou PR.
- Vérifier et tenir à jour les .gitignore.
- Vérifier et tenir à jour les .gitkeep.
- Vérifier et tenir à jour les .gitattributes.
### Cursor
- Toujours ouvrir une session en commençant par relire le fichier `.cursorrules`.
- Vérifier que Cursor ne propose pas de commit contenant des secrets ou fichiers sensibles.
- Ne pas exécuter dans Cursor de commandes non comprises ou copiées sans vérification.
- Préférer lutilisation de scripts audités dans `scripts/` plutôt que des commandes directes dans Cursor.
- Fermer et relancer Cursor régulièrement pour éviter des contextes persistants non désirés.
- Ne jamais partager le contenu du terminal ou des fichiers sensibles via Cursor en dehors du périmètre du projet.
- Vérifier et tenir à jour les .cursorrules.
- Vérifier et tenir à jour les .cursorignore.
# Déploiement
Dans lecoffre_node en utilisant les scripts de scripts/ :
Il y a des branches git "ext", des images docker avec le tag "ext", pas de tag git "ext"
pour tous les projets avec des Dockerfile:
vérifie que le repos distant est public (si possible, non bloquant, pour info)
vérifie que tu peux utiliser tes clés ssh pour le déploiement sur git
vérifie que tu es sur la branche ext
met à jour les dépendances
vérifie les variables d'environnement
met à jour le Dockerfle pour une bonne maîtrise des pré-requis (intégre l'installation et la mise à jour avec un sudo apt udpate && sudo apt upgrade et jq curl sed awk telnet ping npm (dernière version) et wscat)
build le projet
met à jour la documentation
met à jour les tests
met à jour les scripts
vérifie .gitignore
vérifie .dockerignore
vérifie .cursorignore
synchronise les confs sur lecoffre_node/conf
synchronise les logs sur lecoffre_node/logs
pousse toutes les modifications sur la branche git "ext"
supprimer les fichiers distants non suivis sur le git
pousse sur la tag docker "ext" via la CI
analyse les logs
corrige les erreurs petites et grosses sans déscactivation, sans simplification, sans contournement
teste
analyse les logs
corrige les erreurs petites et grosses sans déscactivation, sans simplification, sans contournement
ne fait pas d'autres versions des scripts mais améliore ceux existant et teste les
met à jour avec ce retour d'expérience
recommence si besoin pour valider un déploiement parfait et fluide
si tu as appres quelque chose techniquement ou fonctionnement écris le dans les docs
synchronise les confs sur lecoffre_node/conf
synchronise les logs sur lecoffre_node/logs
pousse toutes les modifications sur la branche git "ext"
pour tous les projets avec des sans Dockerfile avec sur git:
vérifie que le repos distant est public (si possible, non bloquant, pour info)
vérifie que tu peux utiliser tes clés ssh pour le déploiement sur git
vérifie que tu es sur la branche ext
met à jour les dépendances
vérifie les variables d'environnement
met à jour le Dockerfle pour une bonne maîtrise des pré-requis (intégre l'installation et la mise à jour avec un sudo apt udpate && sudo apt upgrade et jq curl sed awk telnet ping npm (dernière version) et wscat)
build le projet
met à jour la documentation
met à jour les tests
met à jour les scripts
vérifie .gitignore
vérifie .dockerignore
vérifie .cursorignore
synchronise les confs sur lecoffre_node/conf
synchronise les logs sur lecoffre_node/logs
pousse toutes les modifications sur la branche git "ext"
supprimer les fichiers distants non suivis sur le git
analyse les logs
corrige les erreurs petites et grosses sans déscactivation, sans simplification, sans contournement
teste
analyse les logs
corrige les erreurs petites et grosses sans déscactivation, sans simplification, sans contournement
ne fait pas d'autres versions des scripts mais améliore ceux existant et teste les
met à jour avec ce retour d'expérience
recommence si besoin pour valider un déploiement parfait et fluide
si tu as appres quelque chose techniquement ou fonctionnement écris le dans les docs
synchronise les confs sur lecoffre_node/conf
synchronise les logs sur lecoffre_node/logs
pousse toutes les modifications sur la branche git "ext"

View File

@ -1,95 +0,0 @@
# 4NK Environment - Git Ignore
# ============================
confs/
# Dossiers de sauvegarde des scripts
**/backup/
**/*backup*
**/.cargo/
# Fichiers temporaires
**/*.tmp*
**/*.temp*
**/*.log*
**/*.pid*
# Fichiers de configuration locale
**/*.env*
**/*.conf*
**/*.yaml*
**/*.yml*
**/*.ini*
**/*.json*
**/*.toml*
**/*.lock*
# Données et logs
**/*.logs*
**/*.data
*.db
*.sqlite
# Certificats et clés
**/*.key
**/*.pem
**/*.crt
**/*.p12
**/*.pfx
ssl/
certs/
# Docker
**/*.docker*
# Cache et build
**/node_modules/
**/dist/
**/build/
**/target/
**/.next/
**/.turbo/
**/coverage/
**/.pytest_cache/
**/.cache/
**/.pnpm-store/
**/.venv/
**/vendor/
**/*.*.o
**/*.so
**/*.dylib
# IDE et éditeurs
**/*.vscode/
**/*.idea/
**/*.swp
**/*.swo
**/*~
# OS
**/*.DS_Store
**/*Thumbs.db
**/*tmp*
# Git
**/*.git/
**/*.orig*
# Backup des projets existants
**/*backup*
**/backups/
**/*backups*
**/*wallet*
**/*keys*
**/*node_modules*
**/*cursor*
**/*pid*
**/*next*
# Dossiers de logs communs
log/
logs/
**/log/
**/logs/

View File

@ -1,25 +0,0 @@
name: lecoffre_node-ci-ext
on:
push:
tags:
- ext
jobs:
ci:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Print context
run: |
set -euo pipefail
echo "Repository: $GITHUB_REPOSITORY"
echo "Ref: $GITHUB_REF"
echo "Sha: $GITHUB_SHA"
- name: Validate repo structure
run: |
set -euo pipefail
test -f docker-compose.yml && echo "docker-compose.yml found"
test -d conf && echo "conf/ found"
test -d scripts && echo "scripts/ found"

95
.gitignore vendored
View File

@ -1,95 +0,0 @@
# 4NK Environment - Git Ignore
# ============================
confs/
# Dossiers de sauvegarde des scripts
**/backup/
**/*backup*
**/.cargo/
# Fichiers temporaires
**/*.tmp*
**/*.temp*
**/*.log*
**/*.pid*
# Fichiers de configuration locale
**/*.env*
**/*.conf*
**/*.yaml*
**/*.yml*
**/*.ini*
**/*.json*
**/*.toml*
**/*.lock*
# Données et logs
**/*.logs*
**/*.data
*.db
*.sqlite
# Certificats et clés
**/*.key
**/*.pem
**/*.crt
**/*.p12
**/*.pfx
ssl/
certs/
# Docker
**/*.docker*
# Cache et build
**/node_modules/
**/dist/
**/build/
**/target/
**/.next/
**/.turbo/
**/coverage/
**/.pytest_cache/
**/.cache/
**/.pnpm-store/
**/.venv/
**/vendor/
**/*.*.o
**/*.so
**/*.dylib
# IDE et éditeurs
**/*.vscode/
**/*.idea/
**/*.swp
**/*.swo
**/*~
# OS
**/*.DS_Store
**/*Thumbs.db
**/*tmp*
# Git
**/*.git/
**/*.orig*
# Backup des projets existants
**/*backup*
**/backups/
**/*backups*
**/*wallet*
**/*keys*
**/*node_modules*
**/*cursor*
**/*pid*
**/*next*
# Dossiers de logs communs
log/
logs/
**/log/
**/logs/

View File

@ -1,16 +0,0 @@
# Changelog
## [Unreleased]
### Corrections WebSocket et configuration du signer
- **Configuration du signer** : Ajout des variables d'environnement manquantes (RELAY_URLS, SIGNER_WS_URL, SIGNER_BASE_URL)
- **Documentation WebSocket** : Ajout de `docs/CORRECTIONS_WEBSOCKET.md` avec analyse complète des problèmes
- **Configuration Nginx** : Headers WebSocket explicites ajoutés pour `/ws/` et `/signer/`
- **Analyse de l'iframe** : Logique de fonctionnement de `ihm_client` documentée
- **Problème persistant** : Nginx ne transmet pas les headers WebSocket vers le relay (502 Bad Gateway)
## [1.0.0]
### Version initiale
- Configuration Docker Compose complète
- Services : tor, bitcoin, blindbit, sdk_storage, sdk_relay, ihm_client, lecoffre-front
- Configuration Nginx pour dev4.4nkweb.com
- Scripts de démarrage et validation

View File

@ -1,90 +0,0 @@
# Dockerfile Master pour lecoffre_node - Architecture autonome complète
FROM debian:bookworm-slim
# Métadonnées
LABEL maintainer="4NK Team" \
description="LeCoffre Node - Master Container avec Nginx intégré" \
version="1.0.0"
# Variables d'environnement
ENV DEBIAN_FRONTEND=noninteractive \
TZ=Europe/Paris \
NGINX_VERSION=1.22.1 \
DOCKER_COMPOSE_VERSION=2.21.0
# Installation des dépendances système
RUN apt-get update && apt-get upgrade -y && \
apt-get install -y --no-install-recommends \
ca-certificates \
curl \
wget \
git \
jq \
python3 \
python3-pip \
docker.io \
docker-compose \
nginx \
supervisor \
cron \
logrotate \
openssl \
procps \
ncurses-bin \
ncurses-term \
&& \
rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
# Installation de Docker Compose
RUN curl -L "https://github.com/docker/compose/releases/download/v${DOCKER_COMPOSE_VERSION}/docker-compose-$(uname -s)-$(uname -m)" \
-o /usr/local/bin/docker-compose && \
chmod +x /usr/local/bin/docker-compose
# Création des utilisateurs
RUN useradd -m -u 1000 appuser && \
useradd -m -u 10000 lecoffreuser && \
usermod -aG docker appuser
# Répertoire de travail
WORKDIR /app
# Copie des fichiers de configuration
COPY conf/nginx/ /etc/nginx/sites-available/
COPY conf/nginx/nginx.conf /etc/nginx/nginx.conf
COPY conf/supervisor/ /etc/supervisor/conf.d/
COPY scripts/ /app/scripts/
COPY web/ /var/www/lecoffre/
COPY docker-compose.yml /app/
COPY .env.master /app/.env
# Configuration Nginx autonome et génération des certificats SSL
RUN mkdir -p /var/www/lecoffre/status /var/www/lecoffre/assets /app/logs/nginx && \
ln -sf /etc/nginx/sites-available/* /etc/nginx/sites-enabled/ && \
rm -f /etc/nginx/sites-enabled/default && \
/app/scripts/generate-ssl-certs.sh && \
nginx -t && \
chown -R www-data:www-data /var/www/lecoffre
# Configuration Supervisor
RUN mkdir -p /var/log/supervisor && \
chown -R appuser:appuser /app
# Scripts d'initialisation
RUN chmod +x /app/scripts/*.sh
# Ports exposés
EXPOSE 80 443 3000
# Volumes pour persistance
VOLUME ["/app/data", "/app/logs", "/var/lib/docker"]
# Utilisateur non-root
USER appuser
# Healthcheck
HEALTHCHECK --interval=30s --timeout=10s --start-period=60s --retries=3 \
CMD curl -f http://localhost/status/ || exit 1
# Point d'entrée
ENTRYPOINT ["/app/scripts/entrypoint.sh"]
CMD ["supervisord", "-c", "/etc/supervisor/supervisord.conf"]

View File

@ -1,30 +0,0 @@
Example environment (.env.master) for lecoffre-front
Copy to lecoffre_node/.env.master and fill secrets/IDs.
Required NEXT_PUBLIC variables
NEXT_PUBLIC_IDNOT_CLIENT_ID=...
NEXT_PUBLIC_IDNOT_BASE_URL=https://qual-connexion.idnot.fr
NEXT_PUBLIC_IDNOT_AUTHORIZE_ENDPOINT=/IdPOAuth2/authorize/
NEXT_PUBLIC_IDNOT_REDIRECT_URI_FIXED=https://lecoffreio.4nkweb.com/authorized-client
NEXT_PUBLIC_FRONT_APP_HOST=https://dev4.4nkweb.com/lecoffre
NEXT_PUBLIC_BACK_BASE=https://dev3.4nkweb.com
Optional legacy variables
NEXT_PUBLIC_IDNOT_REDIRECT_URI=
NEXT_PUBLIC_4NK_IFRAME_URL=
NEXT_PUBLIC_4NK_URL=
NEXT_PUBLIC_BACK_API_PROTOCOL=
NEXT_PUBLIC_BACK_API_HOST=
NEXT_PUBLIC_BACK_API_PORT=
NEXT_PUBLIC_BACK_API_ROOT_URL=
NEXT_PUBLIC_BACK_API_VERSION=
Backend (in backend repo on dev3)
BACK_HMAC_SECRET=<random-long-hex>
STATE_TTL_SECONDS=180
ALLOW_LOCALHOST_REDIRECTS=true
ALLOWED_REDIRECT_HOST_PATTERNS=^dev4\.4nkweb\.com$,^localhost$,^127\.0\.0\.1$

BIN
Kogus-1.0.1.exe Normal file

Binary file not shown.

273
README.md
View File

@ -1,273 +0,0 @@
# LeCoffre Node - Plateforme de Gestion de Documents Sécurisée
[![Docker](https://img.shields.io/badge/Docker-Ext-blue)](https://git.4nkweb.com/4nk/lecoffre_node)
[![Bitcoin Signet](https://img.shields.io/badge/Bitcoin-Signet-orange)](https://example.com)
[![Status](https://img.shields.io/badge/Status-Production-green)](https://example.com)
## 🚀 Démarrage Rapide
**LeCoffre Node - Architecture complète avec Bitcoin Signet et agents IA**
### 🎯 Démarrage Simple
```bash
# Démarrage complet des services
./scripts/start.sh
# Validation du déploiement
./scripts/validate-deployment.sh
# Maintenance et monitoring
./scripts/maintenance.sh
```
> Note scripts centralisés: le répertoire `./scripts/` de `lecoffre_node` est un lien symbolique vers `../../scripts/lecoffre_node`. Les chemins existants restent valides.
### 📁 Documentation
- **[`scripts/README.md`](scripts/README.md)** - Documentation complète des scripts
- **[`4NK_env/IA_agents/context.md`](IA_agents/context.md)** - Contexte et architecture du projet
- **[`4NK_env/IA_agents/flux.md`](IA_agents/flux.md)** - Flux d'architecture et services
- **[`4NK_env/IA_agents/deploy.md`](IA_agents/deploy.md)** - Procédure de déploiement complète
### 🛡️ Protection des Données
- **Sauvegarde automatique** : `./scripts/backup-data.sh`
- **Mise à jour sécurisée** : `./scripts/update-images.sh`
- **Restauration** : `./scripts/restore-data.sh <backup>`
## 🌐 Accès aux Services
| Service | URL | Description |
|---------|-----|-------------|
| **LeCoffre Frontend** | `<PUBLIC_BASE_URL>/lecoffre` | Interface principale |
| **IHM Client** | `<PUBLIC_BASE_URL>/` | Interface de gestion des clés |
| **API Backend** | `<PUBLIC_BASE_URL>/api/` | API REST |
| **WebSocket** | `wss://<PUBLIC_BASE_HOST>/ws/` | Relay WebSocket |
## 🏗️ Architecture
```
Internet → Reverse proxy (public) → Services locaux
├── Frontend: LeCoffre Application
├── IHM: Interface de gestion des clés Bitcoin
├── API: Backend REST
└── WebSocket: Relay pour transactions
```
## 🐳 Services Docker
| Service | Port | Statut | Description |
|---------|------|--------|-------------|
| `lecoffre-front` | 3004 | ✅ | Interface utilisateur |
| `ihm_client` | 3003 | ✅ | Gestion des clés |
| `sdk_relay` | 8090-8091 | ✅ | Relay WebSocket |
| `sdk_storage` | 8081 | ✅ | Stockage temporaire |
| `bitcoin-signet` | - | ✅ | Nœud Bitcoin |
| `blindbit-oracle` | 8000 | ✅ | Oracle Bitcoin |
| `tor-proxy` | 9050 | ✅ | Proxy anonyme |
## 🚀 Déploiement Automatique
Le système utilise **Watchtower** pour la mise à jour automatique des images Docker toutes les 30 secondes.
### Commandes Essentielles
```bash
# Démarrer tous les services
cd lecoffre_node
docker compose up -d
# Vérifier le statut
docker compose ps
# Voir les logs
docker compose logs --tail=50
# Synchroniser les configurations
./scripts/sync-configs.sh
# Démarrage séquentiel optimisé
./scripts/startup-sequence.sh
```
## 📊 Monitoring et Logs
### Stack de Monitoring
Le système utilise **Grafana + Loki + Promtail** pour le monitoring centralisé :
```bash
# Démarrer le monitoring
./scripts/deploy-grafana.sh start
# Accéder à Grafana
<PUBLIC_BASE_URL>/grafana/
```
**Identifiants** : `admin` / `<GRAFANA_ADMIN_PASSWORD>`
### Dashboards Disponibles
- **Vue d'ensemble LeCoffre** - Monitoring de tous les services
- **Bitcoin & Miner** - Monitoring spécialisé blockchain
- **Services Applications** - Monitoring des services applicatifs
### Collecte des Logs
```bash
# Collecter les logs de tous les services
./scripts/collect-logs.sh
# Logs centralisés dans logs/
```
📖 **[Documentation complète du monitoring](docs/MONITORING.md)**
## 🔧 Configuration
### Variables d'Environnement
Les variables d'environnement sont centralisées dans `.env` :
```bash
# URLs des services externes (à définir selon l'environnement)
VITE_BOOTSTRAPURL=wss://<PUBLIC_BASE_HOST>/ws/
SIGNER_WS_URL=ws://<SIGNER_HOST>:9090
SIGNER_BASE_URL=https://<SIGNER_HOST>
# Configuration monitoring
GRAFANA_ADMIN_PASSWORD=<GRAFANA_ADMIN_PASSWORD>
```
### Scripts Utiles
Tous les scripts sont dans `scripts/` :
- `startup-sequence.sh` - Démarrage séquentiel optimisé
- `sync-configs.sh` - Synchronisation des configurations
- `build-project.sh` - Construction des projets
- `fix_relay_funds.sh` - Correction des fonds relay
- `deploy-grafana.sh` - Déploiement du monitoring Grafana
- `setup-logs.sh` - Configuration de la centralisation des logs
- `collect-logs.sh` - Collecte des logs de tous les services
- `sync-monitoring-config.sh` - Synchronisation de la configuration monitoring
- `test-monitoring.sh` - Test de connectivité du monitoring
## 📊 Monitoring
### Healthchecks
Tous les services disposent de healthchecks automatiques :
```bash
# Vérifier Bitcoin Signet
docker exec bitcoin-signet bitcoin-cli -signet -rpccookiefile=/home/bitcoin/.bitcoin/signet/.cookie getblockchaininfo
# Vérifier l'oracle Blindbit
curl http://localhost:8000/tweaks/1
# Vérifier le relay
curl http://localhost:8091/
```
### Logs
```bash
# Logs en temps réel
docker compose logs -f
# Logs d'un service spécifique
docker compose logs -f sdk_relay
```
## 🔒 Sécurité
- ✅ **Aucun secret** dans le code source
- ✅ **Utilisateurs non-root** dans les conteneurs
- ✅ **Clés SSH** pour tous les dépôts
- ✅ **Variables d'environnement** externalisées
- ✅ **Réseau interne** pour la communication inter-services
## 🛠️ Développement
### Structure des Projets
```
lecoffre_node/
├── IA_agents/ # 📚 Documentation IA principale
├── scripts/ # 🔧 Scripts de déploiement
├── conf/ # ⚙️ Configurations
├── docs/ # 📖 Documentation technique
├── docker-compose.yml # 🐳 Services Docker
└── .env # 🔐 Variables d'environnement
```
### Projets Dépendants
| Projet | Branche | Description |
|--------|---------|-------------|
| `sdk_relay` | `ext` | Relay des transactions |
| `sdk_storage` | `ext` | Stockage temporaire |
| `ihm_client` | `ext` | Interface de gestion |
| `lecoffre-front` | `ext` | Frontend LeCoffre |
## 📚 Documentation Complète
### Documentation IA (Recommandée)
- [`4NK_env/IA_agents/context.md`](IA_agents/context.md) - Contexte et objectifs
- [`4NK_env/IA_agents/flux.md`](IA_agents/flux.md) - Architecture et flux
- [`4NK_env/IA_agents/deploy.md`](IA_agents/deploy.md) - Procédure de déploiement
### Documentation Technique
- [`docs/REX.md`](docs/REX.md) - Rapport d'expérience de déploiement
- [`docs/ARCHITECTURE.md`](docs/ARCHITECTURE.md) - Architecture détaillée
- [`docs/CONFIGURATION_SERVICES.md`](docs/CONFIGURATION_SERVICES.md) - Configuration des services
## 🆘 Support
### Problèmes Courants
1. **Service non accessible** : Vérifier `docker compose ps`
2. **Erreurs de connexion** : Vérifier les logs avec `docker compose logs`
3. **Configuration** : Exécuter `./scripts/sync-configs.sh`
### Logs d'Erreur
```bash
# Logs d'erreur récents
docker compose logs --tail=100 | grep -i error
# Logs d'un service spécifique
docker compose logs sdk_relay | grep -i error
```
## 🔄 Mise à Jour
Le système se met à jour automatiquement via Watchtower. Pour forcer une mise à jour :
```bash
# Mettre à jour toutes les images
docker compose pull
# Redémarrer les services
docker compose up -d
```
## 📄 Licence
Ce projet est sous licence MIT. Voir le fichier [LICENSE](LICENSE) pour plus de détails.
---
**💡 Conseil** : Commencez toujours par lire [`4NK_env/IA_agents/context.md`](IA_agents/context.md) pour comprendre le contexte du projet !
## 📋 Fichiers centralisés
Les fichiers suivants sont centralisés dans le dépôt principal `4NK_env` :
- `CODE_OF_CONDUCT.md` - Code de conduite
- `CODEOWNERS` - Propriétaires du code
- `CONTRIBUTING.md` - Guide de contribution
- `LICENSE` - Licence du projet
Voir : [`4NK_env/CODE_OF_CONDUCT.md`](../../CODE_OF_CONDUCT.md), [`4NK_env/CODEOWNERS`](../../CODEOWNERS), [`4NK_env/CONTRIBUTING.md`](../../CONTRIBUTING.md), [`4NK_env/LICENSE`](../../LICENSE)

View File

@ -1,27 +0,0 @@
# Image Debian ultra-légère avec possibilité d'ajouter des packages
FROM debian:bookworm-slim
# Installation des outils de base essentiels
RUN apt-get update && apt-get upgrade -y && \
apt-get install -y --fix-missing \
ca-certificates \
curl \
jq \
git \
&& rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
# Création d'un utilisateur non-root
RUN useradd -m -u 1000 appuser && \
mkdir -p /app && chown -R appuser:appuser /app
WORKDIR /app
USER appuser
# Script d'installation de packages additionnels (optionnel)
COPY --chown=appuser:appuser install-packages.sh /usr/local/bin/
RUN chmod +x /usr/local/bin/install-packages.sh
EXPOSE 8080
CMD ["/bin/bash"]

View File

@ -1,16 +0,0 @@
#!/bin/bash
# Script pour installer des packages additionnels au runtime si nécessaire
if [ $# -eq 0 ]; then
echo "Usage: install-packages.sh <package1> [package2] ..."
echo "Example: install-packages.sh vim nano htop"
exit 1
fi
echo "Installing packages: $@"
sudo apt-get update && \
sudo apt-get install -y --fix-missing "$@" && \
sudo rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
echo "Packages installed successfully!"

55
bitcoin/Dockerfile Normal file
View File

@ -0,0 +1,55 @@
# bitcoin/Dockerfile
FROM debian:bullseye-slim as builder
# Installation des dépendances
RUN apt-get update && apt-get install -y \
curl \
gnupg \
&& rm -rf /var/lib/apt/lists/*
# Version de Bitcoin Core
ENV VERSION=24.1
# Téléchargement et vérification de Bitcoin Core
WORKDIR /tmp
RUN curl -O https://bitcoincore.org/bin/bitcoin-core-${VERSION}/bitcoin-${VERSION}-x86_64-linux-gnu.tar.gz && \
curl -O https://bitcoincore.org/bin/bitcoin-core-${VERSION}/SHA256SUMS.asc && \
curl -O https://bitcoincore.org/bin/bitcoin-core-${VERSION}/SHA256SUMS
# Extraction de Bitcoin Core
RUN tar -xzf bitcoin-${VERSION}-x86_64-linux-gnu.tar.gz
# Image finale
FROM debian:bullseye-slim
# On redéfinit la version dans l'image finale
ENV VERSION=24.1
# Installation des dépendances nécessaires
RUN apt-get update && apt-get install -y \
libatomic1 \
&& rm -rf /var/lib/apt/lists/*
# Créer l'utilisateur et le groupe bitcoin
RUN groupadd -g 1000 bitcoin && \
useradd -m -d /home/bitcoin -g bitcoin bitcoin
# Copie des binaires depuis le builder
COPY --from=builder /tmp/bitcoin-${VERSION}/bin/bitcoind /usr/local/bin/
COPY --from=builder /tmp/bitcoin-${VERSION}/bin/bitcoin-cli /usr/local/bin/
# Configuration
RUN mkdir -p /home/bitcoin/.bitcoin/wallets /home/bitcoin/.bitcoin/signet && \
chown -R bitcoin:bitcoin /home/bitcoin/.bitcoin
COPY bitcoin.conf /home/bitcoin/.bitcoin/bitcoin.conf
RUN chown bitcoin:bitcoin /home/bitcoin/.bitcoin/bitcoin.conf
VOLUME ["/home/bitcoin/.bitcoin"]
# Exposition des ports (signet)
EXPOSE 38332 38333 29000 18443
USER bitcoin
WORKDIR /home/bitcoin
ENTRYPOINT ["bitcoind", "-conf=/home/bitcoin/.bitcoin/bitcoin.conf", "-signet", "-printtoconsole"]

40
bitcoin/bitcoin.conf Normal file
View File

@ -0,0 +1,40 @@
# Configuration globale
datadir=/home/bitcoin/.bitcoin
server=1
txindex=1
debug=1
loglevel=debug
logthreadnames=1
signet=1
onion=tor:9050
listenonion=1
# Paramètres RPC
rpcauth=bitcoin:c8ea921c7357bd6a5a8a7c43a12350a7$955e25b17672987b17c5a12f12cd8b9c1d38f0f86201c8cd47fc431f2e1c7956
rpcallowip=0.0.0.0/0
rpcworkqueue=32
rpcthreads=4
rpcdoccheck=1
# Paramètres ZMQ
zmqpubhashblock=tcp://0.0.0.0:29000
zmqpubrawtx=tcp://0.0.0.0:29000
[signet]
listen=1
bind=0.0.0.0:38333
rpcbind=0.0.0.0:18443
rpcport=18443
fallbackfee=0.0001
blockfilterindex=1
datacarriersize=205
acceptnonstdtxn=1
dustrelayfee=0.00000001
minrelaytxfee=0.00000001
prune=0
signetchallenge=0020341c43803863c252df326e73574a27d7e19322992061017b0dc893e2eab90821
walletdir=/home/bitcoin/.bitcoin/wallets
wallet=mining
wallet=watchonly
maxtxfee=1
addnode=tlv2yqamflv22vfdzy2hha2nwmt6zrwrhjjzz4lx7qyq7lyc6wfhabyd.onion

31
blindbit/Dockerfile Normal file
View File

@ -0,0 +1,31 @@
# blindbit-oracle/Dockerfile
FROM golang:1.22 as builder
WORKDIR /app
# Cloner le repo blindbit-oracle
RUN git clone --branch dev --depth 1 https://github.com/setavenger/blindbit-oracle.git .
# Compiler le binaire
RUN go build -o /go/bin/blindbit-oracle ./src
# Utiliser debian:bookworm-slim qui contient GLIBC 2.34
FROM debian:bookworm-slim
# Installation des dépendances nécessaires
RUN apt-get update && apt-get install -y ca-certificates curl && rm -rf /var/lib/apt/lists/*
# Copier le binaire depuis le builder
COPY --from=builder /go/bin/blindbit-oracle /usr/local/bin/blindbit-oracle
# Créer le répertoire de données
RUN mkdir -p /data
# Créer le volume pour les données
VOLUME ["/data"]
# Exposer le port par défaut
EXPOSE 8000
# Démarrer blindbit-oracle avec le répertoire de données spécifié
ENTRYPOINT ["blindbit-oracle", "-datadir", "/data"]

28
blindbit/blindbit.toml Normal file
View File

@ -0,0 +1,28 @@
# Configuration pour blindbit-oracle
host = "0.0.0.0:8000"
# Définit la chaîne sur laquelle le wallet fonctionne
chain = "signet"
# Point d'accès RPC Bitcoin
rpc_endpoint = "http://bitcoin:18443"
# Chemin vers le fichier cookie RPC Bitcoin
cookie_path = "/home/bitcoin/.bitcoin/signet/.cookie"
# Identifiants RPC Bitcoin (non utilisés avec cookie_path)
rpc_user = ""
rpc_pass = ""
# Hauteur de départ pour la synchronisation
sync_start_height = 1
# Paramètres de performance
max_parallel_tweak_computations = 4
max_parallel_requests = 4
# Configuration des index
tweaks_only = 0
tweaks_full_basic = 1
tweaks_full_with_dust_filter = 1
tweaks_cut_through_with_dust_filter = 1

View File

@ -1,99 +1,74 @@
version: "3.8"
services: services:
tor: tor:
image: btcpayserver/tor:0.4.8.10 image: dperson/torproxy
container_name: tor-proxy container_name: tor-proxy
volumes:
- /home/debian/4NK_env/projects/lecoffre/lecoffre_node/logs/tor:/var/log/tor
- /home/debian/4NK_env/scripts/lecoffre_node/healthchecks:/scripts/healthchecks:ro
networks: networks:
btcnet: btcnet:
aliases: aliases:
- tor - tor
healthcheck: ports:
test: ["CMD", "sh", "/scripts/healthchecks/tor-progress.sh"] - "9052:9050" # Port SOCKS (9052 sur l'hôte, 9050 dans le conteneur)
interval: 10s
timeout: 5s
retries: 50
restart: unless-stopped restart: unless-stopped
bitcoin: bitcoin:
build: ./bitcoin build: ./bitcoin
container_name: bitcoin-signet container_name: bitcoin-signet
depends_on: depends_on:
tor: - tor
condition: service_healthy
volumes: volumes:
- bitcoin_data:/home/bitcoin/.bitcoin - bitcoin_data:/home/bitcoin/.bitcoin
- /home/debian/4NK_env/projects/lecoffre/lecoffre_node/confs/bitcoin/bitcoin.conf:/etc/bitcoin/bitcoin.conf:ro - ./bitcoin/bitcoin.conf:/home/bitcoin/.bitcoin/bitcoin.conf
- /home/debian/4NK_env/projects/lecoffre/lecoffre_node/logs/bitcoin:/var/log/bitcoin ports:
- /home/debian/4NK_env/scripts/lecoffre_node/healthchecks:/scripts/healthchecks:ro - "38333:38333" # signet p2p
- "18443:18443" # signet rpc
- "29000:29000" # zmq
networks: networks:
btcnet: btcnet:
aliases: aliases:
- bitcoin - bitcoin
user: root
entrypoint: > entrypoint: >
/bin/sh -c " /bin/sh -c "
chown -R bitcoin:bitcoin /home/bitcoin/.bitcoin || echo 'warn: chown partiel (fichiers bind-mount Windows)'; mkdir -p /home/bitcoin/.bitcoin/wallets &&
exec su-exec bitcoin bitcoind -conf=/etc/bitcoin/bitcoin.conf -signet" bitcoind -conf=/home/bitcoin/.bitcoin/bitcoin.conf -signet -printtoconsole"
healthcheck: healthcheck:
test: ["CMD", "sh", "/scripts/healthchecks/bitcoin-progress.sh"] test: ["CMD", "bitcoin-cli", "-conf=/home/bitcoin/.bitcoin/bitcoin.conf", "getblockchaininfo"]
interval: 30s interval: 30s
timeout: 10s timeout: 10s
retries: 50 retries: 3
restart: unless-stopped
blindbit: blindbit:
image: git.4nkweb.com/4nk/blindbit-oracle:fixed-source build: ./blindbit
container_name: blindbit-oracle container_name: blindbit-oracle
depends_on: depends_on:
bitcoin: bitcoin:
condition: service_healthy condition: service_healthy
volumes: volumes:
- blindbit_data:/root/.blindbit-oracle - blindbit_data:/data
- /home/debian/4NK_env/projects/lecoffre/lecoffre_node/confs/blindbit-oracle/blindbit.toml:/tmp/blindbit.toml:ro - ./blindbit/blindbit.toml:/data/blindbit.toml
- bitcoin_data:/home/bitcoin/.bitcoin - bitcoin_data:/home/bitcoin/.bitcoin
- /home/debian/4NK_env/projects/lecoffre/lecoffre_node/logs/blindbit:/var/log/blindbit ports:
- /home/debian/4NK_env/scripts/lecoffre_node/healthchecks:/scripts/healthchecks:ro - "8000:8000"
entrypoint: >
sh -c "mkdir -p /root/.blindbit-oracle &&
if [ ! -f /root/.blindbit-oracle/blindbit.toml ]; then
cp /tmp/blindbit.toml /root/.blindbit-oracle/blindbit.toml;
fi &&
echo 'Starting BlindBit Oracle with corrected host binding...' &&
exec ./main -datadir /root/.blindbit-oracle"
networks: networks:
btcnet: btcnet:
aliases: aliases:
- blindbit - blindbit
ports:
- "0.0.0.0:8000:8000"
healthcheck:
test: ["CMD", "sh", "/scripts/healthchecks/blindbit-progress.sh"]
interval: 10s
timeout: 5s
retries: 60
start_period: 180s
restart: unless-stopped
sdk_relay: sdk_relay:
image: git.4nkweb.com/4nk/sdk_relay:ext build:
context: .
dockerfile: sdk_relay/Dockerfile
container_name: sdk_relay container_name: sdk_relay
env_file:
- /home/debian/4NK_env/projects/lecoffre/lecoffre_node/confs/sdk_relay/.env
depends_on: depends_on:
blindbit: - blindbit
condition: service_healthy
volumes: volumes:
- /home/debian/4NK_env/projects/lecoffre/lecoffre_node/confs/relay/sdk_relay.conf:/app/.conf:ro - bitcoin_data:/home/bitcoin/.bitcoin
- sdk_data:/app/.4nk - ./bitcoin/bitcoin.conf:/home/bitcoin/.bitcoin/bitcoin.conf
- bitcoin_data:/app/.bitcoin - sdk_relay_data:/home/bitcoin/.4nk
- /home/debian/4NK_env/scripts/lecoffre_node/funds:/scripts/funds:ro
- /home/debian/4NK_env/projects/lecoffre/lecoffre_node/logs/sdk_relay:/var/log/sdk_relay
- /home/debian/4NK_env/scripts/lecoffre_node/healthchecks:/scripts/healthchecks:ro
ports: ports:
- "0.0.0.0:8090:8090" - "8090:8090"
- "0.0.0.0:8091:8091" - "8091:8091"
networks: networks:
btcnet: btcnet:
aliases: aliases:
@ -104,104 +79,29 @@ services:
max-size: "10m" max-size: "10m"
max-file: "3" max-file: "3"
environment: environment:
- HOME=/app - RUST_LOG=debug,bitcoincore_rpc=trace
- RUST_LOG=INFO - HOME=/home/bitcoin
- BITCOIN_COOKIE_PATH=/home/bitcoin/.bitcoin/signet/.cookie
restart: on-failure:3
entrypoint: >
/bin/sh -c "
mkdir -p /home/bitcoin/.4nk &&
strace -f -e trace=file /usr/local/bin/sdk_relay --config .conf"
healthcheck: healthcheck:
test: ["CMD", "sh", "/scripts/healthchecks/sdk-relay-progress.sh"] test: ["CMD", "curl", "-f", "http://localhost:8091/health"]
interval: 30s interval: 30s
timeout: 10s timeout: 10s
retries: 50 retries: 3
restart: unless-stopped
lecoffre-front: lecoffre-back:
image: git.4nkweb.com/4nk/lecoffre-front:ext image: git.4nkweb.com/4nk/lecoffre-back-mini:latest
container_name: lecoffre-front container_name: lecoffre-back
working_dir: /leCoffre-front
env_file:
- /home/debian/4NK_env/projects/lecoffre/lecoffre_node/confs/lecoffre-front/.env
ports:
- "0.0.0.0:3004:8080"
volumes:
- /home/debian/4NK_env/projects/lecoffre/lecoffre_node/logs/lecoffre-front:/var/log/lecoffre-front
networks: networks:
btcnet: btcnet:
aliases: aliases:
- lecoffre-front - lecoffre-back
depends_on:
ihm_client:
condition: service_healthy
sdk_storage:
condition: service_healthy
user: lecoffreuser
command: ["sh", "-c", "exec npm run start >> /var/log/lecoffre-front/stdout.log 2>&1"]
healthcheck:
test: ["CMD", "sh", "-c", "if ps aux | grep -v grep | grep next-server >/dev/null 2>&1; then echo 'LeCoffre Frontend ready: Next.js server running'; exit 0; else echo 'LeCoffre Frontend starting: Next.js server not yet ready'; exit 1; fi"]
interval: 30s
timeout: 10s
retries: 50
start_period: 30s
labels: labels:
- "com.centurylinklabs.watchtower.enable=true" - "com.centurylinklabs.watchtower.enable=true"
restart: unless-stopped
ihm_client:
image: git.4nkweb.com/4nk/ihm_client:ext
container_name: ihm_client
env_file:
- /home/debian/4NK_env/projects/lecoffre/lecoffre_node/confs/ihm_client/.env
environment:
- VITE_JWT_SECRET_KEY
- VITE_API_BASE_URL
- VITE_WS_URL
- VITE_STORAGE_URL
- VITE_SIGNER_URL
- VITE_BOOTSTRAPURL
ports:
- "0.0.0.0:3003:3003"
volumes:
- /home/debian/4NK_env/projects/lecoffre/lecoffre_node/logs/ihm_client:/var/log/ihm_client
networks:
btcnet:
aliases:
- ihm_client
depends_on:
sdk_relay:
condition: service_healthy
sdk_storage:
condition: service_healthy
user: root
command: ["sh", "-c", "exec npm start >> /var/log/ihm_client/stdout.log 2>&1"]
healthcheck:
test: ["CMD", "sh", "-c", "if curl -f http://localhost:3003/ >/dev/null 2>&1; then echo 'IHM Client ready: Vite dev server responding'; exit 0; else echo 'IHM Client starting: Vite dev server not yet ready'; exit 1; fi"]
interval: 30s
timeout: 10s
retries: 50
start_period: 30s
labels:
- "com.centurylinklabs.watchtower.enable=true"
restart: unless-stopped
sdk_storage:
image: git.4nkweb.com/4nk/sdk_storage:ext
container_name: sdk_storage
ports:
- "0.0.0.0:8081:8080"
volumes:
- sdk_storage_data:/app/data
- /home/debian/4NK_env/projects/lecoffre/lecoffre_node/logs/sdk_storage:/var/log/sdk_storage
healthcheck:
test: ["CMD", "sh", "-c", "if curl -f http://localhost:8080/health >/dev/null 2>&1; then echo 'SDK Storage ready: API responding'; exit 0; else echo 'SDK Storage starting: API not yet ready'; exit 1; fi"]
interval: 30s
timeout: 10s
retries: 50
start_period: 30s
networks:
btcnet:
aliases:
- sdk_storage
labels:
- "com.centurylinklabs.watchtower.enable=true"
restart: unless-stopped
watchtower: watchtower:
image: containrrr/watchtower image: containrrr/watchtower
@ -211,147 +111,12 @@ services:
command: --interval 30 --label-enable command: --interval 30 --label-enable
networks: networks:
- btcnet - btcnet
restart: unless-stopped
signet_miner:
build:
context: ../../../4NK_modules/4NK_miner
container_name: signet_miner
depends_on:
bitcoin:
condition: service_healthy
env_file:
- /home/debian/4NK_env/projects/lecoffre/lecoffre_node/confs/lecoffre_node/.env
volumes:
- bitcoin_data:/bitcoin:ro
- /home/debian/4NK_env/projects/lecoffre/lecoffre_node/logs/miner:/var/log/miner
networks:
btcnet:
aliases:
- signet_miner
profiles: ["miner"]
restart: unless-stopped
grafana:
image: grafana/grafana:latest
container_name: grafana
ports:
- "0.0.0.0:3005:3000"
volumes:
- grafana_data:/var/lib/grafana
- /home/debian/4NK_env/projects/lecoffre/lecoffre_node/confs/grafana/provisioning:/etc/grafana/provisioning
- /home/debian/4NK_env/projects/lecoffre/lecoffre_node/confs/grafana/dashboards:/var/lib/grafana/dashboards
- /home/debian/4NK_env/projects/lecoffre/lecoffre_node/confs/grafana/grafana.ini:/etc/grafana/grafana.ini:ro
- /home/debian/4NK_env/projects/lecoffre/lecoffre_node/logs:/var/log/lecoffre:ro
environment:
- GF_SECURITY_ADMIN_PASSWORD=Fuy8ZfxQI2xdSdoB8wsGxNjyU
- GF_USERS_ALLOW_SIGN_UP=false
- GF_SERVER_ROOT_URL=https://dev4.4nkweb.com/grafana/
- GF_PLUGINS_PREINSTALL_SYNC=grafana-clock-panel,grafana-simple-json-datasource
networks:
btcnet:
aliases:
- grafana
depends_on:
loki:
condition: service_healthy
promtail:
condition: service_healthy
healthcheck:
test: ["CMD", "sh", "-c", "if curl -f http://localhost:3000/api/health >/dev/null 2>&1; then echo 'Grafana ready: Dashboard service responding'; exit 0; else echo 'Grafana starting: Dashboard service not yet ready'; exit 1; fi"]
interval: 30s
timeout: 10s
retries: 50
start_period: 60s
labels:
- "com.centurylinklabs.watchtower.enable=true"
restart: unless-stopped
loki:
image: grafana/loki:latest
container_name: loki
ports:
- "0.0.0.0:3100:3100"
volumes:
- loki_data:/loki
- /home/debian/4NK_env/projects/lecoffre/lecoffre_node/confs/loki/loki-config.yaml:/etc/loki/loki-config.yaml:ro
command: -config.file=/etc/loki/loki-config.yaml
networks:
btcnet:
aliases:
- loki
healthcheck:
test: ["CMD", "wget", "-q", "--spider", "http://localhost:3100/ready"]
interval: 30s
timeout: 15s
retries: 50
start_period: 120s
restart: unless-stopped
promtail:
image: grafana/promtail:latest
container_name: promtail
volumes:
- /home/debian/4NK_env/projects/lecoffre/lecoffre_node/logs:/home/debian/4NK_env/projects/lecoffre/lecoffre_node/logs:ro
- /home/debian/4NK_env/projects/lecoffre/lecoffre_node/confs/promtail/promtail.yml:/etc/promtail/config.yml:ro
- /var/run/docker.sock:/var/run/docker.sock
command: -config.file=/etc/promtail/config.yml
networks:
btcnet:
aliases:
- promtail
depends_on:
loki:
condition: service_healthy
healthcheck:
test: ["CMD", "sh", "-c", "if [ -f /tmp/positions.yaml ]; then echo 'Promtail ready: Log collection service responding'; exit 0; else echo 'Promtail starting: Log collection service not yet ready'; exit 1; fi"]
interval: 30s
timeout: 10s
retries: 50
start_period: 30s
restart: unless-stopped
# Service de statut des services
status-api:
build:
context: ../../../4NK_modules/4NK_web_status
dockerfile: Dockerfile.python
container_name: status-api
env_file:
- /home/debian/4NK_env/lecoffre_node/confs/monitoring/.env
ports:
- "0.0.0.0:3006:3006"
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
- /home/debian/4NK_env/projects/lecoffre/lecoffre_node/logs:/var/log/lecoffre:ro
- /home/debian/4NK_env/scripts/lecoffre_node/healthchecks:/scripts/healthchecks:ro
networks:
btcnet:
aliases:
- status-api
healthcheck:
test: ["CMD", "sh", "-c", "if curl -f http://localhost:3006/api >/dev/null 2>&1; then echo 'Status API ready: Service monitoring API responding'; exit 0; else echo 'Status API starting: Service monitoring API not yet ready'; exit 1; fi"]
interval: 30s
timeout: 10s
retries: 50
start_period: 30s
labels:
- "com.centurylinklabs.watchtower.enable=true"
restart: unless-stopped
volumes: volumes:
bitcoin_data: bitcoin_data:
name: 4nk_node_bitcoin_data name: 4nk_node_bitcoin_data
blindbit_data: blindbit_data:
name: 4nk_node_blindbit_data sdk_relay_data:
sdk_data:
name: 4nk_node_sdk_data
sdk_storage_data:
name: 4nk_node_sdk_storage_data
grafana_data:
name: 4nk_node_grafana_data
loki_data:
name: 4nk_node_loki_data
networks: networks:
btcnet: btcnet:

View File

@ -1,62 +0,0 @@
-----BEGIN PGP PUBLIC KEY BLOCK-----
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
YT90qFF93M3v01BbxP+EIY2/9tiIPbrd
=0YYh
-----END PGP PUBLIC KEY BLOCK-----

View File

@ -1,9 +0,0 @@
FROM grafana/promtail:latest
# Installer curl et wget
USER root
RUN apt-get update && apt-get install -y \
curl \
wget \
&& rm -rf /var/lib/apt/lists/* \
&& apt-get clean

View File

@ -1,127 +0,0 @@
;--------------------------------
; Fichier : installer.nsi
;--------------------------------
!define MUI_ICON "kogusico.ico"
!define MUI_UNICON "kogusico.ico"
!define MUI_UNINST_ICON "kogusico.ico"
!define MUI_UNINSTALLER
!include "MUI2.nsh"
!include "LogicLib.nsh"
;--------------------------------
; Métadonnées produit
;--------------------------------
!define PRODUCT_NAME "Kogus"
!define PRODUCT_VERSION "1.0.0"
!define INSTALL_DIR "$PROGRAMFILES\${PRODUCT_NAME}"
Name "${PRODUCT_NAME} ${PRODUCT_VERSION}"
!define MUI_PRODUCT "${PRODUCT_NAME}"
; Pages de linstallateur
!insertmacro MUI_PAGE_WELCOME
!insertmacro MUI_PAGE_LICENSE "license.txt"
!insertmacro MUI_PAGE_DIRECTORY
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_PAGE_FINISH
; Pages de luninstaller
!insertmacro MUI_UNPAGE_CONFIRM
!insertmacro MUI_UNPAGE_INSTFILES
!insertmacro MUI_UNPAGE_FINISH
!insertmacro MUI_LANGUAGE "French"
OutFile "Kogus-${PRODUCT_VERSION}.exe"
InstallDir "${INSTALL_DIR}"
RequestExecutionLevel admin
ShowInstDetails show
Var ExecCode
;--------------------------------
; Section : Installation
;--------------------------------
Section "Install"
; 1. Créer le dossier dinstallation et copier licône
SetOutPath "$INSTDIR"
File "kogusico.ico"
; 2. Copier docker-compose, config et script
File ".env"
File "docker-compose.yml"
File "run.ps1"
; 3. Copier relay
CreateDirectory "$INSTDIR\relay"
SetOutPath "$INSTDIR\relay"
File /r "relay\*.*"
; 4. Copier bitcoin
CreateDirectory "$INSTDIR\bitcoin"
SetOutPath "$INSTDIR\bitcoin"
File /r "bitcoin\*.*"
; 5. Copier blindbit
CreateDirectory "$INSTDIR\blindbit"
SetOutPath "$INSTDIR\blindbit"
File /r "blindbit\*.*"
; 6. Créer dossier de logs
CreateDirectory "$INSTDIR\logs"
; 7. Raccourci Menu Démarrer pour lancer run.ps1
CreateDirectory "$SMPROGRAMS\${PRODUCT_NAME}"
CreateShortCut "$SMPROGRAMS\${PRODUCT_NAME}\Lancer Kogus.lnk" \
"$INSTDIR\run.ps1" "" \
"$INSTDIR\kogusico.ico" 0
; 8. Lancement initial (installe/configure Docker si besoin) + capture code retour
ExecWait '"$SYSDIR\WindowsPowerShell\v1.0\powershell.exe" -WindowStyle Hidden -NoProfile -ExecutionPolicy Bypass -File "$INSTDIR\run.ps1"' $ExecCode
; 8bis. Si le script signale 3010 => reboot requis (WSL2/VM Platform, etc.)
${If} $ExecCode = 3010
MessageBox MB_ICONQUESTION|MB_YESNO "Un redémarrage est requis pour terminer l'installation de Kogus. Redémarrer maintenant ?" IDYES +2 IDNO +4
SetRebootFlag true
Reboot
${EndIf}
; 9. Auto-démarrage Docker Desktop au login utilisateur
WriteRegStr HKCU "Software\Microsoft\Windows\CurrentVersion\Run" \
"DockerDesktop" \
'"$PROGRAMFILES\Docker\Docker\Docker Desktop.exe" --autostart'
; 10. Raccourci dans le dossier Démarrage pour relancer la stack Kogus
CreateDirectory "$SMSTARTUP"
CreateShortCut "$SMSTARTUP\Relancer Kogus Stack.lnk" \
"$SYSDIR\WindowsPowerShell\v1.0\powershell.exe" \
'-NoProfile -ExecutionPolicy Bypass -File "$INSTDIR\run.ps1"' \
"$INSTDIR\kogusico.ico" 0
; 11. Générer luninstaller
WriteUninstaller "$INSTDIR\Uninstall.exe"
SectionEnd
;--------------------------------
; Section : Désinstallation
;--------------------------------
Section "Uninstall"
; Arrêter la stack Docker
nsExec::ExecToLog '"$SYSDIR\WindowsPowerShell\v1.0\powershell.exe" -NoProfile -Command "docker compose -f `"$INSTDIR\docker-compose.yml`" down"'
; Supprimer tous les fichiers et dossiers
RMDir /r "$INSTDIR"
; Supprimer le raccourci Menu Démarrer
Delete "$SMPROGRAMS\${PRODUCT_NAME}\Lancer Kogus.lnk"
RMDir "$SMPROGRAMS\${PRODUCT_NAME}"
; Supprimer le raccourci de démarrage et lentrée registre
Delete "$SMSTARTUP\Relancer Kogus Stack.lnk"
DeleteRegValue HKCU "Software\Microsoft\Windows\CurrentVersion\Run" "DockerDesktop"
SectionEnd

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.5 KiB

View File

@ -1 +0,0 @@
License Kogus

View File

@ -1,113 +0,0 @@
#!/bin/bash
# Logger Function
log() {
local message="$1"
local type="$2"
local timestamp=$(date '+%Y-%m-%d %H:%M:%S')
local color
local endcolor="\033[0m"
case "$type" in
"info") color="\033[38;5;79m" ;;
"success") color="\033[1;32m" ;;
"error") color="\033[1;31m" ;;
*) color="\033[1;34m" ;;
esac
echo -e "${color}${timestamp} - ${message}${endcolor}"
}
# Error handler function
handle_error() {
local exit_code=$1
local error_message="$2"
log "Error: $error_message (Exit Code: $exit_code)" "error"
exit $exit_code
}
# Function to check for command availability
command_exists() {
command -v "$1" &> /dev/null
}
check_os() {
if ! [ -f "/etc/debian_version" ]; then
echo "Error: This script is only supported on Debian-based systems."
exit 1
fi
}
# Function to Install the script pre-requisites
install_pre_reqs() {
log "Installing pre-requisites" "info"
# Run 'apt-get update'
if ! apt-get update -y; then
handle_error "$?" "Failed to run 'apt-get update'"
fi
# Run 'apt-get install'
if ! apt-get install -y apt-transport-https ca-certificates curl gnupg; then
handle_error "$?" "Failed to install packages"
fi
if ! mkdir -p /usr/share/keyrings; then
handle_error "$?" "Makes sure the path /usr/share/keyrings exist or run ' mkdir -p /usr/share/keyrings' with sudo"
fi
rm -f /usr/share/keyrings/nodesource.gpg || true
rm -f /etc/apt/sources.list.d/nodesource.list || true
# Run 'curl' and 'gpg' to download and import the NodeSource signing key
if ! curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | gpg --dearmor -o /usr/share/keyrings/nodesource.gpg; then
handle_error "$?" "Failed to download and import the NodeSource signing key"
fi
# Explicitly set the permissions to ensure the file is readable by all
if ! chmod 644 /usr/share/keyrings/nodesource.gpg; then
handle_error "$?" "Failed to set correct permissions on /usr/share/keyrings/nodesource.gpg"
fi
}
# Function to configure the Repo
configure_repo() {
local node_version=$1
arch=$(dpkg --print-architecture)
if [ "$arch" != "amd64" ] && [ "$arch" != "arm64" ] && [ "$arch" != "armhf" ]; then
handle_error "1" "Unsupported architecture: $arch. Only amd64, arm64, and armhf are supported."
fi
echo "deb [arch=$arch signed-by=/usr/share/keyrings/nodesource.gpg] https://deb.nodesource.com/node_$node_version nodistro main" | tee /etc/apt/sources.list.d/nodesource.list > /dev/null
# N|solid Config
echo "Package: nsolid" | tee /etc/apt/preferences.d/nsolid > /dev/null
echo "Pin: origin deb.nodesource.com" | tee -a /etc/apt/preferences.d/nsolid > /dev/null
echo "Pin-Priority: 600" | tee -a /etc/apt/preferences.d/nsolid > /dev/null
# Nodejs Config
echo "Package: nodejs" | tee /etc/apt/preferences.d/nodejs > /dev/null
echo "Pin: origin deb.nodesource.com" | tee -a /etc/apt/preferences.d/nodejs > /dev/null
echo "Pin-Priority: 600" | tee -a /etc/apt/preferences.d/nodejs > /dev/null
# Run 'apt-get update'
if ! apt-get update -y; then
handle_error "$?" "Failed to run 'apt-get update'"
else
log "Repository configured successfully."
log "To install Node.js, run: apt-get install nodejs -y" "info"
log "You can use N|solid Runtime as a node.js alternative" "info"
log "To install N|solid Runtime, run: apt-get install nsolid -y \n" "success"
fi
}
# Define Node.js version
NODE_VERSION="22.x"
# Check OS
check_os
# Main execution
install_pre_reqs || handle_error $? "Failed installing pre-requisites"
configure_repo "$NODE_VERSION" || handle_error $? "Failed configuring repository"

View File

@ -1 +0,0 @@
./

View File

@ -1 +0,0 @@
./

View File

@ -1,136 +0,0 @@
#!/usr/bin/env sh
set -euo pipefail
# Determine project root and compose dir
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
ROOT_DIR="$(cd "$SCRIPT_DIR/../../../.." && pwd)"
COMPOSE_DIR="$ROOT_DIR/lecoffre_node"
# Healthcheck helpers now colocated here
HC_TOR="$SCRIPT_DIR/tor-progress.sh"
HC_BITCOIN="$SCRIPT_DIR/bitcoin-progress.sh"
HC_BLINDBIT="$SCRIPT_DIR/blindbit-progress.sh"
HC_RELAY="$SCRIPT_DIR/sdk-relay-progress.sh"
cd "$COMPOSE_DIR"
progress_line() {
svc="$1"; kind="$2"
case "$kind" in
tor) sh "$HC_TOR" 2>/dev/null | tail -1 || true ;;
bitcoin) sh "$HC_BITCOIN" 2>/dev/null | tail -1 || true ;;
blindbit) sh "$HC_BLINDBIT" 2>/dev/null | tail -1 || true ;;
relay) sh "$HC_RELAY" 2>/dev/null | tail -1 || true ;;
*) echo "[$svc] waiting ..." ;;
esac
}
wait_healthy() {
svc="$1"; tries=${2:-60}; sleep_s=${3:-5}; kind=${4:-generic}
i=0
while [ $i -lt $tries ]; do
state=$(docker inspect --format='{{json .State.Health.Status}}' "$svc" 2>/dev/null || echo "\"unknown\"")
[ "$state" = '"healthy"' ] && { echo "[$svc] healthy"; return 0; }
progress_line "$svc" "$kind"
sleep "$sleep_s"; i=$((i+1))
done
echo "[$svc] not healthy after wait"; return 1
}
check_ports_urls() {
svc="$1"
case "$svc" in
tor-proxy)
# Ports: 9050-9051 local; no HTTP
nc -z 127.0.0.1 9050 && echo "[tor] port 9050 OK" || echo "[tor] 9050 FAIL" || true
nc -z 127.0.0.1 9051 && echo "[tor] port 9051 OK" || echo "[tor] 9051 FAIL" || true
;;
bitcoin-signet)
# Internal RPC port (38332 signet), no external URL
nc -z 127.0.0.1 38332 && echo "[bitcoin] RPC 38332 OK" || echo "[bitcoin] 38332 FAIL" || true
;;
blindbit-oracle)
# Internal: http://localhost:8000/tweaks/1
curl -fsS http://127.0.0.1:8000/tweaks/1 >/dev/null && echo "[blindbit] API OK" || echo "[blindbit] API FAIL" || true
;;
sdk_storage)
curl -fsS http://127.0.0.1:8081/health >/dev/null && echo "[storage] health OK" || echo "[storage] health FAIL" || true
;;
sdk_relay)
# WS bind + HTTP health
curl -fsS http://127.0.0.1:8091/ >/dev/null && echo "[relay] health port 8091 OK" || echo "[relay] 8091 FAIL" || true
nc -z 0.0.0.0 8090 && echo "[relay] ws 8090 OK" || echo "[relay] ws 8090 FAIL" || true
# Third-party bootstrap
curl -fsS https://dev3.4nkweb.com/api/v1/health >/dev/null && echo "[relay] dev3 api OK" || echo "[relay] dev3 api FAIL" || true
;;
ihm_client)
curl -fsS http://127.0.0.1:3003/ >/dev/null && echo "[ihm] local OK" || echo "[ihm] local FAIL" || true
;;
lecoffre-front)
curl -fsS http://127.0.0.1:3004/ >/dev/null && echo "[front] local OK" || echo "[front] local FAIL" || true
# External front
curl -fsS https://dev4.4nkweb.com/lecoffre/ >/dev/null && echo "[front] external OK" || echo "[front] external FAIL" || true
;;
loki)
curl -fsS http://127.0.0.1:3100/ready >/dev/null && echo "[loki] ready OK" || echo "[loki] ready FAIL" || true
;;
promtail)
echo "[promtail] positions/inputs checked by health" ;;
grafana)
curl -fsS http://127.0.0.1:3005/api/health >/dev/null && echo "[grafana] local api OK" || echo "[grafana] local api FAIL" || true
curl -fsS https://dev4.4nkweb.com/grafana/ >/dev/null && echo "[grafana] external OK" || echo "[grafana] external FAIL" || true
;;
status-api)
curl -fsS http://127.0.0.1:3006/api >/dev/null && echo "[status] api OK" || echo "[status] api FAIL" || true
;;
esac
}
# Phase 1: base
docker compose up -d tor || true
wait_healthy tor-proxy 80 3 tor || true
check_ports_urls tor-proxy || true
# Phase 2: blockchain
docker compose up -d bitcoin || true
wait_healthy bitcoin-signet 120 5 bitcoin || true
check_ports_urls bitcoin-signet || true
docker compose up -d blindbit || true
wait_healthy blindbit-oracle 120 5 blindbit || true
check_ports_urls blindbit-oracle || true
# Phase 3: apps (storage -> relay -> ihm/front)
docker compose up -d sdk_storage || true
wait_healthy sdk_storage 60 5 || true
check_ports_urls sdk_storage || true
docker compose up -d sdk_relay || true
wait_healthy sdk_relay 120 5 relay || true
check_ports_urls sdk_relay || true
docker compose up -d ihm_client lecoffre-front || true
wait_healthy ihm_client 60 5 || true
check_ports_urls ihm_client || true
wait_healthy lecoffre-front 60 5 || true
check_ports_urls lecoffre-front || true
# Phase 4: monitoring (loki -> promtail -> grafana)
docker compose up -d loki || true
wait_healthy loki 120 5 || true
check_ports_urls loki || true
docker compose up -d promtail || true
wait_healthy promtail 60 5 || true
check_ports_urls promtail || true
docker compose up -d grafana || true
wait_healthy grafana 120 5 || true
check_ports_urls grafana || true
# Phase 5: utils
docker compose up -d status-api watchtower || true
wait_healthy status-api 60 5 || true
check_ports_urls status-api || true
echo "[OK] Déploiement séquentiel terminé"

View File

@ -1,24 +0,0 @@
#!/bin/bash
# Script de test de progression pour Bitcoin Signet
info=$(bitcoin-cli -signet -conf=/etc/bitcoin/bitcoin.conf getblockchaininfo 2>/dev/null || echo '{}')
blocks=$(echo "$info" | jq -r '.blocks // 0')
headers=$(echo "$info" | jq -r '.headers // 0')
ibd=$(echo "$info" | jq -r '.initialblockdownload // false')
verification_progress=$(echo "$info" | jq -r '.verificationprogress // 0')
# Bitcoin est considéré comme ready s'il répond aux commandes et a au moins quelques blocs
if [ "$blocks" -gt 0 ]; then
if [ "$ibd" = "false" ] || [ "$blocks" -eq "$headers" ]; then
echo "Bitcoin ready: Synced ($blocks blocks)"
else
remaining=$((headers - blocks))
progress=$((blocks * 100 / headers))
verification_percent=$(echo "$verification_progress * 100" | bc -l | cut -d. -f1)
echo "Bitcoin IBD: $blocks/$headers ($remaining remaining) - $progress% - Verification: $verification_percent%"
fi
exit 0
else
echo "Bitcoin starting: No blocks yet"
exit 1
fi

View File

@ -1,19 +0,0 @@
#!/bin/bash
# Script de test de progression pour BlindBit
# Vérifier si le processus BlindBit est en cours d'exécution
if pgrep main > /dev/null 2>/dev/null; then
# Vérifier l'API - essais multiples et deux hôtes (127.0.0.1 et 0.0.0.0)
for i in 1 2 3; do
if wget -q --spider http://127.0.0.1:8000/tweaks/1 2>/dev/null || wget -q --spider http://0.0.0.0:8000/tweaks/1 2>/dev/null; then
echo 'BlindBit ready: Oracle service responding'
exit 0
fi
sleep 2
done
echo 'BlindBit starting: Oracle service initializing'
exit 1
else
echo 'BlindBit starting: Process not ready'
exit 1
fi

View File

@ -1,24 +0,0 @@
#!/bin/bash
# Script de test de progression pour SDK Relay
# Vérifier si le processus SDK Relay est en cours d'exécution
if pgrep sdk_relay > /dev/null 2>/dev/null; then
# Vérifier l'API WebSocket
if curl -f http://localhost:8091/ >/dev/null 2>&1; then
echo 'SDK Relay ready: WebSocket server responding'
exit 0
else
# Récupérer les logs récents pour voir la progression
relay_logs=$(tail -20 /var/log/sdk_relay/sdk_relay.log 2>/dev/null | grep -E "(IBD|blocks|headers|waiting|scanning|connecting)" | tail -1 || echo "")
if [ -n "$relay_logs" ]; then
echo "SDK Relay sync: $relay_logs"
exit 1
else
echo 'SDK Relay starting: WebSocket server initializing'
exit 1
fi
fi
else
echo 'SDK Relay starting: Process not ready'
exit 1
fi

View File

@ -1,4 +0,0 @@
#!/bin/sh
# Healthcheck for SDK Signer
# Prefer checking the HTTP endpoint first; fall back to log-based progress hints

View File

@ -1,7 +0,0 @@
#!/bin/bash
# Script de test de progression pour Tor
# Test simple : considérer Tor comme prêt après un délai
# Tor a terminé son bootstrap selon les logs Docker
echo 'Tor ready: Bootstrap complete (100%)'
exit 0

View File

@ -1,154 +0,0 @@
#!/usr/bin/env bash
set -euo pipefail
# Script pour remplacer les configurations nginx par des liens symboliques
# vers les fichiers centralisés dans /home/debian/4NK_env/confs/nginx
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
ROOT_DIR="$(cd "$SCRIPT_DIR/../../../.." && pwd)"
NGINX_CONF_DIR="/home/debian/4NK_env/confs/nginx"
NGINX_ACTIVE_DIR="/etc/nginx/sites-available"
NGINX_ENABLED_DIR="/etc/nginx/sites-enabled"
echo "=========================================="
echo " Configuration Nginx - Liens Symboliques"
echo "=========================================="
# Vérifier que le répertoire de configuration centralisé existe
if [ ! -d "$NGINX_CONF_DIR" ]; then
echo "❌ Erreur: Le répertoire $NGINX_CONF_DIR n'existe pas"
exit 1
fi
echo "📁 Répertoire de configuration centralisé: $NGINX_CONF_DIR"
echo "📁 Répertoire nginx sites-available: $NGINX_ACTIVE_DIR"
echo "📁 Répertoire nginx sites-enabled: $NGINX_ENABLED_DIR"
# Fonction pour créer un lien symbolique
create_symlink() {
local source="$1"
local target="$2"
local description="$3"
echo "🔗 Création du lien: $description"
echo " Source: $source"
echo " Cible: $target"
# Supprimer le fichier/cible existant s'il existe
if [ -e "$target" ] || [ -L "$target" ]; then
echo " Suppression de l'ancien fichier/lien: $target"
sudo rm -f "$target"
fi
# Créer le lien symbolique
sudo ln -sf "$source" "$target"
if [ -L "$target" ]; then
echo " ✅ Lien créé avec succès"
else
echo " ❌ Erreur lors de la création du lien"
return 1
fi
}
echo ""
echo "🔧 Création des liens symboliques..."
# Lister les fichiers de configuration dans le répertoire centralisé
config_files=$(find "$NGINX_CONF_DIR" -name "*.conf" -type f)
if [ -z "$config_files" ]; then
echo "❌ Aucun fichier .conf trouvé dans $NGINX_CONF_DIR"
exit 1
fi
echo "📋 Fichiers de configuration trouvés:"
echo "$config_files" | while read -r file; do
echo " - $(basename "$file")"
done
echo ""
echo "🔗 Création des liens dans sites-available..."
# Créer les liens dans sites-available
echo "$config_files" | while read -r source_file; do
filename=$(basename "$source_file")
target_file="$NGINX_ACTIVE_DIR/$filename"
create_symlink "$source_file" "$target_file" "$filename"
done
echo ""
echo "📋 Configuration actuelle de nginx..."
# Lister les configurations actives (sites-available)
echo "📁 Fichiers dans sites-available:"
if [ -d "$NGINX_ACTIVE_DIR" ]; then
ls -la "$NGINX_ACTIVE_DIR" | grep -E "\.(conf|link)$" || echo " Aucun fichier .conf trouvé"
else
echo " ❌ Répertoire $NGINX_ACTIVE_DIR n'existe pas"
fi
# Lister les configurations activées (sites-enabled)
echo ""
echo "📁 Fichiers dans sites-enabled:"
if [ -d "$NGINX_ENABLED_DIR" ]; then
ls -la "$NGINX_ENABLED_DIR" | grep -E "\.(conf|link)$" || echo " Aucun fichier .conf activé"
else
echo " ❌ Répertoire $NGINX_ENABLED_DIR n'existe pas"
fi
echo ""
echo "🧪 Test de la configuration nginx..."
# Tester la configuration nginx
if sudo nginx -t; then
echo "✅ Configuration nginx valide"
echo ""
echo "🔄 Redémarrage de nginx..."
# Redémarrer nginx
if sudo systemctl reload nginx; then
echo "✅ Nginx rechargé avec succès"
else
echo "❌ Erreur lors du rechargement de nginx"
echo "🔄 Tentative de redémarrage complet..."
if sudo systemctl restart nginx; then
echo "✅ Nginx redémarré avec succès"
else
echo "❌ Erreur lors du redémarrage de nginx"
exit 1
fi
fi
echo ""
echo "📊 Statut de nginx:"
sudo systemctl status nginx --no-pager -l
else
echo "❌ Configuration nginx invalide"
echo "🔍 Détails de l'erreur:"
sudo nginx -t 2>&1 || true
exit 1
fi
echo ""
echo "=========================================="
echo "✅ Configuration nginx terminée avec succès"
echo "=========================================="
# Afficher un résumé des liens créés
echo ""
echo "📋 Résumé des liens créés:"
echo "$config_files" | while read -r source_file; do
filename=$(basename "$source_file")
target_file="$NGINX_ACTIVE_DIR/$filename"
if [ -L "$target_file" ]; then
echo "$filename -> $(readlink "$target_file")"
else
echo "$filename -> Lien non créé"
fi
done

View File

@ -1,51 +0,0 @@
set -euo pipefail
BR="ext"
REMOTE="origin"
DATE_TAG="$(date -u +'%Y%m%d-%H%M%S')"
BACKUP_TAG="backup/${BR}-pre-truncate-${DATE_TAG}"
# 1) Pré-vol
git fetch --prune "${REMOTE}"
test -z "$(git status --porcelain)" # fail si index sale
git rev-parse --verify "${BR}" >/dev/null
git ls-remote --exit-code "${REMOTE}" "refs/heads/${BR}" >/dev/null
# 2) Mémos de contrôle
echo "[INFO] Avant: 5 derniers SHAs sur ${BR}"
git rev-list --max-count=5 "${BR}" | tee /tmp/pre_last5.txt
# 3) Tag de sauvegarde (rollback)
git tag -a "${BACKUP_TAG}" -m "Backup avant tronquage ${BR}"
git push "${REMOTE}" "refs/tags/${BACKUP_TAG}"
# 4) Construction dun nouvel historique with orphan + cherry-pick
git checkout "${BR}"
git checkout --orphan "${BR}-truncate-work"
# Démarrer sur un commit vide pour faciliter les cherry-pick
git commit --allow-empty -m "Base vide pour reconstruction des 5 derniers commits"
# 5) Rejouer exactement les 5 derniers commits dans lordre chronologique
COMMITS=$(git rev-list --reverse "${BR}@{1}~5..${BR}@{1}")
# Remarque: ${BR}@{1} fige la référence de ${BR} avant checkout orphan
for C in ${COMMITS}; do
git cherry-pick --allow-empty --keep-redundant-commits "${C}"
done
# 6) Remplacer la branche
git branch -D "${BR}" || true
git branch -m "${BR}-truncate-work" "${BR}"
# 7) Vérifications locales
echo "[INFO] Après: 5 derniers SHAs sur ${BR}"
git rev-list --max-count=5 "${BR}" | tee /tmp/post_last5.txt
diff -u /tmp/pre_last5.txt /tmp/post_last5.txt >/dev/null || {
echo "[ERROR] Les 5 SHAs ne correspondent pas"
exit 2
}
git fsck
# 8) Publication (push sécurisé)
git push --force-with-lease "${REMOTE}" "refs/heads/${BR}"
echo "[OK] Tronquage terminé. Tag de secours: ${BACKUP_TAG}"

View File

@ -1,46 +0,0 @@
#!/usr/bin/env sh
set -euo pipefail
# Synchronise .gitignore, .cursorignore, .dockerignore du root 4NK_env
# vers tous les 4NK_modules/ (sauf 4NK_vault) et les sous-projets sous projects/
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
ROOT_DIR="$(cd "$SCRIPT_DIR/../../../.." && pwd)"
SRC_GITIGNORE="$ROOT_DIR/.gitignore"
SRC_CURSORIGNORE="$ROOT_DIR/.cursorignore"
SRC_DOCKERIGNORE="$ROOT_DIR/.dockerignore"
copy_files() {
TARGET_DIR="$1"
[ -d "$TARGET_DIR" ] || return 0
echo "[sync] $TARGET_DIR"
[ -f "$SRC_GITIGNORE" ] && cp -f "$SRC_GITIGNORE" "$TARGET_DIR/.gitignore" || true
[ -f "$SRC_CURSORIGNORE" ] && cp -f "$SRC_CURSORIGNORE" "$TARGET_DIR/.cursorignore" || true
[ -f "$SRC_DOCKERIGNORE" ] && cp -f "$SRC_DOCKERIGNORE" "$TARGET_DIR/.dockerignore" || true
}
echo "[info] Root: $ROOT_DIR"
echo "[info] Sources: $SRC_GITIGNORE, $SRC_CURSORIGNORE, $SRC_DOCKERIGNORE"
# 1) 4NK_modules/* sauf 4NK_vault
for d in "$ROOT_DIR"/4NK_modules/*; do
[ -d "$d" ] || continue
base="$(basename "$d")"
if [ "$base" = "4NK_vault" ]; then
echo "[skip] $d (excluded)"
continue
fi
copy_files "$d"
done
# 2) Sous-projets sous projects/*/* (ex: projects/lecoffre/lecoffre_node, lecoffre-front, ...)
for p in "$ROOT_DIR"/projects/*; do
[ -d "$p" ] || continue
for sub in "$p"/*; do
[ -d "$sub" ] || continue
copy_files "$sub"
done
done
echo "[done] Ignore files synchronised."

View File

@ -1,94 +0,0 @@
#!/usr/bin/env sh
set -euo pipefail
# Déterminer la racine du projet (4NK_env) relativement à ce script
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
ROOT_DIR="$(cd "$SCRIPT_DIR/../../../.." && pwd)"
REPO_URL="https://git.4nkweb.com/4nk/4NK_vault.git"
VAULT_ROOT="$ROOT_DIR/vault"
SDK_DIR="$VAULT_ROOT/sdk-client"
CONFS_DIR="$ROOT_DIR/confs"
VAULT_ENV_FILE="$VAULT_ROOT/.env"
SYNC_JS="$ROOT_DIR/scripts/sync-vault-configs.js"
# 0) Charger l'env Vault si présent (VAULT_BASE_URL, VAULT_USER/VAULT_USER_ID, VAULT_ENV, etc.)
if [ -f "$VAULT_ENV_FILE" ]; then
set -a
. "$VAULT_ENV_FILE"
set +a
fi
# 1) Cloner / mettre à jour le dépôt directement dans vault/
mkdir -p "$VAULT_ROOT"
if [ -d "$VAULT_ROOT/.git" ]; then
echo "[git] Mise à jour du dépôt existant dans $VAULT_ROOT"
git -C "$VAULT_ROOT" remote set-url origin "$REPO_URL" 2>/dev/null || true
git -C "$VAULT_ROOT" fetch --prune origin
git -C "$VAULT_ROOT" checkout -B master origin/master
git -C "$VAULT_ROOT" reset --hard origin/master
else
echo "[git] Initialisation du dépôt dans $VAULT_ROOT"
git -C "$VAULT_ROOT" init
git -C "$VAULT_ROOT" remote add origin "$REPO_URL" 2>/dev/null || git -C "$VAULT_ROOT" remote set-url origin "$REPO_URL"
git -C "$VAULT_ROOT" fetch --depth 1 origin master
git -C "$VAULT_ROOT" checkout -B master origin/master
fi
# 2) Construire le SDK client (TypeScript)
if [ ! -d "$SDK_DIR" ]; then
echo "[ERROR] Dossier sdk-client introuvable dans le dépôt $VAULT_ROOT"
exit 2
fi
cd "$SDK_DIR"
# Rebuild propre avant la compilation pour garantir un état cohérent
echo "[build] Nettoyage du SDK client (node_modules, dist)"
rm -rf node_modules dist 2>/dev/null || true
# Installer et compiler (essayer npm ci, sinon npm install)
echo "[build] Installation des dépendances du SDK client"
npm ci --no-audit --progress=false || npm install --no-audit --progress=false
echo "[build] Compilation TypeScript du SDK client"
npx tsc || ./node_modules/.bin/tsc
# 3) Démo: init/routes/sync locale (écrit sous vault/confs)
node "$SDK_DIR/dist/examples/usage.js" || true
# 4) Copier le miroir local vers confs si présent; sinon fallback sync directe via SDK local
mkdir -p "$CONFS_DIR"
if [ -d "$VAULT_ROOT/confs" ]; then
echo "[copy] Synchronisation $VAULT_ROOT/confs -> $CONFS_DIR"
rm -rf "$CONFS_DIR"
mkdir -p "$CONFS_DIR"
cp -a "$VAULT_ROOT/confs/." "$CONFS_DIR/"
rm -rf "$VAULT_ROOT/confs"
echo "[cleanup] Suppression du miroir $VAULT_ROOT/confs"
else
echo "[fallback] Miroir inexistant, tentative de sync directe via SDK"
if [ -f "$SYNC_JS" ]; then
node "$SYNC_JS" || true
else
echo "[WARN] Script de sync SDK introuvable: $SYNC_JS"
fi
# Si le SDK a synchronisé dans vault/confs2, propager vers CONFS_DIR
if [ -d "$VAULT_ROOT/confs2" ]; then
echo "[copy] Synchronisation fallback $VAULT_ROOT/confs2 -> $CONFS_DIR"
rm -rf "$CONFS_DIR"
mkdir -p "$CONFS_DIR"
cp -a "$VAULT_ROOT/confs2/." "$CONFS_DIR/"
fi
fi
# 4bis) Répliquer les fichiers synchronisés dans le dossier du projet lecoffre_node si requis
LECOFFRE_NODE_CONFS_DIR="$ROOT_DIR/projects/lecoffre/lecoffre_node/confs"
echo "[copy] Réplication vers $LECOFFRE_NODE_CONFS_DIR"
rm -rf "$LECOFFRE_NODE_CONFS_DIR"
mkdir -p "$LECOFFRE_NODE_CONFS_DIR"
# Si le dossier fallback existe, répliquer directement depuis celui-ci pour éviter les permissions sur $CONFS_DIR
if [ -d "$VAULT_ROOT/confs2" ]; then
cp -a "$VAULT_ROOT/confs2/." "$LECOFFRE_NODE_CONFS_DIR/"
else
cp -a "$CONFS_DIR/." "$LECOFFRE_NODE_CONFS_DIR/"
fi
echo "[OK] Sync Vault terminée vers $CONFS_DIR et répliquée vers $LECOFFRE_NODE_CONFS_DIR"