Nouveau : Datasets open source gratuits disponibles !Decouvrir →
🟢
Intermediaire 20 min NestJS

Deployer NestJS sur Heroku

Pourquoi Déployer NestJS sur Heroku ?

Le déploiement d'une application NestJS sur Heroku permet aux développeurs de créer des applications web et API de qualité, en utilisant un environnement cloud fiable et évolutif. Heroku offre une plateforme complète pour le développement, le déploiement et l'hébergement des applications.

Un cas d'usage concret serait le déploiement d'une application backend de gestion de tâches pour une application mobile ou web. Cette application peut être déployée sur Heroku pour que les utilisateurs puissent accéder à leurs tâches depuis n'importe où, en tout temps.

Prerequis

  • Connaissances en développement backend avec Node.js et JavaScript
  • Familiarité avec NestJS
  • Un compte Heroku
  • Un IDE ou éditeur de code (VSCode recommandé)
  • Terminal accessible

Concepts fondamentaux

1. Comprendre le déploiement continu sur Heroku

Heroku prend en charge la conception et le déploiement des applications avec un modèle de déploiement continu (CI/CD). Lorsque vous faites une modification dans votre code source, vous pouvez déployer cette mise à jour sur Heroku simplement en exécutant une commande.

## Commitez vos modifications locales
git add .
git commit -m "Ajouter gestionnaire de tâches"

## Déployez sur Heroku
git push heroku master

2. Créer un fichier Procfile

Le fichier Procfile indique à Heroku comment démarrer votre application. C'est le script qui sera exécuté pour lancer votre application.

## Fichier Procfile
web: npm start

3. Utiliser les environnements de variables

Heroku vous permet de définir des variables d'environnement qui peuvent être utilisées dans votre application. Ces variables sont particulièrement utiles pour stocker des informations sensibles comme les clés API, le secret d'authentification et les mots de passe.

// Dans app.module.ts
import { Module } from '@nestjs/common';
import { ConfigModule } from '@nestjs/config';

@Module({
  imports: [
    ConfigModule.forRoot({
      envFilePath: '.env',
      isGlobal: true,
    }),
  ],
})
export class AppModule {}

Vous pouvez définir des variables d'environnement dans l'interface Heroku Dashboard ou en utilisant le CLI Heroku.

heroku config:set API_KEY=your_api_key -a your-app-name

4. Optimiser les performances sur Heroku

Heroku propose différents plans qui ont différentes limites et fonctionnalités. Pour optimiser les performances, vous pouvez utiliser des add-ons comme New Relic ou Datadog pour surveiller l'utilisation de votre application.

## Installer un add-on New Relic
heroku addons:create newrelic:standard-1 -a your-app-name

5. Utiliser le système de base de données Heroku Postgres

Heroku propose une version gratuite de PostgreSQL qui est parfaitement adaptée pour les petits projets et les prototypes.

## Installer l'add-on Heroku Postgres
heroku addons:create heroku-postgresql:hobby-dev -a your-app-name

Vous pouvez accéder à votre base de données en utilisant le CLI Heroku ou en configurant les variables d'environnement dans le fichier app.module.ts.

// Dans app.module.ts
import { Module } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm';

@Module({
  imports: [
    ConfigModule.forRoot({
      envFilePath: '.env',
      isGlobal: true,
    }),
    TypeOrmModule.forRoot({
      type: 'postgres',
      host: process.env.DATABASE_URL.split(':')[1].split('@')[1].split('/')[0],
      port: parseInt(process.env.DATABASE_URL.split(':')[2].split('?')[0]),
      username: process.env.DATABASE_URL.split(':')[3].split('@')[0],
      password: process.env.DATABASE_URL.split(':')[3].split('@')[1].split('/')[0],
      database: process.env.DATABASE_URL.split(':')[3].split('@')[1].split('/')[1],
      entities: [__dirname + '/**/*.entity{.ts,.js}'],
      synchronize: true,
    }),
  ],
})
export class AppModule {}

Mise en pratique : Projet fil rouge

Nous allons créer un simple gestionnaire de tâches en utilisant NestJS.

Étape 1 : Créer le projet NestJS

## Installer le CLI NestJS (si ce n'est pas déjà fait)
npm install -g @nestjs/cli

## Créer un nouveau projet NestJS
nest new task-manager

