Cloning Ubiquiti's MongoDB instance to a separate server

DISCLAIMER: I am not a MongoDB person (even if it is Web Scale X-D) - below instructions may work for you, they may not. Use with care!

For some work I've been doing I wanted to access the data in Ubiquiti's Unifi controller which it stores in MongoDB. Because I didn't want to risk my actual Unifi device by changing local settings to enable remote access, and also because the version of MongoDB on it is older than ideal, I wanted to clone the data elsewhere. This article shows you how.

Dump data from source server (unifi)

To start with, SSH to the Unifi box (in my case, it's a CloudKey). Username and password are the same as Unifi web GUI login.

Inspect local MongoDB instance (ace is the database that unifi uses):

root@UniFi-CloudKey:~# mongo localhost:27117/ace  
MongoDB shell version: 2.4.10  
connecting to: localhost:27117/foo  
Server has startup warnings:  
Wed Nov  1 19:38:11.033 [initandlisten]  
Wed Nov  1 19:38:11.033 [initandlisten] ** NOTE: This is a 32 bit MongoDB binary.  
Wed Nov  1 19:38:11.033 [initandlisten] **       32 bit builds are limited to less than 2GB of data (or less with --journal).  
Wed Nov  1 19:38:11.033 [initandlisten] **       Note that journaling defaults to off for 32 bit and is currently off.  
Wed Nov  1 19:38:11.033 [initandlisten] **       See http://dochub.mongodb.org/core/32bit  
Wed Nov  1 19:38:11.034 [initandlisten]

mongo01:PRIMARY> db.getCollection('device').find({},{name:1})  
{ "_id" : ObjectId("58385328e4b001431e4e497a"), "name" : "Unifi AP - Study" }
{ "_id" : ObjectId("583854cde4b001431e4e4982"), "name" : "Unifi AP - Attic" }

Now run mongodump to dump the DB to file:

root@UniFi-CloudKey:~# mongodump --port 27117  
connected to: 127.0.0.1:27117  
Wed Mar  7 12:14:05.092 all dbs  
Wed Mar  7 12:14:05.098 DATABASE: ace     to     dump/ace  
Wed Mar  7 12:14:05.103     ace.system.indexes to dump/ace/system.indexes.bson  
Wed Mar  7 12:14:05.108          120 objects  
Wed Mar  7 12:14:05.110     ace.account to dump/ace/account.bson  
Wed Mar  7 12:14:05.112          0 objects  
Wed Mar  7 12:14:05.112     Metadata for ace.account to dump/ace/account.metadata.json  
Wed Mar  7 12:14:05.114     ace.admin to dump/ace/admin.bson  
Wed Mar  7 12:14:05.116          1 objects  
Wed Mar  7 12:14:05.117     Metadata for ace.admin to dump/ace/admin.metadata.json  
Wed Mar  7 12:14:05.118     ace.alarm to dump/ace/alarm.bson  
Wed Mar  7 12:14:05.124          152 objects  

Install MongoDB locally

Ref: Install docs

sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 2930ADAE8CAF5059EE73BB4B58712A2291FA4AD5  
echo "deb http://repo.mongodb.org/apt/debian jessie/mongodb-org/3.6 main" | sudo tee /etc/apt/sources.list.d/mongodb-org-3.6.list  
sudo apt-get update  
sudo apt-get install -y mongodb-org  

Check version:

rmoff@proxmox01 ~> mongo --host 127.0.0.1:27017  
MongoDB shell version v3.6.3  
connecting to: mongodb://127.0.0.1:27017/  

Restore data to new server

Copy dump file from CloudKey to local server:

rmoff@proxmox01 ~> scp -r robin@unifi.moffatt.me:/root/dump unifi-mongodump  

Run mongorestore to restore dump to local MongoDB instance:

rmoff@proxmox01 ~> mongorestore unifi-mongodump/

----
connected to: 127.0.0.1  
Wed Mar  7 12:17:31.910 unifi-mongodump/ace/alarm.bson  
Wed Mar  7 12:17:31.910         going into namespace [ace.alarm]  
152 objects found  
Wed Mar  7 12:17:31.912         Creating index: { name: "_id_", key: { _id: 1 }, ns: "ace.alarm" }  
Wed Mar  7 12:17:31.930         Creating index: { name: "datetime_1", key: { datetime: 1 }, ns: "ace.alarm" }  
Wed Mar  7 12:17:31.931         Creating index: { name: "archived_1", key: { archived: 1 }, ns: "ace.alarm" }  
Wed Mar  7 12:17:31.932 unifi-mongodump/ace/radiusprofile.bson  
[...]
----

Done!

Using Robo 3T (formerly Robomongo) it's easy to explore the data in the restored instance:

Robin Moffatt

Read more posts by this author.

Yorkshire, UK