Meeds on Ubuntu 24.04 on Azure User Guide
Overview
Meeds is an open source employee engagement platform. People collaborate inside spaces, which are dedicated areas for a team, a project or a topic, sharing posts, files, notes and tasks. A personal profile collects a person's activity, connections and contributions, and a built in quest and kudos system lets colleagues recognise each other's work, complete guided onboarding steps, and earn points for genuine participation.
This image wires the whole stack together and generates every credential fresh on the VM you launch.
What is included:
- Meeds 7.2.0, the official Tomcat standalone distribution
- OpenJDK 21
- PostgreSQL 16 as the application database
- Elasticsearch 8.14.3 for full text search across posts, spaces and profiles
- nginx on port 80 as the only public surface
- Ubuntu 24.04 LTS base, fully patched at build time
- 24/7 cloudimg support, 24h response SLA
Scope, stated plainly. This image ships no demonstration content and no pre created spaces. It boots to the product's own first run Account Setup, from which the administrator and their password are created on your VM, not baked into the image.
Prerequisites
- An active Azure subscription.
- An SSH key pair.
- A VNet and subnet to deploy into.
- A network security group you can edit, to restrict who reaches ports 22 and 80.
Recommended VM size: Standard_B2ms (2 vCPU / 8 GB). Meeds is a Java platform plus PostgreSQL plus Elasticsearch, and this is where the stack has real headroom rather than merely running. The image sizes both the application heap and the Elasticsearch heap automatically from the memory it finds at first boot, so a smaller size does work for evaluation: a Standard_B2s (2 vCPU / 4 GB) runs the full stack end to end, though with a genuinely tight memory margin under load. Treat B2ms as headroom for real teams and concurrent users, not as a hard floor.
Step 1: Deploy from the Azure Portal
Search the Marketplace for Meeds, choose the plan and deploy it into your VNet. In the network security group, allow TCP 22 (SSH) and TCP 80 (the workspace) from your own networks only. In production, put a TLS terminating reverse proxy or an Azure Application Gateway in front of port 80.
Step 2: Deploy from the Azure CLI
RG="meeds-prod"; LOCATION="eastus"; VM_NAME="meeds-01"
GALLERY_IMAGE_ID="/subscriptions/<sub-id>/resourceGroups/azure-cloudimg/providers/Microsoft.Compute/galleries/cloudimgGallery/images/meeds/versions/<version>"
SSH_KEY="$(cat ~/.ssh/id_rsa.pub)"
az group create --name "$RG" --location "$LOCATION"
az network vnet create -g "$RG" --name meeds-vnet --address-prefix 10.106.0.0/16 --subnet-name meeds-subnet --subnet-prefix 10.106.1.0/24
az network nsg create -g "$RG" --name meeds-nsg
az network nsg rule create -g "$RG" --nsg-name meeds-nsg --name allow-ssh --priority 100 \
--source-address-prefixes "<your-mgmt-cidr>" --destination-port-ranges 22 --access Allow --protocol Tcp
az network nsg rule create -g "$RG" --nsg-name meeds-nsg --name allow-web --priority 110 \
--source-address-prefixes "<your-mgmt-cidr>" --destination-port-ranges 80 --access Allow --protocol Tcp
az vm create -g "$RG" --name "$VM_NAME" --image "$GALLERY_IMAGE_ID" \
--size Standard_B2ms --storage-sku StandardSSD_LRS \
--admin-username azureuser --ssh-key-values "$SSH_KEY" \
--vnet-name meeds-vnet --subnet meeds-subnet --nsg meeds-nsg --public-ip-sku Standard
Step 3: Connect via SSH
ssh azureuser@<vm-ip>
The first boot detects the VM's memory, sizes the application and search heaps accordingly, creates the PostgreSQL role and database, starts the platform, and completes Account Setup with a password generated for this VM alone. On a Standard_B2ms the stack is ready within a few minutes of the VM reporting running.
Step 4: Verify the Services
for u in postgresql elasticsearch meeds nginx; do printf '%-14s : %s\n' "$u" "$(systemctl is-active $u)"; done
sudo test -f /var/lib/cloudimg/meeds-firstboot.done && echo "first boot : complete"
sudo ss -tln | grep -E ':8080|:9200|:5432|:80 '

Only nginx is bound to a public address. The platform (8080), Elasticsearch (9200) and PostgreSQL (5432) all listen on loopback, so nginx is the only way in from outside the VM.
Step 5: Retrieve the Administrator Password
sudo cat /root/meeds-credentials.txt
sudo stat -c '%a %U:%G' /root/meeds-credentials.txt

