Odoo 19 Community on Ubuntu 24.04 on Azure User Guide
Overview
This guide covers the deployment and configuration of Odoo 19 Community Edition on Ubuntu 24.04 on Azure using cloudimg Azure Marketplace images. Odoo is the world's leading open source business application suite, providing a fully integrated ERP, CRM, eCommerce, accounting, inventory, project management, and HR platform in a single Apache 2.0 licensed package. Version 19 introduces an updated UI framework, improved accounting localisation, an enhanced eCommerce engine, and a faster ORM. The Community Edition includes over 50 business modules at no per-user licensing cost, making it an ideal starting point for small to medium businesses and developers building custom business applications.
The image ships Odoo 19.0 installed from the official Odoo nightly APT repository at nightly.odoo.com. PostgreSQL 16 is installed automatically as a dependency and runs locally, bound exclusively to 127.0.0.1:5432. No database is pre-created in the shipped image. On every fresh customer virtual machine, odoo-firstboot.service generates a strong random master password unique to that virtual machine, injects it into /etc/odoo/odoo.conf, restarts Odoo, and writes the credentials to /root/odoo-credentials.txt and /stage/scripts/odoo-credentials.log. This pattern means no two virtual machines ever share a master password and no password is baked into the image at any point. Customers create their first Odoo database through the web interface at /web/database/manager using the generated master password.
What is included:
- Odoo 19.0 Community Edition, installed from the official Odoo nightly APT repository
- PostgreSQL 16 database backend, pre-configured and bound to localhost only
- wkhtmltopdf for PDF report generation (invoices, purchase orders, delivery notes)
- Node.js for Odoo asset compilation
- Ubuntu 24.04 LTS (Noble Numbat) with latest security patches applied at build time
- Azure Linux Agent (waagent) for cloud-init, SSH key provisioning, and disk management
- ufw firewall with ports 8069 and 8072 open; all other ports restricted by default
odoo-firstboot.servicesystemd unit that rotates the master password on every first boot
Prerequisites
- An active Azure subscription with permission to create virtual machines
- An SSH key pair (Ed25519 or RSA 4096 recommended)
- A network security group (NSG) rule allowing inbound TCP on port 8069 (and 8072 for long-polling) from your trusted IP range
- A terminal with the Azure CLI installed (for CLI deploy steps)
Step 1: Deploy the Virtual Machine from the Azure Portal
- Navigate to the Azure Marketplace and search for Odoo 19 CE on Ubuntu 24.04 LTS by cloudimg.
- Click Create and select your subscription and resource group.
- Choose a region. The image is available globally.
- Select a VM size. Standard_D4s_v3 (4 vCPU, 16 GB RAM) is recommended for small teams. Use Standard_D8s_v3 or larger for multi-user production workloads.
- Under Administrator account, select SSH public key and provide your public key.
- Under Inbound port rules, open port 22 (SSH). Add NSG rules for port 8069 and 8072 after deployment, scoped to your trusted source IP range rather than
0.0.0.0/0. - On the Disks tab, select Standard SSD or better for the OS disk.
- Review and create. The VM will be ready within two to three minutes.
Step 2: Deploy the Virtual Machine from the Azure CLI
Replace <sub-id>, <rg>, and <version> with your subscription ID, resource group name, and the gallery image version.
az vm create \
--subscription "<sub-id>" \
--resource-group "<rg>" \
--name odoo-19-vm \
--image cloudimgGallery/images/odoo-19-community-ubuntu-24-04/versions/<version> \
--size Standard_D4s_v3 \
--storage-sku StandardSSD_LRS \
--admin-username azureuser \
--ssh-key-values ~/.ssh/id_ed25519.pub \
--public-ip-sku Standard \
--output table
After the VM is created, add NSG rules to permit inbound TCP on ports 8069 and 8072 from your source IP:
az network nsg rule create \
--resource-group "<rg>" \
--nsg-name odoo-19-vmNSG \
--name allow-odoo \
--priority 310 \
--protocol Tcp \
--destination-port-ranges 8069 8072 \
--source-address-prefixes "<your-ip>/32" \
--access Allow
Step 3: Connect via SSH
ssh azureuser@<vm-ip>
Substitute the public IP address assigned to your virtual machine. The default user is azureuser.
Step 4: Retrieve the Master Password
The odoo-firstboot.service runs automatically on first boot and generates a unique master password for your virtual machine. Retrieve it with:
sudo cat /root/odoo-credentials.txt
Example output:
Odoo Master Password: aB3kPqRwXm7nYvZc2sD9tFgH
To create your first database:
1. Navigate to http://<YOUR-IP>:8069/web/database/manager
2. Enter the master password above and create your first database
3. Log in to Odoo with your chosen admin credentials
The machine-readable form is at /stage/scripts/odoo-credentials.log (mode 600, root only):
sudo cat /stage/scripts/odoo-credentials.log
Step 5: Verify the Odoo Service
Confirm that Odoo and PostgreSQL are running and that port 8069 is listening:
systemctl status odoo
ss -tlnp | grep -E '8069|8072|5432'
Check the Odoo version:
odoo --version
Verify the health endpoint returns HTTP 200:
curl -s -o /dev/null -w "%{http_code}\n" http://localhost:8069/web/health
Expected output: 200
Step 6: Access the Web Interface and Create Your First Database
- Open
http://<your-vm-ip>:8069/web/database/managerin a browser.

