MRBS Meeting Room Booking System on AWS User Guide
Overview
This image runs MRBS, the Meeting Room Booking System, a mature open source web application for booking meeting rooms and other shared resources. Users see a calendar driven booking interface with day, week and month views; administrators manage areas, rooms and user accounts from an admin area; and everyone can see at a glance what is free and reserve it without email chains or spreadsheets.
The stack is LAMP: MRBS 1.12.2 on PHP 8.3 under Apache 2.4, with a MySQL 8.0 database, all from the Ubuntu 24.04 noble universe with no third party APT repositories. The database data directory, /var/lib/mysql, and the web application root, /var/www, are each a dedicated, independently resizable EBS data volume, so both the database and the application files are kept off the operating system disk and can be grown or snapshotted on their own.
Authentication is database backed: accounts live in the application database and the administrator is a real account with a hashed password, not a shared default. The administrator account is created on the first boot of every deployed instance, and its password, the application database password, the MySQL root password and the MySQL maintenance password are all generated freshly on each instance, so two instances launched from the same Amazon Machine Image never share a credential. The build time database is destroyed before the image is captured, so no default login ships in the image. The credentials are written to /stage/scripts/mrbs-credentials.log with mode 0600 so that only the root user can read them.
MRBS derives its address from the request host on every request, so it answers correctly on the instance public IP, its private IP, or any custom domain you later point at it, with no reconfiguration and no redirect to a stale address.
Prerequisites
Before you deploy this image you need:
- An Amazon Web Services account where you can launch EC2 instances
- IAM permissions to launch instances, create security groups, and subscribe to AWS Marketplace products
- An EC2 key pair in the target Region for SSH access to the instance
- A VPC and subnet in the target Region, with a security group allowing inbound port 22 from your management network, and ports 80 and 443 for the web application
- The AWS CLI (version 2) installed locally if you plan to deploy from the command line
m5.large (2 vCPU, 8 GB RAM) is a comfortable starting point for most deployments; move up to a larger instance for very large user bases. MySQL listens only on loopback and is never exposed to the network.
Step 1: Launch the instance from the AWS Marketplace
Sign in to the AWS Management Console, open the EC2 service, and select Launch instance. Under Application and OS Images choose AWS Marketplace AMIs and search for MRBS. Select the cloudimg listing and choose Select, then Continue on the subscription summary.
Pick an instance type of m5.large or larger. Choose your EC2 key pair under Key pair (login). Under Network settings select your VPC and subnet, and either create or select a security group that opens port 22 from your management network and ports 80 and 443 for the web application. Leave the root volume at the default size or larger; the database and web volumes are attached automatically.
Select Launch instance. First boot initialisation takes a short time after the instance state becomes Running and the status checks pass, while the database is created, the booking schema is loaded and the per instance administrator is provisioned.
Step 2: Launch the instance from the AWS CLI (optional)
Alternatively, launch from the command line. Replace <ami-id> with the AMI ID shown on the Marketplace listing, my-key with your EC2 key pair name, <subnet-id> with your subnet ID, and <security-group-id> with a security group that opens ports 22, 80 and 443 as described above:
aws ec2 run-instances \
--image-id <ami-id> \
--instance-type m5.large \
--key-name my-key \
--subnet-id <subnet-id> \
--security-group-ids <security-group-id> \
--associate-public-ip-address \
--metadata-options "HttpTokens=required" \
--tag-specifications 'ResourceType=instance,Tags=[{Key=Name,Value=mrbs}]'
Step 3: Connect to your instance
Connect over SSH using your EC2 key pair. The login user depends on the operating system variant you launched:
| OS variant | SSH login user |
|---|---|
| Ubuntu 24.04 LTS | ubuntu |
ssh -i /path/to/my-key.pem ubuntu@<public-ip>
The first boot service loads the booking schema and generates the per instance credentials within a few seconds of the instance starting.
Step 4: Verify the services
Confirm Apache and MySQL are active, and that only the web ports and SSH are listening publicly while MySQL stays on loopback:
sudo systemctl is-active apache2.service mysql.service
sudo ss -ltn
Step 5: Check the versions
The MRBS release is the $mrbs_version_number value in the version file:
grep mrbs_version_number /var/www/html/mrbs/web/version_num.inc
php -r 'echo "PHP ".PHP_VERSION."\n";'
mysql --version
apache2 -v
Step 6: Inspect the database
The schema is loaded and a single administrator account exists, stored with a bcrypt password hash, so there is no default or shared login. Read the application database password into a shell variable (it is not printed), then inspect the table count and the administrator row, showing only the hash prefix rather than any secret:
DB_PASS=$(sudo grep '^MRBS_DB_PASSWORD=' /stage/scripts/mrbs-credentials.log | cut -d= -f2-)
sudo mysql -umrbsuser -p"$DB_PASS" mrbs -e "SELECT COUNT(*) AS mrbs_tables FROM information_schema.tables WHERE table_schema='mrbs'" 2>/dev/null
sudo mysql -umrbsuser -p"$DB_PASS" mrbs -e "SELECT id,name,level,LEFT(password_hash,4) AS hash_prefix FROM mrbs_users" 2>/dev/null
Step 7: Confirm MRBS is serving and the credentials are set
Confirm MRBS answers on loopback, and that the per instance administrator credentials are present, without printing the password itself:
curl -s -o /dev/null -w 'MRBS home page: HTTP %{http_code}\n' http://127.0.0.1/
sudo test -s /stage/scripts/mrbs-credentials.log && echo "credentials file present (0600 root only)"
sudo grep -qE '^MRBS_ADMIN_USER=admin$' /stage/scripts/mrbs-credentials.log && echo "administrator user: admin"
sudo grep -qE '^MRBS_ADMIN_PASSWORD=.{8,}$' /stage/scripts/mrbs-credentials.log && echo "administrator password: generated per instance (value hidden)"
Step 8: Read the administrator password
The per instance credentials are written to a root only file. Read it to pick up the MRBS_ADMIN_USER and MRBS_ADMIN_PASSWORD for signing in for the first time:
sudo cat /stage/scripts/mrbs-credentials.log
Keep this file secure, and change the administrator password from within MRBS once you have signed in.
Step 9: Sign in
Browse to http://<public-ip>/admin.php in your browser and sign in as admin with the password from the credentials file. Sessions are server side, so there is no client side cookie tied to the instance IP.

