9
votes

Comment générer une version de production d'une API réalisée avec NESTJS

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


0 commentaires

6 Réponses :


1
votes

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.


1 commentaires

OMG. Après 6 heures, j'ai vu votre phrase "spécifique à la machine". J'aurais aimé le savoir. Merci!



10
votes

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!


0 commentaires

2
votes

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:

  1. Exécutez npm install et les outils dont vous avez besoin pour créer l'application.
  2. Créez un conteneur Docker et copiez dist / , node_modules et package.json
  3. Dans le conteneur docker, exécutez npm rebuild bcrypt --update-binary

1 commentaires

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.



4
votes

Pour moi, cette approche a fonctionné et tout ce dont vous avez besoin est le dossier dist pour cela:

  • Créez une version prod de votre application en utilisant npm run start: prod , cela créerait un dossier dist dans la source de votre application
  • Copiez le dossier dist sur votre serveur.
  • Pour obtenir toutes les dépendances 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à.
  • Si vous utilisez pm2 pour exécuter vos applications de nœud, exécutez simplement pm2 start main.js à partir du dossier dist

0 commentaires

1
votes

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


0 commentaires

0
votes

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.


0 commentaires