Déployer un site e-commerce React Router 7 en prod

Apprends le déploiement complet d’un site e-commerce React Router 7 : GitHub Actions, Docker, VPS et HTTPS. Prêt à mettre ton code en prod en 2 minutes.

4 min read
Déverrouillez votre potentiel

avec React Router 7

Vous en avez marre de...

❌ perdre du temps à chercher des informations éparpillées
❌ ne pas avoir de retour sur votre progression
Assistant IA spécialisé

Posez vos questions 24/7 à notre IA experte en React Router 7

Quiz interactifs

Validez vos acquis avec des quiz personnalisés et un feedback instantané

9 modules
76 leçons
Accès à vie
299.49
-35%

Pousse ton code sur GitHub

Nous partons d’un dépôt local fonctionnel. On initialise Git, on crée un repo distant puis on pousse le code :

Terminal
1
git init
2
git add .
3
git commit -m "feat: MVP e-commerce prêt"
4
git branch -M main
5
git remote add origin git@github.com:<ton-user>/shop-router.git
6
git push -u origin main

Ajoute l’intégration continue

Nous voulons :

  1. un type-check à chaque push ;
  2. la construction et le push de l’image Docker sur Docker Hub.

Crée le dossier .github/workflows et colle les deux fichiers suivants.

.github/workflows/build.yml
1
name: 🐳 Build And Push Docker Image
2
3
on:
4
workflow_call:
5
inputs:
6
tag:
7
type: string
8
9
jobs:
10
build:
11
if: ${{ github.ref == 'refs/heads/main' || github.ref == 'refs/heads/dev' }}
12
runs-on: ubuntu-latest
13
steps:
14
- uses: actions/checkout@v4
15
- uses: docker/login-action@v2
16
with:
17
username: ${{ secrets.DOCKERHUB_USERNAME }}
18
password: ${{ secrets.DOCKERHUB_TOKEN }}
19
- uses: docker/setup-buildx-action@v2
20
- name: 🐳 Build & Push
21
uses: docker/build-push-action@v3
22
with:
23
context: .
24
push: true
25
tags: algomax/shop-router:${{ inputs.tag }}
.github/workflows/ci.yml
1
name: Docker Image CI
2
on:
3
push:
4
branches: ['main','dev']
5
pull_request:
6
branches: ['main','dev']
7
8
jobs:
9
build:
10
uses: ./.github/workflows/build.yml
11
with:
12
tag: ${{ github.ref == 'refs/heads/main' && 'production' || 'latest' }}
13
secrets: inherit
14
15
typecheck:
16
runs-on: ubuntu-latest
17
steps:
18
- uses: actions/checkout@v4
19
- run: npm install
20
- run: npm run typecheck

Secrets nécessaires

  • DOCKERHUB_USERNAME
  • DOCKERHUB_TOKEN

Ajoute‐les dans : Repo → Settings → Secrets → Actions.

Prépare l’image Docker

Dockerfile
1
FROM node:22-alpine AS dev-deps
2
WORKDIR /app
3
COPY . .
4
RUN npm ci # deps + devDeps
5
6
FROM node:22-alpine AS prod-deps
7
WORKDIR /app
8
COPY package*.json ./
9
RUN npm ci --omit=dev # deps prod only
10
11
FROM node:22-alpine AS build
12
WORKDIR /app
13
COPY . .
14
COPY --from=dev-deps /app/node_modules ./node_modules
15
RUN npm run build
16
17
FROM node:22-alpine
18
WORKDIR /app
19
COPY package*.json .
20
COPY prisma ./prisma
21
COPY --from=prod-deps /app/node_modules ./node_modules
22
COPY --from=build /app/build ./build
23
RUN npx prisma generate
24
CMD ["npm","run","start"]

Ajoute un .dockerignore minimal :

.dockerignore
1
node_modules
2
build
3
README.md

Compose : dev et prod

docker-compose.dev.yml
1
services:
2
shop_router_dev:
3
build: .
4
container_name: shop_router_dev
5
ports:
6
- "3000:3000"
7
env_file: .env
docker-compose.prod.yml
1
services:
2
shop_router_production:
3
image: algomax/shop-router:production
4
container_name: shop_router_production
5
ports:
6
- "3011:3000"
7
env_file: .env.production

