mongodb image

Contexte

Pré-requis : concepts de conteneurisation maitrisés.

Déploiement d’un container mongodb et mongo-express pré-configuré avec docker-compose.

Mongodb

docker-compose

version: '3'

services:
  mongo:
    image: mongo
    environment:
      - MONGO_INITDB_ROOT_USERNAME=<USER>
      - MONGO_INITDB_ROOT_PASSWORD=<PASSWORD>
      - MONGO_INITDB_DATABASE=test
    volumes:
      - ./etc/mongo-volume:/data/db
      - ./init-mongo.js:/docker-entrypoint-initdb.d/init-mongo.js:ro
    ports:
      - "27017:27017"

Description du conteneur mongo

  • Basé sur l’image mongo
  • Descriptions des variables d’environnement
  • Création de volumes pour le partage de fichiers
  • Configuration des flux (ports)

⚠️ Ne pas oublier de modifier les valeurs USER et PASSWORD

Point d’attention

J’ai rencontré des difficultés avec la gestion des utilisateurs. mongo-express n’arrivait pas a se connecter. Pour contourner ce problème j’utilise:

  • MONGO_INITDB_ROOT_USERNAME
  • MONGO_INITDB_ROOT_PASSWORD

Une fois ces variables renseignées alors mongodb démarre avec le l’authentification obligatoire (voir mongod --auth)) Cet utilisateur est crée dans la table : admin avec le role ROOT et mongo-express pourra l’utiliser pour l’administration de la base de données


Initialisation d’une base de donnée avec système d’authentification

Au lancement de mongodb les fichiers d’initialisation (//docker-entrypoint-initdb.d) sont exécutés dans l’ordre alphabetique.

Si la variable d’environnement MONGO_INITDB_DATABASE est renseignée alors elle sera utilisée pour l’exécution de ces scripts.

db.createUser(
  {
    user: "auth_login",
    pwd: "pwd", // or cleartext password
    roles: [ { role: "readWrite", db: "db-project" } ]
  }
)

Pour aller plus loins :

Authentification

Pour vous connecter et tester votre configuration il est possible :

$> mongo -u <login> -p <pwd> authentificationDatabase <db_name>

$> mongo -u <login> --authentificationDatabase <db_name>

// exemple
$> mongo -u auth_login --authentificationDatabase db-project
Enter your password: ...

Pour aller plus loins: Encryption SSL


Mongodb Express

Problèmes rencontrés authentification sur bdd mongo via mongo-express

> Ne pas se tromper dans les variables d’environnement pour disposer d’un accès root en dev (voir section variables d’environnement)


Déploiement via Docker-compose

  mongo-express:
    image: mongo-express
    restart: always
    environment:
      - ME_CONFIG_MONGODB_SERVER=mongo
      - ME_CONFIG_MONGODB_PORT=27017
      - ME_CONFIG_MONGODB_ENABLE_ADMIN=true
      - ME_CONFIG_MONGODB_ADMINUSERNAME=<USER>  # <-- Doit correspondre au compte root décrit plus haut
      - ME_CONFIG_MONGODB_ADMINPASSWORD=<PASSWORD> # <--
      - ME_CONFIG_BASICAUTH_USERNAME=dev
      - ME_CONFIG_BASICAUTH_PASSWORD=dev
    depends_on:
      - mongo
    ports:
      - "8888:8081"

Authentification

Attention, a ne pas confondre ME_CONFIG_MONGODB_ADMINUSERNAME et ME_CONFIG_MONGODB_AUTH_USERNAME


Les variables suivantes doivent être renseignées si ME_CONFIG_MONGODB_ENABLE_ADMIN est false

NameDefaultDescription
ME_CONFIG_MONGODB_AUTH_DATABASE‘db’Database name
ME_CONFIG_MONGODB_AUTH_USERNAME‘admin’Database username
ME_CONFIG_MONGODB_AUTH_PASSWORD‘pass’Database password

si ME_CONFIG_MONGODB_ENABLE_ADMIN est false alors l’utilisateur définit va ME_CONFIG_MONGODB_AUTH_USERNAME et ME_CONFIG_MONGODB_AUTH_PASSWORD ne pourra pas voir toutes les bases de données. Risque d’erreur : MongoError: not authorized on admin to execute command { listDatabases: 1 }


Attention ! Si ME_CONFIG_MONGODB_ENABLE_ADMIN est a true alors, il sera possible d’effectuer des actions critiques via mongo-express. En dev : J’utilise ME_CONFIG_MONGODB_ADMINUSERNAME + compte root


Variables d’environnement

NameDefaultDescription
ME_CONFIG_BASICAUTH_USERNAME''mongo-express web username
ME_CONFIG_BASICAUTH_PASSWORD''mongo-express web password
ME_CONFIG_MONGODB_ENABLE_ADMIN’true'Enable admin access to all databases. Send strings: "true" or "false"
ME_CONFIG_MONGODB_ADMINUSERNAME''MongoDB admin username
ME_CONFIG_MONGODB_ADMINPASSWORD''MongoDB admin password
ME_CONFIG_MONGODB_PORT27017MongoDB port
ME_CONFIG_MONGODB_SERVER‘mongo’MongoDB container name
ME_CONFIG_OPTIONS_EDITORTHEME‘default’mongo-express editor color theme, more here
ME_CONFIG_REQUEST_SIZE‘100kb’Maximum payload size. CRUD operations above this size will fail in body-parser.
ME_CONFIG_SITE_BASEURL‘/’Set the baseUrl to ease mounting at a subdirectory. Remember to include a leading and trailing slash.
ME_CONFIG_SITE_COOKIESECRET‘cookiesecret’String used by cookie-parser middleware to sign cookies.
ME_CONFIG_SITE_SESSIONSECRET‘sessionsecret’String used to sign the session ID cookie by express-session middleware.
ME_CONFIG_SITE_SSL_ENABLED‘false’Enable SSL.
ME_CONFIG_SITE_SSL_CRT_PATH''SSL certificate file.
ME_CONFIG_SITE_SSL_KEY_PATH''SSL key file.