From 859683b6242019c32f116b78cbbbe3bc677a43e0 Mon Sep 17 00:00:00 2001 From: Johan LEROY Date: Mon, 4 May 2026 12:05:08 +0200 Subject: [PATCH] prod setup --- .gitea/workflows/deploy.yml | 54 ------------------------------------- CLAUDE.md | 6 ++--- README.md | 26 +++++++++--------- 3 files changed, 17 insertions(+), 69 deletions(-) delete mode 100644 .gitea/workflows/deploy.yml diff --git a/.gitea/workflows/deploy.yml b/.gitea/workflows/deploy.yml deleted file mode 100644 index f20b298..0000000 --- a/.gitea/workflows/deploy.yml +++ /dev/null @@ -1,54 +0,0 @@ -name: Deploy to Plesk (Node.js hosting) -on: - push: - branches: - - main - -jobs: - build-and-deploy: - runs-on: ubuntu-latest - - steps: - - name: Checkout repository - uses: actions/checkout@v4 - - - name: Setup Node.js - uses: actions/setup-node@v4 - with: - node-version: '22' - cache: 'npm' - - - name: Install dependencies - run: npm ci - - - name: Build project - run: npm run build - - - name: Check build output - run: ls -la ./dist - - - name: Deploy via FTP to Plesk - run: | - sudo apt-get update && sudo apt-get install -y lftp - HOST=${{ secrets.FTP_HOST }} - USER=${{ secrets.FTP_USER }} - PASSWORD=${{ secrets.FTP_PASSWORD }} - TARGET_DIR=${{ secrets.FTP_TARGET_DIR }} - lftp -c " - open -u $USER,$PASSWORD $HOST - set ssl:verify-certificate no - mirror -R --delete --verbose \ - --exclude-glob node_modules/ \ - --exclude-glob .git/ \ - --exclude-glob .astro/ \ - --exclude-glob public/content/ \ - ./dist $TARGET_DIR/dist - mirror -R --verbose ./public $TARGET_DIR/public - put -O $TARGET_DIR package.json - put -O $TARGET_DIR package-lock.json - " - - - name: Trigger Plesk restart - if: success() - run: | - echo "::notice::Build uploadé. Redémarre l'application Node.js depuis Plesk pour appliquer." diff --git a/CLAUDE.md b/CLAUDE.md index 8794ec2..6d0b89e 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -6,7 +6,7 @@ Site vitrine personnel en **Astro 6 hybrid** (SSG public + SSR admin), identité - Utilisateur : **Johan Leroy** — dev fullstack + DJ tekno - Objectif : remplacer l'ancien portfolio Angular 19 (`~/WebstormProjects/Portfolio_angular/`) par une version moderne, animée, maintenable sans recompilation -- Déploiement : **Plesk Node.js** sur `johanleroy.fr` (CI Gitea FTP) +- Déploiement : **Plesk Node.js** sur `johanleroy.fr` (upload FTP manuel, pas de CI) - Commande `/context johanleroy` charge tout le contexte projet ## Stack @@ -25,7 +25,7 @@ Site vitrine personnel en **Astro 6 hybrid** (SSG public + SSR admin), identité Tout le contenu du site est dans **`data/content/*.json`** (7 fichiers, **gitignored**). Chaque fichier est validé par un schéma Zod dans `src/content/schemas/`. Édition possible via `/admin` ou directement en éditant le JSON. Au premier run, les JSON sont copiés depuis `public/content/*.json` (seeds versionnés en repo) si `data/content/` est vide — voir `src/lib/content.ts`. ### Persistance prod (Plesk) -Le déploiement Gitea CI/CD FTP **rebuilt `public/` à chaque push**. C'est pour ça que tout le contenu dynamique est dans **`data/`** (gitignored, conservé entre déploiements) : +Le déploiement (FTP manuel) **réécrit `dist/` et `public/` à chaque upload**. C'est pour ça que tout le contenu dynamique est dans **`data/`** (gitignored, jamais touché par l'upload, conservé entre déploiements) : - `data/content/*.json` — JSON édités via `/admin` - `data/uploads/img/{folder}/*` — images uploadées - `data/uploads/assets/{folder}/*` — PDF (CV) @@ -35,7 +35,7 @@ Les fichiers de `data/uploads/` sont servis via la route **`/api/files/[...path] **Init prod (premier déploiement post-refonte)** : 1. Sur le serveur Plesk, créer `data/{content,uploads/img,uploads/assets}` avec les bons droits (utilisateur Node). 2. Copier les seeds : `cp public/content/*.json data/content/` et `cp -r public/img/* data/uploads/img/` et `cp public/assets/cv.pdf data/uploads/assets/`. -3. Vérifier que la CI Gitea **n'écrase pas** `data/` (l'exclure du déploiement FTP, ou s'assurer qu'il ne fait pas partie du payload). +3. Lors des uploads FTP suivants, **ne jamais sélectionner `data/`** — uploader uniquement `dist/`, `public/`, `package.json`, `package-lock.json`. 4. Tester un upload via `/admin` → vérifier que le fichier arrive bien dans `data/uploads/...` et que `/api/files/...` le sert. **Sécurité** : `/api/files/[...path].ts` protège contre le path traversal (résolu via `resolve()` + check préfixe). Les uploads passent par `/api/upload` qui est JWT-gated dans `src/middleware.ts`. diff --git a/README.md b/README.md index a00ef43..5a0ab85 100644 --- a/README.md +++ b/README.md @@ -81,22 +81,24 @@ Login via mot de passe, cookie httpOnly 7 jours. ### Paramètres Plesk Node.js -- **Node.js version** : 22 -- **Application root** : racine du repo +- **Node.js version** : 22+ (24.x OK) +- **Application root** : `/httpdocs/johanleroy` +- **Document root Apache** : `/httpdocs/johanleroy/dist/client` (Apache sert les statiques buildés, le reste passe en proxy vers Node) - **Application startup file** : `dist/server/entry.mjs` -- **Application URL** : https://johanleroy.fr +- **Application URL** : https://johanleroy.fr (SSL Let's Encrypt obligatoire pour les cookies admin) -### CI/CD Gitea (branch `main`) +### Déploiement manuel -Le workflow `.gitea/workflows/deploy.yml` déclenche un build + upload FTP sur chaque push `main`. +1. **Build local** : `npm run build` (vérifier que `dist/server/entry.mjs` est généré) +2. **Upload FTP/SFTP** vers le répertoire de l'application Plesk (ex : `/httpdocs/johanleroy/`) : + - `dist/` (écrase l'existant) + - `public/` (écrase l'existant) + - `package.json` + - `package-lock.json` +3. **Plesk → Node.js → NPM install** (à faire si `package.json` a changé) +4. **Plesk → Node.js → Restart App** pour recharger le nouveau bundle -**Secrets Gitea à configurer :** -- `FTP_HOST` -- `FTP_USER` -- `FTP_PASSWORD` -- `FTP_TARGET_DIR` (ex : `/httpdocs/johanleroy`) - -Après chaque déploiement : redémarrer l'application Node.js depuis Plesk pour prendre en compte les nouveaux fichiers. +**Ne JAMAIS écraser** : `data/`, `.env`, `node_modules/` côté serveur. ---