Appearance
Migrer le stack Docker du PC vers le VPS
TL;DR — Ne transférez pas les containers Windows. Recréez le stack sur le VPS depuis le code source (
docker compose up --build). Transférez uniquement les données (Postgres + images de cartes) si vous voulez sauter la phase d'ingestion.
Pourquoi recréer plutôt que transférer
Vous avez deux options :
| Option | Description | Verdict |
|---|---|---|
| A. Transférer les containers | docker save des images + copie des volumes via SSH | À éviter |
| B. Recréer depuis le code (IaC) | git clone + docker compose up --build sur le VPS | Recommandé |
Recréer (option B) — pourquoi c'est mieux
- Tout est déjà reproductible — le
compose.yml, les*.Dockerfileet le code source sont versionnés danstcg-collector-backend/. Le VPS sait déjà builder le stack. - Plus léger — vous ne transférez ni les ~5 GB d'images Docker, ni les caches buildkit. Le VPS ne tire que les bases (
pgvector/pgvector:pg16,nginx:alpine,node:22-alpine) et compile les couches custom à partir d'un repo de quelques MB. - Plus propre — pas d'accumulation de couches obsolètes (le container
tcg-collector-ingest-1exited depuis 5 jours, l'ancien sidecarembeddingsprobablement remplaçable, le réseausolidity-dojo_defaultorphelin… tout repart à zéro). - Évite les pièges OS — copier un
data/pgcru de Docker Desktop (WSL2) vers Linux marche en pratique mais reste fragile (pg_dumpest la voie sûre, voir plus bas). - Prêt pour l'avenir — chaque modification future passera par un
git pull && docker compose up -d --buildsur le VPS, pas par un nouveau transfert manuel.
Transférer (option A) — quand ça vaut le coup
Uniquement si toutes ces conditions sont vraies :
- Vous avez modifié l'état applicatif manuellement (data hors ingestion).
- Re-télécharger via TCGdex serait trop long ou rate-limité côté VPS.
- Vous êtes pressé de mettre le service en ligne.
Dans ce cas, ne transférez pas les containers, mais seulement les données : pg_dump + tar des images (voir §3).
1. Préparer le VPS
Pré-requis supposés en place sur le VPS :
- Docker Engine + plugin compose installés.
- Utilisateur
kaeldans le groupedocker. ghinstallé et authentifié.- Repo
snag-tcg/tcg-collector-backendclonable.
Vérifier avant tout :
bash
docker compose version
docker run --rm hello-world2. Recréer le stack — voie nominale
bash
# 1. Cloner (si pas déjà fait)
mkdir -p ~/skn-tcg && cd ~/skn-tcg
gh repo clone snag-tcg/tcg-collector-backend
cd tcg-collector-backend
# 2. Configurer l'environnement
cp .env.example .env
# Éditer .env :
# - PGUSER / PGPASSWORD (un mot de passe FORT, pas "tcg")
# - API_WRITE_TOKEN (token aléatoire si /scan ou writes exposés)
# - CORS_ORIGIN (domaine du front, pas "*" en prod)
nano .env
# 3. Lancer le stack
docker compose -f docker/compose.yml up -d --build
# 4. Vérifier
docker compose -f docker/compose.yml ps
docker compose -f docker/compose.yml logs -f api
curl http://localhost:8080/health # ou via nginx : :8081/api/health
# 5. Première ingestion (long — selon INGEST_SETS)
docker compose -f docker/compose.yml run --rm ingestBuilds attendus : ~5 à 15 min selon CPU du VPS (le plus long = tcg-vision qui télécharge ~85 MB de poids DINOv2 et build PyTorch CPU).
3. Transférer les données (optionnel — si vous voulez sauter l'ingestion)
Faites-le après que le stack tourne sur le VPS, en remplaçant uniquement le contenu de Postgres et le dossier data/images.
3.1 Postgres — pg_dump (méthode propre, recommandée)
Sur le PC Windows :
powershell
# Dump complet (compressé, format custom)
docker exec tcg-collector-postgres-1 `
pg_dump -U tcg -d tcg -Fc -Z 9 -f /tmp/tcg.dump
docker cp tcg-collector-postgres-1:/tmp/tcg.dump .\tcg.dump
# Envoyer sur le VPS
scp .\tcg.dump kael@VPS_IP:/tmp/tcg.dumpSur le VPS :
bash
# Stack déjà démarré, mais vide
docker cp /tmp/tcg.dump tcg-collector-postgres-1:/tmp/tcg.dump
# Restaurer
docker exec -i tcg-collector-postgres-1 \
pg_restore -U tcg -d tcg --clean --if-exists --no-owner /tmp/tcg.dumpPourquoi pas un copier-coller du dossier
data/pg? Ça marche souvent (même versionpg16), mais c'est fragile : différences d'endianness, locale, page size,pg_controlcorrompu en cours de copie.pg_dumpest portable et version-tolérant.
Note sur la corruption d'index détectée dans le
data/pgdu PC (voircontainer-inventory.md) :pg_dumplit logiquement les tables, donc le dump régénère des index propres côté VPS. C'est un avantage net du dump par rapport à la copie brute.
3.2 Images de cartes — tar + scp (ou rsync)
Les ~1.9 GB de visuels sont des fichiers statiques régénérables, mais long à re-télécharger.
powershell
# Sur Windows, depuis tcg-collector-backend\
tar -czf data-images.tar.gz data\images
scp data-images.tar.gz kael@VPS_IP:/tmp/Sur le VPS :
bash
cd ~/snag-tcg/tcg-collector-backend
tar -xzf /tmp/data-images.tar.gz # recrée data/images/
sudo chown -R $USER:$USER data/imagesLe service nginx du compose monte déjà ../data/images ; un simple docker compose restart nginx suffit à le rendre actif.
3.3 Index pHash & FAISS
- L'index pHash (
scanIndex.json) est généré dans le repo siblingpoc-tcg-collector(npm run ingest:cards). Pas besoin de migrer : régénérez-le sur le VPS si vous y déployez aussi le client RN, sinon laissez-le côté machine de build. - L'index FAISS du sidecar
tcg-visionest prébuilt dans l'image Docker (docker/tcg-vision.Dockerfileclone un commit pinned deKaelSensei/tgc-app). Aucune action manuelle.
4. Faut-il garder l'ancien sidecar embeddings ?
Probablement non — tcg-vision le remplace fonctionnellement avec une approche plus complète. Avant de couper :
- Grep dans le code de l'API :
EMBEDDINGS_URLest-il encore lu ? - Si oui, lit-il l'ancien
embeddingsou pointe-t-il surtcg-vision? - Si l'ancien n'est plus consommé, retirer le service
embeddingsducompose.ymlcôté VPS dès le départ. Économie : ~1.25 GB d'image, RAM en moins.
5. Production — checklist sécurité minimale
À configurer côté VPS, avant d'exposer publiquement :
.env: mot de passe Postgres fort,API_WRITE_TOKENlong et aléatoire,CORS_ORIGINrestreint au domaine du front.- Ne pas exposer le port
5432publiquement. Danscompose.yml, lier explicitement à localhost :yamlports: - "127.0.0.1:5432:5432" - Reverse proxy TLS (Caddy / Traefik / nginx host) devant
:8080et:8000. Pas d'API en clair. - UFW / iptables : n'ouvrir que
22/tcp(SSH) +80/tcp+443/tcp. - Rate-limit côté nginx ou côté Fastify (
API_RATE_LIMIT_MAX). docker compose ... up -dau démarrage du serveur via systemd (lerestart: unless-stoppeddu compose suffit après un premierup).
6. Ordre d'exécution recommandé
- Réparer la corruption d'index sur le PC (optionnel — pour avoir un état sain à dumper).
- Sur le VPS : compléter les pré-requis de provisioning listés en §1, puis cloner le repo.
cp .env.example .env+ édition des secrets.docker compose up -d --build(laisse Postgres + nginx + api + tcg-vision tourner à vide).- Au choix :
- Sans transfert :
docker compose run --rm ingest→ laisser tourner ~30 min. - Avec transfert :
pg_dump+pg_restore+tar/scpdes images (§3).
- Sans transfert :
- Health-checks :
curl /api/health,curl :8000/health, scan d'une carte test. - Mettre les ports privés derrière un reverse proxy + TLS (§5).
7. Une fois en place — workflow récurrent
Plus de transferts ! Le pattern devient :
bash
# Sur le VPS
cd ~/snag-tcg/tcg-collector-backend
git pull
docker compose -f docker/compose.yml up -d --buildSi une nouvelle ingestion est nécessaire (nouveaux sets) : docker compose run --rm ingest.