Lancer un setup de minage de 50 kW, c'est un peu le scénario limite entre la prise de courant résidentielle et le data center commercial. D'un côté, une charge active de 50 kW peut encore passer dans un petit local commercial ou un site privé disposant de son propre poste transformateur. De l'autre, on parle tout de même d'environ 14 à 15 ASIC modernes, dont chacun dégage jusqu'à 3,5 kW de chaleur, tire entre 15 et 16 ampères sur une seule phase et nécessite de brasser entre 600 et 800 mètres cubes d'air par heure.
Ce guide rassemble un retour d'terrain pragmatique sur la conception, l'approvisionnement en matériel, le câblage électrique, le refroidissement et l'automatisation d'une ferme de minage de 50 kW. Pas de blabla, de théories abstraites ou d'académisme : que du chiffre brut, du hardware, des câbles, des études de sol et des scripts de monitoring taillés pour la production.
1. Paramètres initiaux et infrastructure électrique
La base de tout business de minage, c'est le coût du kilowatt-heure et la fiabilité du poste de transformation. Pour une charge continue de 50 kW en 24/7, le calibre de votre protection générale doit intégrer une marge de sécurité de 20 % sur l'intensité (selon les normes NFPA/IEC pour les charges continues).
I_total = P / (√3 · U · cosφ) = 50000 / (√3 · 380 · 0.95) ≈ 79.8 A
En tenant compte du coefficient de 1,25, le disjoncteur général doit être calibré à un minimum de 100 A (triphasé).
Spécification du tableau électrique principal (TGBT 50 kW)
- Disjoncteur général : 3P 100A (courbe C, pouvoir de coupure d'au moins 10 kA, ex. Schneider Electric Acti9 ou ABB S200).
- Équilibrage des phases : 3 phases L1, L2, L3, réparties strictement de manière égale avec 5 appareils par phase (pour 15 machines) afin d'éviter le déséquilibre de phases et un courant excessif dans le neutre.
- Ligne de câble du poste au TGBT : Câble cuivre U1000 R2V 4x25 mm² ou aluminium 4x50 mm² en pose enterrée (en veillant à ce que la chute de voltage ne dépasse pas 2 % sur 50 mètres).
- Protection des départs : Pour chaque ASIC, un disjoncteur dédié 2P 20A (courbe C) + câble cuivre ignifugé à double isolation 3x2,5 mm².
- Mise à la terre : Boucle de terre ou piquet TN-S / TN-C-S avec une résistance inférieure à 4 ohms (constituée de 3 piquets cuivrés de 2,5 m plantés en triangle et reliés par un feuillard soudé de 40x4 mm).
2. Choix du matériel et CAPEX (Dépenses d'investissement)
Pour nos calculs, partons sur le standard absolu de l'industrie : les séries Bitmain Antminer S19k Pro / S21 ou MicroBT Whatsminer M50/M60. Pour encaisser proprement 50 kW, l'optimum consiste à aligner 14 unités d'Antminer S21 (200 TH/s) avec une consommation standard d'environ 3 500 W par machine.
- Hashrate total : 14 · 200 TH/s = 2 800 TH/s = 2.8 PH/s
- Consommation totale : 14 · 3 500 W = 49 kW (on rentre dans la limite des 50 kW en gardant de la marge pour la ventilation).
Tableau des dépenses d'investissement (CAPEX)
| Poste de dépense | Spécification / Détails | Qté | Prix unitaire ($) | Total ($) |
|---|---|---|---|---|
| ASIC miners | Antminer S21 200 TH/s (3500W) | 14 unités | 3,800 | 53,200 |
| Tableau général (TGBT) | Disjoncteurs ABB/SE, contacteurs, voltmètres, parafoudre | 1 kit | 1,200 | 1,200 |
| Câblage | Câble 3x2.5, chevelines, PDU C19 (16A) | 14 lignes | 70 | 980 |
| Refroidissement / Ventilation | Extracteur hélicoïdal industriel (12 000 m³/h) + variateur de fréquence | 2 unités | 850 | 1,700 |
| Filtration d'air entrant | Ossature, filtres G4/F7 (dépoussiérage), louvres | 1 kit | 600 | 600 |
| Infrastructure réseau | Switch manageable Mikrotik 24 ports, routeur 4G/WAN, onduleur | 1 kit | 550 | 550 |
| Boucle de terre | Kit de mise à la terre, pose, mesures | 1 kit | 350 | 350 |
| Prestations d'installation | Montage des racks, câblage électrique, mise en service | - | - | 1,500 |
| TOTAL CAPEX | $60,080 |
3. Refroidissement et ventilation : Calculs thermodynamiques
L'erreur classique du débutant : installer un climatiseur résidentiel. Un climatiseur retire l'humidité et baisse la température via un cycle frigorifique, mais pour 50 kW de chaleur, il vous faudrait une bête de course de 150 000 BTU qui pompera à elle seule 15 à 18 kW d'électricité supplémentaires.
Le minage se refroidit exclusivement par une ventilation double flux dynamique (un balayage d'air forcé).
Calcul du débit d'air nécessaire
Formule du débit d'air requis :
Q = P_dissip / (ρ · c_p · ΔT)
Où :
- P_dissip = 49 000 W (chaleur dégagée)
- ρ = 1,2 kg/m³ (masse volumique de l'air à 20 °C)
- c_p = 1 005 J/(kg·K) (capacité thermique massique de l'air)
- ΔT = 15 °C (élévation de température admissible entre l'entrée et la sortie)
Q = 49000 / (1.2 · 1005 · 15) ≈ 2.708 m³/s = 9750 m³/h
En tenant compte de la perte de charge des préfiltres (G4), il faut dimensionner des ventilateurs d'une capacité totale d'au moins 12 000 à 14 000 m³/h.
Cloisonnement des flux (Allées chaudes / Allées froides)
- Allée froide : Admission d'air extérieur à travers des murs filtrants. La pression atmosphérique y est légèrement en surpression.
- Allée chaude : Les mineurs ASIC sont encastrés dans une cloison étanche (bâti avec déflecteurs). Les ventilateurs des machines recrachent l'air chaud directement dans un plénum isolé, d'où un extracteur industriel l'évacue vers l'extérieur.
4. OPEX et charges d'exploitation (Bilan mensuel)
Les frais de fonctionnement reposent sur trois piliers majeurs : l'électricité, le loyer du local, la connexion Internet et la maintenance technique.
Prenons un tarif moyen de l'électricité pro à 0,07 $ par kWh.
Calcul de la facture électrique mensuelle
- Consommation horaire : 49 kW (miners) + 1,5 kW (ventilation et réseau) = 50,5 kW
- Consommation journalière : 50,5 · 24 = 1 212 kWh
- Consommation mensuelle (30,5 jours) : 1 212 · 30,5 = 36 966 kWh
- Coût électricité par mois : 36 966 · 0,07 $ = 2 587,62 $
Charges fixes mensuelles (OPEX)
| Poste de coût | Description | Montant ($) |
|---|---|---|
| Électricité | 36 966 kWh à 0,07 $/kWh | 2,587.62 |
| Loyer du local | Espace industriel / entrepôt 20-30 m² | 300.00 |
| Connexion Internet | Ligne principale (fibre) + secours (4G) | 40.00 |
| Fonds de maintenance / Pièces | Remplacement de ventilos ASIC, nettoyage des filtres, consommables | 150.00 |
| TOTAL OPEX / mois | $3,077.62 |
5. Rentabilité, retour sur investissement (ROI) et modèle financier
Pour estimer les revenus, on s'appuie sur la difficulté du réseau Bitcoin et la récompense de bloc en vigueur en 2026. Imaginons que 1 TH/s rapporte environ 0,042 $ par jour (hors coût de l'électricité, avec un cours du BTC à ~65 000 $).
Calcul des revenus (Revenue)
- Hashrate cumulé : 2 800 TH/s
- Recettes journalières : 2 800 · 0,042 $ = 117,60 $
- Recettes mensuelles (30,5 jours) : 117,60 $ · 30,5 = 3 586,80 $
Bénéfice net (EBITDA / Net Profit)
- Net Profit/mo = Recettes (3 586,80 $) - OPEX (3 077,62 $) = 509,18 $ (le chiffre grimpe si le rendement par TH/s augmente ; il évolue proportionnellement si le BTC s'envole à 90 000 $).
Remarque importante sur la sensibilité du ROI face au cours et au prix de l'électricité :
Si le coût du kWh descend à 0,05 $, l'OPEX électricité chute à 1 848,30 $ et le bénéfice net bondit à 1 248,50 $ par mois. De quoi ramener le délai d'amortissement de chiffres catastrophiques à un raisonnable 35-40 mois. Miner avec un tarif pro supérieur à 0,065–0,07 $/kWh sans bull run ou sans une flotte ultra-efficace vous place directement en zone de haute voltige financière.
6. Automatisation et supervision : Script Python de monitoring (CGMiner / CGMiner API)
Un vrai ingénieur ne s'amuse pas à cliquer manuellement sur l'interface web de 14 machines différentes. Tous les mineurs ASIC modernes (Antminer, Whatsminer) supportent le protocole CGMiner API (basé sur du JSON via des sockets TCP).
Voici un script Python prêt pour la production pour surveiller votre ferme de minage. Il interroge en parallèle les 14 ASIC sur le réseau local, récupère le hashrate, la température des puces, et envoie une alerte directe sur Telegram en cas de baisse de perfs ou de surchauffe.
#!/usr/bin/env python3
"""
Monitoring de ferme de minage ASIC via CGMiner API (Port 4028).
Fonctionnalités :
* interroge tous les appareils en parallèle ;
* Antminer (clé "command") et Whatsminer (clé "cmd") — type défini dans MINERS ;
* alertes : hors ligne, chute de hashrate, surchauffe, champs de température introuvables ;
* déduplication : un même événement n'est pas envoyé plus d'une fois toutes les REPEAT_MINUTES ;
* notification de rétablissement lorsque le problème disparaît ;
* confirmation du problème sur CONFIRM_CYCLES interrogations consécutives (protection contre les faux positifs) ;
* l'état est stocké dans un fichier, ce qui fonctionne parfaitement en boucle ou via cron (--once).
Configuration via variables d'environnement :
TG_BOT_TOKEN, TG_CHAT_ID — obligatoires
TEMP_THRESHOLD (défaut 85) — seuil de température des puces, °C
HASHRATE_WARN_TH (défaut 170) — hashrate minimum, TH/s
POLL_INTERVAL_SEC (défaut 60) — période d'interrogation en mode boucle
REPEAT_MINUTES (défaut 60) — répétition d'une même alerte
CONFIRM_CYCLES (défaut 2) — nombre d'interrogations consécutives requises pour valider un problème
Exécution :
python3 asic_monitor.py # boucle infinie
python3 asic_monitor.py --once # exécution unique (pour cron / systemd timer)
IMPORTANT : Le port 4028 ne doit être accessible que depuis le réseau local.
Ne l'exposez jamais directement sur Internet.
"""
import json
import logging
import os
import socket
import sys
import time
from concurrent.futures import ThreadPoolExecutor
import requests
# --------------------------------------------------------------------------
# Configuration
# --------------------------------------------------------------------------
# (ip, type) : "antminer" ou "whatsminer"
MINERS = [(f"192.168.1.{i}", "antminer") for i in range(101, 115)] # .101 - .114
# Exemple de ferme mixte :
# MINERS[0] = ("192.168.1.101", "whatsminer")
API_PORT = 4028
SOCKET_TIMEOUT = 3.0
TG_BOT_TOKEN = os.environ.get("TG_BOT_TOKEN", "")
TG_CHAT_ID = os.environ.get("TG_CHAT_ID", "")
TEMP_THRESHOLD = float(os.environ.get("TEMP_THRESHOLD", "85"))
HASHRATE_WARN_TH = float(os.environ.get("HASHRATE_WARN_TH", "170"))
POLL_INTERVAL_SEC = int(os.environ.get("POLL_INTERVAL_SEC", "60"))
REPEAT_MINUTES = int(os.environ.get("REPEAT_MINUTES", "60"))
CONFIRM_CYCLES = int(os.environ.get("CONFIRM_CYCLES", "2"))
STATE_FILE = os.environ.get("STATE_FILE", "asic_monitor_state.json")
# Préfixes des clés de température des puces dans la réponse `stats` pour Antminer.
# À vérifier avec votre firmware : lancez `stats` et inspectez les vraies clés.
ANTMINER_TEMP_PREFIXES = ("temp2_", "temp_chip")
logging.basicConfig(
level=logging.INFO,
format="%(asctime)s %(levelname)s %(message)s",
datefmt="%Y-%m-%d %H:%M:%S",
)
log = logging.getLogger("asic_monitor")
# --------------------------------------------------------------------------
# Telegram
# --------------------------------------------------------------------------
def send_telegram(text: str) -> bool:
"""Envoie un message sans parse_mode (le texte dynamique ne casse pas le formatage).
Renvoie True uniquement si Telegram a accepté le message."""
if not TG_BOT_TOKEN or not TG_CHAT_ID:
log.error("TG_BOT_TOKEN / TG_CHAT_ID non définis, alerte non envoyée : %s", text)
return False
url = f"https://api.telegram.org/bot{TG_BOT_TOKEN}/sendMessage"
try:
r = requests.post(url, json={"chat_id": TG_CHAT_ID, "text": text}, timeout=10)
if not r.ok:
log.error("Telegram a renvoyé %s : %s", r.status_code, r.text[:200])
return r.ok
except requests.RequestException as e:
log.error("Erreur d'envoi vers Telegram : %s", e)
return False
# --------------------------------------------------------------------------
# Interaction avec l'API CGMiner
# --------------------------------------------------------------------------
def query_miner(ip: str, kind: str, command: str) -> dict:
"""Envoie une commande à l'API CGMiner. En cas d'erreur, renvoie {"error": "..."}."""
key = "cmd" if kind == "whatsminer" else "command"
try:
with socket.create_connection((ip, API_PORT), timeout=SOCKET_TIMEOUT) as s:
s.settimeout(SOCKET_TIMEOUT)
s.sendall(json.dumps({key: command}).encode("utf-8"))
chunks = []
while True:
chunk = s.recv(4096)
if not chunk:
break
chunks.append(chunk)
text = b"".join(chunks).decode("utf-8", errors="ignore").replace("\x00", "")
# Certains firmwares renvoient "}{" sans virgule entre les objets
text = text.replace("}{", "},{")
return json.loads(text)
except Exception as e: # réseau, timeout, JSON invalide
return {"error": f"{type(e).__name__}: {e}"}
def to_float(value):
"""Nombre ou chaîne représentant un nombre -> float, sinon None."""
try:
return float(value)
except (TypeError, ValueError):
return None
def get_hashrate_th(summary: dict, kind: str):
"""Hashrate en TH/s ou None si le champ est introuvable."""
try:
s = summary["SUMMARY"][0]
except (KeyError, IndexError, TypeError):
return None
if kind == "whatsminer":
# MH/s -> TH/s. Moyenne sur 5 min si dispo, sinon moyenne globale.
for key in ("MHS 5m", "MHS av"):
v = to_float(s.get(key))
if v is not None:
return v / 1_000_000.0
return None
# Antminer : GH/s -> TH/s. On évite "GHS 5s" (trop instable).
for key in ("rate_30m", "GHS av"):
v = to_float(s.get(key))
if v is not None:
return v / 1000.0
return None
def get_max_chip_temp(ip: str, kind: str, summary: dict):
"""Température maximale des puces ou None si les champs sont introuvables."""
if kind == "whatsminer":
try:
s = summary["SUMMARY"][0]
except (KeyError, IndexError, TypeError):
return None
temps = [to_float(s.get(k)) for k in ("Chip Temp Max", "Temperature")]
temps = [t for t in temps if t]
return max(temps) if temps else None
stats = query_miner(ip, kind, "stats")
try:
info = stats["STATS"][1]
except (KeyError, IndexError, TypeError):
return None
temps = []
for k, v in info.items():
if k.startswith(ANTMINER_TEMP_PREFIXES):
t = to_float(v)
if t: # 0 = la carte ne renvoie pas de valeur
temps.append(t)
return max(temps) if temps else None
# --------------------------------------------------------------------------
# Vérification d'un équipement individuel
# --------------------------------------------------------------------------
def check_miner(ip: str, kind: str) -> dict:
"""Renvoie {issue_key: texte_alerte} pour les problèmes actifs."""
issues = {}
summary = query_miner(ip, kind, "summary")
if "error" in summary:
# Hors ligne : les autres vérifications ne servent à rien
return {"offline": f"⚠️ {ip} : pas de réponse de l'API ({summary['error']})"}
th = get_hashrate_th(summary, kind)
if th is None:
issues["parse"] = f"❌ {ip} : impossible de récupérer le hashrate depuis summary (vérifiez le firmware/type)"
elif th < HASHRATE_WARN_TH:
issues["hashrate"] = f"📉 {ip} : hashrate de {th:.1f} TH/s (seuil {HASHRATE_WARN_TH:.0f})"
temp = get_max_chip_temp(ip, kind, summary)
if temp is None:
issues["temp_keys"] = f"❓ {ip} : champs de température introuvables, vérifiez les clés dans stats"
elif temp > TEMP_THRESHOLD:
issues["temp"] = f"🔥 {ip} : surchauffe, puces à {temp:.0f}°C (seuil {TEMP_THRESHOLD:.0f})"
return issues
# --------------------------------------------------------------------------
# État et déduplication
# --------------------------------------------------------------------------
def load_state() -> dict:
try:
with open(STATE_FILE, encoding="utf-8") as f:
return json.load(f)
except (OSError, ValueError):
return {"sent": {}, "streak": {}}
def save_state(state: dict) -> None:
try:
tmp = STATE_FILE + ".tmp"
with open(tmp, "w", encoding="utf-8") as f:
json.dump(state, f)
os.replace(tmp, STATE_FILE)
except OSError as e:
log.error("Échec de l'enregistrement de l'état : %s", e)
def run_cycle(state: dict) -> None:
sent, streak = state["sent"], state["streak"]
now = time.time()
with ThreadPoolExecutor(max_workers=len(MINERS)) as pool:
results = list(pool.map(lambda m: (m[0], check_miner(*m)), MINERS))
for ip, issues in results:
# 1) problèmes actifs
for key, text in issues.items():
sid = f"{ip}|{key}"
streak[sid] = streak.get(sid, 0) + 1
if streak[sid] < CONFIRM_CYCLES:
continue
last = sent.get(sid)
if last is None or now - last >= REPEAT_MINUTES * 60:
if send_telegram(text):
sent[sid] = now
# 2) problèmes résolus
prefix = f"{ip}|"
for sid in [s for s in list(streak) if s.startswith(prefix)]:
key = sid[len(prefix):]
if key in issues:
continue
streak.pop(sid, None)
if sid in sent: # notification de retour à la normale seulement si une alerte avait été émise
if send_telegram(f"✅ {ip} : problème « {key} » résolu"):
sent.pop(sid, None)
ok = sum(1 for _, i in results if not i)
log.info("Interrogation terminée : %d/%d sans problème", ok, len(results))
save_state(state)
# --------------------------------------------------------------------------
def main() -> None:
state = load_state()
state.setdefault("sent", {})
state.setdefault("streak", {})
if "--once" in sys.argv:
run_cycle(state)
return
log.info("Lancement du monitoring : %d appareils, période de %d s", len(MINERS), POLL_INTERVAL_SEC)
while True:
try:
run_cycle(state)
except Exception:
log.exception("Exception non gérée dans la boucle d'interrogation")
time.sleep(POLL_INTERVAL_SEC)
if __name__ == "__main__":
main()7. Check-list pré-lancement (Recette technique)
- 1. Test de charge du réseau : Faire tourner un canon à chaleur de 50 kW pendant 4 heures avant d'installer les mineurs. Vérifier au pyromètre l'échauffement des blocs de contacts sur le disjoncteur général et les jeux de barres. La température des contacts ne doit pas dépasser 65°C.
- 2. Mesure de la terre : Faire intervenir un consuel/laboratoire électrique pour mesurer la boucle de défaut phase-neutre et la résistance de dispersion de la prise de terre (doit être < 4 Ohms).
- 3. Vérification du débit d'air : S'assurer que la perte de charge des filtres G4 ne crée pas de dépression excessive dans le local (la porte menant au couloir froid doit s'ouvrir sans effort particulier lorsque l'extraction tourne).
- 4. Configuration du Watchdog : Activer les fonctions intégrées de redémarrage automatique matériel (Hardware Auto-Reboot) dans les firmwares des mineurs (LUXOS, VNISH ou Stock) en cas de perte de pool ou d'IP.
Exécution :
export TG_BOT_TOKEN="..." TG_CHAT_ID="..."
python3 asic_monitor.py8. Structuration juridique, contrat PPA et comptabilité fiscale internationale
Déployer une installation de 50 kW dans n'importe quelle juridiction exige un statut officiel de consommateur commercial. Miner « au noir » en se branchant sur une prise domestique standard mènera inévitablement à des mises en demeure du fournisseur d'énergie, à de lourdes amendes pour dépassement des seuils de puissance et à un usage non conforme des réseaux.
Schéma de structuration et architecture juridique
- Création d'une structure opérationnelle (LLC / SARL / Inc.) : Le site est enregistré sous une entité morale à responsabilité limitée classique. C'est indispensable pour signer légalement un bail commercial et un contrat de raccordement au réseau électrique.
- Contrat PPA (Power Purchase Agreement) : Le document clé de l'installation est le contrat d'achat d'électricité (PPA) conclu avec le fournisseur de dernier recours ou le propriétaire du poste de transformation. Le contrat fixe :
- La puissance active souscrite : 50 kW sous la catégorie de fiabilité III (avec une charge continue autorisée 24h/24 et 7j/7).
- Le point de raccordement et de livraison : 0,4 kV sur les barres basse tension du transformateur.
- La grille tarifaire : un coût fixe par kWh (cible < 0,065–0,07 $).
- Importation du matériel (Code SH 8471) : L'achat des miners ASIC s'effectue via un contrat B2B direct. Le code du Système Harmonisé (code SH) international pour ce matériel est le 8471 50 000 0 (unités de traitement). Lors d'un dédouanement en règle, la TVA à l'importation (VAT/GST) et les droits de douane sont acquittés. Vous conservez ainsi les déclarations en douane (DAU/GTD) et les factures commerciales, garantissant la traçabilité des actifs immobilisés à l'bilan.
- Comptabilité fiscale et off-ramping : Les revenus du minage sont générés en BTC directement sur le pool. Pour couvrir les charges d'exploitation mensuelles (OPEX : électricité, loyer), un compte institutionnel (Corporate Account) est ouvert sur un exchange crypto ou une plateforme OTC avec une procédure KYB (Know Your Business) validée. Les fonds fiat obtenus sont versés sur le compte bancaire de la société par virement pour régler régulièrement les factures d'électricité.
9. Logistique et réception du matériel
La masse totale de 14 unités Antminer S21 dans leur emballage d'origine s'élève à environ 230–250 kg.
Protocole de contrôle à la réception (QC)
- 1. Inspection visuelle des emballages : vérification des scellés d'inviolabilité et de l'absence de dommages sur les cartons.
- 2. Test de secousse (Vérification des dissipateurs) : pendant le transport depuis la Chine, les fortes vibrations peuvent desserrer les vis de fixation ou détacher des radiateurs individuels des puces (en particulier sur du matériel d'occasion). Secouez délicatement l'appareil : aucun bruit de pièce baladeuse ne doit provenir de l'intérieur.
- 3. Test de résistance (Cold Test) : avant d'envoyer le 220 V, un multimètre sert à vérifier l'absence de court-circuit sur les bus d'alimentation des hashboards (la résistance de la ligne VDD doit correspondre aux specs du fabricant, soit quelques dizaines d'ohms).
- 4. Banc d'essai (15 minutes) : mise sous tension séquentielle dans un circuit isolé. Contrôle de l'atteinte du hashrate cible (200 TH/s), de la réponse des 3 cartes (3/3 Boards detected) et de l'absence de puces défectueuses (HW Errors < 0,5 %).
10. Sécurité et isolation réseau
Une ferme de 50 kW est une cible attrayante tant pour le vol physique que pour les cyberattaques (interception du trafic stratum, injection de malwares de minage).
Architecture du réseau :
[ Internet (WAN) ]
&│
[ Secours 4G/LTE ]
&│
┌───────┴────────┐
│ Router / WAF │ (MikroTik / OPNsense)
│ Firewall │ ── WireGuard VPN (Accès distant uniquement)
└───────┬────────┘
│ (VLAN isolé 10.0.10.0/24)
┌────────┼─────────────────┬─────────────────┐
│ │ │ │
[ASIC 1] [ASIC 2] ... [ASIC 14] [Node du script]
10.0.10.101 10.0.10.102 10.0.10.114 10.0.10.250 (Python Watchdog)
Paramètres du segment réseau
- Isolation complète du WAN : Les ASIC se trouvent dans un segment VLAN fermé, dépourvu d'adresse IP publique.
- Port 4028 fermé (CGMiner API) : L'accès au port de collecte des métriques est exclusivement autorisé pour l'adresse IP du serveur de supervision interne.
- Chiffrement Stratum/TLS : Le routage du trafic vers le pool (Stratum V2 ou Stratum over TLS) élimine tout risque de détournement d'adresse de portefeuille via une attaque de l'homme du milieu (MitM) au niveau du FAI.
11. Bilan ingénieur (Checklist de déploiement)
- 1. Électricité : Vérifier la section des câbles VVGng-LS 3x2,5 mm² pour chaque prise C19, resserrer toutes les bornes du TGBT (tableau général basse tension) à la clé dynamométrique après 48 heures de fonctionnement en charge.
- 2. Ventilation : Mesurer l'écart de température entre l'air entrant et l'air sortant. Si $\Delta T > 18^\circ\text{C}$, basculer les ventilateurs d'extraction à une vitesse supérieure via un variateur de fréquence (VFD).
- 3. Supervision : Déployer le script de contrôle automatisé des ASIC avec alertes en cas de chute du hashrate en dessous de 170 TH/s.
- 4. Gestion des risques financiers : Calculer le seuil de rentabilité en intégrant une augmentation potentielle de la difficulté du réseau de 15 à 20 % par an.