mirror of
https://github.com/IliesAllali/parenthese.git
synced 2026-11-10 07:52:13 +00:00
Utilisateurs - Suppression de compte depuis l'écran « Votre compte », confirmée par mot de passe : arbres possédés et médias effacés, email retiré des contributions, sessions fermées partout. - Suppression d'arbre définitive, en base et sur le disque. - Ajout d'un frère ou d'une sœur relié aux parents existants ; relations parent et enfant corrigées en mode démo. - Liste d'attente retirée (route, envoi d'emails, dépendance Resend). Projet ouvert - CI : front, landing, backend avec vérification des migrations, test Docker de bout en bout. - Déploiement lancé seulement après une CI réussie sur main. - Image API : CLI Prisma installée à part pour que les migrations tournent au démarrage. - SECURITY.md, CONTRIBUTING.md, modèles d'issue et de pull request. - Migration renommée avec un nom descriptif, contenu identique. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
88 lines
3.2 KiB
YAML
88 lines
3.2 KiB
YAML
name: Deploy Hostinger
|
|
|
|
# Déploie Parenthèse sur le VPS quand le workflow « CI » a réussi sur un push sur main, ou à la main.
|
|
# Le travail est fait sur le serveur par deploy/deploy.sh, incrémental et verrouillé : seules les parties
|
|
# modifiées sont reconstruites, et un run sans changement ne reconstruit rien.
|
|
# Le serveur déploie origin/main au moment du run (fetch + reset) : si deux pushs se suivent de près,
|
|
# c'est le plus récent qui part, sa propre CI déclenchera ensuite un run sans changement.
|
|
on:
|
|
workflow_run:
|
|
workflows:
|
|
- CI
|
|
types:
|
|
- completed
|
|
branches:
|
|
- main
|
|
workflow_dispatch:
|
|
inputs:
|
|
full:
|
|
description: 'Tout réinstaller et tout reconstruire'
|
|
type: boolean
|
|
default: false
|
|
|
|
permissions:
|
|
contents: read
|
|
|
|
# Un déploiement à la fois. Un push arrivé pendant un déploiement attend son tour au lieu de le couper
|
|
# (couper un npm ci en cours laisse node_modules à moitié vide).
|
|
concurrency:
|
|
group: hostinger-production
|
|
cancel-in-progress: false
|
|
|
|
jobs:
|
|
deploy:
|
|
# Uniquement sur le dépôt d'origine (jamais sur un fork), et après une CI réussie sur un vrai push sur main.
|
|
if: >-
|
|
github.repository == 'IliesAllali/parenthese' &&
|
|
(
|
|
github.event_name == 'workflow_dispatch' ||
|
|
(
|
|
github.event.workflow_run.conclusion == 'success' &&
|
|
github.event.workflow_run.event == 'push' &&
|
|
github.event.workflow_run.head_branch == 'main' &&
|
|
github.event.workflow_run.head_repository.full_name == 'IliesAllali/parenthese'
|
|
)
|
|
)
|
|
runs-on: ubuntu-latest
|
|
timeout-minutes: 25
|
|
|
|
steps:
|
|
- name: Start SSH agent
|
|
uses: webfactory/ssh-agent@v0.9.0
|
|
with:
|
|
ssh-private-key: ${{ secrets.HOSTINGER_SSH_PRIVATE_KEY }}
|
|
|
|
- name: Add Hostinger host key (best-effort)
|
|
env:
|
|
HOSTINGER_HOST: ${{ secrets.HOSTINGER_HOST }}
|
|
HOSTINGER_PORT: ${{ secrets.HOSTINGER_PORT }}
|
|
run: |
|
|
set -euo pipefail
|
|
PORT="${HOSTINGER_PORT:-22}"
|
|
mkdir -p ~/.ssh
|
|
# keyscan can fail if the host firewall blocks GitHub runners; make it non-fatal
|
|
ssh-keyscan -T 5 -p "$PORT" -H "$HOSTINGER_HOST" >> ~/.ssh/known_hosts || true
|
|
|
|
- name: Deploy on Hostinger
|
|
env:
|
|
HOSTINGER_HOST: ${{ secrets.HOSTINGER_HOST }}
|
|
HOSTINGER_PORT: ${{ secrets.HOSTINGER_PORT }}
|
|
HOSTINGER_USER: ${{ secrets.HOSTINGER_USER }}
|
|
FORCE_FULL: ${{ inputs.full && '1' || '0' }}
|
|
run: |
|
|
set -euo pipefail
|
|
PORT="${HOSTINGER_PORT:-22}"
|
|
|
|
# backend/.env vit sur le serveur, jamais dans GitHub (dépôt public)
|
|
ssh -p "$PORT" -o ServerAliveInterval=30 "$HOSTINGER_USER@$HOSTINGER_HOST" "FORCE_FULL=$FORCE_FULL bash -s" <<'EOF'
|
|
set -euo pipefail
|
|
cd /var/www/parenthese
|
|
# Sous le même verrou que deploy.sh : récupération du code, puis déploiement
|
|
flock -w 900 /tmp/parenthese-deploy.lock env PARENTHESE_DEPLOY_LOCKED=1 FORCE_FULL="$FORCE_FULL" bash -c '
|
|
set -euo pipefail
|
|
git fetch -q origin main
|
|
git reset -q --hard origin/main
|
|
bash deploy/deploy.sh
|
|
'
|
|
EOF
|