Voty est une application web permettant de créer, publier et répondre à des sondages (questions ouvertes et QCM).
- Client : Vue 3 + Vite, servi par Nginx
- API : Node.js + Express + TypeScript + Mongoose
- DB : MongoDB 7
- Infra dev : Docker Compose avec profils (
app), healthchecks et variables d’environnement
Prérequis : Docker + Docker Compose,
pnpmconseillé.
# Lancer toute la stack (client + api + db)
pnpm stack:up
# Suivre les logs
pnpm stack:logs
# Arrêter
pnpm stack:down- Front : http://localhost
- API : http://localhost:3000/api
- Health: http://localhost:3000/api/health
{
"scripts": {
"db:up": "docker compose up -d mongo",
"db:down": "docker compose stop mongo",
"db:logs": "docker compose logs -f mongo",
"stack:up": "docker compose --profile app up -d --build",
"stack:down": "docker compose --profile app down",
"stack:logs": "docker compose logs -f server client mongo"
}
}db:*: ne démarre que Mongo (pratique pour dev local hors Docker)stack:*: démarre client + serveur + db via le profilapp
- DB en Docker
pnpm db:up
pnpm db:logs # attendre "{ ok: 1 }"- API en local (dans
server/)
Créerserver/.env.development:
MONGO_URI=mongodb://root:rootpassword@127.0.0.1:27017/voty?authSource=admin&directConnection=true
PORT=3000
JWT_SECRET=dev-secret-change-me
CLIENT_URL=http://localhost:5173Lancer :
pnpm -F server devVérifier CORS :
curl -sI -H 'Origin: http://localhost:5173' http://localhost:3000/api/health | grep -i access-control-allow-origin
# => Access-Control-Allow-Origin: http://localhost:5173- Client en local (dans
client/)
Créerclient/.env:
VITE_API_URL=http://localhost:3000/apiLancer :
pnpm -F client devpnpm stack:up
# client : http://localhost
# api : http://localhost:3000/apiNote Vite : en mode Docker,
VITE_API_URLest injecté au build (viaclient/Dockerfileetdocker-compose.yml→build.args).
Pour le changer : modifiedocker-compose.yml→client.build.args.VITE_API_URL, puis rebuild :
docker compose build client --no-cache
pnpm stack:upGET /api/health→ liveness/readiness JSON (retourne 200 si DB connectée, sinon 503)- Auth, polls, responses : voir le code dans
server/src/routes/*(Swagger JSDoc dans les handlers)
.
├── docker-compose.yml
├── README.md
├── client/
│ ├── Dockerfile
│ ├── nginx.conf
│ ├── src/...
│ └── README.md
└── server/
├── Dockerfile
├── src/
│ ├── index.ts
│ ├── routes/
│ │ ├── healthRoutes.ts
│ │ ├── authRoutes.ts
│ │ ├── pollRoutes.ts
│ │ └── responsesRoutes.ts
│ └── ...
└── README.md
- Mongo “unhealthy” au démarrage :
docker compose down -v # ⚠️ supprime les données locales pnpm stack:up - Front appelle la mauvaise API en Docker : vérifier
client.build.args.VITE_API_URLet rebuild le client. - 404 sur /api/health : vérifier que
healthRoutesest bien monté dansserver/src/index.ts:import healthRoutes from "./routes/healthRoutes"; app.use("/api", healthRoutes);
- CORS : l’API doit autoriser
http://localhost(déjà le cas dans ta config).
- Node 20.x (si exécution locale), pnpm 10.x
- Images Docker :
node:20-alpine,mongo:7,nginx:alpine