diff --git a/app/Http/Middleware/SecurityHeaders.php b/app/Http/Middleware/SecurityHeaders.php index 30251f2..c1ac4b7 100644 --- a/app/Http/Middleware/SecurityHeaders.php +++ b/app/Http/Middleware/SecurityHeaders.php @@ -38,10 +38,12 @@ class SecurityHeaders // Content-Security-Policy : réduit fortement le risque d'injection de scripts (XSS). // Politique volontairement compatible avec Laravel/Vite (styles et scripts inline autorisés). // Pour durcir davantage, remplacer 'unsafe-inline' par un système de nonce. + // NB : l'application charge Tailwind via CDN (cdn.tailwindcss.com) et + // les avatars via ui-avatars.com : ces sources externes sont donc autorisées. $response->headers->set('Content-Security-Policy', implode('; ', [ "default-src 'self'", - "script-src 'self' 'unsafe-inline'", - "style-src 'self' 'unsafe-inline'", + "script-src 'self' 'unsafe-inline' https://cdn.tailwindcss.com", + "style-src 'self' 'unsafe-inline' https://cdn.tailwindcss.com", "img-src 'self' data: https:", "font-src 'self' data:", "connect-src 'self'", diff --git a/docs/05-mise-en-place-gitea-actions.md b/docs/05-mise-en-place-gitea-actions.md new file mode 100644 index 0000000..d40eabc --- /dev/null +++ b/docs/05-mise-en-place-gitea-actions.md @@ -0,0 +1,148 @@ +# 05 — Mise en place de Gitea Actions (CI/CD) + +Guide d'installation du moteur d'automatisation (CI/CD) pour le dépôt. +Contexte : **Gitea en Docker / docker-compose**, accès **SSH** au serveur. + +Gitea Actions nécessite deux choses : +1. **Activer** la fonctionnalité Actions dans Gitea. +2. Enregistrer au moins un **runner** (`act_runner`) qui exécute les workflows. + +--- + +## Étape 1 — Activer Actions dans Gitea + +Se connecter en SSH au serveur, puis se placer dans le dossier du `docker-compose.yml` +**de Gitea** (⚠️ celui de Gitea, pas celui de l'application Laravel). + +### Option A (recommandée) — via variable d'environnement + +Dans le service Gitea du `docker-compose.yml`, ajouter la variable : + +```yaml +services: + server: # nom du service Gitea (peut s'appeler "gitea") + image: gitea/gitea:latest + environment: + - GITEA__actions__ENABLED=true + # ... reste de la configuration inchangé +``` + +Puis recharger Gitea : + +```bash +docker compose up -d +``` + +### Option B — via le fichier app.ini + +Éditer le fichier `app.ini` (dans le volume Gitea, souvent +`./gitea/gitea/conf/app.ini`) et ajouter : + +```ini +[actions] +ENABLED = true +``` + +Puis redémarrer : `docker compose restart`. + +### Vérification + +Dans l'interface web du dépôt, un onglet **« Actions »** doit apparaître. + +--- + +## Étape 2 — Obtenir un jeton d'enregistrement du runner + +Deux niveaux possibles : + +- **Niveau instance** (runner partagé par tous les dépôts) : + `Site Administration → Actions → Runners → Create new Runner`. +- **Niveau dépôt** (runner dédié au projet) : + `Dépôt → Settings → Actions → Runners → Create new Runner`. + +Copier le **jeton (registration token)** affiché. + +--- + +## Étape 3 — Lancer un runner (act_runner) en Docker + +Créer un dossier de travail sur le serveur, par exemple `~/gitea-runner`, avec un +fichier `docker-compose.yml` : + +```yaml +services: + runner: + image: gitea/act_runner:latest + container_name: gitea_runner + restart: always + environment: + GITEA_INSTANCE_URL: "https://gitea.sam-coffre.duckdns.org" + GITEA_RUNNER_REGISTRATION_TOKEN: "COLLER_LE_JETON_ICI" + GITEA_RUNNER_NAME: "runner-docker-1" + # Images utilisées pour `runs-on: ubuntu-latest` + GITEA_RUNNER_LABELS: "ubuntu-latest:docker://catthehacker/ubuntu:act-latest" + volumes: + - ./data:/data + - /var/run/docker.sock:/var/run/docker.sock +``` + +> Le montage de `/var/run/docker.sock` permet au runner de créer les conteneurs +> qui exécutent chaque job. L'image `catthehacker/ubuntu:act-latest` fournit un +> environnement compatible `ubuntu-latest` (Node, outils de base). + +Démarrer le runner : + +```bash +cd ~/gitea-runner +docker compose up -d +docker compose logs -f runner # doit afficher "runner registered successfully" +``` + +Le runner apparaît alors en vert dans `Settings → Actions → Runners` du dépôt. + +--- + +## Étape 4 — Ajouter les secrets de déploiement + +Dans `Dépôt → Settings → Actions → Secrets`, créer : + +| Secret | Valeur | +|--------|--------| +| `SSH_HOST` | IP ou domaine du serveur de production | +| `SSH_USER` | utilisateur SSH (ex. `sam`) | +| `SSH_PRIVATE_KEY` | clé privée SSH autorisée sur le serveur | +| `SSH_PORT` | port SSH (ex. `22`) | + +> Générer une paire de clés dédiée au déploiement : +> `ssh-keygen -t ed25519 -C "gitea-deploy" -f deploy_key` +> puis ajouter `deploy_key.pub` dans `~/.ssh/authorized_keys` du serveur, et +> coller le contenu de `deploy_key` (clé privée) dans le secret `SSH_PRIVATE_KEY`. + +--- + +## Étape 5 — Déclencher et vérifier + +Un simple push sur `master` déclenche les workflows : + +```bash +git commit --allow-empty -m "test: déclenche la CI" +git push +``` + +Dans l'onglet **Actions** du dépôt : +- le workflow **CI** (`ci.yml`) exécute Pint puis PHPUnit ; +- le workflow **CD** (`deploy.yml`) déploie via SSH. + +Une exécution en vert constitue une **preuve idéale à intégrer au dossier** (capture d'écran). + +--- + +## Dépannage rapide + +| Symptôme | Cause probable / solution | +|----------|---------------------------| +| Pas d'onglet Actions | Actions non activé (Étape 1) ou Gitea non redémarré | +| « No runner available » | Runner non enregistré / hors ligne (Étape 3) | +| `ubuntu-latest` introuvable | Label non défini → variable `GITEA_RUNNER_LABELS` | +| `actions/checkout` échoue | Le serveur doit accéder à github.com (Gitea proxy les actions) | +| Déploiement SSH refusé | Vérifier la clé dans `authorized_keys` et les secrets SSH_* |