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 hanyadocker-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!