The file is mode 0600 and readable only by root. It contains the workspace URL, the built in super user root and a password unique to this VM, a companion personal account admin, and the PostgreSQL application password.
Meeds ships no baked in demonstration login at all. Rather than creating a known account and rotating its password, this image drives the product's own first run Account Setup on your VM, submitting a password generated fresh for that boot. The historic community demonstration credential (root / gtn) is therefore never live, not even for a moment. You can confirm it is refused:
/usr/local/sbin/meeds-roundtrip.sh

Step 6: Sign In to the Workspace
Browse to http://<vm-ip>/ and sign in as root with the password from /root/meeds-credentials.txt.

The dashboard is the workspace home: a place to post an update, see suggested onboarding quests, and pick up tasks.

The Suggested Quests panel is the recognition system in action: completing genuine actions such as adding a profile picture, sending or receiving Kudos, or starting a space earns real points, shown next to each quest.
Step 7: Browse Spaces
Spaces, in the left navigation, lists every collaboration space you can see. On a freshly launched VM this is genuinely empty, with a prompt to create the first one:

Selecting Add opens the space creation panel, where a name, description and visibility (open, private or hidden) define a new collaboration area for a team or a project.
Step 8: View a Profile
Every account has a profile page collecting its identity, its activity and its connections:

The Your activity panel is a live count, not static text: joining a space or making a connection changes the numbers shown here.
Step 9: Server Components
java -version
head -2 /opt/meeds/LICENSE.txt
sudo -u postgres psql -tAc 'select version()'

| Component | Path |
|---|---|
| Meeds home | /opt/meeds |
| Configuration | /opt/meeds/conf/server.xml, /opt/meeds/gatein/conf/exo.properties |
| Application data | /opt/meeds/gatein/data |
| Elasticsearch data | /var/lib/elasticsearch |
| nginx site | /etc/nginx/sites-available/meeds |
| Credentials | /root/meeds-credentials.txt (mode 0600) |
| Firstboot sentinel | /var/lib/cloudimg/meeds-firstboot.done |
| Port | Bound to | Purpose |
|---|---|---|
| 80 | all interfaces | nginx, the only public surface |
| 8080 | 127.0.0.1 | Tomcat: the Meeds platform |
| 9200 | 127.0.0.1 | Elasticsearch |
| 5432 | 127.0.0.1 | PostgreSQL |
Step 10: Managing the Service
sudo systemctl restart elasticsearch.service
sudo systemctl restart meeds.service
sudo journalctl -u meeds.service --no-pager -n 50
Restart Elasticsearch before Meeds if you restart both: the platform expects the search index to already be reachable during its own startup checks. A fresh restart takes a couple of minutes to become fully ready, in line with the first boot timing in Step 3 — the command below waits for it rather than checking once:
for i in $(seq 1 30); do
CODE=$(curl -s -o /dev/null -w '%{http_code}' http://127.0.0.1/portal/login)
[ "$CODE" = "200" ] && { echo "login page: HTTP $CODE"; break; }
sleep 5
done
Step 11: Security Recommendations
- Change the administrator password from the account menu once signed in, and store the new value in your own secret manager.
- Restrict the network security group so that ports 22 and 80 only accept traffic from networks you control.
- Terminate TLS in front of nginx. The image serves plain HTTP on port 80 so that it makes no assumptions about your certificate authority. Put an Application Gateway, a load balancer or a TLS reverse proxy in front of it before real company data goes in.
- Create named accounts for every person who signs in, rather than sharing the
rootlogin. - Back up PostgreSQL and the application data directory together. The database and
/opt/meeds/gatein/dataare a matched pair: a backup of one without the other does not restore cleanly. - Keep the OS patched with
sudo apt-get update && sudo apt-get upgrade, and reboot for kernel updates.
Step 12: Support and Licensing
Meeds is published under the LGPL-3.0 licence, read verbatim from the licence file inside the official distribution. cloudimg provides commercial support for the image itself, separately from the upstream project.
- Email: support@cloudimg.co.uk
- Website: www.cloudimg.co.uk
- Support hours: 24/7, 24h response SLA
Deploy on Azure
Launch Meeds on Ubuntu 24.04 with 24/7 support from cloudimg.
View on Marketplace
Need Help?
Our support team is available 24/7. support@cloudimg.co.uk