# Déployer un site WordPress pour un club

Cette procédure permet de créer un nouveau site WordPress géré par CEDILLE pour un club étudiant. Le workflow génère une pull request Kubernetes, puis Argo CD déploie automatiquement le site après le merge.

## Prérequis

* Avoir accès au repo `k8s-cedille-production-v2`.
* Avoir les droits pour lancer les GitHub Actions du repo.
* Avoir les droits pour merger une pull request.
* Avoir accès à Argo CD pour vérifier le déploiement.
* Avoir accès à `kubectl` sur le cluster `k8s-cedille-production-v2` pour debug au besoin.

## Créer un site WordPress

Aller dans le repo GitHub:

```text
k8s-cedille-production-v2
```

Ouvrir l’onglet:

```text
Actions
```

Sélectionner le workflow:

```text
Create WordPress site
```

Cliquer sur:

```text
Run workflow
```

Remplir les champs principaux:

```text
nom_club: mon-club

domaine: mon-club.prodv2.cedille.club
```

Règles importantes:

* `nom_club` doit être un slug DNS: lettres minuscules, chiffres et tirets seulement.
* Ne pas mettre de point dans `nom_club`.
* Le domaine complet va dans `domaine`.
* Exemple valide: `mon-club`
* Exemple invalide: `mon-club.prodv2.cedille.club`

Pour un premier déploiement, laisser les valeurs d’images et de storage par défaut.

## Pull Request générée

Le workflow crée une branche du type:

```text
wordpress/mon-club
```

Puis il ouvre une pull request contenant les fichiers du nouveau site:

```text
apps/mon-club/wordpress/prod/configMap.yaml

apps/mon-club/wordpress/prod/ingress.yaml

apps/mon-club/wordpress/prod/kustomization.yaml

apps/mon-club/wordpress/prod/vault-secret.yaml

apps/mon-club/wordpress/mon-club-wordpress.argoapp.yaml
```

Vérifier que:

* Le namespace attendu est `mon-club-wordpress`.
* Le domaine est le bon.
* Le nom de l’application Argo CD est `mon-club-wordpress`.
* Les checks de la PR passent.

Si tout est bon, merger la PR dans `main`.

## Déploiement Argo CD

Après le merge, Argo CD détecte la nouvelle application.

Dans Argo CD, chercher l’application:

```text
mon-club-wordpress
```

Attendre que l’application soit synchronisée.

États attendus:

```text
Sync Status: Synced

Health: Healthy
```

Pendant le démarrage, il est normal de voir temporairement:

```text
Progressing
```

## Vérifier avec kubectl

Exporter le kubeconfig au besoin:

```bash
export KUBECONFIG=~/Downloads/k8s-cedille-production-v2-kubeconfig.yaml
```

Vérifier les pods:

```bash
kubectl -n mon-club-wordpress get pods
```

Résultat attendu:

```text
mysql-0                      1/1     Running

wordpress-xxxxxxxxxx-xxxxx   1/1     Running
```

Vérifier l’ingress Contour, le certificat TLS et les secrets:

```bash
kubectl -n mon-club-wordpress get httpproxy,certificate,secret
```

Résultat attendu:

```text
httpproxy.projectcontour.io/wordpress   mon-club.prodv2.cedille.club   wordpress-tls   valid

certificate.cert-manager.io/wordpress-tls   True   wordpress-tls

secret/wordpress-secret

secret/wordpress-tls
```

Tester le site:

```bash
curl -I https://mon-club.prodv2.cedille.club
```

Résultat attendu:

```text
HTTP/2 200
```

## Connexion à WordPress

URL d’administration:

```text
https://mon-club.prodv2.cedille.club/wp-admin
```

Nom d’utilisateur par défaut:

```text
admin
```

Récupérer le mot de passe admin:

```bash
kubectl -n mon-club-wordpress get secret wordpress-secret \
  -o jsonpath='{.data.WORDPRESS_ADMIN_PASSWORD}' | base64 -d; echo
```

Se connecter avec:

```text
Username: admin

Password: <mot de passe généré>
```

Après la première connexion, il est recommandé de changer le mot de passe admin dans WordPress.

## Ce qui est créé

Pour chaque club, le workflow crée:

* Une application Argo CD dédiée.
* Un namespace Kubernetes dédié.
* Un déploiement WordPress.
* Une base de données MySQL.
* Un PVC pour le contenu WordPress.
* Un PVC pour les données MySQL.
* Un certificat TLS avec cert-manager.
* Un HTTPProxy Contour.
* Des secrets générés automatiquement via Vault.

Exemple pour `mon-club`:

```text
Application Argo CD: mon-club-wordpress

Namespace: mon-club-wordpress

Domaine: mon-club.prodv2.cedille.club
```

## Debug rapide

Voir les pods:

```bash
kubectl -n mon-club-wordpress get pods
```

Voir les événements:

```bash
kubectl -n mon-club-wordpress get events --sort-by=.lastTimestamp | tail -n 80
```

Décrire MySQL:

```bash
kubectl -n mon-club-wordpress describe pod mysql-0
```

Décrire WordPress:

```bash
kubectl -n mon-club-wordpress describe pod -l app.kubernetes.io/name=wordpress
```

Voir les logs WordPress:

```bash
kubectl -n mon-club-wordpress logs deploy/wordpress
```

Voir les logs de l’init container WordPress:

```bash
kubectl -n mon-club-wordpress logs deploy/wordpress -c wordpress-install
```

Voir les logs MySQL:

```bash
kubectl -n mon-club-wordpress logs mysql-0
```

## Problèmes fréquents

### Le pod indique `secret "wordpress-secret" not found`

Vérifier les ressources Vault:

```bash
kubectl -n mon-club-wordpress get randomsecret,vaultsecret,secret
```

Vérifier que Vault fonctionne:

```bash
kubectl -n vault get pods
```

### Le pod reste en `ContainerCreating`

Vérifier les événements:

```bash
kubectl -n mon-club-wordpress describe pod mysql-0

kubectl -n mon-club-wordpress get events --sort-by=.lastTimestamp | tail -n 80
```

Ca peut indiquer un problème de stockage Ceph/CSI.

Vérifier le stockage:

```bash
kubectl get storageclass

kubectl get pods -A | grep -Ei 'rook|ceph|csi'
```

### Le site ne répond pas en HTTPS

Vérifier le HTTPProxy et le certificat:

```bash
kubectl -n mon-club-wordpress get httpproxy,certificate
```

Vérifier que le domaine pointe bien vers l’ingress prodv2.

### WordPress démarre mais l’admin ne fonctionne pas

Vérifier le mot de passe généré:

```bash
kubectl -n mon-club-wordpress get secret wordpress-secret \
  -o jsonpath='{.data.WORDPRESS_ADMIN_PASSWORD}' | base64 -d; echo
```

L’utilisateur par défaut est:

```text
admin
```

## Supprimer un site de test

Pour supprimer un site, retirer l’application générée du repo GitOps, puis merger la PR.

Exemple:

```text
apps/mon-club/wordpress/
```

Après le merge, vérifier dans Argo CD que l’application est supprimée ou désynchronisée selon la configuration.

Attention: la suppression peut aussi supprimer les volumes persistants selon la politique de rétention configurée. Ne pas supprimer un site réel sans confirmer avec le club.