Étape 2 : Créer un module et une entité pour les tâches

## Créer un module TasksModule
nest generate module tasks

## Créer une entité TaskEntity
nest generate entity task

Étape 3 : Définir le modèle de données

// src/task/task.entity.ts
import { Entity, PrimaryGeneratedColumn, Column } from 'typeorm';

@Entity()
export class Task {
  @PrimaryGeneratedColumn()
  id: number;

  @Column()
  title: string;

  @Column({ default: false })
  completed: boolean;
}

Étape 4 : Créer un service pour les tâches

// src/task/task.service.ts
import { Injectable } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import { Repository } from 'typeorm';
import { Task } from './task.entity';

@Injectable()
export class TasksService {
  constructor(
    @InjectRepository(Task)
    private readonly taskRepository: Repository<Task>,
  ) {}

  findAll(): Promise<Task[]> {
    return this.taskRepository.find();
  }

  findOne(id: number): Promise<Task> {
    return this.taskRepository.findOne(id);
  }

  async remove(id: number): Promise<void> {
    await this.taskRepository.delete(id);
  }
}

Étape 5 : Créer un contrôleur pour les tâches

// src/task/task.controller.ts
import { Controller, Get, Post, Body, Param, Delete } from '@nestjs/common';
import { TasksService } from './task.service';
import { Task } from './task.entity';

@Controller('tasks')
export class TasksController {
  constructor(private readonly tasksService: TasksService) {}

  @Get()
  findAll(): Promise<Task[]> {
    return this.tasksService.findAll();
  }

  @Post()
  create(@Body() task: Task): Promise<Task> {
    return this.tasksService.create(task);
  }

  @Delete(':id')
  remove(@Param('id') id: number): Promise<void> {
    return this.tasksService.remove(id);
  }
}

Étape 6 : Configurer le module TasksModule

// src/tasks/tasks.module.ts
import { Module } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm';
import { Task } from './task.entity';
import { TasksService } from './task.service';
import { TasksController } from './task.controller';

@Module({
  imports: [TypeOrmModule.forFeature([Task])],
  providers: [TasksService],
  controllers: [TasksController],
})
export class TasksModule {}

Étape 7 : Ajouter le module TasksModule au AppModule

// src/app.module.ts
import { Module } from '@nestjs/common';
import { ConfigModule } from '@nestjs/config';
import { TypeOrmModule } from '@nestjs/typeorm';
import { TasksModule } from './tasks/tasks.module';

@Module({
  imports: [
    ConfigModule.forRoot({
      envFilePath: '.env',
      isGlobal: true,
    }),
    TypeOrmModule.forRoot({
      type: 'postgres',
      host: process.env.DATABASE_URL.split(':')[1].split('@')[1].split('/')[0],
      port: parseInt(process.env.DATABASE_URL.split(':')[2].split('?')[0]),
      username: process.env.DATABASE_URL.split(':')[3].split('@')[0],
      password: process.env.DATABASE_URL.split(':')[3].split('@')[1].split('/')[0],
      database: process.env.DATABASE_URL.split(':')[3].split('@')[1].split('/')[1],
      entities: [__dirname + '/**/*.entity{.ts,.js}'],
      synchronize: true,
    }),
    TasksModule,
  ],
})
export class AppModule {}

Étape 8 : Déployer l'application sur Heroku

## Créer un fichier .gitignore pour exclure les fichiers inutiles
echo "node_modules" > .gitignore
echo ".env" >> .gitignore

## Initialiser le dépôt Git
git init
git add .
git commit -m "Initial commit"

## Créer une nouvelle application Heroku
heroku create your-app-name

## Déployer l'application
git push heroku master

Étape 9 : Vérifier le déploiement

Ouvrez votre navigateur et accédez à https://your-app-name.herokuapp.com/tasks. Vous devriez voir une liste vide de tâches. Vous pouvez ajouter des tâches en utilisant les méthodes HTTP POST et DELETE.

Erreurs fréquentes et debugging

1. Erreur : "Cannot find module './task.entity'"

Cette erreur indique que NestJS ne peut pas trouver le fichier TaskEntity.

// Dans app.module.ts
import { Module } from '@nestjs/common';
import { ConfigModule } from '@nestjs/config';
import { TypeOrmModule } from '@nestjs/typeorm';
import { TasksService } from './tasks/task.service';
import { TasksController } from './tasks/task.controller';
import { Task } from './task/task.entity'; // Correct