Step 10: The booking calendar
The home page is the booking calendar. Switch between Day, Week, and Month views, pick an area, and see every room side by side with its current bookings. The week view gives a single glance across all rooms for the whole week; click an empty slot in any view to make a new booking.

Step 11: Manage areas and rooms
Open the Rooms admin area to create areas (buildings, sites, or floors) and the rooms within them, setting each room's capacity and description. Rooms can be enabled or disabled, and the list can be exported to CSV, Excel or PDF. The Users area manages accounts and permission levels.

Step 12: Create a booking
Selecting a slot opens the booking form, where you set the brief description, full description, start and end times, room, and booking type. Bookings can be marked confirmed or tentative, repeated on a schedule, and opened for registration.

Step 13: Reporting
The Report area produces a filtered report of bookings across a date range, area, room, type or description, summarised by room, creator or type, and exportable to CSV, Excel, PDF or iCalendar. Use it to review room utilisation or export a schedule.

Step 14: Components and file locations
| Component | Path |
|---|---|
| MRBS install | /var/www/html/mrbs/ |
| Document root | /var/www/html/mrbs/web/ |
| MRBS config | /var/www/html/mrbs/web/config.inc.php |
| Database schema file | /var/www/html/mrbs/tables.my.sql |
| Apache vhost | /etc/apache2/sites-available/mrbs.conf |
| Apache logs | /var/log/apache2/mrbs-{access,error}.log |
| MySQL data (dedicated EBS volume) | /var/lib/mysql/ |
| Web application (dedicated EBS volume) | /var/www/ |
| Firstboot script | /usr/local/sbin/mrbs-firstboot.sh |
| Credentials | /stage/scripts/mrbs-credentials.log (mode 0600 root:root) |
Step 15: Storage layout
The database and the web application each live on their own dedicated, independently resizable EBS data volume, so neither shares the operating system disk. Both are mounted by filesystem UUID and are captured into the image, so every instance you launch has the same layout. To grow either tier, modify the EBS volume in the EC2 console and extend the filesystem; you can also snapshot each volume independently for backup.
Step 16: Security and next steps
- Change the administrator password from within MRBS after your first sign in, and add your real user accounts under the Users area.
- Enable HTTPS by installing certbot and requesting a certificate for your domain. On Ubuntu:
text
sudo apt-get install -y certbot python3-certbot-apache
sudo certbot --apache -d your-domain.example.com
- Restrict the security group so that ports 80 and 443 are open only to your users or load balancer, and port 22 only to your management network.
- Configure email in
config.inc.phpso MRBS can send booking confirmations and reminders. - Point your domain at the instance; because the image is host agnostic, no URL rewrite is needed.
- Patch the OS regularly:
text
sudo apt-get update && sudo apt-get upgrade -y
Licensing
MRBS is distributed under the GPL-2.0 licence and is free to use commercially. cloudimg packages and supports the image; support is available 24/7 at support@cloudimg.co.uk. All product and company names are trademarks or registered trademarks of their respective holders and their use does not imply affiliation or endorsement.