diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..4cc95bb --- /dev/null +++ b/.dockerignore @@ -0,0 +1,9 @@ +node_modules +dist +.git +.vscode +.idea +*.log +.env +.env.* +!.env.example diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..ad2790e --- /dev/null +++ b/Dockerfile @@ -0,0 +1,20 @@ +# syntax=docker/dockerfile:1 + +FROM node:22-alpine AS builder + +WORKDIR /app + +COPY package.json package-lock.json ./ +RUN npm ci + +COPY . . +RUN npm run build + +FROM nginx:1.27-alpine AS runner + +COPY docker/nginx.conf /etc/nginx/conf.d/default.conf +COPY --from=builder /app/dist /usr/share/nginx/html + +EXPOSE 80 + +CMD ["nginx", "-g", "daemon off;"] diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..1e5af94 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,6 @@ +services: + web: + build: . + ports: + - "5173:80" + restart: unless-stopped diff --git a/docker/nginx.conf b/docker/nginx.conf new file mode 100644 index 0000000..d280c57 --- /dev/null +++ b/docker/nginx.conf @@ -0,0 +1,20 @@ +server { + listen 80; + listen [::]:80; + server_name localhost; + root /usr/share/nginx/html; + index index.html; + + location = /index.html { + add_header Cache-Control "no-cache"; + } + + location / { + try_files $uri $uri/ /index.html; + } + + location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|webp|woff2?)$ { + expires 1y; + add_header Cache-Control "public, immutable"; + } +} diff --git a/src/data/projets.js b/src/data/projets.js index 5e3167e..81a00b3 100644 --- a/src/data/projets.js +++ b/src/data/projets.js @@ -1,5 +1,38 @@ /** Cartes projet (page Projets) : titre, compétences, visuel, texte, lien externe. */ export const PROJETS = [ + { + id: 'clipautocs2', + title: 'clipAutoCS2', + skills: ['Vidéo', 'YouTube'], + imageSrc: 'https://picsum.photos/seed/billeterie/640/360', + imageAlt: 'Aperçu du projet clipAutoCS2', + description: + 'Création de clips highlight pro sur CS2.\nRécupération d’un match e-sport et traitement des données.\nEnregistrement automatisé des meilleurs moments, montage vidéo, publication sur YouTube.\nProjet personnel — GitHub perso.', + link: 'https://github.com/Foufure13', + linkLabel: 'Profil GitHub', + }, + { + id: 'cryptobot', + title: 'CryptoBot', + skills: ['API', 'Dashboard', 'Crypto', 'Trading'], + imageSrc: '/images/cryptobot-preview.png', + imageAlt: 'Aperçu du projet CryptoBot', + description: + 'Outil complet de gestion de comptes crypto par API.\nSite web dashboard, sécurité compte / base de données.\nRécupération des flux marché (API), aide à la décision d’investissement, trading sur portefeuille (API).\nDépôt GitHub privé.', + link: 'https://github.com/Foufure13', + linkLabel: 'Profil GitHub (dépôt privé)', + }, + { + id: 'mecafollow', + title: 'mecaFollow', + skills: ['Web', 'Suivi', 'E-mail'], + imageSrc: '/images/mecafollow-preview.png', + imageAlt: 'Aperçu du projet mecaFollow', + description: + 'Site web personnel ou professionnel : enregistrement et suivi d’une voiture ou autre véhicule pour faciliter le suivi des entretiens (un ou plusieurs véhicules).\nNotifications par e-mail lorsqu’une intervention est nécessaire.\nProjet personnel et professionnel — GitHub sécurisé.', + link: 'https://github.com/Foufure13', + linkLabel: 'Profil GitHub (dépôt sécurisé)', + }, { id: 'androidpayload', title: 'androidpayload', @@ -47,7 +80,7 @@ export const PROJETS = [ { id: 'twitch-bot-interactif', title: 'Twitch Bot Interactif', - skills: ['Twitch', 'API', 'STT', 'Bot'], + skills: ['Twitch', 'API', 'Bot'], imageSrc: '/images/twitch-bot-preview.png', imageAlt: 'Aperçu du bot Twitch', description: @@ -69,7 +102,7 @@ export const PROJETS = [ { id: 'realmaster', title: 'RealMaster', - skills: ['Web', 'Social', 'Stats'], + skills: ['Web', 'Stats'], imageSrc: 'https://picsum.photos/seed/lkfindpost/640/360', imageAlt: 'Aperçu du projet RealMaster', description: @@ -91,7 +124,7 @@ export const PROJETS = [ { id: 'airsoft-vitrine', title: 'Airsoft vitrine', - skills: ['Web', 'Association', 'Vitrine'], + skills: ['Association', 'Vitrine'], imageSrc: '/images/airsoft-vitrine-preview.png', imageAlt: 'Aperçu du site Airsoft', description: @@ -99,21 +132,10 @@ export const PROJETS = [ link: 'https://github.com/Foufure13/Airsoft', linkLabel: 'Airsoft sur GitHub', }, - { - id: 'cryptobot', - title: 'CryptoBot', - skills: ['API', 'Dashboard', 'Crypto', 'Trading'], - imageSrc: '/images/cryptobot-preview.png', - imageAlt: 'Aperçu du projet CryptoBot', - description: - 'Outil complet de gestion de comptes crypto par API.\nSite web dashboard, sécurité compte / base de données.\nRécupération des flux marché (API), aide à la décision d’investissement, trading sur portefeuille (API).\nDépôt GitHub privé.', - link: 'https://github.com/Foufure13', - linkLabel: 'Profil GitHub (dépôt privé)', - }, { id: 'bot-instagram', title: 'Bot autonome Instagram', - skills: ['Social', 'IA', 'API', 'Génération'], + skills: ['IA', 'API', 'Génération'], imageSrc: 'https://www.thispersondoesnotexist.com', imageAlt: 'Aperçu du bot Instagram', description: @@ -124,7 +146,7 @@ export const PROJETS = [ { id: 'site-partage-info', title: 'Site web de partage d’information', - skills: ['Web', 'Forum', 'Light'], + skills: ['Forum', 'Light'], imageSrc: '/images/site-partage-preview.png', imageAlt: 'Aperçu du site de partage', description: @@ -132,28 +154,6 @@ export const PROJETS = [ link: 'https://github.com/Foufure13', linkLabel: 'Profil GitHub (dépôt privé)', }, - { - id: 'mecafollow', - title: 'mecaFollow', - skills: ['Web', 'Suivi', 'E-mail'], - imageSrc: '/images/mecafollow-preview.png', - imageAlt: 'Aperçu du projet mecaFollow', - description: - 'Site web personnel ou professionnel : enregistrement et suivi d’une voiture ou autre véhicule pour faciliter le suivi des entretiens (un ou plusieurs véhicules).\nNotifications par e-mail lorsqu’une intervention est nécessaire.\nProjet personnel et professionnel — GitHub sécurisé.', - link: 'https://github.com/Foufure13', - linkLabel: 'Profil GitHub (dépôt sécurisé)', - }, - { - id: 'clipautocs2', - title: 'clipAutoCS2', - skills: ['Vidéo', 'YouTube'], - imageSrc: 'https://picsum.photos/seed/billeterie/640/360', - imageAlt: 'Aperçu du projet clipAutoCS2', - description: - 'Création de clips highlight pro sur CS2.\nRécupération d’un match e-sport et traitement des données.\nEnregistrement automatisé des meilleurs moments, montage vidéo, publication sur YouTube.\nProjet personnel — GitHub perso.', - link: 'https://github.com/Foufure13', - linkLabel: 'Profil GitHub', - }, { id: 'wiki-documentation', title: 'Wiki Documentation',