WebErpMesv2 on Ubuntu 24.04 on Azure User Guide
Overview
WebErpMesv2 (WEM) is a free, open source Resource Management and Manufacturing Execution System (MES) built for small industry — sheet metal, machining, moulds and similar make-to-order workshops. It brings the commercial pipeline (leads, opportunities, quotes), sales orders, production planning and execution (routings, work orders, workshop tracking), stock and purchasing, and ISO-9001 quality management together in one web application, so a small manufacturer can run quote-to-delivery from a single tool.
The cloudimg image delivers WebErpMesv2 fully installed and configured on Ubuntu 24.04 — a Laravel 12 application (with AdminLTE) on PHP 8.3 with OPcache, served by nginx over HTTPS, backed by MariaDB. Database migrations are already applied and a demo dataset is pre-loaded (companies, quotes, orders, products and CRM activity), so you land on a populated dashboard and can explore straight away. Backed by 24/7 cloudimg support.
Not the same as the classic webERP accounting application. WebErpMesv2 is a manufacturing-focused ERP/MES from the SMEWebify project; it is a different product from the older weberp.org accounting ERP. This image is the manufacturing MES.
What is included:
- WebErpMesv2 (MIT licensed), served from
/var/www/weberpmes/public - nginx (HTTPS on :443 with a per-VM self-signed certificate; :80 redirects to :443) + PHP 8.3 (php8.3-fpm with OPcache) + MariaDB, all from Ubuntu 24.04
- Front-end assets compiled at build time with Vite — no Node or composer toolchain ships in the image
- Per-VM administrator password, MariaDB password and Laravel
APP_KEY, all generated at first boot and written to a root-only file — no default login ships in the image, and self-registration is disabled - Pre-loaded demo dataset (companies, quotes, orders, products and CRM opportunities) so the interface is populated on first sign-in
nginx.service,php8.3-fpm.serviceandmariadb.serviceas systemd units, enabled and active- Plain-HTTP liveness endpoint at
http://<vm>/upreturningok - 24/7 cloudimg support

Prerequisites
An active Azure subscription, an SSH key pair, and a VNet + subnet in the target region. Standard_B2s (2 vCPU / 4 GiB RAM) is a good starting point; scale up for more concurrent users or larger datasets. NSG inbound: allow 22/tcp from your management network, and 443/tcp (plus 80/tcp for the HTTP→HTTPS redirect) from your users.
Step 1 — Deploy from the Azure Marketplace
Sign in to the Azure Portal, choose Create a resource, search the Marketplace for WebErpMesv2 by cloudimg, and select Create. On Basics 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 HTTPS (443). Then Review + create → Create.
Step 2 — Deploy from the Azure CLI
az vm create \
--resource-group <your-rg> \
--name weberpmes \
--image <marketplace-image-urn> \
--size Standard_B2s \
--admin-username azureuser \
--ssh-key-values ~/.ssh/id_ed25519.pub \
--vnet-name <your-vnet> --subnet <your-subnet> \
--public-ip-sku Standard
az vm open-port --resource-group <your-rg> --name weberpmes --port 443 --priority 1010
az vm open-port --resource-group <your-rg> --name weberpmes --port 80 --priority 1011
Step 3 — Connect to your VM
ssh azureuser@<vm-public-ip>
Step 4 — Confirm the services are running
The three services that back WebErpMesv2 should all report active. A plain-HTTP liveness endpoint answers on /up (it never touches the app or database), and the site itself is served over HTTPS:
systemctl is-active nginx php8.3-fpm mariadb
curl -s http://127.0.0.1/up
curl -ks -o /dev/null -w 'https /en/login -> HTTP %{http_code}\n' https://127.0.0.1/en/login
Expected: three lines of active, then ok, then HTTP 200.

Step 5 — Retrieve your administrator credentials
On the first boot of every VM, a one-shot service (weberp-mesv2-firstboot.service) generates credentials that are unique to that VM: a fresh Laravel application key, a fresh MariaDB password, and a fresh administrator password. The VM's own address is set as the application URL and a per-VM self-signed TLS certificate is generated. No shared or default credentials ship in the image — every seeded account's password is scrambled at build time, and the administrator's password is set only on first boot.
sudo cat /root/weberp-mesv2-credentials.txt
The file (mode 0600, root only) contains the administrator email (wem.admin.user, which is contact@wem-project.org), the administrator password (wem.admin.pass), the site URL and the database credentials. WebErpMesv2 signs in by email.

