Files
office_translator/.gitea/workflows/cleanup-glossaries.yml
Sepehr 8f55e3d9aa
All checks were successful
Deploy to Production / Build and Deploy (push) Successful in 3m1s
fix(glossaries): dedup by (user_id, name) instead of (user_id, template_id)
Le groupement par template_id etait faux sur la prod :
- Les doublons historiques ont template_id=NULL (crees avant la migration)
- Deux glossaires 'Finance - FR->Anglais' et 'Finance - FR->Multilingue'
  partagent le meme template_id mais DOIVENT etre conserves separement.

Changements :
- Groupement par (user_id, name) -> c'est ce que l'utilisateur voit dans l'UI
  et la definition reelle d'un doublon.
- Les glossaires multilingues ('-> Multilingue') ont un nom distinct des
  versions '-> Anglais' : ils ne sont jamais fusionnes (preserve par design).
- Fallback automatique si la colonne template_id est absente du schema
  (dev DB) : warning + requete sans la colonne, aucun crash.
- Suppression du flag --allow-missing-template-id devenu inutile.
- Nettoyage des imports ORM inutiles (text brut uniquement, plus rapide).
2026-06-03 21:48:53 +02:00

88 lines
3.1 KiB
YAML

name: Cleanup Duplicate Glossaries
on:
workflow_dispatch:
inputs:
user_id:
description: 'User ID dont on nettoie les doublons (obligatoire).'
required: true
type: string
dry_run:
description: 'Mode relecture seule — aucune suppression.'
required: false
default: true
type: boolean
yes:
description: 'Confirme la suppression (ignoré si dry_run=true).'
required: false
default: false
type: boolean
jobs:
cleanup:
name: Backup and delete duplicate glossaries on production
runs-on: ubuntu-24.04
steps:
- name: Setup SSH
run: |
mkdir -p ~/.ssh
echo "${{ secrets.SSH_PRIVATE_KEY }}" > ~/.ssh/id_rsa
chmod 600 ~/.ssh/id_rsa
ssh-keyscan -H 192.168.1.151 >> ~/.ssh/known_hosts
- name: Run cleanup on production server
env:
USER_ID: ${{ inputs.user_id }}
DRY_RUN: ${{ inputs.dry_run }}
YES: ${{ inputs.yes }}
run: |
ssh root@192.168.1.151 << ENDSSH
set -euo pipefail
cd /opt/wordly
# S'assurer que le code local est à jour (les scripts font partie du repo).
git config --global --add safe.directory /opt/wordly
git fetch origin production-deployment
git reset --hard origin/production-deployment
# S'assurer que postgres tourne (le script lit via DATABASE_URL du .env).
docker compose up -d postgres redis
# Attendre postgres (max 60s).
for i in \$(seq 1 30); do
if docker compose exec -T postgres pg_isready -U translate >/dev/null 2>&1; then
echo "Postgres ready after \$((i * 2))s"
break
fi
[ "\$i" -eq 30 ] && { echo "Postgres not ready after 60s"; exit 1; }
sleep 2
done
# Construire les flags.
FLAGS="--user \${USER_ID}"
if [ "\${DRY_RUN}" = "true" ]; then
FLAGS="\${FLAGS} --dry-run"
fi
if [ "\${YES}" = "true" ]; then
FLAGS="\${FLAGS} --yes"
fi
echo "════════════════════════════════════════"
echo " USER_ID=\${USER_ID}"
echo " DRY_RUN=\${DRY_RUN}"
echo " YES=\${YES}"
echo " FLAGS=\${FLAGS}"
echo "════════════════════════════════════════"
# Le service "backend" charge .env via env_file et l'entrypoint
# fait `exec "\$@"` si on passe des args. DATABASE_URL est résolu
# vers le hostname docker "postgres:5432" via la variable d'env.
docker compose run --rm backend \
python scripts/delete_duplicate_glossaries.py \${FLAGS}
ENDSSH
- name: List backup artifacts
if: always()
run: |
ssh root@192.168.1.151 'ls -la /opt/wordly/backups/ 2>/dev/null || echo "(no backups dir)"'