id: mongodb
category: service
displayName: MongoDB
description: 'Document database with seeded dev credentials and a readiness healthcheck. Reachable in-container as host `mongodb`.'
service:
  image: mongo:8
  defaultPort: 27017
  dataMount: /data/db
  healthcheck:
    test: [CMD, mongosh, --quiet, --eval, 'db.adminCommand({ ping: 1 }).ok']
    interval: 10s
    timeout: 5s
    retries: 5
  vscodeExtensions: [mongodb.mongodb-vscode]
  client:
    npm: [mongosh]
  connectionEnv:
    URL: mongodb://${MONGO_INITDB_ROOT_USERNAME}:${MONGO_INITDB_ROOT_PASSWORD}@${host}:${port}/${MONGO_INITDB_DATABASE}?authSource=admin
    HOST: ${host}
    PORT: ${port}
    USER: ${MONGO_INITDB_ROOT_USERNAME}
    PASSWORD: ${MONGO_INITDB_ROOT_PASSWORD}
    DB: ${MONGO_INITDB_DATABASE}
options:
  MONGO_INITDB_ROOT_USERNAME:
    type: string
    default: monoceros
    surface: env
  MONGO_INITDB_ROOT_PASSWORD:
    type: string
    default: monoceros
    surface: env
  MONGO_INITDB_DATABASE:
    type: string
    default: monoceros
    surface: env
# The service block for the project's pipeline compose file, verbatim.
deploy:
  compose: |-
    image: mongo:8
    environment:
      MONGO_INITDB_ROOT_USERNAME: ${MONGO_INITDB_ROOT_USERNAME:?set it as a pipeline secret}
      MONGO_INITDB_ROOT_PASSWORD: ${MONGO_INITDB_ROOT_PASSWORD:?set it as a pipeline secret}
      MONGO_INITDB_DATABASE: ${MONGO_INITDB_DATABASE:?set it as a pipeline secret}
    healthcheck:
      test: [CMD, mongosh, --quiet, --eval, "db.adminCommand({ ping: 1 }).ok"]
      interval: 5s
      timeout: 5s
      retries: 20
    # No volume: each run starts empty, collections and indexes come from the
    # project's migrations.
