Deployment guide

Movinin

Overview

Movin'In is an open-source, self-hosted rental property booking marketplace, built with React, Node and MongoDB. It gives you three web surfaces from a single server: a customer-facing storefront where renters search and book rental properties by location and dates, an admin dashboard where you manage agencies, properties, locations, bookings and users, and a REST API backed by MongoDB. It is a data-owning alternative to paying a third-party portal a commission on every booking.

This SecureAnyCloud image runs Movin'In 7.0.0, built from its official source at the pinned upstream tag v7.0, on a hardened Ubuntu 24.04 LTS base that is patched at build time. It ships unprovisioned, with an empty database and no secrets. On the first boot of every VM, a one-shot service generates that VM's secrets, so no instance is reachable in an unprovisioned state and no secret is shared between customers.

What you get:

  • Movin'In 7.0.0 (React + Node/Express + MongoDB), built from the pinned upstream tag v7.0
  • The customer storefront on :80 and the admin dashboard on :3003, both served by nginx as React single-page applications
  • The backend REST API and CDN asset storage on :4004 (Node/Express, managed by systemd)
  • MongoDB 8.0 Community bound to 127.0.0.1 only, never reachable from the network, with a per-VM database password
  • A per-VM database password, JWT and cookie secrets, and administrator password generated on first boot and recorded in a root-only file. Movin'In's only administrator creation path is server-side, and its own setup routine ships with a well-known default password. The first boot service instead creates a single administrator with a random password, so the upstream default password is never created on any running instance.
  • Nothing published on ports 80, 3003 or 4004 until first boot has provisioned and secured the instance
  • mongod.service, movinin.service and nginx.service as enabled systemd units, so the platform returns after a reboot
  • 24/7 SecureAnyCloud support

Prerequisites

You need an active Azure subscription, an SSH key pair, and a VNet with a subnet in the target region.

Standard_B2s (2 vCPU / 4 GiB RAM) is a sensible starting size. Choose a larger size if you expect many concurrent renters or large property catalogs.

Configure the network security group (NSG) to allow inbound 22/tcp from your management network. Also allow 80/tcp (storefront), 3003/tcp (admin dashboard) and 4004/tcp (backend API) from the networks that need them. Put HTTPS in front of the instance before you expose it to the public internet (see Next steps).

Step 1 - Deploy from the Azure Marketplace

Sign in to the Azure Portal, choose Create a resource, search the Marketplace for Movin'In by SecureAnyCloud, and select Create.

On the Basics tab, pick your subscription, resource group, region and size. Under Administrator account, choose SSH public key and paste your key. Under Inbound port rules, allow SSH (22), HTTP (80) and custom TCP 3003 and 4004.

Then select Review + create and Create.

Step 2 - Deploy from the Azure CLI

# Accept the Marketplace terms once per subscription (required before the first CLI deploy)
az vm image terms accept --urn sac1647283583153:movinin-ubuntu-24-04:default:latest
az vm create \
  --resource-group <your-rg> \
  --name movinin \
  --image sac1647283583153:movinin-ubuntu-24-04:default:latest \
  --size Standard_B2s \
  --admin-username azureuser \
  --generate-ssh-keys \
  --public-ip-sku Standard

Open the storefront, admin and API ports so that your browsers and clients can reach them:

az vm open-port --resource-group <your-rg> --name movinin --port 80 --priority 1001
az vm open-port --resource-group <your-rg> --name movinin --port 3003 --priority 1002
az vm open-port --resource-group <your-rg> --name movinin --port 4004 --priority 1003

Step 3 - Confirm the services are running

SSH in as azureuser. First boot generates this VM's secrets, seeds the database and administrator, then binds the public ports. It completes in well under a minute. Confirm that the three services are active:

systemctl is-active mongod movinin nginx | paste -sd' ' -

List the listening TCP ports. The storefront (80), admin (3003) and API (4004) are public, while MongoDB (27017) is bound to the loopback interface only:

