Wm
Applications Azure

WebErpMesv2 on Ubuntu 24.04 on Azure User Guide

| Product: WebErpMesv2 Manufacturing Execution System on Ubuntu 24.04 LTS on Azure

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.service and mariadb.service as systemd units, enabled and active
  • Plain-HTTP liveness endpoint at http://<vm>/up returning ok
  • 24/7 cloudimg support

WebErpMesv2 sign-in page

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 + createCreate.

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.

Service status and health endpoints

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.

Per-VM credentials file (secrets redacted)

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.

The KPI dashboard populated with the demo dataset

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.

The opportunities CRM pipeline with 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 workshop module for production planning and execution

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.

Installed versions and provenance

The pre-loaded MES dataset the appliance ships with:

The seeded MES dataset

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 wem MariaDB database and the /var/www/weberpmes/storage tree (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.