@Module({
  imports: [
    ConfigModule.forRoot({
      envFilePath: '.env',
      isGlobal: true,
    }),
    TypeOrmModule.forRoot({
      type: 'postgres',
      host: process.env.DATABASE_URL.split(':')[1].split('@')[1].split('/')[0],
      port: parseInt(process.env.DATABASE_URL.split(':')[2].split('?')[0]),
      username: process.env.DATABASE_URL.split(':')[3].split('@')[0],
      password: process.env.DATABASE_URL.split(':')[3].split('@')[1].split('/')[0],
      database: process.env.DATABASE_URL.split(':')[3].split('@')[1].split('/')[1],
      entities: [__dirname + '/**/*.entity{.ts,.js}'],
      synchronize: true,
    }),
    TasksModule,
  ],
})
export class AppModule {}

2. Erreur : "Uncaught TypeError: Cannot set property 'completed' of undefined"

Cette erreur indique que vous essayez d'accéder à une propriété sur un objet qui n'existe pas.

// Dans task.service.ts
async remove(id: number): Promise<void> {
  await this.taskRepository.delete({ id }); // Correct
}

3. Erreur : "Database connection failed"

Cette erreur indique que votre application ne peut pas se connecter à la base de données Heroku.

// Dans app.module.ts
TypeOrmModule.forRoot({
  type: 'postgres',
  host: process.env.DATABASE_URL.split(':')[1].split('@')[1].split('/')[0],
  port: parseInt(process.env.DATABASE_URL.split(':')[2].split('?')[0]),
  username: process.env.DATABASE_URL.split(':')[3].split('@')[0],
  password: process.env.DATABASE_URL.split(':')[3].split('@')[1].split('/')[0],
  database: process.env.DATABASE_URL.split(':')[3].split('@')[1].split('/')[1],
  entities: [__dirname + '/**/*.entity{.ts,.js}'],
  synchronize: true,
}),

Pour aller plus loin

1. Utiliser GraphQL avec NestJS

NestJS supporte les API GraphQL, ce qui peut être utile pour créer des applications modernes et évolutives.

2. Optimiser les performances de votre application

En utilisant des techniques comme la pagination et l'optimisation des requêtes, vous pouvez améliorer les performances de votre application.

3. Utiliser le système de sécurité JWT

NestJS est compatible avec les tokens JSON Web (JWT), ce qui permet une authentification sécurisée et un accès contrôlé à votre application.

Défi pratique :

Créez une API de blog en utilisant NestJS. L'API devrait permettre aux utilisateurs d'ajouter, lire, mettre à jour et supprimer des articles. Assurez-vous d'utiliser les bonnes pratiques de sécurité et d'optimisation des performances.

Besoin d'aide sur NestJS ?

Besoin d'aide sur un projet technique ? Decrivez-le pour des conseils personnalises.

Recevoir des conseils

Questions frequentes

Comment installer Node.js sur Heroku ?
Pour installer Node.js sur Heroku, vous pouvez utiliser le buildpack officiel de Node.js en ajoutant la ligne suivante à votre fichier `Procfile` : `web: npm start`. Assurez-vous également que vous avez spécifié une version compatible de Node.js dans votre `package.json`.
Quelle est la meilleure façon d'optimiser mon application NestJS pour Heroku ?
Pour optimiser votre application NestJS sur Heroku, envisagez de minimiser le poids des dépendances en utilisant un fichier `package.json` bien organisé. Activez également les niveaux de journalisation appropriés et envisagez d'utiliser une base de données relationnelle si nécessaire.
Comment configurer la gestion des environnements sur Heroku avec NestJS ?
Pour configurer la gestion des environnements sur Heroku, utilisez les variables d'environnement fournies par Heroku. Créez un fichier `.env` pour chaque environnement (développement, production) et chargez-le dans votre application NestJS à l'aide de la bibliothèque `dotenv`. Utilisez ensuite ces variables d'environnement pour configurer vos paramètres tels que les connexions aux bases de données ou les clés secrètes.

Pages liees

Chaque semaine, le meilleur de la tech francaise

Tendances, salaires, outils et opportunites — directement dans votre boite mail.

Gratuit. Desabonnement en un clic. Pas de spam.