sqlserver_docker.sh

Note de lecture générée automatiquement

Le vrai fichier est scripts/bdd/sqlserver_docker.sh (Obsidian n’affiche pas les scripts eux-mêmes). Ne modifie pas cette note : modifie le script, puis relance python3 generer_vues_obsidian.py dans le dossier scripts.

Code

#!/usr/bin/env bash
# =============================================================================
# sqlserver_docker.sh — Gérer un SQL Server en conteneur Docker (Pop!_OS / Arch)
#
# Usage : ./sqlserver_docker.sh creer      → crée le conteneur (1re fois)
#         ./sqlserver_docker.sh demarrer   → démarre
#         ./sqlserver_docker.sh arreter    → arrête
#         ./sqlserver_docker.sh etat       → 🟢 / 🟡 / ⚪
#         ./sqlserver_docker.sh sqlcmd     → console SQL dans le conteneur
#         ./sqlserver_docker.sh sauvegarder <base>   → fichier .bak copié ici
#
# Variables modifiables : NOM_CONTENEUR, IMAGE, PORT
# Connexion depuis VS Code (extension SQL Server) : serveur localhost,1433 /
#   utilisateur sa / mot de passe choisi / "Trust server certificate" coché.
# =============================================================================
set -euo pipefail
 
NOM_CONTENEUR="${NOM_CONTENEUR:-sqlserver}"
IMAGE="${IMAGE:-mcr.microsoft.com/mssql/server:2022-latest}"   # ou :2025-latest
PORT="${PORT:-1433}"
VOLUME="${NOM_CONTENEUR}_donnees"
 
action="${1:-etat}"
 
sqlcmd_conteneur() {
  # sqlcmd est livré dans l'image ; -C = faire confiance au certificat auto-signé
  docker exec -it "$NOM_CONTENEUR" /opt/mssql-tools18/bin/sqlcmd -S localhost -U sa -C "$@"
}
 
case "$action" in
  creer)
    read -r -s -p "Mot de passe sa (8+ caractères, MAJ, min, chiffre, symbole) : " mot_de_passe_sa
    echo
    docker run -d --name "$NOM_CONTENEUR" --hostname "$NOM_CONTENEUR" \
      -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=$mot_de_passe_sa" -e "MSSQL_PID=Developer" \
      -p "$PORT:1433" -v "$VOLUME:/var/opt/mssql" \
      "$IMAGE"
    echo "Démarrage (20-30 s)…"
    for _ in $(seq 1 30); do
      if docker logs "$NOM_CONTENEUR" 2>&1 | grep -q "ready for client connections"; then
        echo "🟢 SQL Server prêt sur localhost,$PORT"
        exit 0
      fi
      sleep 2
    done
    echo "⚠ Pas encore prêt. Regarde : docker logs $NOM_CONTENEUR | tail -30"
    ;;
  demarrer) docker start "$NOM_CONTENEUR" && echo "🟢 démarré" ;;
  arreter)  docker stop "$NOM_CONTENEUR"  && echo "⚪ arrêté" ;;
  etat)
    statut=$(docker inspect -f '{{.State.Status}}' "$NOM_CONTENEUR" 2>/dev/null || echo "absent")
    case "$statut" in
      running)            echo "🟢 SQL Server en marche (port $PORT)" ;;
      created|restarting) echo "🟡 SQL Server en cours de démarrage" ;;
      absent)             echo "⚪ Aucun conteneur '$NOM_CONTENEUR' : lance '$0 creer'" ;;
      *)                  echo "⚪ SQL Server arrêté ($statut)" ;;
    esac
    ;;
  sqlcmd) sqlcmd_conteneur ;;
  sauvegarder)
    base="${2:?Usage : $0 sauvegarder <nom_de_la_base>}"
    fichier="${base}-$(date +%Y-%m-%dT%H-%M).bak"
    sqlcmd_conteneur -Q "BACKUP DATABASE [$base] TO DISK = N'/var/opt/mssql/data/$fichier' WITH INIT, COMPRESSION"
    docker cp "$NOM_CONTENEUR:/var/opt/mssql/data/$fichier" "./$fichier"
    echo "Sauvegarde copiée : ./$fichier"
    ;;
  *) sed -n '2,16p' "$0"; exit 1 ;;
esac