Crée ton dépôt Docker Hub

  1. Va sur hub.docker.comCreate repository.
  2. Nom : shop-router.
  3. Laisse en public (gratuit) ou private (1 image gratuite).

Le tag production sera donc :

1
algomax/shop-router:production

Prépare le serveur VPS

  1. User non-root + clé SSH
Terminal
1
adduser virgile
2
usermod -aG sudo virgile
3
ssh-keygen -t ed25519 -f ~/.ssh/hostinger
4
# copie la clé .pub dans ~/.ssh/authorized_keys
  1. Mise à jour & Docker
Terminal
1
sudo apt update && sudo apt full-upgrade -y
2
curl -fsSL https://get.docker.com | sudo bash
3
sudo apt install docker-compose-plugin -y
4
sudo usermod -aG docker virgile
  1. Runner GitHub auto-hébergé
Terminal
1
mkdir -p ~/deployments/shop-router && cd ~/deployments/shop-router
2
# copie/colle le script d’installation donné par GitHub
3
./config.sh
4
sudo ./svc.sh install
5
sudo ./svc.sh start

Le runner apparaît en idle dans Settings → Actions → Runners.

Reverse proxy Caddy + HTTPS

/etc/caddy/Caddyfile
1
shop-router.algomax.fr {
2
reverse_proxy localhost:3011
3
encode zstd gzip
4
}
Terminal
1
sudo systemctl reload caddy

Flux complet après merge main

1
sequenceDiagram
2
participant GitHub
3
participant Runner
4
participant DockerHub
5
participant VPS
6
7
GitHub->>GitHub: CI (type-check)
8
GitHub->>DockerHub: build + push image :production
9
GitHub->>Runner: job deploy
10
Runner->>DockerHub: docker pull image
11
Runner->>VPS: docker compose up -d (-f docker-compose.prod.yml)
12
VPS->>Caddy: service écoute 3011
13
Caddy->>client: https://shop-router.algomax.fr

Le site est live, sécurisé TLS, et chaque git push main redéploie en < 2 min.

Problèmes typiques et correctifs

MessageCauseFix
platform linux/amd64 missingVPS x86, image buildée arm64 depuis Mac M1ajoute platform: linux/amd64 dans compose prod
Cannot find module '@prisma/client'package en devDependenciesdéplace @prisma/client dans dependencies
permission denied to push imagePAT Docker Hub en lecture seulerégénère le token avec scope read/write
404 après déploiementCaddy cible mauvais portvérifie 3011 dans compose + Caddyfile

Et maintenant ?

  1. Passe les variables .env.production en vraies clés Stripe, PostgreSQL cloud.
  2. Mets à jour le DNS (champ A) → shop-router.algomax.fr.
  3. Vérifie la CI : badge green ✅
  4. Ouvre un ticket si tu bloques : Discord Algomax t’attend.
Inclus
Quiz interactif
Testez vos connaissances et validez votre compréhension du module avec notre quiz interactif.
1

Comprendre les concepts fondamentaux

Quelle est la principale différence entre les composants client et serveur dans React ?

Les composants client s'exécutent uniquement dans le navigateur
Les composants serveur peuvent utiliser useState
Les composants client sont plus rapides
Il n'y a aucune différence significative
2

Optimisation des performances

Quelle technique est recommandée pour éviter les rendus inutiles dans React ?

Utiliser React.memo pour les composants fonctionnels
Ajouter plus d'états locaux
Éviter d'utiliser les props
Toujours utiliser les class components
3

Architecture des données

Quel hook permet de gérer les effets de bord dans un composant React ?

useEffect
useState
useMemo
useContext
4

Gestion des erreurs

Comment implémenter la gestion des erreurs pour les requêtes API dans React ?

Utiliser try/catch avec async/await
Ignorer les erreurs
Toujours afficher un message d'erreur
Rediriger l'utilisateur
5

Déploiement et CI/CD

Quelle est la meilleure pratique pour déployer une application React en production ?

Utiliser un service CI/CD comme GitHub Actions
Copier les fichiers manuellement via FTP
Envoyer le code source complet
Ne jamais mettre à jour l'application

Débloquez ce quiz et tous les autres contenus inclus en achetant ce cours