#!/usr/bin/env bash set -euo pipefail # --- Dépendances --- # Vérifier que docopts est installé (pour Bash) if ! command -v docopts &> /dev/null; then echo "❌ Erreur : 'docopts' est requis pour Bash." >&2 echo "Installez-le avec : wget https://raw.githubusercontent.com/docopt/docopts/master/docopts && chmod +x docopts && sudo mv docopts /usr/local/bin/" >&2 exit 1 fi # --- Usage et documentation --- usage="Usage: $0 [options] Options: -h, --help Affiche ce message. -t, --template TEMPLATE Template LXC (ex: local:vztmpl/nixos-unstable-amd64-default_20260428_0830-rootfs.tar.gz). -r, --rootfs-size SIZE Taille du stockage racine (ex: 8G). -c, --cores CORES Nombre de cœurs CPU. -m, --memory MEMORY RAM en Mo. -s, --swap SWAP Swap en Mo. -p, --password PASSWORD Mot de passe root du conteneur. -b, --bridge BRIDGE Bridge réseau (ex: vmbr0). -v, --vlan VLAN VLAN (ex: tag=10). -d, --domain DOMAIN Domaine DNS. -u, --unprivileged UNPRIV Conteneur non privilégié (0 ou 1). -i, --ip IP IP statique (ex: 192.168.1.100/24). --pve-host HOST Hôte Proxmox (ex: pve). --pve-user USER Utilisateur Proxmox (ex: admin). --pve-port PORT Port SSH Proxmox (ex: 22). --pve-password PASSWORD Mot de passe pour l'authentification SSH sur Proxmox. --pve-ssh-key KEY Fichier de clé SSH pour l'authentification (ex: ~/.ssh/id_admin). " # --- Paramètres par défaut (variables d'environnement) --- # Serveur Proxmox PVE_HOST="${PVE_HOST:-}" PVE_USER="${PVE_USER:-admin}" PVE_PORT="${PVE_PORT:-22}" PVE_PASSWORD="${PVE_PASSWORD:-}" PVE_SSH_KEY="${PVE_SSH_KEY:-}" # Conteneur LXC TEMPLATE="${TEMPLATE:-local:vztmpl/nixos-unstable-amd64-default_20260428_0830-rootfs.tar.gz}" ROOTFS_SIZE="${ROOTFS_SIZE:-8G}" CORES="${CORES:-2}" MEMORY="${MEMORY:-2048}" SWAP="${SWAP:-1024}" PASSWORD="${PASSWORD:-changeme}" BRIDGE="${BRIDGE:-vmbr0}" VLAN="${VLAN:-}" DOMAIN="${DOMAIN:-lagraula.fr}" UNPRIVILEGED="${UNPRIVILEGED:-0}" IP="${IP:-}" # --- Parsing des arguments avec docopts (priorité la plus basse) --- args=$(docopts -h "$usage" : "$@") eval "$args" # Nom court de la machine (paramètre obligatoire) SHORT_NAME="${argv[0]:-}" if [ -z "$SHORT_NAME" ]; then echo "❌ Erreur : Le nom court de la machine est obligatoire." >&2 echo "$usage" >&2 exit 1 fi # --- Surcharge par /etc/nixos-infra/hosts/ (priorité moyenne) --- if [ -f "/etc/nixos-infra/hosts/$SHORT_NAME" ]; then echo "📄 Application des paramètres depuis /etc/nixos-infra/hosts/$SHORT_NAME..." set -a source "/etc/nixos-infra/hosts/$SHORT_NAME" set +a fi # --- Surcharge par ./ (priorité moyenne) --- if [ -f "./$SHORT_NAME" ]; then echo "📄 Application des paramètres depuis ./$SHORT_NAME..." set -a source "./$SHORT_NAME" set +a fi # --- Application des arguments de la ligne de commande (priorité la plus haute) --- eval "$args" # --- Gestion de la clé SSH par défaut --- if [ "$PVE_SSH_KEY" = "default" ]; then PVE_SSH_KEY="${HOME}/.ssh/id_${PVE_USER}" elif [ -z "$PVE_SSH_KEY" ] && [ -z "$PVE_PASSWORD" ]; then PVE_SSH_KEY="${HOME}/.ssh/id_${PVE_USER}" fi # --- Vérification des paramètres critiques --- if [ -z "$TEMPLATE" ] || [ -z "$ROOTFS_SIZE" ] || [ -z "$CORES" ] || \ [ -z "$MEMORY" ] || [ -z "$SWAP" ] || [ -z "$PASSWORD" ] || \ [ -z "$BRIDGE" ] || [ -z "$DOMAIN" ] || [ -z "$UNPRIVILEGED" ] || \ [ -z "$PVE_HOST" ] || [ -z "$PVE_USER" ] || [ -z "$PVE_PORT" ]; then echo "❌ Erreur : Un ou plusieurs paramètres critiques sont manquants." >&2 exit 1 fi # Vérification de l'authentification if [ -z "$PVE_PASSWORD" ]; then if [ -z "$PVE_SSH_KEY" ]; then echo "❌ Erreur : Aucun paramètre d'authentification (mot de passe ou clé SSH) n'est défini." >&2 exit 1 elif [ ! -f "$PVE_SSH_KEY" ]; then echo "❌ Erreur : Le fichier de clé SSH '$PVE_SSH_KEY' n'existe pas." >&2 exit 1 fi fi # --- Connexion SSH au serveur Proxmox --- run_proxmox() { local ssh_cmd="ssh -p $PVE_PORT" # Priorité à la clé SSH si elle est fournie et existe if [ -n "$PVE_SSH_KEY" ] && [ -f "$PVE_SSH_KEY" ]; then ssh_cmd="$ssh_cmd -i $PVE_SSH_KEY" else # Utiliser le mot de passe si la clé SSH n'est pas disponible ssh_cmd="$ssh_cmd -o PreferredAuthentications=password -o StrictHostKeyChecking=no" fi $ssh_cmd "$PVE_USER@$PVE_HOST" "$1" } # --- Construction des options réseau --- NET_OPTS="name=eth0,bridge=$BRIDGE" if [ -n "$VLAN" ]; then NET_OPTS="$NET_OPTS,$VLAN" fi if [ -n "$IP" ]; then NET_OPTS="$NET_OPTS,ip=$IP" fi # --- Création du conteneur --- echo "🚀 Création du conteneur LXC $SHORT_NAME sur $PVE_HOST..." LXC_ID=$(run_proxmox "pct create $ROOTFS_SIZE $TEMPLATE --cores $CORES --memory $MEMORY --swap $SWAP --hostname $SHORT_NAME.$DOMAIN --password $PASSWORD --unprivileged $UNPRIVILEGED --net0 $NET_OPTS --onboot 1" | grep -oP '\d+') if [ -z "$LXC_ID" ]; then echo "❌ Erreur : Échec de la création du conteneur." >&2 exit 1 fi echo "✅ Conteneur LXC $SHORT_NAME créé avec succès (ID: $LXC_ID)."