Je génère la version de production d'une API que j'ai créée en utilisant le framework NESTJS et j'aimerais savoir quels fichiers je dois télécharger sur le serveur. Quand j'exécute la compilation "npm run start: prod", il génère le dossier "dist" mais j'ai essayé de l'exécuter uniquement avec lui mais ce n'est pas suffisant pour exécuter mon application. Dois-je télécharger tous les fichiers sur le serveur? J'ai fait plusieurs tests en supprimant les dossiers que j'ai utilisés pendant le développement mais je n'ai réussi à fonctionner en mode production que lorsque j'étais tout de même en mode développement.
J'ai cherché quelque chose à ce sujet dans la documentation mais je n'ai rien trouvé. quelqu'un peut-il m'aider?
Merci
6 Réponses :
La plupart du temps, vous n'aurez besoin que des dépendances dans node_modules
. Vous devriez cependant créer les bibliothèques sur votre serveur au lieu de les copier depuis votre machine de développement. Les bibliothèques comme bcrypt
ont un code spécifique à la machine et ne fonctionneront probablement pas sur une autre machine. ( 30% des bibliothèques npm ont des liaisons natives.)
Donc, pour votre déploiement, je recommanderais de récupérer votre dépôt git sur votre serveur, puis d'exécuter simplement npm run start: prod
(qui construit le projet à chaque fois) directement là-bas.
OMG. Après 6 heures, j'ai vu votre phrase "spécifique à la machine". J'aurais aimé le savoir. Merci!
Honnêtement, vous ne devriez vraiment avoir besoin que du dossier dist car ce sont les fichiers JS "conformes". Pour exécuter votre application, vous utilisez généralement cette commande node dist / main.js
. Quant aux fichiers que vous téléchargez, cela dépend de vous. Personnellement, j'utilise beaucoup d'intégration continue, donc je clonerais simplement pour repo dans mon conteneur / serveur et utiliserais yarn start: prod
. C'est ainsi à chaque fois que je déploie, je génère les fichiers requis pour s'exécuter dans un environnement de production.
Comme @Kim Kern l'a mentionné, certains modules de nœuds sont natifs construits en utilisant node-gyro; il est donc toujours préférable de créer vos node_modules sur le serveur / conteneur lors du déploiement. Votre script de déploiement devrait ressembler à quelque chose comme ceci
git clone git@github.com:myuser/myrepo.git /var/www/ cd /var/www/ node -v && \ yarn && \ yarn build && \ yarn start:prod
Le script ci-dessus devrait
1) extraire le dépôt requis dans un répertoire «hébergé»
2) vérifier la version du nœud
3) installez node_modules et créez des scripts natifs, etc.
4) Construisez la distribution de production
5) exécutez les scripts JS de production
Si vous regardez dans votre fichier package.json, vous remarquerez les différents scripts qui sont exécutés lorsque vous utilisez yarn start
, yarn start: dev
et yarn start: prod
. Lorsque vous êtes en développement, vous remarquerez l'utilisation de ts-node
qui est une chose de type coureur de nœud tapé (je ne me souviens pas de la phrase correcte). Le script start: dev
utilise également nodemode pour redémarrer le script ts-node
. Vous verrez également que le script start: prod
utilise node dist / main.js
et que le script prestart: prod
exécute rm -rf dist && tsc
qui supprime le dossier dist et «compile» le javascript requis pour un environnement de production.
Cependant, l'inconvénient d'une application dactylographiée sur votre serveur sans intégration continue est qu'il y a la possibilité d'erreurs de compilation dactylographiées que vous ne verriez pas ou ne sauriez pas avant d'exécuter les scripts prod. Je recommanderais de mettre en place une procédure pour compiler le javascipt à partir de typescript avant de faire un déploiement car vous ne voulez pas supprimer la construction dist actuelle avant de savoir que la prochaine version sera compilée et exécutée!
Nous ne construisons pas notre application en production, mais la construisons à la place lors de la création de notre conteneur docker.
Les étapes pour nous sont en gros:
dist /
, node_modules
et package.json
npm rebuild bcrypt --update-binary
Cela semble plus intelligent. Vous ne voulez pas que la version de production se retrouve avec des modules légèrement différents après le transfert de la construction sur CI. Les versions de production doivent être EXACTEMENT ce qui a été construit dans CI, sans code téléchargé d'Internet vers la production.
Pour moi, cette approche a fonctionné et tout ce dont vous avez besoin est le dossier dist
pour cela:
npm run start: prod
, cela créerait un dossier dist
dans la source de votre application dist
sur votre serveur. node_modules
sur votre serveur, copiez simplement votre fichier package.json
dans le dossier dist
(dans lequel vous avez copié serveur), puis exécutez npm install
à partir de là. pm2
pour exécuter vos applications de nœud, exécutez simplement pm2 start main.js
à partir du dossier dist
Utilisez simplement Nest-CLI et compilez avec
async function bootstrap() { let appConfig = {} if (process.env.production) { console.log('process env production: ', process.env.production) const httpsOptions = { key: fs.readFileSync('/etc/certs/letsencrypt/live/testtest.de/privkey.pem'), cert: fs.readFileSync('/etc/certs/letsencrypt/live/testtest.de/fullchain.pem'), } // prod config appConfig = { httpsOptions, } } const app = await NestFactory.create<NestExpressApplication>( AppModule, appConfig, ) app.enableCors() app.setGlobalPrefix('v1') await app.listen(3300) } bootstrap()
Ensuite, vous obtenez un dossier dist avec le code compilé. Vous pouvez ensuite le placer sur un serveur et exécuter par exemple avec le gestionnaire de processus PM2:
production=true pm2 start dist/main.js
Dans l'ancienne commande, la variable d'environnement production est définie sur true . Cela pourrait par exemple être utile lorsque vous exécutez le serveur Nest.js sur HTTPS.
Si vous souhaitez exécuter un serveur sécurisé HTTPS, vous devez également inclure les certificats dans le processus de démarrage du serveur. Lorsque la production de variable d'environnement est définie et vraie, les certificats sont inclus dans le processus de démarrage de l'application Nest.js dans main.ts comme suit:
nest build
Nous utilisons NX pour monorepo où nous détenons nos API. Et nous utilisons docker pour nos images et conteneurs. Lorsque nous devons créer une image docker, exécutez uniquement: npx nx build
et cela génère une build sur dist/apps/
. Ce dossier va à l'image du docker, avec le package.json et c'est tout. Vous n'avez pas besoin d'ajouter node_modules, car ils se trouvent sur package.json. Assurez-vous simplement d'inclure npm install
dans votre Dockerfile.