Step 6 — Sign in
Browse to https://<vm-public-ip>/en/login and sign in with the administrator email and password from the credentials file. Because the VM ships a per-VM self-signed certificate, your browser shows a one-time security warning the first time — accept it to continue (Step 9 shows how to install a trusted domain certificate). After signing in you land on the dashboard, already populated with the pre-loaded demo dataset — open quotes and orders, supplier counts and financial forecasts.

You can also prove the login round-trip from the VM's own shell — this reads the per-VM credentials, fetches a CSRF token and posts a real sign-in over HTTPS (a successful WebErpMesv2 login answers HTTP 302):
ADMIN_USER=$(sudo grep '^wem.admin.user=' /root/weberp-mesv2-credentials.txt | cut -d= -f2-)
ADMIN_PASS=$(sudo grep '^wem.admin.pass=' /root/weberp-mesv2-credentials.txt | cut -d= -f2-)
CJ=$(mktemp)
TOK=$(curl -ks -c "$CJ" https://127.0.0.1/en/login | grep -oE 'name="_token" value="[^"]+"' | head -1 | sed 's/.*value="//;s/"//')
curl -ks -o /dev/null -w 'login HTTP %{http_code}\n' -b "$CJ" -c "$CJ" \
-d "_token=$TOK" -d "modeView=desktop" --data-urlencode "email=$ADMIN_USER" --data-urlencode "password=$ADMIN_PASS" \
https://127.0.0.1/en/login
rm -f "$CJ"
Step 7 — Explore quotes, orders, production and CRM
From the left navigation you can move through the whole quote-to-delivery flow. Opportunities and Leads hold the commercial pipeline; the opportunities view summarises win probability, amounts and recent activity from the demo dataset.

Quotes and Orders carry the sales documents through to production, while the Workshop interface is where manufacturing execution happens — the task list and planning, production declarations and shop-floor stock.

The demo dataset (250 companies, 500 quotes, 500 orders, 50 products) is there so the interface is populated while you evaluate. To start clean, remove the demo records from each module, or reset the database and re-run the migrations for an empty install.
Step 8 — Confirm the application stack
Laravel's about command summarises the running application — framework version, PHP, environment and the configured drivers:
sudo -u www-data HOME=/tmp php /var/www/weberpmes/artisan about --only=environment
You should see WebErpMesv2 on Laravel 12 / PHP 8.3, environment production and debug OFF. The bundled versions and provenance are shown below.

The pre-loaded MES dataset the appliance ships with:

Step 9 — Install a trusted HTTPS certificate (recommended for production)
The image ships a per-VM self-signed certificate so the site is encrypted from first boot. For production, point a DNS name at the VM and replace it with a free Let's Encrypt certificate:
sudo apt-get update && sudo apt-get install -y certbot python3-certbot-nginx
sudo certbot --nginx -d your-domain.example.com
Certbot installs the certificate into the nginx site and sets up automatic renewal. Update APP_URL in /var/www/weberpmes/.env to your https://your-domain.example.com address afterwards.
Administration from the CLI
Admin tasks use Laravel's artisan as the www-data user, for example to list the available commands or run the project's built-in diagnostics:
sudo -u www-data HOME=/tmp php /var/www/weberpmes/artisan list
The MariaDB database is named wem; its per-VM password is in /root/weberp-mesv2-credentials.txt. The Laravel scheduler runs every minute from /etc/cron.d/weberpmes-scheduler to drive backups (spatie/laravel-backup) and activity-log maintenance.
Maintenance
- OS updates: unattended-upgrades is enabled, so security patches apply automatically. Apply the full set with
sudo apt-get update && sudo apt-get -y dist-upgrade. - Upgrading WebErpMesv2: back up the database and
/var/www/weberpmes, then follow the project's documentation. - Backups: back up the
wemMariaDB database and the/var/www/weberpmes/storagetree (uploaded documents and files).
Support
Every cloudimg deployment includes 24/7 support. cloudimg is not affiliated with, endorsed by, or sponsored by the WebErpMesv2 project, SMEWebify or its authors; all product names are the property of their respective owners.