Nomenclature Mnémonique des Hostnames
Fédération DNS Multi-Tenant
Version: 2.0
Date: Octobre 2025
Standard: RFC 1123 compliant + Mnémonique
Table des matières
- Philosophie de nomenclature
- Principes mnémoniques
- Architecture multi-tenant
- Codes mnémoniques des services
- Structure des hostnames
- Exemples complets par partenaire
- Nomenclature des zones tenant
- Tables de référence
- Outils et validation
Philosophie de nomenclature
Objectifs
- Mnémonique : Facile à retenir et à deviner
- Cohérent : Même logique partout
- Scalable : Fonctionne pour 1 ou 1000 serveurs
- Humain d'abord : Optimisé pour l'administrateur, pas la machine
Principe central
"Si tu ne peux pas deviner le hostname, c'est un mauvais hostname"
Un bon hostname doit permettre à n'importe quel administrateur de comprendre immédiatement :
- Quel service c'est
- Où il se trouve (réseau/partenaire)
- Son rôle (primary/standby/replica)
Principes mnémoniques
Codes courts et parlants
Utiliser des abbréviations standard de 2-4 lettres :
Code | Service | Mnémonique |
---|---|---|
ns
|
Nameserver | Name Server |
api
|
API | API |
db
|
Database | DataBase |
web
|
Web server | Web |
mon
|
Monitoring | Monitoring |
vpn
|
VPN | VPN |
gw
|
Gateway | Gateway |
fw
|
Firewall | Firewall |
lb
|
Load Balancer | Load Balancer |
bkp
|
Backup | Backup |
log
|
Logging | Log |
cache
|
Cache | Cache |
Numéros d'instance
- Commencer à
1
(pas 0) - Conventions de rôle :
1
= Primary/Leader2
= Standby/Secondary3+
= Additional replicas/workers
Segments réseau (optionnels mais recommandés)
Segment | Abréviation | Usage |
---|---|---|
Management |
mgmt
|
Infrastructure de gestion |
Platform |
plat
|
Services de plateforme |
Public |
pub
|
Services exposés sur Internet |
Internal |
int
|
Services internes uniquement |
DMZ |
dmz
|
Zone démilitarisée |
Architecture multi-tenant
Deux niveaux distincts
┌─────────────────────────────────────────────────────┐
│ NIVEAU 1 : INFRASTRUCTURE DES PARTENAIRES │
│ (Serveurs, services internes) │
│ │
│ {service}{N}.{segment}.{partner-domain} │
│ Exemple: ns1.pub.chezlepro.ca │
└─────────────────────────────────────────────────────┘
↓ héberge
┌─────────────────────────────────────────────────────┐
│ NIVEAU 2 : TENANTS (CLIENTS) │
│ (Zones DNS des clients, y compris partenaires) │
│ │
│ {tenant-domain} │
│ Exemples: │
│ - chezlepro.ca (tenant Chezlepro lui-même) │
│ - client-a.com (tenant externe) │
│ - startup-xyz.io (tenant externe) │
└─────────────────────────────────────────────────────┘
Modèle de données
Partenaire (ex: Chezlepro)
├── Infrastructure (serveurs physiques/virtuels)
│ ├── ns1.pub.chezlepro.ca
│ ├── api.plat.chezlepro.ca
│ └── db1.plat.chezlepro.ca
│
└── Tenants hébergés
├── Tenant: "Chezlepro" (le partenaire lui-même)
│ ├── Zone: chezlepro.ca
│ └── Zone: chezlepro.com
│
├── Tenant: "ACME Corporation"
│ ├── Zone: acme.com
│ ├── Zone: acme.ca
│ └── Zone: acme-shop.io
│
└── Tenant: "Startup XYZ"
└── Zone: startup-xyz.io
Important: Un tenant peut avoir plusieurs zones DNS.
Codes mnémoniques des services
Services DNS
Hostname | Service | Mnémonique |
---|---|---|
ns{N}
|
Nameserver public | Name Server |
pdns{N}
|
PowerDNS Authoritative | PowerDNS |
rec{N}
|
DNS Recursor | Recursor |
Exemples:
ns1.pub.chezlepro.ca → Nameserver public #1
ns2.pub.chezlepro.ca → Nameserver public #2
pdns1.plat.chezlepro.ca → PowerDNS Auth primary
pdns2.plat.chezlepro.ca → PowerDNS Auth standby
rec1.int.chezlepro.ca → DNS Recursor interne
Services de données
Hostname | Service | Mnémonique |
---|---|---|
db{N}
|
Database primary/standby | DataBase |
dbr{N}
|
Database read replica | DBReplica |
redis{N}
|
Redis cache | Redis |
pg{N}
|
PostgreSQL (alternatif) | PostgreSQL |
maria{N}
|
MariaDB | MariaDB |
Exemples:
db1.plat.chezlepro.ca → PostgreSQL primary
db2.plat.chezlepro.ca → PostgreSQL standby (HA)
dbr1.plat.chezlepro.ca → PostgreSQL read replica #1
dbr2.plat.chezlepro.ca → PostgreSQL read replica #2
redis1.plat.chezlepro.ca → Redis cache
Services API et Web
Hostname | Service | Mnémonique |
---|---|---|
api{N}
|
API Tenant | API |
adm{N}
|
API Admin | Admin |
web{N}
|
Web server | Web |
dash{N}
|
Dashboard | Dashboard |
portal{N}
|
Portal | Portal |
Exemples:
api1.plat.chezlepro.ca → API Tenant #1
api2.plat.chezlepro.ca → API Tenant #2 (load balanced)
adm1.plat.chezlepro.ca → API Admin #1
dash1.plat.chezlepro.ca → Dashboard web
portal1.pub.chezlepro.ca → Portail public
Services réseau
Hostname | Service | Mnémonique |
---|---|---|
vpn{N}
|
VPN endpoint | VPN |
wg{N}
|
WireGuard | WireGuard |
gw{N}
|
Gateway | Gateway |
fw{N}
|
Firewall | Firewall |
lb{N}
|
Load Balancer | Load Balancer |
proxy{N}
|
Reverse Proxy | Proxy |
Exemples:
vpn1.pub.chezlepro.ca → VPN endpoint public
wg1.pub.chezlepro.ca → WireGuard endpoint
gw1.mgmt.chezlepro.ca → Gateway management
lb1.pub.chezlepro.ca → Load balancer public
proxy1.pub.chezlepro.ca → Reverse proxy (Nginx)
Infrastructure et gestion
Hostname | Service | Mnémonique |
---|---|---|
mon{N}
|
Monitoring | Monitoring |
log{N}
|
Logging | Logging |
bkp{N}
|
Backup | Backup |
nfs{N}
|
NFS storage | NFS |
ansible{N}
|
Ansible controller | Ansible |
bastion{N}
|
Bastion/Jump host | Bastion |
jump{N}
|
Jump host (alternatif) | Jump |
Exemples:
mon1.mgmt.chezlepro.ca → Icinga/Prometheus
log1.mgmt.chezlepro.ca → Loki/Elasticsearch
bkp1.mgmt.chezlepro.ca → Serveur backup
nfs1.mgmt.chezlepro.ca → NFS storage
ansible1.mgmt.chezlepro.ca → Ansible control node
bastion1.mgmt.chezlepro.ca → Jump host SSH
Hyperviseurs et virtualisation
Hostname | Service | Mnémonique |
---|---|---|
pve{N}
|
Proxmox VE | Proximox VE |
vm{N}
|
Virtual Machine générique | Virtual Machine |
ct{N}
|
Container | Container |
kvm{N}
|
KVM host | KVM |
Exemples:
pve1.mgmt.chezlepro.ca → Proxmox node #1
pve2.mgmt.chezlepro.ca → Proxmox node #2
pve3.mgmt.chezlepro.ca → Proxmox node #3
vm-test1.int.chezlepro.ca → VM de test
ct-web1.plat.chezlepro.ca → Container web
Structure des hostnames
Format général
{service}{instance}.{segment}.{partner-domain}
Variantes selon complexité
Minimal (petite infra):
{service}{instance}.{partner-domain}
Exemples:
ns1.chezlepro.ca
db1.chezlepro.ca
api1.chezlepro.ca
Standard (recommandé):
{service}{instance}.{segment}.{partner-domain}
Exemples:
ns1.pub.chezlepro.ca
db1.plat.chezlepro.ca
mon1.mgmt.chezlepro.ca
Détaillé (grande infra, multi-sites):
{service}{instance}.{segment}.{site}.{partner-domain}
Exemples:
ns1.pub.mtl.chezlepro.ca (Montréal)
ns1.pub.qc.chezlepro.ca (Québec)
db1.plat.dc1.chezlepro.ca (Datacenter 1)
Exemples complets par partenaire
Chezlepro (Bloc: 10.100.0.0/16)
Management Network (10.100.0.0/24)
# Hyperviseurs
pve1.mgmt.chezlepro.ca 10.100.0.50
pve2.mgmt.chezlepro.ca 10.100.0.51
pve3.mgmt.chezlepro.ca 10.100.0.52
pve-vip.mgmt.chezlepro.ca 10.100.0.55 (Virtual IP)
# Monitoring
mon1.mgmt.chezlepro.ca 10.100.0.10
log1.mgmt.chezlepro.ca 10.100.0.11
# Access & Control
bastion1.mgmt.chezlepro.ca 10.100.0.20
ansible1.mgmt.chezlepro.ca 10.100.0.21
# Storage
bkp1.mgmt.chezlepro.ca 10.100.0.30
nfs1.mgmt.chezlepro.ca 10.100.0.40
Platform Services (10.100.1.0/24)
# Database
db1.plat.chezlepro.ca 10.100.1.10 (primary)
db2.plat.chezlepro.ca 10.100.1.11 (standby)
dbr1.plat.chezlepro.ca 10.100.1.12 (read replica)
# API
api1.plat.chezlepro.ca 10.100.1.20
api2.plat.chezlepro.ca 10.100.1.21 (HA)
adm1.plat.chezlepro.ca 10.100.1.25 (Admin API)
# Frontend
dash1.plat.chezlepro.ca 10.100.1.30
web1.plat.chezlepro.ca 10.100.1.31
# DNS Backend
pdns1.plat.chezlepro.ca 10.100.1.40 (primary)
pdns2.plat.chezlepro.ca 10.100.1.41 (standby)
# Cache
redis1.plat.chezlepro.ca 10.100.1.50
Public Services (10.100.2.0/24)
# DNS Public (NATés vers IPs publiques)
ns1.pub.chezlepro.ca 10.100.2.10 → 203.0.113.10
ns2.pub.chezlepro.ca 10.100.2.11 → 203.0.113.11
# VPN
vpn1.pub.chezlepro.ca 10.100.2.20 → 203.0.113.20
wg1.pub.chezlepro.ca 10.100.2.20 (alias)
# Load Balancer
lb1.pub.chezlepro.ca 10.100.2.30 → 203.0.113.30
Aliases fonctionnels (CNAMEs)
# Raccourcis (sans segment)
ns1.chezlepro.ca → CNAME ns1.pub.chezlepro.ca
ns2.chezlepro.ca → CNAME ns2.pub.chezlepro.ca
api.chezlepro.ca → CNAME api1.plat.chezlepro.ca
dashboard.chezlepro.ca → CNAME dash1.plat.chezlepro.ca
# Alias de rôle
db-primary.chezlepro.ca → CNAME db1.plat.chezlepro.ca
db-standby.chezlepro.ca → CNAME db2.plat.chezlepro.ca
db-read.chezlepro.ca → Round-robin A vers dbr{N}
# Alias de service
monitoring.chezlepro.ca → CNAME mon1.mgmt.chezlepro.ca
icinga.chezlepro.ca → CNAME mon1.mgmt.chezlepro.ca
grafana.chezlepro.ca → CNAME mon1.mgmt.chezlepro.ca
backup.chezlepro.ca → CNAME bkp1.mgmt.chezlepro.ca
vpn.chezlepro.ca → CNAME vpn1.pub.chezlepro.ca
Partner A France (Bloc: 10.101.0.0/16)
# Management
pve1.mgmt.partner-a.fr 10.101.0.50
mon1.mgmt.partner-a.fr 10.101.0.10
bastion1.mgmt.partner-a.fr 10.101.0.20
bkp1.mgmt.partner-a.fr 10.101.0.30
# Platform
db1.plat.partner-a.fr 10.101.1.10
db2.plat.partner-a.fr 10.101.1.11
api1.plat.partner-a.fr 10.101.1.20
adm1.plat.partner-a.fr 10.101.1.25
dash1.plat.partner-a.fr 10.101.1.30
pdns1.plat.partner-a.fr 10.101.1.40
pdns2.plat.partner-a.fr 10.101.1.41
# Public
ns1.pub.partner-a.fr 10.101.2.10 → IP publique
ns2.pub.partner-a.fr 10.101.2.11 → IP publique
vpn1.pub.partner-a.fr 10.101.2.20 → IP publique
# Aliases
ns1.partner-a.fr → CNAME ns1.pub.partner-a.fr
ns2.partner-a.fr → CNAME ns2.pub.partner-a.fr
api.partner-a.fr → CNAME api1.plat.partner-a.fr
dashboard.partner-a.fr → CNAME dash1.plat.partner-a.fr
ACME Corporation (Bloc: 10.104.0.0/16)
# Management
pve1.mgmt.acme.com 10.104.0.50
mon1.mgmt.acme.com 10.104.0.10
bastion1.mgmt.acme.com 10.104.0.20
# Platform
db1.plat.acme.com 10.104.1.10
api1.plat.acme.com 10.104.1.20
dash1.plat.acme.com 10.104.1.30
pdns1.plat.acme.com 10.104.1.40
# Public
ns1.pub.acme.com 10.104.2.10 → IP publique
ns2.pub.acme.com 10.104.2.11 → IP publique
vpn1.pub.acme.com 10.104.2.20 → IP publique
# Aliases
ns1.acme.com → CNAME ns1.pub.acme.com
ns2.acme.com → CNAME ns2.pub.acme.com
api.acme.com → CNAME api1.plat.acme.com
Nomenclature des zones tenant
Zones = Domaines des clients
Les tenants utilisent leurs propres domaines, pas une nomenclature imposée.
Tenant: Chezlepro (lui-même)
Zones DNS:
├── chezlepro.ca (zone principale)
│ ├── www.chezlepro.ca
│ ├── mail.chezlepro.ca
│ ├── blog.chezlepro.ca
│ └── [autres records]
│
└── chezlepro.com (zone secondaire, redirection)
└── www.chezlepro.com → CNAME www.chezlepro.ca
Tenant: ACME Corporation
Zones DNS:
├── acme.com (zone principale)
│ ├── www.acme.com
│ ├── shop.acme.com
│ ├── mail.acme.com
│ └── api.acme.com
│
├── acme.ca (marché canadien)
│ ├── www.acme.ca
│ └── shop.acme.ca
│
└── acme-shop.io (micro-site)
└── www.acme-shop.io
Tenant: Startup XYZ
Zones DNS:
└── startup-xyz.io
├── www.startup-xyz.io
├── app.startup-xyz.io
└── api.startup-xyz.io
NS Records des zones tenant
Toutes les zones tenant ont les mêmes NS (réplication fédérée):
chezlepro.ca. IN NS ns1.pub.chezlepro.ca.
chezlepro.ca. IN NS ns1.pub.partner-a.fr.
chezlepro.ca. IN NS ns1.pub.acme.com.
acme.com. IN NS ns1.pub.chezlepro.ca.
acme.com. IN NS ns1.pub.partner-a.fr.
acme.com. IN NS ns1.pub.acme.com.
startup-xyz.io. IN NS ns1.pub.chezlepro.ca.
startup-xyz.io. IN NS ns1.pub.partner-a.fr.
startup-xyz.io. IN NS ns1.pub.acme.com.
Chaque zone est:
- PRIMARY chez un partenaire (celui qui l'héberge)
- SECONDARY chez les autres partenaires (réplication AXFR)
Tables de référence
Résumé des codes mnémoniques
Code | Service | Port(s) | Segment typique |
---|---|---|---|
ns
|
Nameserver | 53 UDP/TCP | pub |
pdns
|
PowerDNS Auth | 53, 8081 | plat |
rec
|
DNS Recursor | 53 | int |
db
|
Database Primary | 5432/3306 | plat |
dbr
|
Database Replica | 5432/3306 | plat |
redis
|
Redis Cache | 6379 | plat |
api
|
API Tenant | 443 | plat |
adm
|
API Admin | 8443 | plat |
dash
|
Dashboard | 443 | plat |
web
|
Web Server | 80/443 | pub/plat |
portal
|
Portal | 443 | pub |
vpn
|
VPN Endpoint | 51820 | pub |
wg
|
WireGuard | 51820 | pub |
gw
|
Gateway | - | mgmt |
fw
|
Firewall | - | mgmt |
lb
|
Load Balancer | 80/443 | pub |
proxy
|
Reverse Proxy | 80/443 | pub/plat |
mon
|
Monitoring | 443 | mgmt |
log
|
Logging | 514/5140 | mgmt |
bkp
|
Backup | 22/873 | mgmt |
nfs
|
NFS Storage | 2049 | mgmt |
ansible
|
Ansible Control | 22 | mgmt |
bastion
|
Jump Host | 22 | mgmt |
pve
|
Proxmox VE | 8006 | mgmt |
vm
|
Virtual Machine | varies | varies |
ct
|
Container | varies | varies |
Segments réseau
Segment | Description | Exemples de services |
---|---|---|
mgmt
|
Management | pve, mon, bastion, ansible |
plat
|
Platform | db, api, pdns, dash, redis |
pub
|
Public | ns, vpn, lb, proxy |
int
|
Internal | rec, cache interne |
dmz
|
DMZ | services exposés avec restrictions |
Convention des instances
Instance | Rôle typique | Description |
---|---|---|
1
|
Primary/Leader/Active | Service principal actif |
2
|
Standby/Secondary/Passive | Haute disponibilité (failover) |
3+
|
Replicas/Workers | Scaling horizontal, load balancing |
Outils et validation
Script de génération de hostnames
#!/usr/bin/env python3
# generate-hostnames.py
def generate_infrastructure_hostnames(partner_domain, ip_block):
"""
Génère tous les hostnames d'infrastructure pour un partenaire
avec nomenclature mnémonique
"""
octets = ip_block.split('.')
base = f"{octets[0]}.{octets[1]}"
hostnames = {
"Management (mgmt)": {
f"pve1.mgmt.{partner_domain}": f"{base}.0.50",
f"pve2.mgmt.{partner_domain}": f"{base}.0.51",
f"pve3.mgmt.{partner_domain}": f"{base}.0.52",
f"pve-vip.mgmt.{partner_domain}": f"{base}.0.55",
f"mon1.mgmt.{partner_domain}": f"{base}.0.10",
f"log1.mgmt.{partner_domain}": f"{base}.0.11",
f"bastion1.mgmt.{partner_domain}": f"{base}.0.20",
f"ansible1.mgmt.{partner_domain}": f"{base}.0.21",
f"bkp1.mgmt.{partner_domain}": f"{base}.0.30",
f"nfs1.mgmt.{partner_domain}": f"{base}.0.40",
},
"Platform (plat)": {
f"db1.plat.{partner_domain}": f"{base}.1.10",
f"db2.plat.{partner_domain}": f"{base}.1.11",
f"dbr1.plat.{partner_domain}": f"{base}.1.12",
f"api1.plat.{partner_domain}": f"{base}.1.20",
f"api2.plat.{partner_domain}": f"{base}.1.21",
f"adm1.plat.{partner_domain}": f"{base}.1.25",
f"dash1.plat.{partner_domain}": f"{base}.1.30",
f"web1.plat.{partner_domain}": f"{base}.1.31",
f"pdns1.plat.{partner_domain}": f"{base}.1.40",
f"pdns2.plat.{partner_domain}": f"{base}.1.41",
f"redis1.plat.{partner_domain}": f"{base}.1.50",
},
"Public (pub)": {
f"ns1.pub.{partner_domain}": f"{base}.2.10",
f"ns2.pub.{partner_domain}": f"{base}.2.11",
f"vpn1.pub.{partner_domain}": f"{base}.2.20",
f"lb1.pub.{partner_domain}": f"{base}.2.30",
},
"Aliases": {
f"ns1.{partner_domain}": f"CNAME ns1.pub.{partner_domain}",
f"ns2.{partner_domain}": f"CNAME ns2.pub.{partner_domain}",
f"api.{partner_domain}": f"CNAME api1.plat.{partner_domain}",
f"dashboard.{partner_domain}": f"CNAME dash1.plat.{partner_domain}",
f"db-primary.{partner_domain}": f"CNAME db1.plat.{partner_domain}",
f"db-standby.{partner_domain}": f"CNAME db2.plat.{partner_domain}",
f"monitoring.{partner_domain}": f"CNAME mon1.mgmt.{partner_domain}",
f"vpn.{partner_domain}": f"CNAME vpn1.pub.{partner_domain}",
}
}
return hostnames
# Usage
if __name__ == "__main__":
import sys
if len(sys.argv) < 3:
print("Usage: python3 generate-hostnames.py <partner-domain> <ip-block>")
print("Example: python3 generate-hostnames.py chezlepro.ca 10.100.0.0/16")
sys.exit(1)
partner_domain = sys.argv[1]
ip_block = sys.argv[2].split('/')[0]
hostnames = generate_infrastructure_hostnames(partner_domain, ip_block)
print(f"\n# Infrastructure Hostnames - {partner_domain}")
print(f"# IP Block: {ip_block}/16\n")
for segment, hosts in