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

  1. Philosophie de nomenclature
  2. Principes mnémoniques
  3. Architecture multi-tenant
  4. Codes mnémoniques des services
  5. Structure des hostnames
  6. Exemples complets par partenaire
  7. Nomenclature des zones tenant
  8. Tables de référence
  9. Outils et validation

Philosophie de nomenclature

Objectifs

  1. Mnémonique : Facile à retenir et à deviner
  2. Cohérent : Même logique partout
  3. Scalable : Fonctionne pour 1 ou 1000 serveurs
  4. 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/Leader
    • 2 = Standby/Secondary
    • 3+ = 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