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.
avec React Router 7
Posez vos questions 24/7 à notre IA experte en React Router 7
Validez vos acquis avec des quiz personnalisés et un feedback instantané
Nous partons d’un dépôt local fonctionnel. On initialise Git, on crée un repo distant puis on pousse le code :
1git init2git add .3git commit -m "feat: MVP e-commerce prêt"4git branch -M main5git remote add origin git@github.com:<ton-user>/shop-router.git6git push -u origin main
Nous voulons :
Crée le dossier .github/workflows
et colle les deux fichiers suivants.
1name: 🐳 Build And Push Docker Image23on:4workflow_call:5inputs:6tag:7type: string89jobs:10build:11if: ${{ github.ref == 'refs/heads/main' || github.ref == 'refs/heads/dev' }}12runs-on: ubuntu-latest13steps:14- uses: actions/checkout@v415- uses: docker/login-action@v216with:17username: ${{ secrets.DOCKERHUB_USERNAME }}18password: ${{ secrets.DOCKERHUB_TOKEN }}19- uses: docker/setup-buildx-action@v220- name: 🐳 Build & Push21uses: docker/build-push-action@v322with:23context: .24push: true25tags: algomax/shop-router:${{ inputs.tag }}
1name: Docker Image CI2on:3push:4branches: ['main','dev']5pull_request:6branches: ['main','dev']78jobs:9build:10uses: ./.github/workflows/build.yml11with:12tag: ${{ github.ref == 'refs/heads/main' && 'production' || 'latest' }}13secrets: inherit1415typecheck:16runs-on: ubuntu-latest17steps:18- uses: actions/checkout@v419- run: npm install20- run: npm run typecheck
DOCKERHUB_USERNAME
DOCKERHUB_TOKEN
Ajoute‐les dans : Repo → Settings → Secrets → Actions.
1FROM node:22-alpine AS dev-deps2WORKDIR /app3COPY . .4RUN npm ci # deps + devDeps56FROM node:22-alpine AS prod-deps7WORKDIR /app8COPY package*.json ./9RUN npm ci --omit=dev # deps prod only1011FROM node:22-alpine AS build12WORKDIR /app13COPY . .14COPY --from=dev-deps /app/node_modules ./node_modules15RUN npm run build1617FROM node:22-alpine18WORKDIR /app19COPY package*.json .20COPY prisma ./prisma21COPY --from=prod-deps /app/node_modules ./node_modules22COPY --from=build /app/build ./build23RUN npx prisma generate24CMD ["npm","run","start"]
Ajoute un .dockerignore
minimal :
1node_modules2build3README.md
1services:2shop_router_dev:3build: .4container_name: shop_router_dev5ports:6- "3000:3000"7env_file: .env
1services:2shop_router_production:3image: algomax/shop-router:production4container_name: shop_router_production5ports:6- "3011:3000"7env_file: .env.production
hub.docker.com
→ Create repository.shop-router
.Le tag production
sera donc :
1algomax/shop-router:production
1adduser virgile2usermod -aG sudo virgile3ssh-keygen -t ed25519 -f ~/.ssh/hostinger4# copie la clé .pub dans ~/.ssh/authorized_keys
1sudo apt update && sudo apt full-upgrade -y2curl -fsSL https://get.docker.com | sudo bash3sudo apt install docker-compose-plugin -y4sudo usermod -aG docker virgile
1mkdir -p ~/deployments/shop-router && cd ~/deployments/shop-router2# copie/colle le script d’installation donné par GitHub3./config.sh4sudo ./svc.sh install5sudo ./svc.sh start
Le runner apparaît en idle dans Settings → Actions → Runners.
1shop-router.algomax.fr {2reverse_proxy localhost:30113encode zstd gzip4}
1sudo systemctl reload caddy
main
1sequenceDiagram2participant GitHub3participant Runner4participant DockerHub5participant VPS67GitHub->>GitHub: CI (type-check)8GitHub->>DockerHub: build + push image :production9GitHub->>Runner: job deploy10Runner->>DockerHub: docker pull image11Runner->>VPS: docker compose up -d (-f docker-compose.prod.yml)12VPS->>Caddy: service écoute 301113Caddy->>client: https://shop-router.algomax.fr
Le site est live, sécurisé TLS, et chaque git push main
redéploie en < 2 min.
Message | Cause | Fix |
---|---|---|
platform linux/amd64 missing | VPS x86, image buildée arm64 depuis Mac M1 | ajoute platform: linux/amd64 dans compose prod |
Cannot find module '@prisma/client' | package en devDependencies | déplace @prisma/client dans dependencies |
permission denied to push image | PAT Docker Hub en lecture seule | régénère le token avec scope read/write |
404 après déploiement | Caddy cible mauvais port | vérifie 3011 dans compose + Caddyfile |
.env.production
en vraies clés Stripe, PostgreSQL cloud.shop-router.algomax.fr
.Quelle est la principale différence entre les composants client et serveur dans React ?
Quelle technique est recommandée pour éviter les rendus inutiles dans React ?
Quel hook permet de gérer les effets de bord dans un composant React ?
Comment implémenter la gestion des erreurs pour les requêtes API dans React ?
Quelle est la meilleure pratique pour déployer une application React en production ?