#!/usr/bin/env bash # ───────────────────────────────────────────────────────────────────────────── # MesRelevés — Installation initiale (déploiement Docker) # # Usage : ./install.sh # # Prérequis : Docker + Docker Compose v2 # ───────────────────────────────────────────────────────────────────────────── set -euo pipefail COMPOSE="docker compose -f docker-compose.prod.yml" echo "────────────────────────────────────────────" echo " MesRelevés — Installation" echo "────────────────────────────────────────────" # ── Prérequis ───────────────────────────────────────────────────────────────── command -v docker >/dev/null 2>&1 || { echo "Erreur : Docker n'est pas installé."; exit 1; } docker compose version >/dev/null 2>&1 || { echo "Erreur : Docker Compose v2 requis."; exit 1; } # ── Fichier .env ────────────────────────────────────────────────────────────── if [ ! -f .env ]; then cp .env.example .env echo "" echo "→ Fichier .env créé depuis .env.example." echo " Éditez .env avec vos paramètres (DB_PASSWORD, MAIL_*, APP_URL, etc.)" echo " puis relancez ce script." echo "" exit 0 fi # Vérification DB_PASSWORD obligatoire if grep -qE "^DB_PASSWORD=$" .env; then echo "Erreur : DB_PASSWORD n'est pas défini dans .env." exit 1 fi # ── Structure storage ───────────────────────────────────────────────────────── mkdir -p storage/{app/backups,framework/{cache,sessions,views},logs} mkdir -p bootstrap/cache # ── Démarrage des services ──────────────────────────────────────────────────── echo "→ Construction de l'image Docker..." $COMPOSE build echo "→ Démarrage des services (db, redis, app, nginx)..." $COMPOSE up -d echo "→ Attente de la base de données..." until $COMPOSE exec -T db pg_isready -U "${DB_USERNAME:-mesreleves}" >/dev/null 2>&1; do sleep 2 done echo " Base de données prête." # Attendre que l'entrypoint termine (composer install, caches) sleep 8 # ── Migrations ──────────────────────────────────────────────────────────────── echo "→ Migration de la base de données..." $COMPOSE exec app php artisan migrate --force # ── Lien storage ────────────────────────────────────────────────────────────── $COMPOSE exec app php artisan storage:link 2>/dev/null || true # ── Tâche planifiée (cron sur l'hôte) ──────────────────────────────────────── CRON_CMD="* * * * * cd $(pwd) && docker compose -f docker-compose.prod.yml exec -T app php artisan schedule:run >> /dev/null 2>&1" echo "" echo "→ Pour activer les tâches planifiées (vérification automatique des mises à jour)," echo " ajoutez cette ligne à votre crontab (crontab -e) :" echo "" echo " ${CRON_CMD}" echo "" # ── Résumé ──────────────────────────────────────────────────────────────────── VERSION=$(cat VERSION 2>/dev/null || echo "?") echo "────────────────────────────────────────────" echo "✓ MesRelevés v${VERSION} installé avec succès !" echo "" echo " URL : $(grep APP_URL .env | cut -d= -f2)" echo "" echo "Commandes utiles :" echo " Voir les logs : docker compose -f docker-compose.prod.yml logs -f app" echo " Vérifier updates : docker compose -f docker-compose.prod.yml exec app php artisan app:check-update" echo " Mettre à jour : docker compose -f docker-compose.prod.yml exec app php artisan app:update" echo "────────────────────────────────────────────"