Outil de guilde World of Warcraft — monorepo TypeScript : portail Next.js, API NestJS + Prisma/Postgres, client desktop Electron (enregistrement POV multi-joueurs + Simbot local), addon Lua WoW.
Source de vérité courante : CLAUDE.md + les docs
skills/*.md.
pnpm install
pnpm approve-builds electron # Windows: première install Electron
pnpm dev:all # NestJS (4000) + Next.js (3000) en parallèle
pnpm dev:electron # Client Electron
pnpm dev:electron:clean # userData isolé + cache GPU désactivéL'installeur Windows (GuildCompanion-Setup-*.exe) est volontairement non
signé pendant la phase de développement (< v1). Au premier lancement,
Windows SmartScreen affiche un écran bleu « Windows a protégé votre
ordinateur » / « Éditeur inconnu ».
Pour contourner :
- Cliquer sur « Informations complémentaires ».
- Cliquer sur « Exécuter quand même ».
Windows mémorise le choix : le clic n'est nécessaire qu'une seule fois par
version. Les mises à jour automatiques (via electron-updater) ne
re-déclenchent pas SmartScreen.
Plan v1 : passage au target appx + Microsoft Store (gratuit pour dev solo
depuis 2024). Détails complets + justification dans
docs/signing.md.
Une version illustrée (captures d'écran, walkthrough utilisateur) est disponible sur la page de téléchargement publique : https://app.guildcompanion.fr/download.
Workflows GitHub Actions actifs (.github/workflows/) :
| Fichier | Rôle | Déclencheurs |
|---|---|---|
tag-publish.yml |
Build & artefacts (images Docker server/web, Electron multi-OS, Helm chart, draft Release) | tag v* |
deploy-prod.yml |
Déploiement API sur VPS via SSH | push main / dispatch |
deploy-web.yml |
Déploiement web sur VPS via SSH | push main / dispatch |
Phases release :
- Bump version manuel via
pnpm release:version(Lerna, conventional commits). - Push du tag
vX.Y.Z→tag-publish.ymlbuild les images + artefacts Electron + crée une Release draft. - Push sur
main→deploy-prod.yml/deploy-web.ymlredéploient le VPS.
Toggles build (repository variables) :
| Variable | Effet |
|---|---|
ENABLE_ELECTRON=false |
Ignore le job Electron dans tag-publish.yml |
ENABLE_HELM=false |
Ignore le job Helm dans tag-publish.yml |
Stack rapide API + Web + Loki + Promtail + Grafana :
docker compose up -dAccès :
- API : http://localhost:4000/health
- Web : http://localhost:8080/
- Grafana : http://localhost:3000 (admin / admin)
Dans Grafana, ajouter le datasource Loki (URL : http://loki:3100) si non auto-détecté, puis requête :
{container="gc-api"}
ou
{container="gc-web"}
Persistance : volumes nommés loki-data et grafana-data.
Déploiement automatisé via deploy-prod.yml (API) et deploy-web.yml (web) — SSH sur le VPS + docker compose up -d avec polling healthcheck.
Déclencheurs :
- Push
main(si chemins impactés) - Manuel via
workflow_dispatch
Health checks :
- API :
GET /api/health - Web :
GET /health.json(nginx statique)
Secrets requis : DOCKERHUB_USERNAME, DOCKERHUB_TOKEN, PROD_SSH_HOST, PROD_SSH_USER, PROD_SSH_KEY, DATABASE_URL, DISCORD_CLIENT_ID, DISCORD_CLIENT_SECRET, DISCORD_REDIRECT_URI, CORS_ORIGIN, BLIZZARD_CLIENT_ID, BLIZZARD_CLIENT_SECRET, BLIZZARD_REDIRECT_URI, WCL_CLIENT_ID, WCL_CLIENT_SECRET, TOKEN_ENCRYPTION_KEY.
Modes :
dryRun: build/pull mais pas de restart conteneur.skipBuild: saute la construction d'image (utilise tags existants).
Déploiement ciblé serveur seul :
workflow_dispatch: services=server skipBuild=true
Ref spécifique (ex : tag déjà publié) :
workflow_dispatch: ref=v1.2.3 skipBuild=true
| Script | Rôle | Notes |
|---|---|---|
scripts/stack-all.sh |
Démarre la stack d'observabilité + services locaux | --build pour reconstruire les images locales |
scripts/stack-down.sh |
Stop & remove la stack compose | |
scripts/stack-disk-check.sh |
Affiche la taille cumulée des volumes | Aide à décider d'un prune |
scripts/validate-secrets.sh |
Vérifie la présence des secrets critiques | Utilisé ponctuellement hors CI |
scripts/electron-dev.ts |
Lancement Electron dev (flags : --clean, --no-electron, --delay <ms>) |
pnpm dev:electron:clean utilise --clean |
Documentation détaillée des outils : voir docs/maintenance/tools.md.