diff --git a/README.md b/README.md index e58c09f..1315bc7 100644 --- a/README.md +++ b/README.md @@ -48,6 +48,14 @@ Le déploiement dans le LXC n'utilise pas Docker. Le script installe `nginx`, `g --proxmox-password 'secret' ``` +Version "curl | bash" : + +```bash +bash -c "$(curl -fsSL https://git.jeannerot.fr/christophe/chesscubing/raw/branch/main/install-chesscubing-proxmox.sh)" +``` + +Cette version pose les questions nécessaires si les variables d'environnement ne sont pas déjà définies. + Valeurs par défaut utiles : - LXC nommé `chesscubing-web` @@ -79,6 +87,12 @@ Options utiles si besoin : --ctid 120 ``` +Version "curl | bash" : + +```bash +bash -c "$(curl -fsSL https://git.jeannerot.fr/christophe/chesscubing/raw/branch/main/update-chesscubing-proxmox.sh)" +``` + On peut aussi cibler le conteneur par nom si on n'a pas le `CTID` : ```bash diff --git a/install-chesscubing-proxmox.sh b/install-chesscubing-proxmox.sh new file mode 100755 index 0000000..47f29ab --- /dev/null +++ b/install-chesscubing-proxmox.sh @@ -0,0 +1,202 @@ +#!/usr/bin/env bash +set -euo pipefail + +REPO_URL="https://git.jeannerot.fr/christophe/chesscubing.git" +REPO_BRANCH="${CHESSCUBING_GIT_BRANCH:-main}" + +usage() { + cat <<'EOF' +Bootstrap d'installation ChessCubing pour Proxmox. + +Usage local : + ./install-chesscubing-proxmox.sh + +Usage en une ligne : + bash -c "$(curl -fsSL https://git.jeannerot.fr/christophe/chesscubing/raw/branch/main/install-chesscubing-proxmox.sh)" + +Variables d'environnement reconnues : + CHESSCUBING_PROXMOX_HOST + CHESSCUBING_PROXMOX_USER + CHESSCUBING_PROXMOX_PASSWORD + CHESSCUBING_SSH_PORT + CHESSCUBING_CTID + CHESSCUBING_LXC_HOSTNAME + CHESSCUBING_LXC_IP + CHESSCUBING_LXC_GATEWAY + CHESSCUBING_LXC_BRIDGE + CHESSCUBING_LXC_CORES + CHESSCUBING_LXC_MEMORY + CHESSCUBING_LXC_SWAP + CHESSCUBING_LXC_DISK_GB + CHESSCUBING_TEMPLATE_STORAGE + CHESSCUBING_ROOTFS_STORAGE + CHESSCUBING_LXC_PASSWORD + CHESSCUBING_GIT_BRANCH +EOF +} + +die() { + printf 'Erreur: %s\n' "$*" >&2 + exit 1 +} + +have_cmd() { + command -v "$1" >/dev/null 2>&1 +} + +install_pkg_if_missing() { + local missing=() + local pkg="" + + for pkg in "$@"; do + if ! have_cmd "$pkg"; then + missing+=("$pkg") + fi + done + + if [[ ${#missing[@]} -eq 0 ]]; then + return 0 + fi + + if ! have_cmd apt-get; then + die "Commandes manquantes: ${missing[*]}. Installe-les manuellement." + fi + + printf 'Installation des dépendances manquantes: %s\n' "${missing[*]}" + if have_cmd sudo && [[ "${EUID}" -ne 0 ]]; then + sudo apt-get update + sudo apt-get install -y git sshpass openssh-client ca-certificates + elif [[ "${EUID}" -eq 0 ]]; then + apt-get update + apt-get install -y git sshpass openssh-client ca-certificates + else + die "git/sshpass manquent et sudo n'est pas disponible." + fi +} + +prompt_default() { + local var_name="$1" + local prompt_label="$2" + local default_value="${3:-}" + local current_value="${!var_name:-}" + local input="" + + if [[ -n "$current_value" ]]; then + return 0 + fi + + if [[ -n "$default_value" ]]; then + read -r -p "$prompt_label [$default_value]: " input + printf -v "$var_name" '%s' "${input:-$default_value}" + else + read -r -p "$prompt_label: " input + printf -v "$var_name" '%s' "$input" + fi +} + +prompt_secret() { + local var_name="$1" + local prompt_label="$2" + local current_value="${!var_name:-}" + + if [[ -n "$current_value" ]]; then + return 0 + fi + + read -rsp "$prompt_label: " current_value + echo + printf -v "$var_name" '%s' "$current_value" +} + +if [[ "${1:-}" == "--help" || "${1:-}" == "-h" ]]; then + usage + exit 0 +fi + +install_pkg_if_missing git ssh sshpass + +PROXMOX_HOST="${CHESSCUBING_PROXMOX_HOST:-}" +PROXMOX_USER="${CHESSCUBING_PROXMOX_USER:-}" +PROXMOX_PASSWORD="${CHESSCUBING_PROXMOX_PASSWORD:-}" +SSH_PORT="${CHESSCUBING_SSH_PORT:-22}" +CTID="${CHESSCUBING_CTID:-}" +LXC_HOSTNAME="${CHESSCUBING_LXC_HOSTNAME:-chesscubing-web}" +LXC_IP="${CHESSCUBING_LXC_IP:-dhcp}" +LXC_GATEWAY="${CHESSCUBING_LXC_GATEWAY:-}" +LXC_BRIDGE="${CHESSCUBING_LXC_BRIDGE:-vmbr0}" +LXC_CORES="${CHESSCUBING_LXC_CORES:-2}" +LXC_MEMORY="${CHESSCUBING_LXC_MEMORY:-1024}" +LXC_SWAP="${CHESSCUBING_LXC_SWAP:-512}" +LXC_DISK_GB="${CHESSCUBING_LXC_DISK_GB:-6}" +TEMPLATE_STORAGE="${CHESSCUBING_TEMPLATE_STORAGE:-}" +ROOTFS_STORAGE="${CHESSCUBING_ROOTFS_STORAGE:-}" +LXC_PASSWORD="${CHESSCUBING_LXC_PASSWORD:-}" + +default_host="" +if have_cmd pct && have_cmd pveam; then + default_host="127.0.0.1" +fi + +prompt_default PROXMOX_HOST "IP ou nom du serveur Proxmox" "$default_host" +prompt_default PROXMOX_USER "Utilisateur SSH Proxmox" "root@pam" +prompt_secret PROXMOX_PASSWORD "Mot de passe SSH Proxmox" +prompt_default SSH_PORT "Port SSH Proxmox" "22" +prompt_default CTID "CTID Proxmox (laisser vide pour auto)" "" +prompt_default LXC_HOSTNAME "Nom du LXC" "chesscubing-web" +prompt_default LXC_IP "IP du LXC ou dhcp" "dhcp" +if [[ "$LXC_IP" != "dhcp" ]]; then + prompt_default LXC_GATEWAY "Passerelle du LXC" "" +fi +prompt_default LXC_BRIDGE "Bridge réseau Proxmox" "vmbr0" + +[[ -n "$PROXMOX_HOST" ]] || die "Le serveur Proxmox est obligatoire." +[[ -n "$PROXMOX_USER" ]] || die "L'utilisateur Proxmox est obligatoire." +[[ -n "$PROXMOX_PASSWORD" ]] || die "Le mot de passe Proxmox est obligatoire." + +TMP_DIR="$(mktemp -d)" +cleanup() { + rm -rf "$TMP_DIR" +} +trap cleanup EXIT + +printf 'Clonage temporaire du dépôt ChessCubing...\n' +git clone --depth 1 --branch "$REPO_BRANCH" "$REPO_URL" "$TMP_DIR/repo" >/dev/null 2>&1 + +cmd=( + "$TMP_DIR/repo/scripts/install-proxmox-lxc.sh" + --proxmox-host "$PROXMOX_HOST" + --proxmox-user "$PROXMOX_USER" + --proxmox-password "$PROXMOX_PASSWORD" + --ssh-port "$SSH_PORT" + --hostname "$LXC_HOSTNAME" + --lxc-ip "$LXC_IP" + --bridge "$LXC_BRIDGE" + --cores "$LXC_CORES" + --memory "$LXC_MEMORY" + --swap "$LXC_SWAP" + --disk-gb "$LXC_DISK_GB" + --branch "$REPO_BRANCH" +) + +if [[ -n "$CTID" ]]; then + cmd+=(--ctid "$CTID") +fi + +if [[ -n "$LXC_GATEWAY" ]]; then + cmd+=(--gateway "$LXC_GATEWAY") +fi + +if [[ -n "$TEMPLATE_STORAGE" ]]; then + cmd+=(--template-storage "$TEMPLATE_STORAGE") +fi + +if [[ -n "$ROOTFS_STORAGE" ]]; then + cmd+=(--rootfs-storage "$ROOTFS_STORAGE") +fi + +if [[ -n "$LXC_PASSWORD" ]]; then + cmd+=(--lxc-password "$LXC_PASSWORD") +fi + +printf 'Lancement de l’installation LXC ChessCubing...\n' +"${cmd[@]}" diff --git a/update-chesscubing-proxmox.sh b/update-chesscubing-proxmox.sh new file mode 100755 index 0000000..f085048 --- /dev/null +++ b/update-chesscubing-proxmox.sh @@ -0,0 +1,158 @@ +#!/usr/bin/env bash +set -euo pipefail + +REPO_URL="https://git.jeannerot.fr/christophe/chesscubing.git" +REPO_BRANCH="${CHESSCUBING_GIT_BRANCH:-main}" + +usage() { + cat <<'EOF' +Bootstrap de mise à jour ChessCubing pour Proxmox. + +Usage local : + ./update-chesscubing-proxmox.sh + +Usage en une ligne : + bash -c "$(curl -fsSL https://git.jeannerot.fr/christophe/chesscubing/raw/branch/main/update-chesscubing-proxmox.sh)" + +Variables d'environnement reconnues : + CHESSCUBING_PROXMOX_HOST + CHESSCUBING_PROXMOX_USER + CHESSCUBING_PROXMOX_PASSWORD + CHESSCUBING_SSH_PORT + CHESSCUBING_CTID + CHESSCUBING_LXC_HOSTNAME + CHESSCUBING_GIT_BRANCH +EOF +} + +die() { + printf 'Erreur: %s\n' "$*" >&2 + exit 1 +} + +have_cmd() { + command -v "$1" >/dev/null 2>&1 +} + +install_pkg_if_missing() { + local missing=() + local pkg="" + + for pkg in "$@"; do + if ! have_cmd "$pkg"; then + missing+=("$pkg") + fi + done + + if [[ ${#missing[@]} -eq 0 ]]; then + return 0 + fi + + if ! have_cmd apt-get; then + die "Commandes manquantes: ${missing[*]}. Installe-les manuellement." + fi + + printf 'Installation des dépendances manquantes: %s\n' "${missing[*]}" + if have_cmd sudo && [[ "${EUID}" -ne 0 ]]; then + sudo apt-get update + sudo apt-get install -y git sshpass openssh-client ca-certificates + elif [[ "${EUID}" -eq 0 ]]; then + apt-get update + apt-get install -y git sshpass openssh-client ca-certificates + else + die "git/sshpass manquent et sudo n'est pas disponible." + fi +} + +prompt_default() { + local var_name="$1" + local prompt_label="$2" + local default_value="${3:-}" + local current_value="${!var_name:-}" + local input="" + + if [[ -n "$current_value" ]]; then + return 0 + fi + + if [[ -n "$default_value" ]]; then + read -r -p "$prompt_label [$default_value]: " input + printf -v "$var_name" '%s' "${input:-$default_value}" + else + read -r -p "$prompt_label: " input + printf -v "$var_name" '%s' "$input" + fi +} + +prompt_secret() { + local var_name="$1" + local prompt_label="$2" + local current_value="${!var_name:-}" + + if [[ -n "$current_value" ]]; then + return 0 + fi + + read -rsp "$prompt_label: " current_value + echo + printf -v "$var_name" '%s' "$current_value" +} + +if [[ "${1:-}" == "--help" || "${1:-}" == "-h" ]]; then + usage + exit 0 +fi + +install_pkg_if_missing git ssh sshpass + +PROXMOX_HOST="${CHESSCUBING_PROXMOX_HOST:-}" +PROXMOX_USER="${CHESSCUBING_PROXMOX_USER:-}" +PROXMOX_PASSWORD="${CHESSCUBING_PROXMOX_PASSWORD:-}" +SSH_PORT="${CHESSCUBING_SSH_PORT:-22}" +CTID="${CHESSCUBING_CTID:-}" +LXC_HOSTNAME="${CHESSCUBING_LXC_HOSTNAME:-chesscubing-web}" + +default_host="" +if have_cmd pct && have_cmd pveam; then + default_host="127.0.0.1" +fi + +prompt_default PROXMOX_HOST "IP ou nom du serveur Proxmox" "$default_host" +prompt_default PROXMOX_USER "Utilisateur SSH Proxmox" "root@pam" +prompt_secret PROXMOX_PASSWORD "Mot de passe SSH Proxmox" +prompt_default SSH_PORT "Port SSH Proxmox" "22" +prompt_default CTID "CTID du LXC (laisser vide pour rechercher par nom)" "" +if [[ -z "$CTID" ]]; then + prompt_default LXC_HOSTNAME "Nom du LXC" "chesscubing-web" +fi + +[[ -n "$PROXMOX_HOST" ]] || die "Le serveur Proxmox est obligatoire." +[[ -n "$PROXMOX_USER" ]] || die "L'utilisateur Proxmox est obligatoire." +[[ -n "$PROXMOX_PASSWORD" ]] || die "Le mot de passe Proxmox est obligatoire." + +TMP_DIR="$(mktemp -d)" +cleanup() { + rm -rf "$TMP_DIR" +} +trap cleanup EXIT + +printf 'Clonage temporaire du dépôt ChessCubing...\n' +git clone --depth 1 --branch "$REPO_BRANCH" "$REPO_URL" "$TMP_DIR/repo" >/dev/null 2>&1 + +cmd=( + "$TMP_DIR/repo/scripts/update-proxmox-lxc.sh" + --proxmox-host "$PROXMOX_HOST" + --proxmox-user "$PROXMOX_USER" + --proxmox-password "$PROXMOX_PASSWORD" + --ssh-port "$SSH_PORT" + --branch "$REPO_BRANCH" +) + +if [[ -n "$CTID" ]]; then + cmd+=(--ctid "$CTID") +else + cmd+=(--hostname "$LXC_HOSTNAME") +fi + +printf 'Lancement de la mise à jour ChessCubing...\n' +"${cmd[@]}"