Standalone-Arkindex-Coolify/docs/TROUBLESHOOTING.md
nak0x 18064be674 Repo complet : scripts, templates, docs et durcissement secrets
- Ajout scripts/ reproduisant chaque étape (secrets, render config, up CLI,
  init Garage, bootstrap prod, admin, vérif E2E, adoption Coolify, backup)
- Templates envsubst (config.yml, garage.toml, cantaloupe.properties) + .example
- deploy.conf (config non-secrète : domaine, versions, uuids Coolify)
- docs/ : ARCHITECTURE, TROUBLESHOOTING (11 problèmes/fixes), RUNBOOK, SECURITY
- Makefile (raccourcis)
- .gitignore + retrait du suivi de .env/.secrets.env/config.yml/garage.toml
  (fichiers conservés sur disque ; secrets restent dans l'historique -> voir SECURITY.md)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-09 16:26:29 +02:00

98 lines
4.6 KiB
Markdown

# Troubleshooting — problèmes rencontrés & diagnostics
Récapitulatif des 11 problèmes du déploiement (symptôme → cause → fix), + commandes de diagnostic
réutilisables. Voir aussi `README.md` §5.
---
## P1 — `manifest unknown` au pull d'une image
**Symptôme** : `docker pull …/backend:1.13.0``manifest unknown`.
**Cause** : `1.13.0` n'existe qu'en `-rc1` ; l'extraction du cœur numérique inventait une version.
**Fix** : n'utiliser que des **finales** (dernière = `1.12.2`). Vérifier :
```bash
tok=$(curl -s "https://gitlab.teklia.com/jwt/auth?service=container_registry&scope=repository:arkindex/backend:pull" | sed -n 's/.*"token":"\([^"]*\)".*/\1/p')
curl -s -H "Authorization: Bearer $tok" https://registry.gitlab.teklia.com/v2/arkindex/backend/tags/list \
| tr ',' '\n' | grep -oE '"[0-9]+\.[0-9]+\.[0-9]+"' | tr -d '"' | sort -uV | tail
```
## P2 — Pas de certificat wildcard possible
**Cause** : Coolify = challenge HTTP-01 seulement.
**Fix** : énumérer chaque hostname dans les règles `Host(...)` (Garage, Cantaloupe). Diag certs :
```bash
for h in ark s3.ark staging.s3.ark uploads.iiif.ark; do
curl -sS -o /dev/null -w "$h.nak0x.dev -> %{http_code} tls=%{ssl_verify_result}\n" "https://$h.nak0x.dev/"
done # tls=0 = certificat valide
```
## P3 — `PermissionError: /arkindex.yml`
**Cause** : fichiers montés en `600` (uid 1000), backend en uid **2000**.
**Fix** : `chmod 644 config.yml garage.toml cantaloupe.properties` (fait par `scripts/01`).
## P4 — Worker : `redis AuthenticationError` ⭐
**Symptôme** : « HELLO must be called with the client already authenticated ».
**Cause** : sur le réseau `coolify`, le nom générique `redis` résout vers **`coolify-redis`**
(protégé par mot de passe), pas le nôtre.
**Diagnostic** :
```bash
docker exec ark-worker-<suffix> getent hosts redis # IP de coolify-redis (mauvais)
docker exec ark-worker-<suffix> getent hosts ark-redis # IP correcte
```
**Fix** : référencer les services par leur **nom unique** `ark-redis`/`ark-database`/`ark-solr`/
`ark-garage` (jamais `redis`/`db`). Appliqué dans `config.yml` et `cantaloupe.properties`.
## P5 — `bootstrap` refuse en prod
**Cause** : `You cannot run this script in production.` + URLs `*.ark.localhost` codées en dur.
**Fix** : réplique manuelle → `scripts/20-garage-init.sh` + `scripts/30-arkindex-init.sh`.
## P6 — S3 en virtual-host (et non path-style)
**Cause** : backend force `addressing_style="auto"` (boto3) → `<bucket>.s3.<DOMAIN>`.
**Fix** : énumérer les 9 sous-domaines de bucket + `root_domain` dans `garage.toml`.
**Test** :
```bash
docker exec -i ark-backend-<suffix> arkindex shell <<'PY'
from arkindex.project.aws import s3
o=s3.Bucket("staging").Object("t"); o.put(Body=b"x"); print(o.get()["Body"].read()); o.delete()
PY
```
## P7 — Trop de workers gunicorn
**Cause** : `nproc*2+1` = 9.
**Fix** : `MAX_WORKERS: "3"` dans l'env du backend.
## P8 — Statics admin/swagger non stylés
**Cause** : pas de WhiteNoise ; statics servis par CDN.
**Fix** : `static.cdn_assets_url: https://assets.teklia.com/arkindex`. Cosmétique (API/SPA OK).
## P9 — `reindex --setup` demande un corpus
**Cause** : collections Solr créées **par corpus** à la volée. Rien à pré-créer.
## P10 — Backend sans Pillow (tests)
**Cause** : traitement image côté workers. Pour un test : générer le JPEG hors backend +
uploader via un conteneur `amazon/aws-cli` (cf. `scripts/50-verify.sh`).
## P11 — Adoption Coolify : volumes vidés + container_name écrasé
**Causes** :
1. Coolify **remappe** les volumes nommés en `<uuid>_*` et **ignore `external:`** → volumes vides.
2. Coolify écrase `container_name` en `<service>-<uuid>` (mais garde le **nom de service** = alias DNS).
**Fix** :
1. Sur un déploiement neuf : ré-init (`scripts/20/30/40`) contre les conteneurs Coolify. Pour des
données existantes : utiliser des **bind-mounts absolus** (dossiers hôte) au lieu de volumes nommés.
2. Nommer les **services** `ark-*` (déjà unique → pas de collision P4).
**Piège** : ne déclencher le deploy **qu'une fois** (POST *ou* GET `/api/v1/deploy?uuid=`).
---
## Diagnostics rapides
```bash
# logs d'un service
docker logs --tail 50 ark-backend-<suffix>
# résolution DNS depuis un conteneur
docker exec ark-worker-<suffix> getent hosts ark-redis
# état santé
docker inspect ark-backend-<suffix> --format '{{.State.Health.Status}}'
# mémoire par conteneur
docker stats --no-stream --format 'table {{.Name}}\t{{.MemUsage}}' | grep ark-
# routers Traefik vus par le proxy
docker exec coolify-proxy wget -qO- http://localhost:8080/api/http/routers 2>/dev/null | head
```