#!/bin/bash set -e # Chargement des variables d'environnement depuis .env (si prĂ©sent) set -a if [ -f .env ]; then . ./.env fi set +a SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" cd "$SCRIPT_DIR" # --- Gestion MySQL via Docker (si DB_ENGINE=mysql) --- if [ "$DB_ENGINE" == "mysql" ]; then MYSQL_CONTAINER="homelab-mysql" echo "🔍 Mode MySQL dĂ©tectĂ©. VĂ©rification du conteneur $MYSQL_CONTAINER..." # ParamĂštres par dĂ©faut si non dĂ©finis dans .env M_USER="${MYSQL_USER:-homelab}" M_PASS="${MYSQL_PASSWORD:-password}" M_DB="${MYSQL_DATABASE:-homelab}" M_PORT="${MYSQL_PORT:-3306}" M_ROOT_PASS="${MYSQL_ROOT_PASSWORD:-rootpassword}" if ! docker ps -a --format '{{.Names}}' | grep -q "^${MYSQL_CONTAINER}$"; then echo "🚀 CrĂ©ation du conteneur MySQL $MYSQL_CONTAINER..." docker run --name "$MYSQL_CONTAINER" \ -e MYSQL_ROOT_PASSWORD="$M_ROOT_PASS" \ -e MYSQL_DATABASE="$M_DB" \ -e MYSQL_USER="$M_USER" \ -e MYSQL_PASSWORD="$M_PASS" \ -p "$M_PORT:3306" \ -d mysql:8.0 --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci echo "⏳ Attente du dĂ©marrage de MySQL..." until docker exec "$MYSQL_CONTAINER" mysqladmin ping -h localhost --silent; do sleep 2 done echo "✅ MySQL est prĂȘt et base de donnĂ©es '$M_DB' créée." else if ! docker ps --format '{{.Names}}' | grep -q "^${MYSQL_CONTAINER}$"; then echo "▶ DĂ©marrage du conteneur MySQL existant..." docker start "$MYSQL_CONTAINER" echo "⏳ Attente du dĂ©marrage de MySQL..." until docker exec "$MYSQL_CONTAINER" mysqladmin ping -h localhost --silent; do sleep 2 done else echo "✅ Conteneur MySQL dĂ©jĂ  en cours d'exĂ©cution." fi # VĂ©rifier si la base de donnĂ©es existe, sinon la crĂ©er echo "Check/Create database $M_DB..." docker exec "$MYSQL_CONTAINER" mysql -uroot -p"$M_ROOT_PASS" -e "CREATE DATABASE IF NOT EXISTS \`$M_DB\`;" 2>/dev/null || \ docker exec "$MYSQL_CONTAINER" mysql -uroot -p"$M_ROOT_PASS" -e "CREATE DATABASE IF NOT EXISTS $M_DB;" fi # --- Gestion CloudBeaver (Interface Web MySQL) --- CLOUDBEAVER_CONTAINER="homelab-cloudbeaver" CLOUDBEAVER_PORT="${CLOUDBEAVER_PORT:-8080}" echo "🔍 VĂ©rification du conteneur $CLOUDBEAVER_CONTAINER..." if ! docker ps -a --format '{{.Names}}' | grep -q "^${CLOUDBEAVER_CONTAINER}$"; then echo "🚀 CrĂ©ation du conteneur CloudBeaver $CLOUDBEAVER_CONTAINER..." docker run --name "$CLOUDBEAVER_CONTAINER" \ -p "$CLOUDBEAVER_PORT:8978" \ -v cloudbeaver_data:/opt/cloudbeaver/workspace \ -d dbeaver/cloudbeaver:latest echo "✅ CloudBeaver est prĂȘt sur http://localhost:$CLOUDBEAVER_PORT" else if ! docker ps --format '{{.Names}}' | grep -q "^${CLOUDBEAVER_CONTAINER}$"; then echo "▶ DĂ©marrage du conteneur CloudBeaver existant..." docker start "$CLOUDBEAVER_CONTAINER" else echo "✅ Conteneur CloudBeaver dĂ©jĂ  en cours d'exĂ©cution." fi echo "🌐 CloudBeaver accessible sur http://localhost:$CLOUDBEAVER_PORT" fi # Forcer la DATABASE_URL correcte pour l'application si elle utilise des placeholders ou est absente # On reconstruit l'URL avec les variables rĂ©elles pour Ă©viter les erreurs de connexion export DATABASE_URL="mysql+aiomysql://$M_USER:$M_PASS@localhost:$M_PORT/$M_DB" echo "🔗 DATABASE_URL configurĂ©e pour MySQL." fi # Workaround pour WSL: SQLite ne fonctionne pas bien sur /mnt/c/... # Utiliser un chemin Linux natif pour la base de donnĂ©es (force override) uniquement en mode SQLite if [[ "$(pwd)" == /mnt/* ]] && [ "$DB_ENGINE" != "mysql" ]; then mkdir -p ~/homelab-data/logs export DATABASE_URL="sqlite+aiosqlite:////home/$USER/homelab-data/homelab.db" export LOGS_DIR="$HOME/homelab-data/logs" echo "⚠ WSL dĂ©tectĂ©: BD stockĂ©e dans ~/homelab-data/" fi # copier les clĂ©s SSH du rĂ©pertoire docker/ssh_keys vers ~/.ssh cp docker/ssh_keys/id_automation_ansible ~/.ssh/ cp docker/ssh_keys/id_automation_ansible.pub ~/.ssh/ # Forcer la clĂ© SSH utilisĂ©e par l'app (notamment pour le terminal web) export SSH_KEY_PATH="$HOME/.ssh/id_automation_ansible" # ajouter les droits aux clĂ©s SSH (sans changer le rĂ©pertoire courant du script) ( cd ~/.ssh chmod 600 id_automation_ansible chmod 644 id_automation_ansible.pub ) # Appliquer les migrations avant de dĂ©marrer l'app (important si la BD vient d'ĂȘtre supprimĂ©e) # Utiliser le venv du projet si prĂ©sent (important: dĂ©pendances runtime comme asyncssh) PYTHON_BIN="python" ALEMBIC_BIN="alembic" if [ -x ".venv/bin/python" ]; then PYTHON_BIN=".venv/bin/python" if [ -x ".venv/bin/alembic" ]; then ALEMBIC_BIN=".venv/bin/alembic" else ALEMBIC_BIN="$PYTHON_BIN -m alembic" fi fi # Les migrations sont gĂ©rĂ©es automatiquement par l'application au dĂ©marrage (init_db) # $ALEMBIC_BIN upgrade head # Commande de dĂ©marrage du backend FastAPI $PYTHON_BIN -m uvicorn main:app --host 0.0.0.0 --port 8008 --reload