- Click Create database.
- Enter the Master Password retrieved in Step 4.
- Choose a Database Name (for example,
mycompany). - Select your Language and Country.
- Optionally tick Demo data for a sandbox environment. Leave it unchecked for production.
- Set your Email and Password for the initial
adminaccount. - Click Create database and wait approximately 60 to 90 seconds while Odoo initialises the schema.
Once the database is created, you are redirected to the Odoo login page. Enter the admin email and password you chose during database creation.

Step 7: Install and Configure Business Modules
After logging in you land on the Odoo home screen. Click Apps in the top navigation bar to open the module store.

- Click Apps in the top navigation bar to open the app store.
- Remove the Apps filter in the search bar to see all available modules.
- Search for the modules your business requires and click Install.
Common starting modules: * Sales — quotations, sales orders, invoicing * Inventory — warehouse, stock moves, delivery orders * Accounting — chart of accounts, journals, bank reconciliation * CRM — leads, pipeline, customer portal * Project — tasks, timesheets, Gantt view * Purchase — purchase orders, vendor bills * eCommerce — online shop tied to Inventory and Accounting
After installing modules, navigate to Settings to configure your company name, logo, currency, and fiscal year.
Step 8: Configure Outgoing Email
After installing modules, navigate to Settings to configure your company name, logo, currency, fiscal year, and outgoing email.

