Faveo Helpdesk on Ubuntu 24.04 on Azure User Guide
Overview
Faveo Helpdesk is a free, open source, self-hosted support ticketing and helpdesk system. It turns inbound email and web requests into tickets, routes them to departments and agents, enforces SLA plans, and gives customers a self service portal and knowledge base, all from a clean agent and admin console. The cloudimg image delivers Faveo Helpdesk Community fully installed and configured on Ubuntu 24.04, a Laravel 9 application on PHP 8.2 with OPcache, served by nginx over HTTPS with php-fpm, backed by MariaDB. The setup wizard has already been run and locked and the administrator account is already created, so you land directly on the sign in page with nothing to configure. Backed by 24/7 cloudimg support.
Faveo Helpdesk Community is licensed under the Open Software License 3.0 (OSL-3.0), an OSI approved open source licence, and the complete, unmodified upstream source is shipped on the image under /var/www/faveo. cloudimg is not affiliated with, endorsed by, or sponsored by the Faveo project; "Faveo" is a trademark of its respective owner. This image repackages the upstream open source release with cloudimg's provisioning and support. The paid Pro and Cloud editions are separate commercial products and are not included.
What is included:
- Faveo Helpdesk Community 2.0.3 (OSL-3.0), served from
/var/www/faveo/public - nginx (TLS on :443, with :80 redirected to HTTPS) + PHP 8.2 (php8.2-fpm from the ondrej/php PPA with OPcache and the mysql, mbstring, imap, gd, intl and bcmath extensions) + MariaDB
- A per-VM self-signed TLS certificate generated on first boot, so the console loads over a secure context (Faveo forces HTTPS for every link and asset)
- Per-VM administrator password, MariaDB password and Laravel
APP_KEY, all generated at first boot and written to a root only file, so no default or shared login ships in the image - Two sample tickets and a demo requester, so the agent console and dashboard are not empty on first launch (delete them once you are set up)
- The application tree and the MariaDB datadir on dedicated, independently resizable data disks
- The Laravel scheduler running every minute via a systemd timer for background jobs, email fetching and SLA escalations
nginx.service,php8.2-fpm.serviceandmariadb.serviceas systemd units, enabled and active- 24/7 cloudimg support

Prerequisites
An active Azure subscription, an SSH key pair, and a VNet plus subnet in the target region. Standard_B2ms (2 vCPU / 8 GiB RAM) is a good starting point; scale up for larger teams or heavier ticket volume. NSG inbound: allow 22/tcp from your management network and 443/tcp (HTTPS) plus 80/tcp (which redirects to HTTPS) from your users.
Step 1 — Deploy from the Azure Marketplace
Sign in to the Azure Portal, choose Create a resource, search the Marketplace for Faveo Helpdesk 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) and HTTPS (443). Then Review + create and Create.
Step 2 — Deploy from the Azure CLI
az vm create \
--resource-group <your-rg> \
--name faveo-helpdesk \
--image <marketplace-image-urn> \
--size Standard_B2ms \
--admin-username azureuser \
--generate-ssh-keys \
--public-ip-sku Standard
Open HTTPS (and HTTP, which redirects) to reach the web console:
az vm open-port --resource-group <your-rg> --name faveo-helpdesk --port 443 --priority 900
az vm open-port --resource-group <your-rg> --name faveo-helpdesk --port 80 --priority 910
Step 3 — Connect to your VM
ssh azureuser@<vm-public-ip>
Step 4 — Confirm the services are running
The three services that back Faveo should all report active. MariaDB listens only on the loopback interface, plain HTTP redirects to HTTPS, and the sign in page answers over TLS:
systemctl is-active nginx php8.2-fpm mariadb
ss -tlnp | grep -E ':80 |:443 |:3306 '
curl -sk -o /dev/null -w 'https sign-in -> %{http_code}\n' https://127.0.0.1/auth/login
Expected: three lines of active, :3306 bound to 127.0.0.1 only, and https sign-in -> 200 (the Faveo sign in page over TLS).

Step 5 — Retrieve your administrator password
On the first boot of every VM, a one-shot service (faveo-helpdesk-firstboot.service) generates credentials that are unique to that VM: a fresh Laravel application key, a fresh MariaDB password, and a fresh administrator password. It also generates a per-VM self-signed TLS certificate and sets the VM's own address as the application URL. No shared or default credentials ship in the image.
sudo cat /root/faveo-helpdesk-credentials.txt
The file (mode 0600, root only) contains the administrator email (faveo.admin.user), the administrator password (faveo.admin.pass), the sign in URL, and the database credentials. Faveo signs in by email address. Change the admin email and profile to your own from Users after signing in.

