- 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>
4.6 KiB
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 :
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 :
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 :
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 :
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 :
- Coolify remappe les volumes nommés en
<uuid>_*et ignoreexternal:→ volumes vides. - Coolify écrase
container_nameen<service>-<uuid>(mais garde le nom de service = alias DNS). Fix : - 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. - 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
# 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