Note: When I started writing this, I was using customized MongooseIM version 3.7.1, now latest updates using TOML config and such have come up as on July 2021. So, if you want to refer to the latest documentation, feel free to read it here .
Setting Up Local Development Environment for MongooseIM:
There are a couple of ways to set up local development environment, obviously, first one is to clone the official repo and getting started, which if you have to do it for multiple systems, becomes a tedious job. So, I’ve written a simple Dockerfile, based on my convenience. Feel free to use it, if you want!
In case, you want to upgrade the Erlang version, change
FROM ubuntu:16.04 RUN apt-get update && \ apt-get install -y --install-recommends unixodbc-dev rsync \ postgresql-client redis-tools wget git \ make gcc g++ libc6-dev libncurses5-dev \ libssl-dev libexpat1-dev libpam0g-dev \ unixodbc-dev gnupg zlib1g-dev \ unzip python2.7 wget && \ wget http://packages.erlang-solutions.com/erlang-solutions_2.0_all.deb && \ dpkg -i erlang-solutions_2.0_all.deb && \ apt-get update && \ apt-get install -y esl-erlang=1:22.3-1 --install-recommends && \ apt-get clean && \ rm -rf /var/lib/apt/lists/* RUN ln -snf python2.7 /usr/bin/python2 # This line makes sure the big tests passes multi-user chat based scenario RUN echo "127.0.0.1 muc.localhost" >> /etc/hosts
I’ve set it up in such a way, that I have pushed the docker image to a private repo and using them in my docker-compose file.
MongooseIM supports SQL and NoSQL Databases, as well as it can run without database too, if you prefer it that way. For one of my clients, I had to use a new Database(CockroachDB) which was not natively supported by MongooseIM. I had to make some changes to the core codebase and modify certain codec to make it work without issues.
As I was writing this post, still support for CockroachDB has not been included by MongooseIM team. Feel free to reach out to me directly, in case you want to understand more on how things were done.
MongooseIM uses in-built mnesia as it’s default session store, unless you want to switch to a more robust redis server.
We have got multiple components and managing them separately will become tedious and hence, I have got a docker-compose file with skeleton of services included, you can expand them as per your needs. Knowingly, I’ve left out some other services, as they too much in the beginning itself.
version: "3.8" services: mim: container_name: mim build: . working_dir: /app volumes: - /mim-src:/app stdin_open: true tty: true command: sh -c "echo '127.0.0.1 muc.localhost' >> /etc/hosts && bash" environment: - PGCLIENTENCODING='utf-8' depends_on: - db - redis ports: - 5225:5222 networks: - internal db: container_name: db image: postgresql:latest hostname: db ports: - 5432:5432 stdin_open: true tty: true volumes: - ./data/db:/var/lib/postgresql/data networks: - internal redis: container_name: cache image: redis:6.0.9-alpine command: redis-server --port 6379 --bind 0.0.0.0 ports: - 6379:6379 networks: - internal s3: container_name: s3 image: minio/minio:latest ports: - 9000:9000 volumes: - ./data/s3:/data command: server /data environment: - MINIO_ACCESS_KEY=minioadmin - MINIO_SECRET_KEY=minioadmin networks: - internal networks: internal: driver: bridge
MongooseIM Config File:
As I’ve already pointed out, you can use the default mongooseim.cfg or mongooseim.toml (The Latest Versions) and mount them in the appropriate directory in the docker-compose file.
Starting Dev Setup
- Clone the actual MongooseIM source code from GitHub
- start the docker-compose with the above one or your modified yaml file
- Once the docker-compose has started, enter into the shell using
docker exec -it mim bash
- Once, you’re in the bash shell, you can start the development XMPP server using
./rebar3 shellor if the makefile needs to be used
make shell. The Makefile has a lot of info about how to generate default config file, development ssl certificates, etc.,
This will start a default development server with the default config, if you have not added a mongooseim.cfg or mongooseim.toml file.
Well folks! This must have been a tedious journey. We still have a long journey ahead of us! Wrapping up the part two! Stay tuned for more.