# 02 — Plan de déploiement

Projet **(RE)Sources Relationnelles** — Bloc INFCDAAL3

## 1. Stratégie de déploiement

Le déploiement repose sur trois piliers :

1. **Conteneurisation** (Docker) pour un environnement reproductible.
2. **Gestion de version** (Gitea) comme source unique de vérité.
3. **Intégration et déploiement continus** (Gitea Actions) pour automatiser
   qualité, tests et mise en production.

Approche retenue : à chaque `push` sur `master`, la CI valide le code
(qualité + tests) ; si tout est vert, le déploiement se déclenche automatiquement
sur le serveur.

## 2. Environnements

| Environnement | Rôle | Hébergement |
|---------------|------|-------------|
| **Local (dev)** | Développement sur le poste | Docker / `php artisan serve` |
| **Test (CI)** | Exécution automatisée des tests | Runner Gitea Actions (base SQLite en mémoire) |
| **Pré-production (QA)** *(recommandé)* | Recette avant mise en ligne | Conteneurs Docker, base dédiée |
| **Production** | Service ouvert aux citoyens | Serveur `app.sam-coffre.duckdns.org` |

> La configuration de chaque environnement est portée par un fichier `.env`
> distinct (jamais versionné). Seul `.env.example` est présent dans le dépôt.

## 3. Architecture de déploiement

```
                 Internet (HTTPS)
                        │
                        ▼
         ┌───────────────────────────┐
         │  Nginx (conteneur web)    │  :443  TLS / redirection 80→443
         │  laravel_web              │
         └─────────────┬─────────────┘
                       │ FastCGI :9000
                       ▼
         ┌───────────────────────────┐
         │  PHP-FPM (conteneur app)  │  Laravel 12
         │  laravel_php              │
         └─────────────┬─────────────┘
                       │
                       ▼
              Base de données MySQL
```

Fichiers concernés : `Dockerfile` (image PHP), `docker-compose.yml`
(orchestration), `nginx.conf` (reverse proxy / TLS).

## 4. Pipeline d'intégration et de déploiement continus (CI/CD)

### 4.1 Intégration continue — `.gitea/workflows/ci.yml`

Déclenchée sur chaque `push` et chaque `pull_request` vers `master` :

1. Récupération du code.
2. Installation de PHP 8.2 et des extensions.
3. Installation des dépendances Composer (avec cache).
4. **Vérification du style de code** : `vendor/bin/pint --test`.
5. **Exécution des tests** : `php artisan test` (PHPUnit).

### 4.2 Déploiement continu — `.gitea/workflows/deploy.yml`

Déclenché sur `push` vers `master`, il se connecte en **SSH** au serveur et exécute :

1. `git pull origin master` — récupération de la nouvelle version.
2. `docker compose up -d --build` — reconstruction des conteneurs.
3. `php artisan migrate --force` — application des migrations de base.
4. `config:cache`, `route:cache`, `view:cache` — optimisations de production.
5. Correction des permissions (`storage`, `bootstrap/cache`).

**Secrets Gitea requis** (Settings → Actions → Secrets) : `SSH_HOST`,
`SSH_USER`, `SSH_PRIVATE_KEY`, `SSH_PORT`.

> Prérequis : un **runner Gitea Actions** doit être enregistré sur l'instance
> (`https://gitea.sam-coffre.duckdns.org/`) et les Actions activées pour le dépôt.

## 5. Plan de déploiement détaillé (étapes, ressources, responsables)

| # | Étape | Ressource / Outil | Responsable | Automatisé ? |
|---|-------|-------------------|-------------|--------------|
| 1 | Développement + commit | Git / Gitea | Développeur | Non |
| 2 | Push sur `master` | Gitea | Développeur | Non |
| 3 | Contrôle qualité (Pint) | Gitea Actions | Runner CI | ✅ Oui |
| 4 | Tests automatisés (PHPUnit) | Gitea Actions | Runner CI | ✅ Oui |
| 5 | Connexion au serveur | SSH | Runner CD | ✅ Oui |
| 6 | Récupération du code | Git | Serveur | ✅ Oui |
| 7 | Build des conteneurs | Docker Compose | Serveur | ✅ Oui |
| 8 | Migrations BDD | Artisan | Serveur | ✅ Oui |
| 9 | Mise en cache config/routes/vues | Artisan | Serveur | ✅ Oui |
| 10 | Vérification post-déploiement | Endpoint `/up` (health check) | Équipe | Semi |

## 6. Retour arrière (rollback)

En cas de problème après un déploiement :

- **Code** : `git revert` ou retour à un tag précédent, puis nouveau déploiement.
- **Base de données** : `php artisan migrate:rollback` (migrations réversibles).
- **Conteneurs** : redéploiement de l'image précédente via `docker compose`.

## 7. Supervision

- **Health check** : endpoint `/up` exposé par Laravel (voir `bootstrap/app.php`).
- **Journaux** : `storage/logs/laravel.log` + logs des conteneurs Docker.
- **Historique des déploiements** : onglet *Actions* de Gitea.
