Cara Menyiapkan PostgreSQL dengan NestJS dan Docker untuk Pengembangan Lokal yang Cepat

· 2 min read
Cara Menyiapkan PostgreSQL dengan NestJS dan Docker untuk Pengembangan Lokal yang Cepat
Photo by Nathan Dumlao / Unsplash

Meluncurkan proyek baru dan membutuhkan Postgres untuk pengembangan NestJS, tetapi belum ingin berkomitmen pada penyedia DB produksi (belum)? Menjalankan instans Postgres lokal di Docker adalah sahabat Anda. Sederhana. Andal. Tidak ada kekacauan sistem.

Di bawah ini, saya akan memandu Anda melalui pengaturan andalan saya untuk menjalankan NestJS dan PostgreSQL menggunakan Docker - gesekan minimal, dapat ditulis sepenuhnya, dan selalu dapat direproduksi. Anda akan mendapatkan konfigurasi praktis, perintah untuk akses kontainer langsung, dan contoh konfigurasi basis data NestJS.

Mengapa Pengaturan Ini?

Pengembangan awal adalah tentang bergerak cepat: mengubah skema, mengatur ulang data, menjalankan migrasi, terkadang semuanya dalam satu hari. Basis data cloud terkelola (seperti Neon) adalah tujuan akhir yang bagus, tetapi untuk peretasan dan pengujian lokal, Docker selalu menang. Docker menjaga Postgres tetap berada di luar mesin host Anda, menghindari kejutan "berfungsi di mesin saya". Ini adalah plug-and-play sejati untuk pengembangan lokal.

Struktur Proyek dan File yang Diperlukan

Berikut ini yang akan kita atur:

  • Dockerfile  untuk aplikasi NestJS
  • docker-compose.yml  untuk menghubungkan Node dan Postgres
  • file .env  untuk variabel lingkungan
  • Contoh konfigurasi dan skrip NestJS
  • Perintah praktis untuk alur kerja umum

Dockerfile: Lingkungan Node Sederhana

FROM node:18

WORKDIR /app

COPY package*.json ./

RUN npm install

COPY . .

EXPOSE 3000

CMD ["npm", "run", "start:dev"]

docker-compose.yml: Node + Postgres Berdampingan

Inilah saus ajaib yang merekatkan API Node Anda dan instans Postgres sekali pakai menjadi satu.

version: "3.8"

services:
  db:
    image: postgres:13
    restart: always
    env_file:
      - .env
    ports:
      - "5432:5432"
    volumes:
      - db-data:/var/lib/postgresql/data

  api:
    build:
      context: .
      dockerfile: Dockerfile
    ports:
      - "3000:3000"
    depends_on:
      - db
    env_file:
      - .env
    command: sh -c "npm run migration:run && npm run start:dev"  

volumes:
  db-data:

Tip: Tombol volume memungkinkan basis data Anda bertahan saat di-boot ulang tanpa kehilangan data.

lingkungan

Buat .envfile di root proyek Anda:

POSTGRES_USER=postgres
POSTGRES_PASSWORD=changeme
POSTGRES_DB=app_db
POSTGRES_HOST=db
POSTGRES_PORT=5432
PORT=3000

Jauhkan rahasia Anda dari Git! .env masuk ke dalam .gitignore.

Skrip Package.json: Wadah Interaktif

Mengapa harus mengingat ID kontainer? Tambahkan ini ke package.jsonskrip Anda untuk akses cepat:

"scripts": {
  "db": "docker exec -it $(docker-compose ps -q db) bash",
  "api": "docker exec -it $(docker-compose ps -q api) bash"
}

Sekarang, jalankan saja npm run dbuntuk shell kontainer basis data, atau npm run apiuntuk aplikasi.

NestJS: Menghubungkan ke Basis Data Docker Anda

Pada startup utama Anda (misalnya main.ts):

async function bootstrap() {
  const app = await NestFactory.create(AppModule);
  await app.listen(process.env.PORT);
}
bootstrap();

Konfigurasi Basis Data:

Berikut berkas konfigurasi umum untuk TypeORM:

const config = {
  type: "postgres",
  host: process.env.POSTGRES_HOST,
  port: parseInt(process.env.POSTGRES_PORT, 10),
  username: process.env.POSTGRES_USER,
  password: process.env.POSTGRES_PASSWORD,
  database: process.env.POSTGRES_DB,
  entities: [__dirname + "/**/*.entity{.ts,.js}"],
  synchronize: false,  // safer for non-prod
  migrations: [__dirname + "/migrations/**/*{.ts,.js}"],
  autoLoadEntities: true,
};

Alur Kerja Pengembangan: Perintah Harian

  • Mulai semuanya: docker-compose up --build (pertama kali) atau hanya docker-compose up
  • Lihat log:docker-compose logs -f api
  • Bongkar (lepaskan wadah):docker-compose down
  • Masuk ke shell DB:npm run db
  • Masuk ke wadah aplikasi:npm run api
Sekian dan Terimakasih!