ss -tlnH | awk '{print $4}' | sed -E 's/.*:([0-9]+)$/\1/' | sort -un | paste -sd' ' -

Confirm the runtime versions:

node --version; mongod --version | head -1

Step 4 - Inspect the per-VM secrets and administrator

Every secret is generated on this VM's first boot and never baked into the image. The administrator credentials are written to a root-only file:

sudo stat -c '%a %U:%G' /root/movinin-credentials.txt

The backend's JSON web token and cookie secrets are per VM. The command shows them by length only and never prints the values. The MongoDB connection string carries a per-VM database password:

for k in MI_JWT_SECRET MI_COOKIE_SECRET; do v=$(sudo grep -E "^$k=" /opt/movinin/backend/.env | cut -d= -f2-); echo "$k: ${#v} chars"; done

Confirm exactly one administrator exists in MongoDB:

DBURI=$(sudo grep -E '^MI_DB_URI=' /opt/movinin/backend/.env | cut -d= -f2- | tr -d '"'); mongosh "$DBURI" --quiet --eval "print('ADMIN users: ' + db.getSiblingDB('movinin').User.countDocuments({type:'ADMIN'}))"

Step 5 - Verify the administrator sign-in

Read this VM's administrator email and password from the root-only file:

sudo grep -E '^movinin.admin.(email|pass)=' /root/movinin-credentials.txt

The per-VM password authenticates against the backend admin sign-in endpoint and returns HTTP 200:

curl -sS -o /dev/null -w 'correct password: HTTP %{http_code}\n' -H 'Content-Type: application/json' -d '{"email":"<MOVININ_ADMIN_EMAIL>","password":"<MOVININ_ADMIN_PASSWORD>"}' http://127.0.0.1:4004/api/sign-in/admin

A wrong password is rejected with HTTP 204 (no session issued):

curl -sS -o /dev/null -w 'wrong password: HTTP %{http_code}\n' -H 'Content-Type: application/json' -d '{"email":"<MOVININ_ADMIN_EMAIL>","password":"WrongPassword123"}' http://127.0.0.1:4004/api/sign-in/admin

Step 6 - Open the storefront and admin dashboard

Browse to the customer storefront at http://<your-vm-public-ip>/. This is what your renters see: a property search over location and dates.

Browse to the admin dashboard at http://<your-vm-public-ip>:3003/ and sign in with the administrator email and password from /root/movinin-credentials.txt.

After you sign in, you land on the bookings dashboard. Use it to create and manage bookings across your agencies and properties.

Use the menu to manage your property catalog. Add properties, set their type, rental term and availability, and publish them to the storefront.

Step 7 - Reboot persistence

systemd manages the platform, so it returns automatically after a reboot. First boot runs exactly once, gated by a sentinel file, and then hands off to the long-running services:

systemctl is-enabled mongod movinin movinin-firstboot nginx | paste -sd' ' -

Next steps

  • Change the administrator password from the admin dashboard profile after your first sign-in.
  • Configure email (SMTP). Renter email verification and booking notifications need an SMTP provider. Set the MI_SMTP_* values in /opt/movinin/backend/.env and restart movinin.service.
  • Configure a payment gateway. To take payments, add your Stripe or PayPal keys (MI_STRIPE_SECRET_KEY / MI_PAYPAL_* in the backend .env, and the matching publishable keys in the storefront) and restart the services.
  • Put HTTPS in front of the instance before you expose it to the public internet. Terminate TLS with your own certificate (for example with Certbot and nginx) so credentials and cookies are never sent in clear text.
  • Back up MongoDB with mongodump on a schedule, so your catalog, customers and bookings are recoverable.

Your Movin'In rental booking platform is now running on Ubuntu 24.04 LTS, secured with credentials unique to this VM. For help, contact SecureAnyCloud support at any time.

Deploy on Azure

Launch Movin'In on Ubuntu 24.04 LTS with 24/7 support from SecureAnyCloud.

View this image

Need Help?

Our support team is available 24/7.

sales@secureanycloud.com

Deploy on Azure