# 02 — Prérequis Tout ce dont vous avez besoin avant de commencer le déploiement. --- ## Comptes à créer ### Obligatoires | Service | URL | Usage | Coût | |---|---|---|---| | **Hetzner Cloud** | https://console.hetzner.cloud | Serveurs, LB, Object Storage | Pay-as-you-go | | **GitHub** | https://github.com | Code + GitHub Actions + GHCR (images Docker) | Gratuit | | **Cloudflare** | https://cloudflare.com | DNS + WAF + CDN | Gratuit (plan Free) | | **Neon.tech** | https://neon.tech | PostgreSQL managé | Free → $19/mois Pro | ### Recommandés (peuvent être substitués) | Service | URL | Usage | Coût | |---|---|---|---| | **Upstash** | https://upstash.com | Redis serverless | Free → $10/mois | | **Brevo** | https://brevo.com | Email SMTP (remplace SendGrid) | Gratuit jusqu'à 300/j | | **Sentry** | https://sentry.io | Error tracking | Gratuit (5K events/mois) | --- ## Outils locaux à installer ### Outils essentiels ```bash # macOS (avec Homebrew) brew install kubectl helm hcloud vitobotta/tap/hetzner-k3s # Vérification versions minimales requises kubectl version --client # >= 1.28 helm version # >= 3.12 hcloud version # >= 1.40 hetzner-k3s version # >= 3.0 ``` ```bash # Ubuntu/Debian # kubectl curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl" chmod +x kubectl && sudo mv kubectl /usr/local/bin/ # helm curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash # hcloud CLI curl -Lo hcloud.tar.gz https://github.com/hetznercloud/cli/releases/latest/download/hcloud-linux-amd64.tar.gz tar -xzf hcloud.tar.gz && sudo mv hcloud /usr/local/bin/ # hetzner-k3s curl -Lo hetzner-k3s https://github.com/vitobotta/hetzner-k3s/releases/latest/download/hetzner-k3s-linux-amd64 chmod +x hetzner-k3s && sudo mv hetzner-k3s /usr/local/bin/ ``` ### Outils optionnels mais recommandés ```bash # kubectx + kubens — changer de contexte/namespace facilement brew install kubectx # k9s — interface terminal pour Kubernetes (très utile) brew install k9s # stern — logs multi-pods en temps réel brew install stern # AWS CLI v2 — pour interagir avec Hetzner Object Storage brew install awscli # Docker — pour build et test des images en local brew install --cask docker ``` --- ## Clés SSH Générez une paire de clés SSH dédiée pour Hetzner (ne réutilisez pas votre clé perso) : ```bash # Générer une clé ED25519 (plus sécurisée et performante que RSA) ssh-keygen -t ed25519 -C "xpeditis-hetzner-deploy" -f ~/.ssh/xpeditis_hetzner # Résultat : # ~/.ssh/xpeditis_hetzner (clé privée — ne JAMAIS partager) # ~/.ssh/xpeditis_hetzner.pub (clé publique — à ajouter sur Hetzner) # Vérification cat ~/.ssh/xpeditis_hetzner.pub # ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI... xpeditis-hetzner-deploy ``` Ajoutez la clé publique dans `~/.ssh/config` pour faciliter la connexion : ```bash cat >> ~/.ssh/config << 'EOF' Host hetzner-xpeditis-* IdentityFile ~/.ssh/xpeditis_hetzner User root StrictHostKeyChecking no EOF ``` --- ## Nom de domaine Vous avez besoin d'un domaine avec accès à la gestion DNS. Ce guide suppose : | Domaine | Usage | |---|---| | `xpeditis.com` (ou votre domaine) | Site principal | | `api.xpeditis.com` | API NestJS backend | | `app.xpeditis.com` | Frontend Next.js | | `monitoring.xpeditis.com` | Grafana (optionnel, accès restreint) | **Si vous n'avez pas encore de domaine :** Namecheap (~$10/an) ou OVHcloud (~€7/an). Une fois acheté, déléguez les DNS à Cloudflare (gratuit, meilleur outil DNS). ### Déléguer le DNS à Cloudflare 1. Créez un compte sur https://cloudflare.com 2. "Add a Site" → entrez votre domaine 3. Cloudflare scanne vos DNS existants 4. Copiez les 2 nameservers Cloudflare (ex: `carl.ns.cloudflare.com`) 5. Chez votre registrar, remplacez les nameservers par ceux de Cloudflare 6. Attendez 5-30 min pour la propagation --- ## Variables d'environnement de travail Créez un fichier `.env.deploy` (ne pas committer) pour centraliser vos variables de déploiement : ```bash # Fichier : ~/.xpeditis-deploy.env # Source ce fichier avant de travailler : source ~/.xpeditis-deploy.env # Hetzner export HCLOUD_TOKEN="" export HETZNER_SSH_KEY_PATH="$HOME/.ssh/xpeditis_hetzner" # Kubernetes export KUBECONFIG="$HOME/.kube/kubeconfig-xpeditis-prod" # Domaine export DOMAIN="xpeditis.com" export API_DOMAIN="api.xpeditis.com" export APP_DOMAIN="app.xpeditis.com" # Registry Docker (GitHub Container Registry) export GHCR_REGISTRY="ghcr.io" export GHCR_ORG="" export BACKEND_IMAGE="$GHCR_REGISTRY/$GHCR_ORG/xpeditis-backend" export FRONTEND_IMAGE="$GHCR_REGISTRY/$GHCR_ORG/xpeditis-frontend" # PostgreSQL (Neon.tech) export DATABASE_URL="postgresql://user:pass@host/dbname?sslmode=require" # Redis (Upstash) export REDIS_HOST="your-redis.upstash.io" export REDIS_PORT="6379" export REDIS_PASSWORD="" # Hetzner Object Storage export HETZNER_S3_BUCKET="xpeditis-prod" export HETZNER_S3_ENDPOINT="https://fsn1.your-objectstorage.com" export HETZNER_S3_ACCESS_KEY="" export HETZNER_S3_SECRET_KEY="" ``` --- ## Checklist avant de démarrer ``` □ Compte Hetzner Cloud créé et vérifié (CB enregistrée) □ Compte GitHub avec repo xpeditis2.0 (ou fork) □ Compte Cloudflare avec domaine délégué □ Compte Neon.tech créé □ Compte Upstash créé (optionnel) □ kubectl installé (>= 1.28) □ helm installé (>= 3.12) □ hcloud CLI installé et configuré □ hetzner-k3s installé □ Paire de clés SSH ED25519 générée pour Hetzner □ Docker installé (pour build local) □ Domaine + sous-domaines api. et app. planifiés ``` --- ## Configuration hcloud CLI ```bash # Configurer le token Hetzner hcloud context create xpeditis-prod # Entrez votre token quand demandé # Vérifier la configuration hcloud context list hcloud server list # Doit retourner une liste vide (ou vos serveurs) # Lister les types de serveurs disponibles hcloud server-type list # Lister les images disponibles hcloud image list --type system | grep ubuntu ``` --- ## Vérification finale ```bash # Tous ces checks doivent passer avant de continuer echo "=== Vérification des outils ===" kubectl version --client --short 2>/dev/null && echo "✅ kubectl OK" || echo "❌ kubectl manquant" helm version --short 2>/dev/null && echo "✅ helm OK" || echo "❌ helm manquant" hcloud version 2>/dev/null && echo "✅ hcloud OK" || echo "❌ hcloud manquant" hetzner-k3s version 2>/dev/null && echo "✅ hetzner-k3s OK" || echo "❌ hetzner-k3s manquant" docker --version 2>/dev/null && echo "✅ docker OK" || echo "❌ docker manquant" ssh-keygen -l -f ~/.ssh/xpeditis_hetzner.pub 2>/dev/null && echo "✅ SSH key OK" || echo "❌ Clé SSH manquante" echo "" echo "=== Vérification des tokens ===" hcloud context list 2>/dev/null | grep xpeditis && echo "✅ hcloud context OK" || echo "❌ hcloud context non configuré" ```