7.7 KiB
7.7 KiB
03 — Setup Hetzner Cloud
Création du compte et du projet
1. Créer le compte Hetzner
- Rendez-vous sur https://console.hetzner.cloud
- Créez votre compte (email + CB requis)
- Activez la vérification 2FA (obligatoire en production)
- Créez un nouveau projet :
xpeditis-prod
2. Générer le token API
- Dans le projet
xpeditis-prod→ Security → API Tokens - Generate API Token
- Name:
hetzner-k3s-deploy - Permissions: Read & Write
- Name:
- Copiez le token immédiatement (affiché une seule fois)
# Configurez hcloud avec ce token
hcloud context create xpeditis-prod
# → Entrez votre token
# Vérification
hcloud server list
# Output: ID NAME STATUS IPV4 IPV6 DATACENTER
# (liste vide si première fois)
3. Ajouter la clé SSH
# Via CLI hcloud
hcloud ssh-key create \
--name xpeditis-deploy \
--public-key-from-file ~/.ssh/xpeditis_hetzner.pub
# Vérification
hcloud ssh-key list
# ID NAME FINGERPRINT
# 1234567 xpeditis-deploy xx:xx:xx:...
Réseau privé (obligatoire pour la sécurité inter-nœuds)
Le réseau privé permet aux nœuds de communiquer entre eux sans passer par internet.
# Créer le réseau privé
hcloud network create \
--name xpeditis-network \
--ip-range 10.0.0.0/16
# Récupérer l'ID du réseau (nécessaire pour la config k3s)
hcloud network list
# ID NAME IP RANGE SERVERS
# 12345 xpeditis-network 10.0.0.0/16 0 servers
export HETZNER_NETWORK_ID=12345 # Remplacer par votre ID
# Créer un sous-réseau pour les nœuds du cluster
hcloud network add-subnet xpeditis-network \
--type cloud \
--network-zone eu-central \
--ip-range 10.0.1.0/24
Firewall (règles de sécurité)
Créez un firewall strict. Les workers ne doivent être accessibles que via le Load Balancer et depuis votre IP pour SSH.
# Créer le firewall
hcloud firewall create --name xpeditis-firewall
# Règle 1 : SSH depuis votre IP uniquement
hcloud firewall add-rule xpeditis-firewall \
--direction in \
--protocol tcp \
--port 22 \
--source-ips "$(curl -s https://api.ipify.org)/32" \
--description "SSH depuis mon IP"
# Règle 2 : HTTP/HTTPS depuis partout (via LB → workers)
hcloud firewall add-rule xpeditis-firewall \
--direction in \
--protocol tcp \
--port 80 \
--source-ips 0.0.0.0/0 \
--description "HTTP public"
hcloud firewall add-rule xpeditis-firewall \
--direction in \
--protocol tcp \
--port 443 \
--source-ips 0.0.0.0/0 \
--description "HTTPS public"
# Règle 3 : Kubernetes API (votre IP + réseau privé Hetzner)
hcloud firewall add-rule xpeditis-firewall \
--direction in \
--protocol tcp \
--port 6443 \
--source-ips "$(curl -s https://api.ipify.org)/32" \
--description "kube-apiserver depuis mon IP"
hcloud firewall add-rule xpeditis-firewall \
--direction in \
--protocol tcp \
--port 6443 \
--source-ips 10.0.0.0/16 \
--description "kube-apiserver depuis réseau privé"
# Règle 4 : Communication inter-nœuds (réseau privé uniquement)
hcloud firewall add-rule xpeditis-firewall \
--direction in \
--protocol tcp \
--port 1-65535 \
--source-ips 10.0.0.0/16 \
--description "Trafic interne cluster"
hcloud firewall add-rule xpeditis-firewall \
--direction in \
--protocol udp \
--port 1-65535 \
--source-ips 10.0.0.0/16 \
--description "Trafic UDP interne cluster"
# Règle 5 : ICMP (ping) pour monitoring
hcloud firewall add-rule xpeditis-firewall \
--direction in \
--protocol icmp \
--source-ips 0.0.0.0/0 \
--description "ICMP ping"
# Vérification
hcloud firewall describe xpeditis-firewall
Object Storage — Setup du bucket S3
Créer le bucket
- Dans la console Hetzner → votre projet → Object Storage
- Cliquez Create Bucket
- Location: Falkenstein (fsn1) (même région que vos serveurs)
- Bucket name:
xpeditis-prod - Visibility: Private (obligatoire)
- Cliquez Create
Créer les credentials S3
- Dans Object Storage → Access Keys
- Generate Access Key
- Name:
xpeditis-backend
- Name:
- Notez bien les deux valeurs (affichées une seule fois) :
- Access Key (commence par
htz...) - Secret Key (longue chaîne)
- Access Key (commence par
Vérifier avec AWS CLI
# Configurer AWS CLI pour Hetzner Object Storage
aws configure --profile hetzner
# AWS Access Key ID: <votre_access_key>
# AWS Secret Access Key: <votre_secret_key>
# Default region name: eu-central-1
# Default output format: json
# Tester la connexion
aws s3 ls --profile hetzner \
--endpoint-url https://fsn1.your-objectstorage.com
# Créer un dossier de test
aws s3 cp /dev/null s3://xpeditis-prod/test/.gitkeep \
--profile hetzner \
--endpoint-url https://fsn1.your-objectstorage.com
# Vérifier
aws s3 ls s3://xpeditis-prod/ \
--profile hetzner \
--endpoint-url https://fsn1.your-objectstorage.com
Structure du bucket recommandée
xpeditis-prod/
├── documents/ # Documents carrier (PDF, XLS, images)
│ └── {orgId}/
│ └── {bookingId}/
│ └── {filename}
├── pdfs/ # PDFs de confirmation booking
│ └── {year}/
│ └── {month}/
│ └── {bookingNumber}.pdf
├── exports/ # Exports CSV/Excel des bookings
│ └── {orgId}/
│ └── {timestamp}-bookings.xlsx
├── logos/ # Logos des organisations
│ └── {orgId}/
│ └── logo.{ext}
└── backups/ # Backups PostgreSQL (voir doc 13)
└── {date}/
└── xpeditis-{timestamp}.sql.gz
Volumes Hetzner (si PostgreSQL self-hosted)
Si vous choisissez d'héberger PostgreSQL sur Hetzner (voir doc 07), créez un volume dédié :
# Créer un volume de 50 GB pour PostgreSQL
hcloud volume create \
--name xpeditis-postgres-data \
--size 50 \
--location fsn1 \
--format ext4
# L'ID sera utilisé dans la config k3s pour le PersistentVolume
hcloud volume list
# ID NAME SIZE SERVER LOCATION
# 67890 xpeditis-postgres-data 50 GB - fsn1
Placement Groups (haute disponibilité)
Les placement groups garantissent que vos workers sont sur des hôtes physiques différents :
# Créer un placement group "spread" (workers sur différents hôtes physiques)
hcloud placement-group create \
--name xpeditis-workers \
--type spread
# Noter l'ID pour la config hetzner-k3s
hcloud placement-group list
# ID NAME TYPE SERVERS
# 111 xpeditis-workers spread 0
Récapitulatif des IDs à noter
Après cette étape, vous devez avoir :
# À sauvegarder dans ~/.xpeditis-deploy.env
export HCLOUD_TOKEN="<votre_token>"
export HCLOUD_NETWORK_ID="12345" # ID du réseau privé
export HCLOUD_SSH_KEY_NAME="xpeditis-deploy"
export HCLOUD_FIREWALL_NAME="xpeditis-firewall"
export HCLOUD_PLACEMENT_GROUP_NAME="xpeditis-workers"
# Object Storage
export HETZNER_S3_ENDPOINT="https://fsn1.your-objectstorage.com"
export HETZNER_S3_BUCKET="xpeditis-prod"
export HETZNER_S3_ACCESS_KEY="<access_key>"
export HETZNER_S3_SECRET_KEY="<secret_key>"
Vérification globale
# Tout doit être en place avant de continuer vers le doc 04/05
echo "=== Network ===" && hcloud network list
echo "=== SSH Keys ===" && hcloud ssh-key list
echo "=== Firewalls ===" && hcloud firewall list
echo "=== Volumes ===" && hcloud volume list
echo "=== Placement Groups ===" && hcloud placement-group list
echo "=== Object Storage ===" && aws s3 ls s3://xpeditis-prod/ \
--profile hetzner \
--endpoint-url https://fsn1.your-objectstorage.com 2>/dev/null && echo "✅ Bucket accessible" || echo "❌ Bucket inaccessible"