Bagaimana cara menggunakan MongoDB tanpa melakukan instalasi?
Tags: docker, mongodb, javascript
Published: 2022-10-14 22:34:06

Pernahkah merasa sulit dan repot saat dipaksa beradaptasi dengan integrasi baru di suatu aplikasi atau projek? Misalnya penerapan _database_ jenis baru yang menggunakan [mongodb](https://www.mongodb.com/). Mungkin kebanyakan developer pemula atau **junior developer** yang sering meresakannya. Penyebabnya tidak lain karena minimnya tingkat pengalaman terkait _tools_ tersebut. Ribetnya adalah instalasi _tools_ di lokal komputer kita, sebagai perangkat yang digunakan untuk berperang dalam proses pengerjaan aplikasi.

Dipercaya kehadiran [docker](https://www.docker.com/) di sini menjadi salah satu solusi untuk memudahkan di bagian instalasinya, baik pada tahap _development_ maupun _deployment_. Cukup satu perintah saja banyak _tools_ yang dibutuhkan dapat dilakukan instalasinya. Lebih tepatnya memaksimalkan penggunaan **docker compose** yang menjadi salah satu fitur penting di dalam <u>docker</u>.

Kesempatan kali ini akan dibahas proses melakukan _containerize_ <u>mongodb</u>, dengan bonus _database client tools_. Sehingga memudahkan kita untuk tidak membuka atau melakukan instalasi aplikasi database _client_ yang kompatibel untuk <u>mongodb</u>. Faktanya pilihan melakukan _dockerize_ terhadap database tidak terlalu _urgent_. Namun menjadi penting saat aplikasi kita memerlukan banyak sekali integrasi _tools_. Mungkin saja keperluan dalam proses _caching_, _message broker_ dan lainnya.

## Persiapan awal

Agar lebih dimudahkan terkait pemahaman proses _containerize_ <u>mongodb</u> dan _client tools_-nya, akan diberikan contoh aplikasi yang melakukan koneksi terhadap database. Dalam kasus ini aplikasi ditulis menggunakan [nodejs](https://nodejs.org/) dengan simpel proses _query_ terhadap <u>mongodb</u>.
> _Disclaimer_:
> Aplikasi dan _tools_ lain tidak termasuk ke dalam proses _dockerize_.

### Kebutuhan _library_:

- [Expressjs](https://expressjs.com/). ([github](https://github.com/expressjs/express))
- [Mongoose](https://mongoosejs.com/). ([github](https://github.com/Automattic/mongoose))
- [Dotenv](https://www.npmjs.com/package/dotenv). ([github](https://github.com/motdotla/dotenv))

Berikut potongan _code_ yang akan diimplementasikan menggunakan docker container dari <u>mongodb</u>:

```
const express = require('express');
const mongoose = require('mongoose');
const dotenv = require('dotenv');
const Todo = require('./todo');

dotenv.config();

const app = express();

const PORT = parseInt(process.env.PORT) || 3000;
const DB_HOST = process.env.DB_HOST;
const DB_PORT = process.env.DB_PORT;
const DB_USER = process.env.DB_USER;
const DB_PASSWORD = process.env.DB_PASSWORD;
const DB_NAME = process.env.DB_NAME;
const DB_URI = `mongodb://${DB_USER}:${DB_PASSWORD}@${DB_HOST}:${DB_PORT}/${DB_NAME}`;

app.use(express.json());

app.get('/todo', async (_req, res) => {
  const allTodos = await Todo.find();
  return res.status(200).json(allTodos);
});

app.post('/todo', async (req, res) => {
  const newTodo = new Todo({ ...req.body });
  const created = await newTodo.save();
  return res.status(201).json(created);
});

const start = async () => {
  try {
    await mongoose.connect(DB_URI);
    app.listen(PORT, () => console.log('Server started on port 3000'));
  } catch (error) {
    console.error(error);
    process.exit(1);
  }
};

start();
```

Projek ini membuat aplikasi todo _list_, menggunakan _framework_ **expressjs** dan **mongoose** _library_. Hanya dibuat 2 _endpoints_ yaitu, _list_ data todo dan tambah data todo. Konfigurasi _value_ yang digunakan pada _database_ dan aplikasi disimpan di dalam _file_ **.env**. Berikut susunan isi di dalam _file_ **.env**:

```
PORT=3000

DB_NAME=domingo_db
DB_USER=domingo_user
DB_PASSWORD=domingo_pass
DB_PORT=27020
DB_HOST=localhost
```

Selain digunakan di dalam aplikasi, _file_ **.env** ini digunakan juga saat _build_ & _run_ pada **docker**. Khusus konfigurasi <u>mongodb</u> membutuhkan _file_ `javascript` untuk inisialisasi _database user_, _database password_ & _database name_. Berikut _file_ `javascript` yang dibutuhkan sebagai inisialisasi <u>mongodb</u>:

```
db.createUser({
  user: 'domingo_user',        // disesuaikan dengan value di file .env => DB_USER
  pwd: 'domingo_pass',         // disesuaikan dengan value di file .env => DB_PASSWORD
  roles: [
    {
      role: 'readWrite',
      db: 'domingo_db',        // disesuaikan dengan value di file .env => DB_NAME
    },
  ],
});
```

## _Dockerize_ mongodb & _Client Tools_

Selanjutnya membuat _file_ **docker-compose.yaml** pada _directory root_ projek. Untuk aplikasi di sini tidak disertakan proses _dockerize_-nya, sehingga untuk melakukan _running_ aplikasi menggunakan perintah di <u>nodejs</u>. Berikut potongan _code_ untuk melakukan _dockerize_:

```
version: '3.8'

services:
  mongodb:
    image: mongo:6.0
    container_name: mongodb-domingo
    environment:
      MONGO_INITDB_DATABASE: '${DB_NAME}'
      MONGO_INITDB_ROOT_USERNAME: '${DB_USER}'
      MONGO_INITDB_ROOT_PASSWORD: '${DB_PASSWORD}'
    volumes:
      - ./init-mongo.js:/docker-entrypoint-initdb.d/init-mongo.js:ro
      - mongo_vol:/data/db
    ports:
      - ${DB_PORT:-27017}:27017
    networks:
      - domingo
    healthcheck:
      test: echo 'db.runCommand("ping").ok | mongo localhost:27017/test --quiet'
      interval: 1m
      timeout: 10s
      retries: 3
    restart: always

  mongo-express:
    image: mongo-express
    container_name: mongo-express-domingo
    restart: always
    environment:
      ME_CONFIG_MONGODB_SERVER: mongodb-domingo
      ME_CONFIG_MONGODB_AUTH_DATABASE: '${DB_NAME}'
      ME_CONFIG_MONGODB_AUTH_USERNAME: '${DB_USER}'
      ME_CONFIG_MONGODB_AUTH_PASSWORD: '${DB_PASSWORD}'
    ports:
      - 8081:8081
    networks:
      - domingo
    depends_on:
      - mongodb

networks:
  domingo:
    driver: bridge
volumes:
  mongo_vol:
    driver: local
```

_Image docker_ <u>mongodb</u> yang digunakan adalah [mongo:6.0](https://hub.docker.com/layers/library/mongo/6.0/images/sha256-e0b1614551474ee2f3c3ef7c9706b5e19f2107aa36b73c910522af9fa8eb756e?context=explore). Sedangkan _Image docker_ <u>mongodb</u> _client tools_ (mongo-express) menggunakan [mongo-express](https://hub.docker.com/_/mongo-express). Di dalam _file_ **docker-compose.yaml** sudah menggunakan _env value_ secara otomatis, karena _default_-nya membaca _value_ jika ada _file_ **.env** pada direktori yang sama.

Perintah yang digunakan untuk menjalankan proses _dockerize_ adalah `docker-compose up -d`. Otomatis akan melakukan _download_ sekaligus _build_ dan menjalankannya. Untuk mematikan _running_ proses <u>docker</u> adalah `docker-compose down`. Disarankan untuk mempunyai pengetahuan _basic_ terkait <u>docker</u>, sehingga dapat memahami dan melakukan _handle_ terhadap proses <u>docker</u>.

## Melakukan _test_ menggunakan postman

Sebelum melakukan pengetesan, pastikan _docker container_ telah dijalankan dan aplikasi todo-nya. Pastikan <u>mongodb</u> _client tools_ berhasil dijalankan dengan mengaksesnya melalui _browser_ seperti berikut:

![mongo_1](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/cvysgd4wxg02en1ndlkb.png)

![mongo_2](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/u3ypmi124eyr50gz4rt6.png)

Untuk hasil _test_ dari _get list_ todo di <u>postman</u> sebagai berikut:

![mongo_3](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/kqrck8xmssznwpmxf1o2.png)

Untuk hasil _test_ dari tambah data todo di <u>postman</u> seperti berikut:

![postman_1](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/vhkl95h9zab9i98eintl.png)

Selanjutnya penggunaan <u>docker</u> bergantung berdasarkan improvisasi masing-masing sesuai kebutuhan. Untuk _source code_ lengkapnya bisa dicek [di sini](https://github.com/mohammadanang/domingo). Sekian.

---

> Credits:
> Image cover by [Rubaitul Azad](https://unsplash.com/@rubaitulazad) on [Unsplash](https://unsplash.com/).

> Support me on:
> [saweria](https://saweria.co/angm182)

---

[![my-site](https://forthebadge.com/images/badges/powered-by-black-magic.svg)](https://anangm182.com/)