# Rollback — Retour vers la chart officielle GitHub

Ce document couvre le retour de la source ArgoCD depuis ce fork Gitea
(`homegit.gyozamancave.fr/billisdead/postiz-helmchart`) vers la chart officielle
(`github.com/gitroomhq/postiz-helmchart`).

---

## Structure des branches et référence upstream

```
Tag upstream-1.0.5      → commit 5d6a9de2  (upstream exact, immuable)
                           gitroomhq/postiz-helmchart, chart v1.0.5, jan 2025

main                    → contenu fonctionnellement identique à upstream
                           (source déployée par ArgoCD)

feat/temporal-support   → 5d6a9de2 → Temporal + env → ROLLBACK.md
                           (branche de travail pour l'upgrade v2.21.8)
```

### Inspecter le delta entre upstream et notre travail

```bash
# Tout ce qui a changé par rapport à l'upstream dans la chart
git diff upstream-1.0.5 feat/temporal-support -- charts/

# Juste les fichiers modifiés (sans le contenu)
git diff --name-only upstream-1.0.5 feat/temporal-support

# Comparer main avec upstream (doit être vide sur charts/)
git diff upstream-1.0.5 main -- charts/
```

### Synchroniser le tag upstream si l'upstream GitHub évolue

```bash
# Ajouter le remote GitHub si absent
git remote add upstream https://github.com/gitroomhq/postiz-helmchart

# Récupérer le nouvel upstream
git fetch upstream

# Créer un nouveau tag pour la nouvelle version upstream
git tag -a upstream-<version> upstream/main -m "Upstream gitroomhq à <version>"
git push origin upstream-<version>
```

---

## Contexte de référence

| Paramètre | Fork Gitea (actuel) | Chart officielle (cible rollback) |
|---|---|---|
| `repoURL` | `https://homegit.gyozamancave.fr/billisdead/postiz-helmchart` | `https://github.com/gitroomhq/postiz-helmchart` |
| `targetRevision` | `main` | `HEAD` |
| `path` | `charts/postiz` | `charts/postiz` |

Les `values` inline dans l'Application ArgoCD ne changent pas.

---

## Scénario 1 — Rollback normal (ArgoCD accessible)

```bash
kubectl patch application postiz -n argocd --type='json' -p='[
  {"op": "replace", "path": "/spec/source/repoURL",        "value": "https://github.com/gitroomhq/postiz-helmchart"},
  {"op": "replace", "path": "/spec/source/targetRevision", "value": "HEAD"}
]'

kubectl annotate application postiz -n argocd \
  argocd.argoproj.io/refresh=hard --overwrite
```

Vérification :

```bash
kubectl get application postiz -n argocd \
  -o jsonpath='{"sync: "}{.status.sync.status}{"\nhealth: "}{.status.health.status}{"\nrevision: "}{.status.sync.revision}{"\n"}'
```

Résultat attendu : `sync: Synced`, `health: Healthy`, revision = dernier commit GitHub.

---

## Scénario 2 — Gitea inaccessible (rollback d'urgence)

Si `homegit.gyozamancave.fr` est down et qu'ArgoCD est bloqué en erreur de fetch,
appliquer le patch de la même façon — ArgoCD re-tentera depuis GitHub immédiatement.

```bash
# Même commande que le scénario 1 — ArgoCD abandonne le fetch Gitea dès que repoURL change
kubectl patch application postiz -n argocd --type='json' -p='[
  {"op": "replace", "path": "/spec/source/repoURL",        "value": "https://github.com/gitroomhq/postiz-helmchart"},
  {"op": "replace", "path": "/spec/source/targetRevision", "value": "HEAD"}
]'
```

Si ArgoCD lui-même ne répond plus, patcher le CRD directement via le control plane :

```bash
# Requiert un accès direct à k3s-master
KUBECONFIG=/etc/rancher/k3s/k3s.yaml kubectl patch application postiz -n argocd \
  --type='json' -p='[
    {"op": "replace", "path": "/spec/source/repoURL",        "value": "https://github.com/gitroomhq/postiz-helmchart"},
    {"op": "replace", "path": "/spec/source/targetRevision", "value": "HEAD"}
  ]'
```

---

## Scénario 3 — Rollback après upgrade image (ex. v2.11.2 → v2.21.8 cassé)

Le rollback de la source chart ne suffit pas si l'image Postiz a aussi été changée
**et que Prisma a migré le schéma DB**. Dans ce cas, la séquence est :

### 3a. Rollback image seule (si DB non migrée)

Éditer les values inline de l'Application ArgoCD et remettre le tag d'origine :

```yaml
image:
  tag: "v2.11.2"
```

```bash
# Puis forcer le sync
kubectl annotate application postiz -n argocd \
  argocd.argoproj.io/refresh=hard --overwrite
```

### 3b. Rollback image + restauration DB (si Prisma a migré)

> **Toujours faire un `pg_dump` avant tout upgrade.**

```bash
# 1. Scale down pour éviter les écritures pendant la restauration
kubectl scale deployment postiz-postiz-app --replicas=0 -n default

# 2. Identifier le pod PostgreSQL
PGPOD=$(kubectl get pod -n default -l app.kubernetes.io/name=postgresql -o jsonpath='{.items[0].metadata.name}')

# 3. Vider le schéma (le dump pg_dump sans --clean ne contient pas de DROP TABLE)
kubectl exec -n default "$PGPOD" -- bash -c \
  'PGPASSWORD="<password>" psql -U postiz postiz -c \
  "DROP SCHEMA public CASCADE; CREATE SCHEMA public; \
   GRANT ALL ON SCHEMA public TO postiz; \
   GRANT ALL ON SCHEMA public TO public;"'

# 4. Restaurer depuis le backup local
kubectl exec -i -n default "$PGPOD" -- bash -c \
  'PGPASSWORD="<password>" psql -U postiz postiz' \
  < /path/to/postiz-backup-YYYYMMDD.sql

# 5. Remettre le tag image v2.11.2 dans les values ArgoCD, puis scale up
kubectl scale deployment postiz-postiz-app --replicas=1 -n default
```

---

## Scénario 4 — Rollback vers un commit Gitea précis (pas GitHub)

Si le problème vient d'un commit spécifique sur le fork mais que la branche `main`
reste valide, pointer sur le SHA du dernier commit stable :

```bash
# Trouver le SHA stable (ex. avant le commit problématique)
git -C /home/billisdead/gitea-trucs/postiz-helm log --oneline main | head -10

# Patcher vers ce SHA
kubectl patch application postiz -n argocd --type='json' -p='[
  {"op": "replace", "path": "/spec/source/targetRevision", "value": "<SHA>"}
]'
```

---

## Vérification post-rollback (tous scénarios)

```bash
# Source effective
kubectl get application postiz -n argocd \
  -o jsonpath='{.spec.source.repoURL}{"\n"}{.spec.source.targetRevision}{"\n"}'

# État de santé
kubectl get application postiz -n argocd \
  -o jsonpath='{"sync: "}{.status.sync.status}{"\nhealth: "}{.status.health.status}{"\n"}'

# Pod toujours Running sans restart
kubectl get pods -n default -l "app.kubernetes.io/name=postiz-app"

# Logs démarrage (vérifier absence d'erreur Temporal/DB/Redis)
kubectl logs -n default deployment/postiz-postiz-app --tail=30
```