You can 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 (a successful Faveo login answers HTTP 302 away from the login page and the authenticated dashboard then answers 200), and confirms a wrong password is rejected:
USER=$(sudo grep '^faveo.admin.user=' /root/faveo-helpdesk-credentials.txt | cut -d= -f2-)
PASS=$(sudo grep '^faveo.admin.pass=' /root/faveo-helpdesk-credentials.txt | cut -d= -f2-)
CJ=$(mktemp)
TOK=$(curl -sk -c "$CJ" https://127.0.0.1/auth/login | grep -oE 'name="_token"[^>]*value="[^"]+"' | head -1 | sed 's/.*value="//;s/"//')
curl -sk -o /dev/null -w 'good login -> %{http_code}\n' -b "$CJ" -c "$CJ" \
-d "_token=$TOK" --data-urlencode "email=$USER" --data-urlencode "password=$PASS" https://127.0.0.1/auth/login
curl -sk -o /dev/null -w 'dashboard -> %{http_code}\n' -b "$CJ" https://127.0.0.1/dashboard
rm -f "$CJ"
Expected: good login -> 302 (accepted, redirected to the dashboard) and dashboard -> 200 (the authenticated agent console).
Step 6 — Sign in
Browse to https://<vm-public-ip>/ and sign in with the email and password from the credentials file. Because the image ships a per-VM self-signed certificate, your browser shows a one-time certificate warning on first visit; click through it, or install your own domain certificate into /etc/ssl/faveo/faveo.crt and /etc/ssl/faveo/faveo.key.
After signing in you land on the Faveo dashboard, which summarises your inbox, unassigned, overdue and due-today ticket counts and a report of tickets created, reopened and closed.

Step 7 — Work with tickets
Open Tickets → Inbox to see the ticket queue. Every inbound email or web request becomes a ticket you can assign to an agent, set a priority and department on, reply to, add internal notes to, merge, or close. The image seeds two sample tickets so the queue is not empty; delete them once you are comfortable with the workflow.

Open a ticket to see the full conversation, its SLA plan and due date, the requester and assignee, and the reply and internal-note actions. This is the core Faveo workflow: a shared, SLA-tracked queue where every request is triaged, answered and resolved.

To configure the helpdesk itself, open Admin Panel and set up your departments, help topics, SLA plans, agents, canned responses, email fetching and the knowledge base.
Step 8 — Confirm the version and the stack
sudo mariadb -N -B faveo -e "SELECT version FROM settings_system LIMIT 1;"
php -v | head -1
df -h /var/www /var/lib/mysql
Expected: v2.0.3, PHP 8.2, and the two dedicated data disks that hold the application tree (/var/www) and the MariaDB datadir (/var/lib/mysql). Resize either disk from the Azure portal if you need more room for attachments or the database.

First-boot service and security model
A one-shot faveo-helpdesk-firstboot.service runs After=mariadb.service and Before=nginx.service php8.2-fpm.service, so the per-VM credentials and TLS certificate are in place before the first page is ever served. It rotates the MariaDB password (editing .env in lock-step so the application never loses its database connection), regenerates the Laravel APP_KEY, sets a per-VM administrator password, writes the credentials file at mode 0600 (root only) and drops a sentinel so it runs exactly once.
systemctl show -p ActiveState -p SubState --value faveo-helpdesk-firstboot.service
sudo stat -c '%a %U:%G %n' /root/faveo-helpdesk-credentials.txt
Expected: active exited and 600 root:root /root/faveo-helpdesk-credentials.txt.

Administration from the CLI
Admin tasks use Laravel's artisan as the www-data user. For example, list the Faveo commands or clear the caches:
sudo -u www-data php /var/www/faveo/artisan list | grep -iE 'install|jwt'
sudo -u www-data php /var/www/faveo/artisan cache:clear
The Laravel scheduler (background jobs such as fetching new email, sending notifications and running SLA escalations) runs every minute through the faveo-helpdesk-scheduler.timer systemd timer, so there is no crontab entry to add.
Serving Faveo on your own domain
To serve Faveo on your own domain, point a DNS record at the VM, then set the application URL in /var/www/faveo/.env and clear the caches. Faveo forces HTTPS, so keep the https:// scheme:
APP_URL=https://help.example.com
sudo -u www-data php /var/www/faveo/artisan config:clear
sudo -u www-data php /var/www/faveo/artisan cache:clear
For a browser-trusted certificate, install one from your CA (for example Let's Encrypt) over the shipped self-signed pair, or point nginx at the certificate files:
sudo apt-get update && sudo apt-get install -y certbot python3-certbot-nginx
sudo certbot --nginx -d help.example.com
Backup and maintenance
Faveo's data lives in the MariaDB database and the uploaded files under /var/www/faveo/storage. Back the database up with mariadb-dump, and snapshot the data disks from the Azure portal for a full point-in-time copy:
sudo mariadb-dump --single-transaction faveo | gzip > /var/backups/faveo-$(date +%F).sql.gz
Keep the OS current with sudo apt-get update && sudo apt-get upgrade; the image ships with unattended security updates enabled. Review Faveo's own release notes before moving between versions.
Support
This image is backed by 24/7 cloudimg support for deployment, upgrades, inbound and outbound email and IMAP fetching, SLA and department configuration, the knowledge base, plugins and database administration. Email support@cloudimg.co.uk or use the live chat in the support portal; critical issues receive a one-hour average response.