Odoo sends transactional emails (order confirmations, invoices, password resets) through a configured SMTP server.
- Navigate to Settings > Technical > Email > Outgoing Mail Servers.
- Click Create and enter your SMTP host, port, authentication method, and credentials.
- Click Test Connection to verify the settings before saving.
For production deployments, use a dedicated transactional email provider (SendGrid, Mailgun, Amazon SES) rather than a personal Gmail account to avoid rate limiting and deliverability issues.
Step 9: Server Components
| Component | Version | Notes |
|---|---|---|
| Odoo Community | 19.0-20260423 | Installed from nightly.odoo.com/19.0/nightly/deb |
| PostgreSQL | 16 | localhost only (127.0.0.1:5432) |
| Python | 3.12 | Ubuntu 24.04 system Python |
| Node.js | 18+ | Required for Odoo asset compilation |
| wkhtmltopdf | 0.12.6 | Ubuntu 24.04 patched build for PDF reports |
| Ubuntu | 24.04 LTS (Noble Numbat) | Kernel 6.8 |
| Azure Linux Agent | 2.9+ | waagent — cloud-init, disk, SSH key management |
Check the currently running Odoo version:
odoo --version
Odoo Server 19.0-20260423
Step 10: Filesystem Layout
| Path | Purpose |
|---|---|
/usr/bin/odoo |
Odoo server binary |
/etc/odoo/odoo.conf |
Main configuration file (mode 640, root:odoo) |
/var/lib/odoo |
Odoo data directory (filestore, sessions, addons) |
/var/log/odoo/odoo-server.log |
Odoo server log |
/usr/lib/python3/dist-packages/odoo/ |
Odoo Python package |
/usr/lib/python3/dist-packages/odoo/addons/ |
Built-in Odoo modules |
/stage/scripts/odoo-credentials.log |
Machine-readable master password (mode 600, root) |
/root/odoo-credentials.txt |
Human-readable master password and first-use instructions |
/usr/local/sbin/odoo-firstboot.sh |
First boot credential generation script |
/etc/systemd/system/odoo-firstboot.service |
Systemd unit for first boot initialisation |
/var/lib/cloudimg/odoo-firstboot.done |
Sentinel file; presence prevents firstboot re-running |
/var/run/postgresql/ |
PostgreSQL runtime socket directory |
Step 11: Managing the Odoo Service
Check service status:
systemctl status odoo
Stop the service:
sudo systemctl stop odoo
Start the service:
sudo systemctl start odoo
Restart the service (for example, after editing odoo.conf):
sudo systemctl restart odoo
Tail the Odoo log in real time:
sudo tail -n 50 /var/log/odoo/odoo-server.log
Step 12: Backups
Web UI backup (recommended for most users)
Odoo provides a built-in database backup tool at /web/database/manager:
- Navigate to
http://<your-vm-ip>:8069/web/database/manager. - Enter the master password when prompted.
- Click Backup next to your database name.
- Select format: zip (includes filestore, recommended) or pg_dump (schema and data only).
- Download the archive and store it in a secure off-site location.
PostgreSQL dump (for scripted or scheduled backups)
pg_dump -U odoo -F c -f /home/azureuser/odoo-backup-$(date +%Y%m%d).dump <your-db-name>
Transfer the dump to Azure Blob Storage or another durable destination. Odoo's filestore at /var/lib/odoo/.local/share/Odoo/filestore/<db-name>/ must be backed up alongside the database dump to preserve uploaded attachments.
Automate with a cron job
# Example: nightly backup at 02:00, keep 7 days
0 2 * * * azureuser pg_dump -U odoo -F c -f /home/azureuser/odoo-backup-$(date +\%Y\%m\%d).dump mycompany && find /home/azureuser -name 'odoo-backup-*.dump' -mtime +7 -delete
Step 13: HTTPS with a Reverse Proxy
Running Odoo directly on port 8069 over plain HTTP is acceptable for internal tools but should not be used for internet-facing deployments. Use nginx as a reverse proxy with a TLS certificate from Let's Encrypt.
Install nginx and certbot:
sudo apt-get install -y nginx certbot python3-certbot-nginx
Create an nginx virtual host at /etc/nginx/sites-available/odoo:
upstream odoo {
server 127.0.0.1:8069;
}
upstream odoo-longpolling {
server 127.0.0.1:8072;
}
server {
listen 80;
server_name your-domain.example.com;
location /longpolling {
proxy_pass http://odoo-longpolling;
}
location / {
proxy_pass http://odoo;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_read_timeout 720s;
client_max_body_size 50m;
}
}
Enable the site and obtain a certificate:
sudo ln -s /etc/nginx/sites-available/odoo /etc/nginx/sites-enabled/odoo
sudo nginx -t && sudo systemctl reload nginx
sudo certbot --nginx -d your-domain.example.com
After enabling the proxy, set proxy_mode = True in /etc/odoo/odoo.conf and restart Odoo so it trusts the X-Forwarded-For header:
sudo sed -i 's/proxy_mode = False/proxy_mode = True/' /etc/odoo/odoo.conf
sudo systemctl restart odoo
Step 14: Troubleshooting
Odoo does not respond on port 8069
Check whether the service is running:
systemctl is-active odoo
If inactive, check the log for startup errors:
sudo tail -50 /var/log/odoo/odoo-server.log
Check whether PostgreSQL is running and accepting connections:
systemctl is-active postgresql
sudo -u postgres psql -c "SELECT version();"
/web/database/manager is inaccessible or returns an error
Verify that the admin password in odoo.conf is not the placeholder value:
sudo grep admin_passwd /etc/odoo/odoo.conf
If the value is PLACEHOLDER_MASTER_PASSWORD, the firstboot service did not run. Check whether the sentinel file exists:
ls -la /var/lib/cloudimg/odoo-firstboot.done
If the file is absent, the service did not complete. Check its journal:
sudo journalctl -u odoo-firstboot --no-pager
To force it to run again, remove the sentinel and start the service manually:
sudo rm -f /var/lib/cloudimg/odoo-firstboot.done
sudo systemctl start odoo-firstboot
sudo cat /root/odoo-credentials.txt
Port 8069 is not reachable from the browser
Verify the NSG rule on the Azure portal permits inbound TCP on port 8069 from your source IP. Confirm ufw allows the port locally:
sudo ufw status | grep 8069
PDF reports are blank or produce errors
Verify wkhtmltopdf is installed and the version Odoo expects:
wkhtmltopdf --version
Odoo uses the wkhtmltopdf binary at /usr/bin/wkhtmltopdf. The version from Ubuntu 24.04 repositories is the patched headless build that is compatible with Odoo.
Odoo is slow on the first request after idle
With workers = 2 in odoo.conf, workers are pre-forked but may sleep. The first request after an idle period can be slow due to Python module loading. For production, consider increasing workers to match available CPU cores.
Step 15: Security Recommendations
Restrict database manager access
After creating your database, restrict the database manager to localhost to prevent unauthorised database creation or deletion:
sudo sed -i '/^\[options\]/a dbfilter = ^mycompany$' /etc/odoo/odoo.conf
sudo systemctl restart odoo
Or add list_db = False to disable the database list entirely once your database is created:
echo "list_db = False" | sudo tee -a /etc/odoo/odoo.conf
sudo systemctl restart odoo
Rotate the master password
The master password is regenerated automatically at every first boot, so all customer VMs start with a unique credential. If you want to rotate it manually at any time:
NEW_PW=$(openssl rand -base64 24 | tr -d '+/=\n' | head -c 32)
sudo sed -i "s|^admin_passwd = .*|admin_passwd = ${NEW_PW}|" /etc/odoo/odoo.conf
echo "New master password: ${NEW_PW}"
sudo systemctl restart odoo
Enable two-factor authentication
Navigate to Settings > Users and Companies > Users, select a user, and enable Two-Factor Authentication in the account security section.
Restrict NSG rules
Limit inbound access to ports 8069 and 8072 to your specific office or VPN IP ranges rather than the public internet. PostgreSQL on port 5432 is bound to localhost and not exposed through the NSG.
Keep packages up to date
Apply security patches regularly:
sudo apt-get update && sudo apt-get upgrade -y odoo
sudo systemctl restart odoo
Step 16: Support and Licensing
Odoo 19 Community Edition is licensed under the Apache License 2.0. The full licence text is available at www.apache.org/licenses/LICENSE-2.0.
cloudimg provides 24/7/365 expert technical support with a guaranteed 24-hour response for all requests and a one-hour average response time for critical issues. Contact support@cloudimg.co.uk.
For the full user guide visit www.cloudimg.co.uk/guides/odoo-19-community-on-ubuntu-24-04-azure and for our complete product catalogue visit www.cloudimg.co.uk/products.
Deploy on Azure
The cloudimg Odoo 19 Community Edition image is available on the Azure Marketplace. Search for Odoo 19 CE on Ubuntu 24.04 LTS by cloudimg or navigate directly from the Azure Portal.
Need Help?
- Email: support@cloudimg.co.uk
- Website: www.cloudimg.co.uk
- Azure Marketplace: search cloudimg to view our full catalogue of production-ready images